Eric Pouech : dbghelp: dwarf: Generate the current source file and store it in dbghelp's internals.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Jun 20 05:23:44 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: 8a92d9ae497149f1ab9165e5f1a854f38d84c5b7
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=8a92d9ae497149f1ab9165e5f1a854f38d84c5b7

Author: Eric Pouech <eric.pouech at wanadoo.fr>
Date:   Sun Jun 18 21:32:24 2006 +0200

dbghelp: dwarf: Generate the current source file and store it in dbghelp's internals.

---

 dlls/dbghelp/dwarf.c |   49 +++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 41 insertions(+), 8 deletions(-)

diff --git a/dlls/dbghelp/dwarf.c b/dlls/dbghelp/dwarf.c
index 701fd5c..f385544 100644
--- a/dlls/dbghelp/dwarf.c
+++ b/dlls/dbghelp/dwarf.c
@@ -57,7 +57,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(dbghelp_dwarf
  * - Functions:
  *      o unspecified parameters
  *      o inlined functions
- *      o line numbers
  *      o Debug{Start|End}Point
  *      o CFA
  * - Udt
@@ -527,7 +526,7 @@ static unsigned long dwarf2_compute_loca
             {
             case DW_OP_addr:    loc[++stk] = dwarf2_parse_addr(&lctx); break;
             case DW_OP_const1u: loc[++stk] = dwarf2_parse_byte(&lctx); break;
-            case DW_OP_const1s: loc[++stk] = (long)(char)dwarf2_parse_byte(&lctx); break;
+            case DW_OP_const1s: loc[++stk] = (long)(signed char)dwarf2_parse_byte(&lctx); break;
             case DW_OP_const2u: loc[++stk] = dwarf2_parse_u2(&lctx); break;
             case DW_OP_const2s: loc[++stk] = (long)(short)dwarf2_parse_u2(&lctx); break;
             case DW_OP_const4u: loc[++stk] = dwarf2_parse_u4(&lctx); break;
@@ -1380,6 +1379,22 @@ static void dwarf2_load_one_entry(dwarf2
     }
 }
 
+static void dwarf2_set_line_number(struct module* module, unsigned long address,
+                                   struct vector* v, unsigned file, unsigned line)
+{
+    struct symt_function*       func;
+    int                         idx;
+    unsigned*                   psrc;
+
+    if (!file || !(psrc = vector_at(v, file - 1))) return;
+
+    TRACE("%s %lx %s %u\n", module->module.ModuleName, address, source_get(module, *psrc), line);
+    if ((idx = symt_find_nearest(module, address)) == -1 ||
+        module->addr_sorttab[idx]->symt.tag != SymTagFunction) return;
+    func = (struct symt_function*)module->addr_sorttab[idx];
+    symt_add_func_line(module, func, *psrc, line, address - func->address);
+}
+
 static void dwarf2_parse_line_numbers(const dwarf2_section_t* sections,        
                                       dwarf2_parse_context_t* ctx,
                                       unsigned long offset)
@@ -1390,6 +1405,9 @@ static void dwarf2_parse_line_numbers(co
     unsigned                    line_range, opcode_base;
     int                         line_base;
     const unsigned char*        opcode_len;
+    struct vector               dirs;
+    struct vector               files;
+    const char**                p;
 
     traverse.sections = sections;
     traverse.section = section_line;
@@ -1406,31 +1424,42 @@ static void dwarf2_parse_line_numbers(co
     header_len = dwarf2_parse_u4(&traverse);
     insn_size = dwarf2_parse_byte(&traverse);
     default_stmt = dwarf2_parse_byte(&traverse);
-    line_base = (char)dwarf2_parse_byte(&traverse);
+    line_base = (signed char)dwarf2_parse_byte(&traverse);
     line_range = dwarf2_parse_byte(&traverse);
     opcode_base = dwarf2_parse_byte(&traverse);
 
     opcode_len = traverse.data;
-    traverse.data += opcode_base;
+    traverse.data += opcode_base - 1;
 
+    vector_init(&dirs, sizeof(const char*), 4);
+    p = vector_add(&dirs, &ctx->pool);
+    *p = ".";
     while (*traverse.data)
     {
         TRACE("Got include %s\n", (const char*)traverse.data);
+        p = vector_add(&dirs, &ctx->pool);
+        *p = (const char *)traverse.data;
         traverse.data += strlen((const char *)traverse.data) + 1;
     }
     traverse.data++;
+
+    vector_init(&files, sizeof(unsigned), 16);
     while (*traverse.data)
     {
-        unsigned int dir_index, mod_time, length;
-        const char* name;
+        unsigned int    dir_index, mod_time, length;
+        const char*     name;
+        const char*     dir;
+        unsigned*       psrc;
 
         name = (const char*)traverse.data;
         traverse.data += strlen(name) + 1;
         dir_index = dwarf2_leb128_as_unsigned(&traverse);
         mod_time = dwarf2_leb128_as_unsigned(&traverse);
         length = dwarf2_leb128_as_unsigned(&traverse);
-        TRACE("Got file %s (%u,%u,%u)\n",
-              name, dir_index, mod_time, length);
+        dir = *(const char**)vector_at(&dirs, dir_index);
+        TRACE("Got file %s/%s (%u,%u)\n", dir, name, mod_time, length);
+        psrc = vector_add(&files, &ctx->pool);
+        *psrc = source_new(ctx->module, dir, name);
     }
     traverse.data++;
 
@@ -1455,6 +1484,7 @@ static void dwarf2_parse_line_numbers(co
                 address += (delta / line_range) * insn_size;
                 line += line_base + (delta % line_range);
                 basic_block = TRUE;
+                dwarf2_set_line_number(ctx->module, address, &files, file, line);
             }
             else
             {
@@ -1462,6 +1492,7 @@ static void dwarf2_parse_line_numbers(co
                 {
                 case DW_LNS_copy:
                     basic_block = FALSE;
+                    dwarf2_set_line_number(ctx->module, address, &files, file, line);
                     break;
                 case DW_LNS_advance_pc:
                     address += insn_size * dwarf2_leb128_as_unsigned(&traverse);
@@ -1493,12 +1524,14 @@ static void dwarf2_parse_line_numbers(co
                     switch (extopcode)
                     {
                     case DW_LNE_end_sequence:
+                        dwarf2_set_line_number(ctx->module, address, &files, file, line);
                         end_sequence = TRUE;
                         break;
                     case DW_LNE_set_address:
                         address = ctx->module->module.BaseOfImage + dwarf2_parse_addr(&traverse);
                         break;
                     case DW_LNE_define_file:
+                        FIXME("not handled %s\n", traverse.data);
                         traverse.data += strlen((const char *)traverse.data) + 1;
                         dwarf2_leb128_as_unsigned(&traverse);
                         dwarf2_leb128_as_unsigned(&traverse);




More information about the wine-cvs mailing list