Module: wine Branch: master Commit: a5293895a34c0cbf4f6db0585a1c48a025ddaee1 URL: http://source.winehq.org/git/wine.git/?a=commit;h=a5293895a34c0cbf4f6db0585a...
Author: Eric Pouech eric.pouech@orange.fr Date: Sat Mar 27 09:08:55 2010 +0100
dbghelp: In dwarf parsing, correctly handle the DW_OP_regx option.
---
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)