From e2aeb752b94ca589e26da30567b7f4ac31644917 Mon Sep 17 00:00:00 2001 From: Peter Oberndorfer Date: Sun, 5 Nov 2006 18:58:11 +0100 Subject: [PATCH] dbghelp: make dwarf2 parser handle file paths relative to working dir better needed for files produced by gcc4 --- dlls/dbghelp/dwarf.c | 35 +++++++++++++++++++++++++++++------ 1 files changed, 29 insertions(+), 6 deletions(-) diff --git a/dlls/dbghelp/dwarf.c b/dlls/dbghelp/dwarf.c index 91e7eac..fe7a398 100644 --- a/dlls/dbghelp/dwarf.c +++ b/dlls/dbghelp/dwarf.c @@ -1583,6 +1583,7 @@ static void dwarf2_set_line_number(struc static void dwarf2_parse_line_numbers(const dwarf2_section_t* sections, dwarf2_parse_context_t* ctx, + const char* compile_dir, unsigned long offset) { dwarf2_traverse_context_t traverse; @@ -1620,13 +1621,28 @@ static void dwarf2_parse_line_numbers(co vector_init(&dirs, sizeof(const char*), 4); p = vector_add(&dirs, &ctx->pool); - *p = "."; + *p = compile_dir ? compile_dir : "."; while (*traverse.data) { - TRACE("Got include %s\n", (const char*)traverse.data); + const char* rel = (const char*)traverse.data; + unsigned rellen = strlen(rel); + TRACE("Got include %s\n", rel); + traverse.data += rellen + 1; p = vector_add(&dirs, &ctx->pool); - *p = (const char *)traverse.data; - traverse.data += strlen((const char *)traverse.data) + 1; + + if (*rel == '/' || !compile_dir) + *p = rel; + else + { + /* include directory relative to compile directory */ + unsigned baselen = strlen(compile_dir); + char* tmp = pool_alloc(&ctx->pool, baselen + 1 + rellen + 1); + strcpy(tmp, compile_dir); + if (tmp[baselen - 1] != '/') tmp[baselen++] = '/'; + strcpy(&tmp[baselen], rel); + *p = tmp; + } + } traverse.data++; @@ -1793,9 +1809,16 @@ static BOOL dwarf2_parse_compilation_uni struct attribute name; dwarf2_debug_info_t** pdi = NULL; struct attribute stmt_list; + struct attribute comp_dir; + const char * cdir = NULL; dwarf2_find_name(&ctx, di, &name, "compiland"); - di->symt = &symt_new_compiland(module, source_new(module, NULL, name.u.string))->symt; + + /* get working directory of current compilation unit */ + if (dwarf2_find_attribute(&ctx, di, DW_AT_comp_dir, &comp_dir)) + cdir = comp_dir.u.string; + + di->symt = &symt_new_compiland(module, source_new(module, cdir, name.u.string))->symt; if (di->abbrev->have_child) { @@ -1806,7 +1829,7 @@ static BOOL dwarf2_parse_compilation_uni } if (dwarf2_find_attribute(&ctx, di, DW_AT_stmt_list, &stmt_list)) { - dwarf2_parse_line_numbers(sections, &ctx, stmt_list.u.uvalue); + dwarf2_parse_line_numbers(sections, &ctx, cdir, stmt_list.u.uvalue); } ret = TRUE; } -- 1.4.3.3