[PATCH 19/19] [DbgHelp]: adding support for the newest line number information in pdb files

Eric Pouech eric.pouech at orange.fr
Mon Sep 29 14:32:38 CDT 2008




A+
---

 dlls/dbghelp/msc.c |   70 +++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 69 insertions(+), 1 deletions(-)


diff --git a/dlls/dbghelp/msc.c b/dlls/dbghelp/msc.c
index e18276d..cd2cf9b 100644
--- a/dlls/dbghelp/msc.c
+++ b/dlls/dbghelp/msc.c
@@ -4,7 +4,7 @@
  *
  * Copyright (C) 1996,      Eric Youngdale.
  * Copyright (C) 1999-2000, Ulrich Weigand.
- * Copyright (C) 2004-2006, Eric Pouech.
+ * Copyright (C) 2004-2009, Eric Pouech.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -1324,6 +1324,52 @@ static void codeview_snarf_linetab(const struct msc_debug_info* msc_dbg, const B
     }
 }
 
+static void codeview_snarf_linetab2(const struct msc_debug_info* msc_dbg, const BYTE* linetab, DWORD size,
+                                     const char* strimage, DWORD strsize)
+{
+    DWORD       offset;
+    unsigned    i;
+    DWORD       addr;
+    const struct codeview_linetab2_block* lbh;
+    const struct codeview_linetab2_file* fd;
+    unsigned    source;
+    struct symt_function* func;
+
+    if (*(const DWORD*)linetab != 0x000000f4) return;
+    offset = *((const DWORD*)linetab + 1);
+
+    for (lbh = (const struct codeview_linetab2_block*)(linetab + 8 + offset);
+         (const BYTE*)lbh < linetab + size;
+         lbh = (const struct codeview_linetab2_block*)((const char*)lbh + 8 + lbh->size_of_block))
+    {
+        if (lbh->header != 0x000000f2)
+        /* FIXME: should also check that whole lbh fits in linetab + size */
+        {
+            TRACE("block end %x\n", lbh->header);
+            break;
+        }
+        addr = codeview_get_address(msc_dbg, lbh->seg, lbh->start);
+        TRACE("block from %04x:%08x #%x (%x lines)\n",
+               lbh->seg, lbh->start, lbh->size, lbh->nlines);
+        fd = (const struct codeview_linetab2_file*)(linetab + 8 + lbh->file_offset);
+        /* FIXME: should check that string is within strimage + strsize */
+        source = source_new(msc_dbg->module, NULL, strimage + fd->offset);
+        func = (struct symt_function*)symt_find_nearest(msc_dbg->module, addr);
+        /* FIXME: at least labels support line numbers */
+        if (!func || func->symt.tag != SymTagFunction)
+        {
+            WARN("--not a func at %04x:%08x %x tag=%d\n",
+                 lbh->seg, lbh->start, addr, func ? func->symt.tag : -1);
+            continue;
+        }
+        for (i = 0; i < lbh->nlines; i++)
+        {
+            symt_add_func_line(msc_dbg->module, func, source,
+                               lbh->l[i].lineno ^ 0x80000000, lbh->l[i].offset - lbh->start);
+        }
+    }
+}
+
 /*========================================================================
  * Process CodeView symbol information.
  */
@@ -2351,6 +2397,8 @@ static BOOL pdb_process_internal(const struct process* pcs,
     HANDLE      hFile, hMap = NULL;
     char*       image = NULL;
     BYTE*       symbols_image = NULL;
+    char*       files_image = NULL;
+    DWORD       files_size = 0;
 
     TRACE("Processing PDB file %s\n", pdb_lookup->filename);
 
@@ -2386,6 +2434,21 @@ static BOOL pdb_process_internal(const struct process* pcs,
                 symbols.version, symbols.version);
         }
 
+        files_image = pdb_read_file(image, pdb_lookup, 12);   /* FIXME: really fixed ??? */
+        if (files_image)
+        {
+            if (*(const DWORD*)files_image == 0xeffeeffe)
+            {
+                files_size = *(const DWORD*)(files_image + 8);
+            }
+            else
+            {
+                WARN("wrong header %x expecting 0xeffeeffe\n", *(const DWORD*)files_image);
+                free(files_image);
+                files_image = NULL;
+            }
+        }
+
         pdb_process_symbol_imports(pcs, msc_dbg, &symbols, symbols_image, image, pdb_lookup, module_index);
 
         /* Read global symbol table */
@@ -2419,6 +2482,10 @@ static BOOL pdb_process_internal(const struct process* pcs,
                                            modimage + sfile.symbol_size,
                                            sfile.lineno_size,
                                            pdb_lookup->kind == PDB_JG);
+                if (files_image)
+                    codeview_snarf_linetab2(msc_dbg, modimage + sfile.symbol_size + sfile.lineno_size,
+                                   pdb_get_file_size(pdb_lookup, sfile.file) - sfile.symbol_size - sfile.lineno_size,
+                                   files_image + 12, files_size);
 
                 pdb_free(modimage);
             }
@@ -2443,6 +2510,7 @@ static BOOL pdb_process_internal(const struct process* pcs,
  leave:
     /* Cleanup */
     pdb_free(symbols_image);
+    pdb_free(files_image);
     pdb_free_lookup(pdb_lookup);
 
     if (image) UnmapViewOfFile(image);





More information about the wine-patches mailing list