[PATCH 05/13] dbghelp: rather use cpu from debuggee's modules than debugger's

Eric Pouech eric.pouech at gmail.com
Mon Nov 8 07:58:13 CST 2021


Signed-off-by: Eric Pouech <eric.pouech at gmail.com>

---
 dlls/dbghelp/dwarf.c  |   50 +++++++++++++++++++++++++++----------------------
 dlls/dbghelp/module.c |    6 +++---
 dlls/dbghelp/stabs.c  |    4 ++--
 3 files changed, 33 insertions(+), 27 deletions(-)

diff --git a/dlls/dbghelp/dwarf.c b/dlls/dbghelp/dwarf.c
index 7ecd04d216e..90452d74eaf 100644
--- a/dlls/dbghelp/dwarf.c
+++ b/dlls/dbghelp/dwarf.c
@@ -812,7 +812,7 @@ static unsigned dwarf2_map_register(int regno, const struct module* module)
         FIXME("What the heck map reg 0x%x\n",regno);
         return 0;
     }
-    return dbghelp_current_cpu->map_dwarf_register(regno, module, FALSE);
+    return module->cpu->map_dwarf_register(regno, module, FALSE);
 }
 
 static enum location_error
@@ -847,8 +847,8 @@ compute_location(const struct module *module, const dwarf2_cuhead_t* head,
                 DWORD   cvreg = dwarf2_map_register(op - DW_OP_reg0, module);
                 if (loc->reg != Wine_DW_no_register)
                     FIXME("Only supporting one reg (%s/%d -> %s/%d)\n",
-                          dbghelp_current_cpu->fetch_regname(loc->reg), loc->reg,
-                          dbghelp_current_cpu->fetch_regname(cvreg), cvreg);
+                          module->cpu->fetch_regname(loc->reg), loc->reg,
+                          module->cpu->fetch_regname(cvreg), cvreg);
                 loc->reg = cvreg;
             }
             loc->kind = loc_register;
@@ -864,8 +864,8 @@ compute_location(const struct module *module, const dwarf2_cuhead_t* head,
                 DWORD   cvreg = dwarf2_map_register(op - DW_OP_breg0, module);
                 if (loc->reg != Wine_DW_no_register)
                     FIXME("Only supporting one breg (%s/%d -> %s/%d)\n",
-                          dbghelp_current_cpu->fetch_regname(loc->reg), loc->reg,
-                          dbghelp_current_cpu->fetch_regname(cvreg), cvreg);
+                          module->cpu->fetch_regname(loc->reg), loc->reg,
+                          module->cpu->fetch_regname(cvreg), cvreg);
                 loc->reg = cvreg;
             }
             stack[++stk] = dwarf2_leb128_as_signed(ctx);
