Peter Oberndorfer : dbghelp: Make dwarf2 parser handle file paths relative to working dir better.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Nov 6 08:48:56 CST 2006


Module: wine
Branch: master
Commit: fd2d43f13171220085ce557e12d50043ca390483
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=fd2d43f13171220085ce557e12d50043ca390483

Author: Peter Oberndorfer <kumbayo84 at arcor.de>
Date:   Sun Nov  5 23:30:52 2006 +0100

dbghelp: Make dwarf2 parser handle file paths relative to working dir better.

---

 dlls/dbghelp/dwarf.c |   34 ++++++++++++++++++++++++++++------
 1 files changed, 28 insertions(+), 6 deletions(-)

diff --git a/dlls/dbghelp/dwarf.c b/dlls/dbghelp/dwarf.c
index 2f22d9e..eab1f04 100644
--- a/dlls/dbghelp/dwarf.c
+++ b/dlls/dbghelp/dwarf.c
@@ -1582,6 +1582,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;
@@ -1615,13 +1616,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++;
 
@@ -1788,9 +1804,15 @@ static BOOL dwarf2_parse_compilation_uni
         struct attribute            name;
         dwarf2_debug_info_t**       pdi = NULL;
         struct attribute            stmt_list;
+        struct attribute            comp_dir;
 
         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))
+            comp_dir.u.string = NULL;
+
+        di->symt = &symt_new_compiland(module, source_new(module, comp_dir.u.string, name.u.string))->symt;
 
         if (di->abbrev->have_child)
         {
@@ -1801,7 +1823,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, comp_dir.u.string, stmt_list.u.uvalue);
         }
         ret = TRUE;
     }




More information about the wine-cvs mailing list