[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