@@ -938,7 +938,7 @@ compute_location(const struct module *module, const dwarf2_cuhead_t* head,
         case DW_OP_fbreg:
             if (loc->reg != Wine_DW_no_register)
                 FIXME("Only supporting one reg (%s/%d -> -2)\n",
-                      dbghelp_current_cpu->fetch_regname(loc->reg), loc->reg);
+                      module->cpu->fetch_regname(loc->reg), loc->reg);
             if (frame && frame->kind == loc_register)
             {
                 loc->kind = loc_regrel;
@@ -2284,7 +2284,7 @@ static struct symt* dwarf2_parse_subprogram(dwarf2_debug_info_t* di)
     {
         /* on stack !! */
         subpgm.frame.kind = loc_regrel;
-        subpgm.frame.reg = dbghelp_current_cpu->frame_regno;
+        subpgm.frame.reg = di->unit_ctx->module_ctx->module->cpu->frame_regno;
         subpgm.frame.offset = 0;
     }
     subpgm.non_computed_variable = FALSE;
@@ -3256,7 +3256,7 @@ static void execute_cfa_instructions(struct module* module, dwarf2_traverse_cont
                 if (!valid_reg(reg)) break;
                 TRACE("%lx: DW_CFA_offset %s, %ld\n",
                       info->ip,
-                      dbghelp_current_cpu->fetch_regname(dbghelp_current_cpu->map_dwarf_register(reg, module, TRUE)),
+                      module->cpu->fetch_regname(module->cpu->map_dwarf_register(reg, module, TRUE)),
                       offset);
                 info->state.regs[reg]  = offset;
                 info->state.rules[reg] = RULE_CFA_OFFSET;
@@ -3268,7 +3268,7 @@ static void execute_cfa_instructions(struct module* module, dwarf2_traverse_cont
                 if (!valid_reg(reg)) break;
                 TRACE("%lx: DW_CFA_restore %s\n",
                       info->ip,
-                      dbghelp_current_cpu->fetch_regname(dbghelp_current_cpu->map_dwarf_register(reg, module, TRUE)));
+                      module->cpu->fetch_regname(module->cpu->map_dwarf_register(reg, module, TRUE)));
                 info->state.rules[reg] = RULE_UNSET;
                 break;
             }
@@ -3316,7 +3316,7 @@ static void execute_cfa_instructions(struct module* module, dwarf2_traverse_cont
             if (!valid_reg(reg)) break;
             TRACE("%lx: DW_CFA_offset_extended %s, %ld\n",
                   info->ip,
-                  dbghelp_current_cpu->fetch_regname(dbghelp_current_cpu->map_dwarf_register(reg, module, TRUE)),
+                  module->cpu->fetch_regname(module->cpu->map_dwarf_register(reg, module, TRUE)),
                   offset);
             info->state.regs[reg]  = offset;
             info->state.rules[reg] = RULE_CFA_OFFSET;
@@ -3328,7 +3328,7 @@ static void execute_cfa_instructions(struct module* module, dwarf2_traverse_cont
             if (!valid_reg(reg)) break;
             TRACE("%lx: DW_CFA_restore_extended %s\n",
                   info->ip,
-                  dbghelp_current_cpu->fetch_regname(dbghelp_current_cpu->map_dwarf_register(reg, module, TRUE)));
+                  module->cpu->fetch_regname(module->cpu->map_dwarf_register(reg, module, TRUE)));
             info->state.rules[reg] = RULE_UNSET;
             break;
         }
@@ -3338,7 +3338,7 @@ static void execute_cfa_instructions(struct module* module, dwarf2_traverse_cont
             if (!valid_reg(reg)) break;
             TRACE("%lx: DW_CFA_undefined %s\n",
                   info->ip,
-                  dbghelp_current_cpu->fetch_regname(dbghelp_current_cpu->map_dwarf_register(reg, module, TRUE)));
+                  module->cpu->fetch_regname(module->cpu->map_dwarf_register(reg, module, TRUE)));
             info->state.rules[reg] = RULE_UNDEFINED;
             break;
         }
@@ -3348,7 +3348,7 @@ static void execute_cfa_instructions(struct module* module, dwarf2_traverse_cont
             if (!valid_reg(reg)) break;
             TRACE("%lx: DW_CFA_same_value %s\n",
                   info->ip,
-                  dbghelp_current_cpu->fetch_regname(dbghelp_current_cpu->map_dwarf_register(reg, module, TRUE)));
+                  module->cpu->fetch_regname(module->cpu->map_dwarf_register(reg, module, TRUE)));
             info->state.regs[reg]  = reg;
             info->state.rules[reg] = RULE_SAME;
             break;
@@ -3360,8 +3360,8 @@ static void execute_cfa_instructions(struct module* module, dwarf2_traverse_cont
             if (!valid_reg(reg) || !valid_reg(reg2)) break;
             TRACE("%lx: DW_CFA_register %s == %s\n",
                   info->ip,
-                  dbghelp_current_cpu->fetch_regname(dbghelp_current_cpu->map_dwarf_register(reg, module, TRUE)),
-                  dbghelp_current_cpu->fetch_regname(dbghelp_current_cpu->map_dwarf_register(reg2, module, TRUE)));
+                  module->cpu->fetch_regname(module->cpu->map_dwarf_register(reg, module, TRUE)),
+                  module->cpu->fetch_regname(module->cpu->map_dwarf_register(reg2, module, TRUE)));
             info->state.regs[reg]  = reg2;
             info->state.rules[reg] = RULE_OTHER_REG;
             break;
