Eric Pouech : dbghelp/pdb: Let codeview_snarf() handle all module debug information.

Alexandre Julliard julliard at winehq.org
Mon Nov 8 15:45:07 CST 2021


Module: wine
Branch: master
Commit: 3bc073d8bf9c417eac761a0f6e77500048a68e26
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=3bc073d8bf9c417eac761a0f6e77500048a68e26

Author: Eric Pouech <eric.pouech at gmail.com>
Date:   Mon Nov  8 14:59:20 2021 +0100

dbghelp/pdb: Let codeview_snarf() handle all module debug information.

Except old linetab v1.

Signed-off-by: Eric Pouech <eric.pouech at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/dbghelp/msc.c | 62 +++++++++++++++++++++++++++++++++---------------------
 1 file changed, 38 insertions(+), 24 deletions(-)

diff --git a/dlls/dbghelp/msc.c b/dlls/dbghelp/msc.c
index d7b1e74edcd..12334a2e69d 100644
--- a/dlls/dbghelp/msc.c
+++ b/dlls/dbghelp/msc.c
@@ -90,6 +90,15 @@ struct pdb_module_info
 
 #define loc_cv_local_range (loc_user + 0) /* loc.offset contain the copy of all defrange* Codeview records following S_LOCAL */
 
+struct cv_module_snarf
+{
+    const struct codeview_type_parse*           ipi_ctp;
+    const struct CV_DebugSSubsectionHeader_t*   dbgsubsect;
+    unsigned                                    dbgsubsect_size;
+    const char*                                 strimage;
+    unsigned                                    strsize;
+};
+
 /*========================================================================
  * Debug file access helper routines
  */
