[PATCH 10/13] [DbgHelp]: in dwarf parsing, correctly handle the DW_OP_regx option
Eric Pouech
eric.pouech at orange.fr
Sat Mar 27 03:08:55 CDT 2010
A+
---
dlls/dbghelp/dwarf.c | 17 ++++++++++-------
1 files changed, 10 insertions(+), 7 deletions(-)
diff --git a/dlls/dbghelp/dwarf.c b/dlls/dbghelp/dwarf.c
index 1652f46..78860d7 100644
--- a/dlls/dbghelp/dwarf.c
+++ b/dlls/dbghelp/dwarf.c
@@ -690,7 +690,6 @@ compute_location(dwarf2_traverse_context_t* ctx, struct location* loc,
}
stack[++stk] = dwarf2_leb128_as_signed(ctx);
loc->kind = loc_regrel;
- break;
}
else switch (op)
{
@@ -736,18 +735,22 @@ compute_location(dwarf2_traverse_context_t* ctx, struct location* loc,
case DW_OP_skip: tmp = dwarf2_parse_u2(ctx); ctx->data += tmp; break;
case DW_OP_bra: tmp = dwarf2_parse_u2(ctx); if (!stack[stk--]) ctx->data += tmp; break;
case DW_OP_regx:
- if (loc->reg != Wine_DW_no_register)
- FIXME("Only supporting one regx\n");
- loc->reg = dwarf2_map_register(dwarf2_leb128_as_unsigned(ctx));
+ tmp = dwarf2_leb128_as_unsigned(ctx);
+ if (!piece_found)
+ {
+ if (loc->reg != Wine_DW_no_register)
+ FIXME("Only supporting one reg\n");
+ loc->reg = dwarf2_map_register(tmp);
+ }
loc->kind = loc_register;
break;
case DW_OP_bregx:
tmp = dwarf2_leb128_as_unsigned(ctx);
- ctx->data++;
if (loc->reg != Wine_DW_no_register)
FIXME("Only supporting one regx\n");
- loc->reg = dwarf2_map_register(tmp) + dwarf2_leb128_as_signed(ctx);
- loc->kind = loc_register;
+ loc->reg = dwarf2_map_register(tmp);
+ stack[++stk] = dwarf2_leb128_as_signed(ctx);
+ loc->kind = loc_regrel;
break;
case DW_OP_fbreg:
if (loc->reg != Wine_DW_no_register)
More information about the wine-patches
mailing list