[PATCH 8/9] dbghelp/dwarf: add reference for a DIE to its CU

Eric Pouech eric.pouech at gmail.com
Wed Sep 15 03:38:29 CDT 2021


Dwarf4 (and GNU extensions) support following debug info in
a) different CU
b) different ELF/PE files
So add a field from debug_info into the parent context unit

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

---
 dlls/dbghelp/dwarf.c |   90 +++++++++++++++++++++++++-------------------------
 1 file changed, 45 insertions(+), 45 deletions(-)

diff --git a/dlls/dbghelp/dwarf.c b/dlls/dbghelp/dwarf.c
index e1702964efa..a9ff9ff2354 100644
--- a/dlls/dbghelp/dwarf.c
+++ b/dlls/dbghelp/dwarf.c
@@ -143,6 +143,7 @@ typedef struct dwarf2_debug_info_s
     const unsigned char**       data;
     struct vector               children;
     struct dwarf2_debug_info_s* parent;
+    struct dwarf2_parse_context_s* unit_ctx;
 } dwarf2_debug_info_t;
 
 typedef struct dwarf2_section_s
@@ -1033,20 +1034,19 @@ static BOOL dwarf2_compute_location_attr(dwarf2_parse_context_t* ctx,
     return TRUE;
 }
 
-static struct symt* dwarf2_lookup_type(dwarf2_parse_context_t* ctx,
-                                       const dwarf2_debug_info_t* di)
+static struct symt* dwarf2_lookup_type(const dwarf2_debug_info_t* di)
 {
     struct attribute attr;
     dwarf2_debug_info_t* type;
 
-    if (!dwarf2_find_attribute(ctx, di, DW_AT_type, &attr))
+    if (!dwarf2_find_attribute(di->unit_ctx, di, DW_AT_type, &attr))
         /* this is only valid if current language of CU is C or C++ */
-        return ctx->module_ctx->symt_cache[sc_void];
-    if (!(type = sparse_array_find(&ctx->debug_info_table, attr.u.uvalue)))
+        return di->unit_ctx->module_ctx->symt_cache[sc_void];
+    if (!(type = sparse_array_find(&di->unit_ctx->debug_info_table, attr.u.uvalue)))
     {
         if (attr.form == DW_FORM_ref_addr)
         {
-            dwarf2_parse_context_t* ref_ctx = dwarf2_locate_cu(ctx->module_ctx, attr.u.uvalue);
+            dwarf2_parse_context_t* ref_ctx = dwarf2_locate_cu(di->unit_ctx->module_ctx, attr.u.uvalue);
             /* ensure CU is fully loaded */
             if (ref_ctx && dwarf2_parse_compilation_unit(ref_ctx))
             {
@@ -1057,22 +1057,22 @@ static struct symt* dwarf2_lookup_type(dwarf2_parse_context_t* ctx,
         if (!type)
         {
             FIXME("Unable to find back reference to type 0x%lx (form=0x%lx)\n", attr.u.uvalue, attr.form);
-            return ctx->module_ctx->symt_cache[sc_unknown];
+            return di->unit_ctx->module_ctx->symt_cache[sc_unknown];
         }
     }
     if (type == di)
     {
         FIXME("Reference to itself\n");
-        return ctx->module_ctx->symt_cache[sc_unknown];
+        return di->unit_ctx->module_ctx->symt_cache[sc_unknown];
     }
     if (!type->symt)
     {
         /* load the debug info entity */
-        dwarf2_load_one_entry(ctx, type);
+        dwarf2_load_one_entry(di->unit_ctx, type);
         if (!type->symt)
         {
             FIXME("Unable to load forward reference for tag %lx\n", type->abbrev->tag);
-            return ctx->module_ctx->symt_cache[sc_unknown];
+            return di->unit_ctx->module_ctx->symt_cache[sc_unknown];
         }
     }
     return type->symt;
@@ -1218,6 +1218,7 @@ static BOOL dwarf2_read_one_debug_info(dwarf2_parse_context_t* ctx,
     di->abbrev = abbrev;
     di->symt   = NULL;
     di->parent = parent_di;
+    di->unit_ctx = ctx;
 
     if (abbrev->num_attr)
     {
@@ -1258,8 +1259,7 @@ static BOOL dwarf2_read_one_debug_info(dwarf2_parse_context_t* ctx,
     return TRUE;
 }
 
-static struct vector* dwarf2_get_di_children(dwarf2_parse_context_t* ctx,
-                                             dwarf2_debug_info_t* di)
+static struct vector* dwarf2_get_di_children(dwarf2_debug_info_t* di)
 {
     struct attribute    spec;
 
@@ -1267,8 +1267,8 @@ static struct vector* dwarf2_get_di_children(dwarf2_parse_context_t* ctx,
     {
         if (di->abbrev->have_child)
             return &di->children;
-        if (!dwarf2_find_attribute(ctx, di, DW_AT_specification, &spec)) break;
-        if (!(di = sparse_array_find(&ctx->debug_info_table, spec.u.uvalue)))
+        if (!dwarf2_find_attribute(di->unit_ctx, di, DW_AT_specification, &spec)) break;
+        if (!(di = sparse_array_find(&di->unit_ctx->debug_info_table, spec.u.uvalue)))
             FIXME("Should have found the debug info entry\n");
     }
     return NULL;
@@ -1305,7 +1305,7 @@ static struct symt* dwarf2_parse_base_type(dwarf2_parse_context_t* ctx,
     }
     di->symt = &symt_new_basic(ctx->module_ctx->module, bt, name.u.string, size.u.uvalue)->symt;
 
-    if (dwarf2_get_di_children(ctx, di)) FIXME("Unsupported children\n");
+    if (dwarf2_get_di_children(di)) FIXME("Unsupported children\n");
     return di->symt;
 }
 
@@ -1320,11 +1320,11 @@ static struct symt* dwarf2_parse_typedef(dwarf2_parse_context_t* ctx,
     TRACE("%s, for %lu\n", dwarf2_debug_ctx(ctx), di->abbrev->entry_code); 
 
     if (!dwarf2_find_attribute(ctx, di, DW_AT_name, &name)) name.u.string = NULL;
-    ref_type = dwarf2_lookup_type(ctx, di);
+    ref_type = dwarf2_lookup_type(di);
 
     if (name.u.string)
         di->symt = &symt_new_typedef(ctx->module_ctx->module, ref_type, name.u.string)->symt;
-    if (dwarf2_get_di_children(ctx, di)) FIXME("Unsupported children\n");
+    if (dwarf2_get_di_children(di)) FIXME("Unsupported children\n");
     return di->symt;
 }
 
@@ -1339,9 +1339,9 @@ static struct symt* dwarf2_parse_pointer_type(dwarf2_parse_context_t* ctx,
     TRACE("%s, for %s\n", dwarf2_debug_ctx(ctx), dwarf2_debug_di(di)); 
 
     if (!dwarf2_find_attribute(ctx, di, DW_AT_byte_size, &size)) size.u.uvalue = sizeof(void *);
-    ref_type = dwarf2_lookup_type(ctx, di);
+    ref_type = dwarf2_lookup_type(di);
     di->symt = &symt_new_pointer(ctx->module_ctx->module, ref_type, size.u.uvalue)->symt;
-    if (dwarf2_get_di_children(ctx, di)) FIXME("Unsupported children\n");
+    if (dwarf2_get_di_children(di)) FIXME("Unsupported children\n");
     return di->symt;
 }
 
@@ -1359,9 +1359,9 @@ static struct symt* dwarf2_parse_array_type(dwarf2_parse_context_t* ctx,
 
     TRACE("%s, for %s\n", dwarf2_debug_ctx(ctx), dwarf2_debug_di(di));
 
-    ref_type = dwarf2_lookup_type(ctx, di);
+    ref_type = dwarf2_lookup_type(di);
 
-    if (!(children = dwarf2_get_di_children(ctx, di)))
+    if (!(children = dwarf2_get_di_children(di)))
     {
         /* fake an array with unknown size */
         /* FIXME: int4 even on 64bit machines??? */
@@ -1376,7 +1376,7 @@ static struct symt* dwarf2_parse_array_type(dwarf2_parse_context_t* ctx,
         switch (child->abbrev->tag)
         {
         case DW_TAG_subrange_type:
-            idx_type = dwarf2_lookup_type(ctx, child);
+            idx_type = dwarf2_lookup_type(child);
             if (!dwarf2_find_attribute(ctx, child, DW_AT_lower_bound, &min))
                 min.u.uvalue = 0;
             if (dwarf2_find_attribute(ctx, child, DW_AT_upper_bound, &max))
@@ -1403,8 +1403,8 @@ static struct symt* dwarf2_parse_const_type(dwarf2_parse_context_t* ctx,
 
     TRACE("%s, for %s\n", dwarf2_debug_ctx(ctx), dwarf2_debug_di(di));
 
-    ref_type = dwarf2_lookup_type(ctx, di);
-    if (dwarf2_get_di_children(ctx, di)) FIXME("Unsupported children\n");
+    ref_type = dwarf2_lookup_type(di);
+    if (dwarf2_get_di_children(di)) FIXME("Unsupported children\n");
     di->symt = ref_type;
 
     return ref_type;
@@ -1419,8 +1419,8 @@ static struct symt* dwarf2_parse_volatile_type(dwarf2_parse_context_t* ctx,
 
     TRACE("%s, for %s\n", dwarf2_debug_ctx(ctx), dwarf2_debug_di(di));
 
-    ref_type = dwarf2_lookup_type(ctx, di);
-    if (dwarf2_get_di_children(ctx, di)) FIXME("Unsupported children\n");
+    ref_type = dwarf2_lookup_type(di);
+    if (dwarf2_get_di_children(di)) FIXME("Unsupported children\n");
     di->symt = ref_type;
 
     return ref_type;
@@ -1444,7 +1444,7 @@ static struct symt* dwarf2_parse_unspecified_type(dwarf2_parse_context_t* ctx,
     basic = symt_new_basic(ctx->module_ctx->module, btVoid, name.u.string, size.u.uvalue);
     di->symt = &basic->symt;
 
-    if (dwarf2_get_di_children(ctx, di)) FIXME("Unsupported children\n");
+    if (dwarf2_get_di_children(di)) FIXME("Unsupported children\n");
     return di->symt;
 }
 
@@ -1457,11 +1457,11 @@ static struct symt* dwarf2_parse_reference_type(dwarf2_parse_context_t* ctx,
 
     TRACE("%s, for %s\n", dwarf2_debug_ctx(ctx), dwarf2_debug_di(di));
 
-    ref_type = dwarf2_lookup_type(ctx, di);
+    ref_type = dwarf2_lookup_type(di);
     /* FIXME: for now, we hard-wire C++ references to pointers */
     di->symt = &symt_new_pointer(ctx->module_ctx->module, ref_type, sizeof(void *))->symt;
 
-    if (dwarf2_get_di_children(ctx, di)) FIXME("Unsupported children\n");
+    if (dwarf2_get_di_children(di)) FIXME("Unsupported children\n");
 
     return di->symt;
 }
@@ -1481,7 +1481,7 @@ static void dwarf2_parse_udt_member(dwarf2_parse_context_t* ctx,
     TRACE("%s, for %s\n", dwarf2_debug_ctx(ctx), dwarf2_debug_di(di));
 
     if (!dwarf2_find_attribute(ctx, di, DW_AT_name, &name)) name.u.string = NULL;
-    elt_type = dwarf2_lookup_type(ctx, di);
+    elt_type = dwarf2_lookup_type(di);
     if (dwarf2_compute_location_attr(ctx, di, DW_AT_data_member_location, &loc, NULL))
     {
         if (loc.kind != loc_absolute)
@@ -1516,7 +1516,7 @@ static void dwarf2_parse_udt_member(dwarf2_parse_context_t* ctx,
                          loc.offset, bit_offset.u.uvalue,
                          bit_size.u.uvalue);
 
-    if (dwarf2_get_di_children(ctx, di)) FIXME("Unsupported children\n");
+    if (dwarf2_get_di_children(di)) FIXME("Unsupported children\n");
 }
 
 static struct symt* dwarf2_parse_subprogram(dwarf2_parse_context_t* ctx,
@@ -1544,7 +1544,7 @@ static struct symt* dwarf2_parse_udt_type(dwarf2_parse_context_t* ctx,
     di->symt = &symt_new_udt(ctx->module_ctx->module, dwarf2_get_cpp_name(ctx, di, name.u.string),
                              size.u.uvalue, udt)->symt;
 
-    children = dwarf2_get_di_children(ctx, di);
+    children = dwarf2_get_di_children(di);
     if (children) for (i = 0; i < vector_length(children); i++)
     {
         child = *(dwarf2_debug_info_t**)vector_at(children, i);
@@ -1606,7 +1606,7 @@ static void dwarf2_parse_enumerator(dwarf2_parse_context_t* ctx,
     if (!dwarf2_find_attribute(ctx, di, DW_AT_const_value, &value)) value.u.svalue = 0;
     symt_add_enum_element(ctx->module_ctx->module, parent, name.u.string, value.u.svalue);
 
-    if (dwarf2_get_di_children(ctx, di)) FIXME("Unsupported children\n");
+    if (dwarf2_get_di_children(di)) FIXME("Unsupported children\n");
 }
 
 static struct symt* dwarf2_parse_enumeration_type(dwarf2_parse_context_t* ctx,
@@ -1636,7 +1636,7 @@ static struct symt* dwarf2_parse_enumeration_type(dwarf2_parse_context_t* ctx,
 
     di->symt = &symt_new_enum(ctx->module_ctx->module, name.u.string, &basetype->symt)->symt;
 
-    children = dwarf2_get_di_children(ctx, di);
+    children = dwarf2_get_di_children(di);
     /* FIXME: should we use the sibling stuff ?? */
     if (children) for (i = 0; i < vector_length(children); i++)
     {
@@ -1682,7 +1682,7 @@ static void dwarf2_parse_variable(dwarf2_subprogram_t* subpgm,
     TRACE("%s, for %s\n", dwarf2_debug_ctx(subpgm->ctx), dwarf2_debug_di(di));
 
     is_pmt = !block && di->abbrev->tag == DW_TAG_formal_parameter;
-    param_type = dwarf2_lookup_type(subpgm->ctx, di);
+    param_type = dwarf2_lookup_type(di);
         
     if (!dwarf2_find_attribute(subpgm->ctx, di, DW_AT_name, &name)) {
 	/* cannot do much without the name, the functions below won't like it. */
@@ -1809,7 +1809,7 @@ static void dwarf2_parse_variable(dwarf2_subprogram_t* subpgm,
                                               (struct symt_function_signature*)subpgm->func->type,
                                               param_type);
 
-    if (dwarf2_get_di_children(subpgm->ctx, di)) FIXME("Unsupported children\n");
+    if (dwarf2_get_di_children(di)) FIXME("Unsupported children\n");
 }
 
 static void dwarf2_parse_subprogram_label(dwarf2_subprogram_t* subpgm,
@@ -1860,7 +1860,7 @@ static void dwarf2_parse_inlined_subroutine(dwarf2_subprogram_t* subpgm,
                                  subpgm->ctx->module_ctx->load_offset + low_pc - subpgm->func->address,
                                  high_pc - low_pc);
 
-    children = dwarf2_get_di_children(subpgm->ctx, di);
+    children = dwarf2_get_di_children(di);
     if (children) for (i = 0; i < vector_length(children); i++)
     {
         child = *(dwarf2_debug_info_t**)vector_at(children, i);
@@ -1914,7 +1914,7 @@ static void dwarf2_parse_subprogram_block(dwarf2_subprogram_t* subpgm,
                                  subpgm->ctx->module_ctx->load_offset + low_pc - subpgm->func->address,
                                  high_pc - low_pc);
 
-    children = dwarf2_get_di_children(subpgm->ctx, di);
+    children = dwarf2_get_di_children(di);
     if (children) for (i = 0; i < vector_length(children); i++)
     {
         child = *(dwarf2_debug_info_t**)vector_at(children, i);
@@ -2025,7 +2025,7 @@ static struct symt* dwarf2_parse_subprogram(dwarf2_parse_context_t* ctx,
      */
     if (elf_is_in_thunk_area(ctx->module_ctx->load_offset + low_pc, ctx->module_ctx->thunks) >= 0)
         return NULL;
-    ret_type = dwarf2_lookup_type(ctx, di);
+    ret_type = dwarf2_lookup_type(di);
 
     /* FIXME: assuming C source code */
     sig_type = symt_new_function_signature(ctx->module_ctx->module, ret_type, CV_CALL_FAR_C);
@@ -2045,7 +2045,7 @@ static struct symt* dwarf2_parse_subprogram(dwarf2_parse_context_t* ctx,
     }
     subpgm.non_computed_variable = FALSE;
 
-    children = dwarf2_get_di_children(ctx, di);
+    children = dwarf2_get_di_children(di);
     if (children) for (i = 0; i < vector_length(children); i++)
     {
         child = *(dwarf2_debug_info_t**)vector_at(children, i);
@@ -2119,12 +2119,12 @@ static struct symt* dwarf2_parse_subroutine_type(dwarf2_parse_context_t* ctx,
 
     TRACE("%s, for %s\n", dwarf2_debug_ctx(ctx), dwarf2_debug_di(di));
 
-    ret_type = dwarf2_lookup_type(ctx, di);
+    ret_type = dwarf2_lookup_type(di);
 
     /* FIXME: assuming C source code */
     sig_type = symt_new_function_signature(ctx->module_ctx->module, ret_type, CV_CALL_FAR_C);
 
-    children = dwarf2_get_di_children(ctx, di);
+    children = dwarf2_get_di_children(di);
     if (children) for (i = 0; i < vector_length(children); i++)
     {
         child = *(dwarf2_debug_info_t**)vector_at(children, i);
@@ -2133,7 +2133,7 @@ static struct symt* dwarf2_parse_subroutine_type(dwarf2_parse_context_t* ctx,
         {
         case DW_TAG_formal_parameter:
             symt_add_function_signature_parameter(ctx->module_ctx->module, sig_type,
-                                                  dwarf2_lookup_type(ctx, child));
+                                                  dwarf2_lookup_type(child));
             break;
         case DW_TAG_unspecified_parameters:
             WARN("Unsupported unspecified parameters\n");
@@ -2157,7 +2157,7 @@ static void dwarf2_parse_namespace(dwarf2_parse_context_t* ctx,
 
     di->symt = ctx->module_ctx->symt_cache[sc_void];
 
-    children = dwarf2_get_di_children(ctx, di);
+    children = dwarf2_get_di_children(di);
     if (children) for (i = 0; i < vector_length(children); i++)
     {
         child = *(dwarf2_debug_info_t**)vector_at(children, i);
@@ -2592,7 +2592,7 @@ static BOOL dwarf2_parse_compilation_unit(dwarf2_parse_context_t* ctx)
                                                 source_new(ctx->module_ctx->module, comp_dir.u.string, name.u.string));
             dwarf2_cache_cuhead(ctx->module_ctx->module->format_info[DFI_DWARF]->u.dwarf2_info, ctx->compiland, &ctx->head);
             di->symt = &ctx->compiland->symt;
-            children = dwarf2_get_di_children(ctx, di);
+            children = dwarf2_get_di_children(di);
             if (children) for (i = 0; i < vector_length(children); i++)
             {
                 child = *(dwarf2_debug_info_t**)vector_at(children, i);




More information about the wine-devel mailing list