Eric Pouech : dbghelp: In dwarf parsing, correctly handle the DW_OP_regx option.

Alexandre Julliard julliard at winehq.org
Mon Mar 29 09:57:49 CDT 2010


Module: wine
Branch: master
Commit: a5293895a34c0cbf4f6db0585a1c48a025ddaee1
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=a5293895a34c0cbf4f6db0585a1c48a025ddaee1

Author: Eric Pouech <eric.pouech at 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)




More information about the wine-cvs mailing list