@@ -3389,7 +3389,7 @@ static void execute_cfa_instructions(struct module* module, dwarf2_traverse_cont
             if (!valid_reg(reg)) break;
             TRACE("%lx: DW_CFA_def_cfa %s, %ld\n",
                   info->ip,
-                  dbghelp_current_cpu->fetch_regname(dbghelp_current_cpu->map_dwarf_register(reg, module, TRUE)),
+                  module->cpu->fetch_regname(module->cpu->map_dwarf_register(reg, module, TRUE)),
                   offset);
             info->state.cfa_reg    = reg;
             info->state.cfa_offset = offset;
@@ -3402,7 +3402,7 @@ static void execute_cfa_instructions(struct module* module, dwarf2_traverse_cont
             if (!valid_reg(reg)) break;
             TRACE("%lx: DW_CFA_def_cfa_register %s\n",
                   info->ip,
-                  dbghelp_current_cpu->fetch_regname(dbghelp_current_cpu->map_dwarf_register(reg, module, TRUE)));
+                  module->cpu->fetch_regname(module->cpu->map_dwarf_register(reg, module, TRUE)));
             info->state.cfa_reg  = reg;
             info->state.cfa_rule = RULE_CFA_OFFSET;
             break;
@@ -3436,7 +3436,7 @@ static void execute_cfa_instructions(struct module* module, dwarf2_traverse_cont
             if (!valid_reg(reg)) break;
             TRACE("%lx: DW_CFA_%sexpression %s %lx-%lx\n",
                   info->ip, (op == DW_CFA_expression) ? "" : "val_",
-                  dbghelp_current_cpu->fetch_regname(dbghelp_current_cpu->map_dwarf_register(reg, module, TRUE)),
+                  module->cpu->fetch_regname(module->cpu->map_dwarf_register(reg, module, TRUE)),
                   expr, expr + len);
             info->state.regs[reg]  = expr;
             info->state.rules[reg] = (op == DW_CFA_expression) ? RULE_EXPRESSION : RULE_VAL_EXPRESSION;
@@ -3465,6 +3465,7 @@ static DWORD64 get_context_reg(const struct module* module, struct cpu_stack_wal
     unsigned regno = csw->cpu->map_dwarf_register(dw_reg, module, TRUE), sz;
     void* ptr = csw->cpu->fetch_context_reg(context, regno, &sz);
 
+    if (csw->cpu != module->cpu) FIXME("mismatch in cpu\n");
     if (sz == 8)
         return *(DWORD64 *)ptr;
     else if (sz == 4)
@@ -3481,6 +3482,7 @@ static void set_context_reg(const struct module* module, struct cpu_stack_walk*
     unsigned regno = csw->cpu->map_dwarf_register(dw_reg, module, TRUE), sz;
     ULONG_PTR* ptr = csw->cpu->fetch_context_reg(context, regno, &sz);
 
+    if (csw->cpu != module->cpu) FIXME("mismatch in cpu\n");
     if (isdebuggee)
     {
         char    tmp[16];
@@ -3518,6 +3520,7 @@ static void copy_context_reg(const struct module* module, struct cpu_stack_walk
     ULONG_PTR* ptrdst = csw->cpu->fetch_context_reg(dstcontext, regdstno, &szdst);
     ULONG_PTR* ptrsrc = csw->cpu->fetch_context_reg(srccontext, regsrcno, &szsrc);
 
+    if (csw->cpu != module->cpu) FIXME("mismatch in cpu\n");
     if (szdst != szsrc)
     {
         FIXME("Cannot copy register %lu/%u => %lu/%u because of size mismatch (%u => %u)\n",
@@ -3536,6 +3539,7 @@ static ULONG_PTR eval_expression(const struct module* module, struct cpu_stack_w
     int sp = -1;
     ULONG_PTR len;
 
+    if (csw->cpu != module->cpu) FIXME("mismatch in cpu\n");
     ctx.data = zp;
     ctx.end_data = zp + 4;
     len = dwarf2_leb128_as_unsigned(&ctx);
@@ -3647,6 +3651,7 @@ static void apply_frame_state(const struct module* module, struct cpu_stack_walk
     ULONG_PTR value;
     union ctx new_context = *context;
 
+    if (csw->cpu != module->cpu) FIXME("mismatch in cpu\n");
     switch (state->cfa_rule)
     {
     case RULE_EXPRESSION:
@@ -3756,6 +3761,7 @@ BOOL dwarf2_virtual_unwind(struct cpu_stack_walk *csw, ULONG_PTR ip,
     struct frame_info info;
 
     if (!module_init_pair(&pair, csw->hProcess, ip)) return FALSE;
+    if (csw->cpu != pair.effective->cpu) FIXME("mismatch in cpu\n");
     if (!dwarf2_fetch_frame_info(pair.effective, csw->cpu, ip, &info)) return FALSE;
 
     /* if at very beginning of function, return and use default unwinder */
@@ -3773,15 +3779,15 @@ static BOOL compute_call_frame_cfa(struct module* module, ULONG_PTR ip, struct l
 {
     struct frame_info info;
 
-    if (!dwarf2_fetch_frame_info(module, dbghelp_current_cpu, ip, &info)) return FALSE;
+    if (!dwarf2_fetch_frame_info(module, module->cpu, ip, &info)) return FALSE;
 
     /* beginning of function, or no available dwarf information ? */
     if (ip == info.ip || info.state.rules[info.retaddr_reg] == RULE_UNSET)
     {
         /* fake the default unwinder */
         frame->kind = loc_regrel;
-        frame->reg = dbghelp_current_cpu->frame_regno;
-        frame->offset = dbghelp_current_cpu->word_size; /* FIXME stack direction */
+        frame->reg = module->cpu->frame_regno;
+        frame->offset = module->cpu->word_size; /* FIXME stack direction */
     }
     else
     {
@@ -3798,7 +3804,7 @@ static BOOL compute_call_frame_cfa(struct module* module, ULONG_PTR ip, struct l
             return FALSE;
         default:
             frame->kind = loc_regrel;
-            frame->reg = dbghelp_current_cpu->map_dwarf_register(info.state.cfa_reg, module, TRUE);
+            frame->reg = module->cpu->map_dwarf_register(info.state.cfa_reg, module, TRUE);
             frame->offset = info.state.cfa_offset;
             break;
         }
diff --git a/dlls/dbghelp/module.c b/dlls/dbghelp/module.c
index 65bdbb38fda..302f85b0747 100644
--- a/dlls/dbghelp/module.c
+++ b/dlls/dbghelp/module.c
@@ -1480,11 +1480,11 @@ PVOID WINAPI SymFunctionTableAccess64(HANDLE hProcess, DWORD64 AddrBase)
     struct process*     pcs = process_find_by_handle(hProcess);
     struct module*      module;
 
-    if (!pcs || !dbghelp_current_cpu->find_runtime_function) return NULL;
+    if (!pcs) return NULL;
     module = module_find_by_addr(pcs, AddrBase, DMT_UNKNOWN);
-    if (!module) return NULL;
+    if (!module || !module->cpu->find_runtime_function) return NULL;
 
-    return dbghelp_current_cpu->find_runtime_function(module, AddrBase);
+    return module->cpu->find_runtime_function(module, AddrBase);
 }
 
 static BOOL native_synchronize_module_list(struct process* pcs)
diff --git a/dlls/dbghelp/stabs.c b/dlls/dbghelp/stabs.c
index f2b3e6d5c7d..931102c4fb3 100644
--- a/dlls/dbghelp/stabs.c
+++ b/dlls/dbghelp/stabs.c
@@ -1396,7 +1396,7 @@ BOOL stabs_parse(struct module* module, ULONG_PTR load_offset,
                     continue;
                 }
                 loc.kind = loc_regrel;
-                loc.reg = dbghelp_current_cpu->frame_regno;
+                loc.reg = module->cpu->frame_regno;
                 loc.offset = n_value;
                 symt_add_func_local(module, curr_func,
                                     (int)n_value >= 0 ? DataIsParam : DataIsLocal,
@@ -1476,7 +1476,7 @@ BOOL stabs_parse(struct module* module, ULONG_PTR load_offset,
         case N_LSYM:
             /* These are local variables */
             loc.kind = loc_regrel;
-            loc.reg = dbghelp_current_cpu->frame_regno;
+            loc.reg = module->cpu->frame_regno;
             loc.offset = n_value;
             if (curr_func != NULL) pending_add_var(&pending_block, ptr, DataIsLocal, &loc);
             break;




More information about the wine-devel mailing list