@@ -1468,11 +1477,11 @@ 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)
+static void codeview_snarf_linetab2(const struct msc_debug_info* msc_dbg, const struct cv_module_snarf* cvmod)
 {
     unsigned    i;
     DWORD_PTR       addr;
+    const void* hdr_last = (const char*)cvmod->dbgsubsect + cvmod->dbgsubsect_size;
     const struct CV_DebugSSubsectionHeader_t*     hdr;
     const struct CV_DebugSSubsectionHeader_t*     hdr_next;
     const struct CV_DebugSSubsectionHeader_t*     hdr_files = NULL;
@@ -1484,15 +1493,13 @@ static void codeview_snarf_linetab2(const struct msc_debug_info* msc_dbg, const
     struct symt_function* func;
 
     /* locate DEBUG_S_FILECHKSMS (if any) */
-    hdr = (const struct CV_DebugSSubsectionHeader_t*)linetab;
-    while (CV_IS_INSIDE(hdr, linetab + size))
+    for (hdr = cvmod->dbgsubsect; CV_IS_INSIDE(hdr, hdr_last); hdr = CV_RECORD_GAP(hdr, hdr->cbLen))
     {
         if (hdr->type == DEBUG_S_FILECHKSMS)
         {
             hdr_files = hdr;
             break;
         }
-        hdr = CV_RECORD_GAP(hdr, hdr->cbLen);
     }
     if (!hdr_files)
     {
@@ -1500,8 +1507,7 @@ static void codeview_snarf_linetab2(const struct msc_debug_info* msc_dbg, const
         return;
     }
 
-    hdr = (const struct CV_DebugSSubsectionHeader_t*)linetab;
-    while (CV_IS_INSIDE(hdr, linetab + size))
+    for (hdr = cvmod->dbgsubsect; CV_IS_INSIDE(hdr, hdr_last); hdr = hdr_next)
     {
         hdr_next = CV_RECORD_GAP(hdr, hdr->cbLen);
         if (!(hdr->type & DEBUG_S_IGNORE))
@@ -1524,7 +1530,7 @@ static void codeview_snarf_linetab2(const struct msc_debug_info* msc_dbg, const
                     break;
                 }
                 source = source_new(msc_dbg->module, NULL,
-                                    (chksms->strOffset < strsize) ? strimage + chksms->strOffset : "<<stroutofbounds>>");
+                                    (chksms->strOffset < cvmod->strsize) ? cvmod->strimage + chksms->strOffset : "<<stroutofbounds>>");
                 func = (struct symt_function*)symt_find_nearest(msc_dbg->module, addr);
                 /* FIXME: at least labels support line numbers */
                 if (!symt_check_tag(&func->symt, SymTagFunction) && !symt_check_tag(&func->symt, SymTagInlineSite))
@@ -1756,8 +1762,10 @@ static unsigned codeview_transform_defrange(const struct msc_debug_info* msc_dbg
     return len;
 }
 
-static BOOL codeview_snarf(const struct msc_debug_info* msc_dbg, const BYTE* root,
-                           int offset, int size, BOOL do_globals)
+static BOOL codeview_snarf(const struct msc_debug_info* msc_dbg,
+                           const BYTE* root, unsigned offset, unsigned size,
+                           const struct cv_module_snarf* cvmod,
+                           BOOL do_globals)
 {
     struct symt_function*               curr_func = NULL;
     int                                 i, length;
@@ -2220,7 +2228,7 @@ static BOOL codeview_snarf(const struct msc_debug_info* msc_dbg, const BYTE* roo
             break;
         }
     }
-
+    if (cvmod) codeview_snarf_linetab2(msc_dbg, cvmod);
     return TRUE;
 }
 
@@ -3011,6 +3019,8 @@ static BOOL pdb_process_internal(const struct process* pcs,
         PDB_SYMBOLS symbols;
         BYTE*       globalimage;
         BYTE*       modimage;
+        BYTE*       ipi_image;
+        struct codeview_type_parse ipi_ctp;
         BYTE*       file;
         int         header_size = 0;
         PDB_STREAM_INDEXES* psi;
@@ -3052,12 +3062,15 @@ static BOOL pdb_process_internal(const struct process* pcs,
                                    pdb_lookup, pdb_module_info, module_index);
         pdb_process_types(msc_dbg, pdb_file);
 
+        ipi_image = pdb_read_file(pdb_file, 4);
+        pdb_init_type_parse(msc_dbg, &ipi_ctp, ipi_image);
+
         /* Read global symbol table */
         globalimage = pdb_read_file(pdb_file, symbols.gsym_file);
         if (globalimage)
         {
-            codeview_snarf(msc_dbg, globalimage, 0,
-                           pdb_get_file_size(pdb_file, symbols.gsym_file), FALSE);
+            codeview_snarf(msc_dbg, globalimage, 0, pdb_get_file_size(pdb_file, symbols.gsym_file),
+                           NULL, FALSE);
         }
 
         /* Read per-module symbols' tables */
@@ -3074,19 +3087,18 @@ static BOOL pdb_process_internal(const struct process* pcs,
             modimage = pdb_read_file(pdb_file, sfile.file);
             if (modimage)
             {
-                if (sfile.symbol_size)
-                    codeview_snarf(msc_dbg, modimage, sizeof(DWORD),
-                                   sfile.symbol_size, TRUE);
-
-                if (sfile.lineno_size && sfile.lineno2_size) FIXME("Both line info present... only supporting first\n");
-                if (sfile.lineno_size)
+                struct cv_module_snarf cvmod = {&ipi_ctp, (const void*)(modimage + sfile.symbol_size), sfile.lineno2_size,
+                    files_image + 12, files_size};
+                codeview_snarf(msc_dbg, modimage, sizeof(DWORD), sfile.symbol_size,
+                               &cvmod, TRUE);
+
+                if (sfile.lineno_size && sfile.lineno2_size)
+                    FIXME("Both line info present... only supporting second\n");
+                else if (sfile.lineno_size)
                     codeview_snarf_linetab(msc_dbg,
                                            modimage + sfile.symbol_size,
                                            sfile.lineno_size,
                                            pdb_file->kind == PDB_JG);
-                else if (sfile.lineno2_size && files_image)
-                    codeview_snarf_linetab2(msc_dbg, modimage + sfile.symbol_size, sfile.lineno2_size,
-                                   files_image + 12, files_size);
 
                 pdb_free(modimage);
             }
@@ -3101,6 +3113,8 @@ static BOOL pdb_process_internal(const struct process* pcs,
                                   pdb_get_file_size(pdb_file, symbols.gsym_file));
             pdb_free(globalimage);
         }
+        HeapFree(GetProcessHeap(), 0, (DWORD*)ipi_ctp.offset);
+        pdb_free(ipi_image);
     }
     else
         pdb_process_symbol_imports(pcs, msc_dbg, NULL, NULL, image,
@@ -3565,8 +3579,8 @@ static BOOL codeview_process_info(const struct process* pcs,
 
             if (ent->SubSection == sstAlignSym)
             {
-                codeview_snarf(msc_dbg, msc_dbg->root + ent->lfo, sizeof(DWORD),
-                               ent->cb, TRUE);
+                codeview_snarf(msc_dbg, msc_dbg->root + ent->lfo, sizeof(DWORD), ent->cb,
+                               NULL, TRUE);
 
                 /*
                  * Check the next and previous entry.  If either is a




More information about the wine-cvs mailing list