[PATCH 5/9] dbghelp/dwarf: Added ability to get to a DIE in a different CU
Eric Pouech
eric.pouech at gmail.com
Wed Sep 15 03:38:10 CDT 2021
Signed-off-by: Eric Pouech <eric.pouech at gmail.com>
---
dlls/dbghelp/dwarf.c | 34 +++++++++++++++++++++++++++++++++-
1 file changed, 33 insertions(+), 1 deletion(-)
diff --git a/dlls/dbghelp/dwarf.c b/dlls/dbghelp/dwarf.c
index 855168a6085..a2ee234f79f 100644
--- a/dlls/dbghelp/dwarf.c
+++ b/dlls/dbghelp/dwarf.c
@@ -188,6 +188,8 @@ enum unit_status
UNIT_ERROR,
UNIT_NOTLOADED,
UNIT_LOADED,
+ UNIT_LOADED_FAIL,
+ UNIT_BEINGLOADED,
};
/* this is the context used for parsing a compilation unit
@@ -224,6 +226,8 @@ struct dwarf2_module_info_s
/* forward declarations */
static struct symt* dwarf2_parse_enumeration_type(dwarf2_parse_context_t* ctx, dwarf2_debug_info_t* entry);
+static BOOL dwarf2_parse_compilation_unit(dwarf2_parse_context_t* ctx);
+static dwarf2_parse_context_t* dwarf2_locate_cu(dwarf2_parse_module_context_t* module_ctx, ULONG_PTR ref);
static unsigned char dwarf2_get_byte(const unsigned char* ptr)
{
@@ -2450,6 +2454,22 @@ unsigned dwarf2_cache_cuhead(struct dwarf2_module_info_s* module, struct symt_co
return TRUE;
}
+static inline dwarf2_parse_context_t* dwarf2_locate_cu(dwarf2_parse_module_context_t* module_ctx, ULONG_PTR ref)
+{
+ unsigned i;
+ dwarf2_parse_context_t* ctx;
+ const BYTE* where;
+ for (i = 0; i < module_ctx->unit_contexts.num_elts; ++i)
+ {
+ ctx = vector_at(&module_ctx->unit_contexts, i);
+ where = module_ctx->sections[ctx->section].address + ref;
+ if (where >= ctx->traverse_DIE.data && where < ctx->traverse_DIE.end_data)
+ return ctx;
+ }
+ FIXME("Couldn't find ref 0x%lx inside sect\n", ref);
+ return NULL;
+}
+
static BOOL dwarf2_parse_compilation_unit_head(dwarf2_parse_context_t* ctx,
dwarf2_traverse_context_t* mod_ctx)
{
@@ -2516,8 +2536,19 @@ static BOOL dwarf2_parse_compilation_unit(dwarf2_parse_context_t* ctx)
dwarf2_traverse_context_t cu_ctx = ctx->traverse_DIE;
BOOL ret = FALSE;
- if (ctx->status == UNIT_ERROR) return FALSE;
+ switch (ctx->status)
+ {
+ case UNIT_ERROR: return FALSE;
+ case UNIT_BEINGLOADED:
+ FIXME("Circular deps on CU\n");
+ /* fall through */
+ case UNIT_LOADED:
+ case UNIT_LOADED_FAIL:
+ return TRUE;
+ case UNIT_NOTLOADED: break;
+ }
+ ctx->status = UNIT_BEINGLOADED;
if (dwarf2_read_one_debug_info(ctx, &cu_ctx, NULL, &di))
{
if (di->abbrev->tag == DW_TAG_compile_unit)
@@ -2558,6 +2589,7 @@ static BOOL dwarf2_parse_compilation_unit(dwarf2_parse_context_t* ctx)
}
else FIXME("Should have a compilation unit here\n");
}
+ if (ctx->status == UNIT_BEINGLOADED) ctx->status = UNIT_LOADED_FAIL;
return ret;
}
More information about the wine-devel
mailing list