[PATCH 3/6] dbghelp/dwarf: Allow get_context_reg() to handle different register sizes.

Zebediah Figura z.figura12 at gmail.com
Tue Jul 31 11:17:36 CDT 2018


Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
 dlls/dbghelp/cpu_arm.c         |  2 +-
 dlls/dbghelp/cpu_arm64.c       |  2 +-
 dlls/dbghelp/cpu_i386.c        |  2 +-
 dlls/dbghelp/cpu_x86_64.c      |  2 +-
 dlls/dbghelp/dbghelp_private.h |  2 +-
 dlls/dbghelp/dwarf.c           | 30 ++++++++++++++++--------------
 6 files changed, 21 insertions(+), 19 deletions(-)

diff --git a/dlls/dbghelp/cpu_arm.c b/dlls/dbghelp/cpu_arm.c
index 15091d3..510da4a 100644
--- a/dlls/dbghelp/cpu_arm.c
+++ b/dlls/dbghelp/cpu_arm.c
@@ -66,7 +66,7 @@ enum st_mode {stm_start, stm_arm, stm_done};
 static BOOL fetch_next_frame(struct cpu_stack_walk* csw, union ctx *pcontext,
     DWORD_PTR curr_pc)
 {
-    DWORD_PTR               xframe;
+    DWORD64 xframe;
     DWORD                   oldReturn = context->Lr;
     CONTEXT *context = &pcontext->ctx;
 
diff --git a/dlls/dbghelp/cpu_arm64.c b/dlls/dbghelp/cpu_arm64.c
index 6cabc5b..7bfa318 100644
--- a/dlls/dbghelp/cpu_arm64.c
+++ b/dlls/dbghelp/cpu_arm64.c
@@ -68,7 +68,7 @@ enum st_mode {stm_start, stm_arm64, stm_done};
 static BOOL fetch_next_frame(struct cpu_stack_walk* csw, union ctx *pcontext,
     DWORD_PTR curr_pc)
 {
-    DWORD_PTR               xframe;
+    DWORD64 xframe;
     DWORD_PTR               oldReturn = context->u.s.Lr;
 
     if (dwarf2_virtual_unwind(csw, curr_pc, pcontext, &xframe))
diff --git a/dlls/dbghelp/cpu_i386.c b/dlls/dbghelp/cpu_i386.c
index 4880fd4..9704cfd 100644
--- a/dlls/dbghelp/cpu_i386.c
+++ b/dlls/dbghelp/cpu_i386.c
@@ -94,7 +94,7 @@ static BOOL i386_get_addr(HANDLE hThread, const CONTEXT* ctx,
 static BOOL fetch_next_frame32(struct cpu_stack_walk* csw,
                                union ctx *pcontext, DWORD_PTR curr_pc)
 {
-    DWORD_PTR               xframe;
+    DWORD64 xframe;
     struct pdb_cmd_pair     cpair[4];
     DWORD                   val32;
     WOW64_CONTEXT *context = &pcontext->x86;
diff --git a/dlls/dbghelp/cpu_x86_64.c b/dlls/dbghelp/cpu_x86_64.c
index be6d3f4..3c0b1d8 100644
--- a/dlls/dbghelp/cpu_x86_64.c
+++ b/dlls/dbghelp/cpu_x86_64.c
@@ -579,7 +579,7 @@ static BOOL interpret_function_table_entry(struct cpu_stack_walk* csw,
 static BOOL fetch_next_frame(struct cpu_stack_walk *csw, union ctx *pcontext,
                              DWORD_PTR curr_pc, void** prtf)
 {
-    DWORD_PTR               cfa;
+    DWORD64 cfa;
     RUNTIME_FUNCTION*       rtf;
     DWORD64                 base;
     CONTEXT *context = &pcontext->ctx;
diff --git a/dlls/dbghelp/dbghelp_private.h b/dlls/dbghelp/dbghelp_private.h
index 57af60b..f689db8 100644
--- a/dlls/dbghelp/dbghelp_private.h
+++ b/dlls/dbghelp/dbghelp_private.h
@@ -693,7 +693,7 @@ extern BOOL         dwarf2_parse(struct module* module, unsigned long load_offse
                                  const struct elf_thunk_area* thunks,
                                  struct image_file_map* fmap) DECLSPEC_HIDDEN;
 extern BOOL dwarf2_virtual_unwind(struct cpu_stack_walk *csw, DWORD_PTR ip,
-    union ctx *ctx, ULONG_PTR *cfa) DECLSPEC_HIDDEN;
+    union ctx *ctx, DWORD64 *cfa) DECLSPEC_HIDDEN;
 
 /* stack.c */
 extern BOOL         sw_read_mem(struct cpu_stack_walk* csw, DWORD64 addr, void* ptr, DWORD sz) DECLSPEC_HIDDEN;
diff --git a/dlls/dbghelp/dwarf.c b/dlls/dbghelp/dwarf.c
index 4053e5e..1dc2dc1 100644
--- a/dlls/dbghelp/dwarf.c
+++ b/dlls/dbghelp/dwarf.c
@@ -3008,18 +3008,19 @@ static void execute_cfa_instructions(dwarf2_traverse_context_t* ctx,
 }
 
 /* retrieve a context register from its dwarf number */
-static ULONG_PTR get_context_reg(struct cpu_stack_walk *csw, union ctx *context,
+static DWORD64 get_context_reg(struct cpu_stack_walk *csw, union ctx *context,
     ULONG_PTR dw_reg)
 {
     unsigned regno = csw->cpu->map_dwarf_register(dw_reg, TRUE), sz;
-    ULONG_PTR* ptr = csw->cpu->fetch_context_reg(context, regno, &sz);
+    void* ptr = csw->cpu->fetch_context_reg(context, regno, &sz);
 
-    if (sz != sizeof(ULONG_PTR))
-    {
-        FIXME("reading register %lu/%u of wrong size %u\n", dw_reg, regno, sz);
-        return 0;
-    }
-    return *ptr;
+    if (sz == 8)
+        return *(DWORD64 *)ptr;
+    else if (sz == 4)
+        return *(DWORD *)ptr;
+
+    FIXME("unhandled size %d\n", sz);
+    return 0;
 }
 
 /* set a context register from its dwarf number */
@@ -3079,7 +3080,8 @@ static ULONG_PTR eval_expression(const struct module* module, struct cpu_stack_w
                                  const unsigned char* zp, union ctx *context)
 {
     dwarf2_traverse_context_t    ctx;
-    ULONG_PTR reg, sz, tmp, stack[64];
+    ULONG_PTR reg, sz, tmp;
+    DWORD64 stack[64];
     int sp = -1;
     ULONG_PTR len;
 
@@ -3117,7 +3119,7 @@ static ULONG_PTR eval_expression(const struct module* module, struct cpu_stack_w
         case DW_OP_deref:
             if (!sw_read_mem(csw, stack[sp], &tmp, sizeof(tmp)))
             {
-                ERR("Couldn't read memory at %lx\n", stack[sp]);
+                ERR("Couldn't read memory at %s\n", wine_dbgstr_longlong(stack[sp]));
                 tmp = 0;
             }
             stack[sp] = tmp;
@@ -3167,7 +3169,7 @@ static ULONG_PTR eval_expression(const struct module* module, struct cpu_stack_w
             sz = dwarf2_parse_byte(&ctx);
             if (!sw_read_mem(csw, stack[sp], &tmp, sz))
             {
-                ERR("Couldn't read memory at %lx\n", stack[sp]);
+                ERR("Couldn't read memory at %s\n", wine_dbgstr_longlong(stack[sp]));
                 tmp = 0;
             }
             /* do integral promotion */
@@ -3188,7 +3190,7 @@ static ULONG_PTR eval_expression(const struct module* module, struct cpu_stack_w
 }
 
 static void apply_frame_state(const struct module* module, struct cpu_stack_walk* csw,
-                              union ctx *context, struct frame_state *state, ULONG_PTR* cfa)
+                              union ctx *context, struct frame_state *state, DWORD64 *cfa)
 {
     unsigned int i;
     ULONG_PTR value;
@@ -3200,7 +3202,7 @@ static void apply_frame_state(const struct module* module, struct cpu_stack_walk
         *cfa = eval_expression(module, csw, (const unsigned char*)state->cfa_offset, context);
         if (!sw_read_mem(csw, *cfa, cfa, sizeof(*cfa)))
         {
-            WARN("Couldn't read memory at %p\n", (void*)*cfa);
+            WARN("Couldn't read memory at %s\n", wine_dbgstr_longlong(*cfa));
             return;
         }
         break;
@@ -3245,7 +3247,7 @@ static void apply_frame_state(const struct module* module, struct cpu_stack_walk
  *
  */
 BOOL dwarf2_virtual_unwind(struct cpu_stack_walk *csw, ULONG_PTR ip,
-    union ctx *context, ULONG_PTR *cfa)
+    union ctx *context, DWORD64 *cfa)
 {
     struct module_pair pair;
     struct frame_info info;
-- 
2.7.4




More information about the wine-devel mailing list