Eric Pouech : dbghelp/dwarf: Split dwarf2_virtual_unwind into two functions.

Alexandre Julliard julliard at winehq.org
Mon Sep 27 15:21:43 CDT 2021


Module: wine
Branch: master
Commit: 1ecd66200df5aa155f39a80e5b7b19842efafe0b
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=1ecd66200df5aa155f39a80e5b7b19842efafe0b

Author: Eric Pouech <eric.pouech at gmail.com>
Date:   Sun Sep 26 14:46:55 2021 +0200

dbghelp/dwarf: Split dwarf2_virtual_unwind into two functions.

Signed-off-by: Eric Pouech <eric.pouech at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/dbghelp/dwarf.c | 73 ++++++++++++++++++++++++++++++----------------------
 1 file changed, 42 insertions(+), 31 deletions(-)

diff --git a/dlls/dbghelp/dwarf.c b/dlls/dbghelp/dwarf.c
index 5f4ff8ad5d3..4edba930698 100644
--- a/dlls/dbghelp/dwarf.c
+++ b/dlls/dbghelp/dwarf.c
@@ -3568,41 +3568,30 @@ static void apply_frame_state(const struct module* module, struct cpu_stack_walk
     *context = new_context;
 }
 
-/***********************************************************************
- *           dwarf2_virtual_unwind
- *
- */
-BOOL dwarf2_virtual_unwind(struct cpu_stack_walk *csw, ULONG_PTR ip,
-    union ctx *context, DWORD64 *cfa)
+static BOOL dwarf2_fetch_frame_info(struct module* module, struct cpu* cpu, LONG_PTR ip, struct frame_info* info)
 {
-    struct module_pair pair;
-    struct frame_info info;
     dwarf2_traverse_context_t cie_ctx, fde_ctx;
     struct module_format* modfmt;
     const unsigned char* end;
     DWORD_PTR delta;
 
-    if (!(pair.pcs = process_find_by_handle(csw->hProcess)) ||
-        !(pair.requested = module_find_by_addr(pair.pcs, ip, DMT_UNKNOWN)) ||
-        !module_get_debug(&pair))
-        return FALSE;
-    modfmt = pair.effective->format_info[DFI_DWARF];
+    modfmt = module->format_info[DFI_DWARF];
     if (!modfmt) return FALSE;
-    memset(&info, 0, sizeof(info));
+    memset(info, 0, sizeof(*info));
     fde_ctx.data = modfmt->u.dwarf2_info->eh_frame.address;
     fde_ctx.end_data = fde_ctx.data + modfmt->u.dwarf2_info->eh_frame.size;
     /* let offsets relative to the eh_frame sections be correctly computed, as we'll map
      * in this process the IMAGE section at a different address as the one expected by
      * the image
      */
-    delta = pair.effective->module.BaseOfImage + modfmt->u.dwarf2_info->eh_frame.rva -
+    delta = module->module.BaseOfImage + modfmt->u.dwarf2_info->eh_frame.rva -
         (DWORD_PTR)modfmt->u.dwarf2_info->eh_frame.address;
-    if (!dwarf2_get_cie(ip, pair.effective, delta, &fde_ctx, &cie_ctx, &info, TRUE))
+    if (!dwarf2_get_cie(ip, module, delta, &fde_ctx, &cie_ctx, info, TRUE))
     {
         fde_ctx.data = modfmt->u.dwarf2_info->debug_frame.address;
         fde_ctx.end_data = fde_ctx.data + modfmt->u.dwarf2_info->debug_frame.size;
-        delta = pair.effective->reloc_delta;
-        if (!dwarf2_get_cie(ip, pair.effective, delta, &fde_ctx, &cie_ctx, &info, FALSE))
+        delta = module->reloc_delta;
+        if (!dwarf2_get_cie(ip, module, delta, &fde_ctx, &cie_ctx, info, FALSE))
         {
             TRACE("Couldn't find information for %lx\n", ip);
             return FALSE;
@@ -3610,23 +3599,45 @@ BOOL dwarf2_virtual_unwind(struct cpu_stack_walk *csw, ULONG_PTR ip,
     }
 
     TRACE("function %lx/%lx code_align %lu data_align %ld retaddr %s\n",
-          ip, info.ip, info.code_align, info.data_align,
-          csw->cpu->fetch_regname(csw->cpu->map_dwarf_register(info.retaddr_reg, pair.effective, TRUE)));
-
-    /* if at very beginning of function, return and use default unwinder */
-    if (ip == info.ip) return FALSE;
-    execute_cfa_instructions(pair.effective, &cie_ctx, ip, &info);
+          ip, info->ip, info->code_align, info->data_align,
+          cpu->fetch_regname(cpu->map_dwarf_register(info->retaddr_reg, module, TRUE)));
 
-    if (info.aug_z_format)  /* get length of augmentation data */
+    if (ip != info->ip)
     {
-        ULONG_PTR len = dwarf2_leb128_as_unsigned(&fde_ctx);
-        end = fde_ctx.data + len;
+        execute_cfa_instructions(module, &cie_ctx, ip, info);
+
+        if (info->aug_z_format)  /* get length of augmentation data */
+        {
+            ULONG_PTR len = dwarf2_leb128_as_unsigned(&fde_ctx);
+            end = fde_ctx.data + len;
+        }
+        else end = NULL;
+        dwarf2_parse_augmentation_ptr(&fde_ctx, info->lsda_encoding, modfmt->u.dwarf2_info->word_size); /* handler_data */
+        if (end) fde_ctx.data = end;
+
+        execute_cfa_instructions(module, &fde_ctx, ip, info);
     }
-    else end = NULL;
-    dwarf2_parse_augmentation_ptr(&fde_ctx, info.lsda_encoding, modfmt->u.dwarf2_info->word_size); /* handler_data */
-    if (end) fde_ctx.data = end;
+    return TRUE;
+}
 
-    execute_cfa_instructions(pair.effective, &fde_ctx, ip, &info);
+/***********************************************************************
+ *           dwarf2_virtual_unwind
+ *
+ */
+BOOL dwarf2_virtual_unwind(struct cpu_stack_walk *csw, ULONG_PTR ip,
+    union ctx *context, DWORD64 *cfa)
+{
+    struct module_pair pair;
+    struct frame_info info;
+
+    if (!(pair.pcs = process_find_by_handle(csw->hProcess)) ||
+        !(pair.requested = module_find_by_addr(pair.pcs, ip, DMT_UNKNOWN)) ||
+        !module_get_debug(&pair))
+        return FALSE;
+    if (!dwarf2_fetch_frame_info(pair.effective, csw->cpu, ip, &info)) return FALSE;
+
+    /* if at very beginning of function, return and use default unwinder */
+    if (ip == info.ip) return FALSE;
 
     /* if there is no information about retaddr, use default unwinder */
     if (info.state.rules[info.retaddr_reg] == RULE_UNSET) return FALSE;




More information about the wine-cvs mailing list