[PATCH 1/4] [DbgHelp]: module info

Eric Pouech eric.pouech at wanadoo.fr
Mon Jun 26 14:37:32 CDT 2006


- now internally storing module info as a 64bit module structure
  (the interest in not in the 64 bit side of things, but because
  it allows storing lots of usefull information)
- fixed SymGetModuleInfo64W which wasn't returning the
  LoadedPdbName field
- now filling for MSC files with the extended information
  (instead of guessing it)
- reused the extended module info to store wine ELF module
  information (link for map link, stabs vs dwarf symbol info)

A+
---

 dlls/dbghelp/coff.c            |   14 ++++++--
 dlls/dbghelp/dbghelp_private.h |    2 +
 dlls/dbghelp/dwarf.c           |    7 ++++
 dlls/dbghelp/elf_module.c      |    4 ++
 dlls/dbghelp/module.c          |   70 +++++++++++++++++++---------------------
 dlls/dbghelp/msc.c             |   31 +++++++++++++++++-
 dlls/dbghelp/stabs.c           |    7 ++++
 7 files changed, 91 insertions(+), 44 deletions(-)

diff --git a/dlls/dbghelp/coff.c b/dlls/dbghelp/coff.c
index e0ff355..a344ac9 100644
--- a/dlls/dbghelp/coff.c
+++ b/dlls/dbghelp/coff.c
@@ -298,8 +298,8 @@ BOOL coff_process_info(const struct msc_
             DWORD base = msc_dbg->sectp[coff_sym->SectionNumber - 1].VirtualAddress;
             nampnt = coff_get_name(coff_sym, coff_strtab);
 
-            TRACE("%d: %lx %s\n",
-                  i, msc_dbg->module->module.BaseOfImage + base + coff_sym->Value,
+            TRACE("%d: %s %s\n",
+                  i, wine_dbgstr_longlong(msc_dbg->module->module.BaseOfImage + base + coff_sym->Value),
                   nampnt);
             TRACE("\tAdding global symbol %s (sect=%s)\n",
                   nampnt, msc_dbg->sectp[coff_sym->SectionNumber - 1].Name);
@@ -343,8 +343,8 @@ BOOL coff_process_info(const struct msc_
              */
             nampnt = coff_get_name(coff_sym, coff_strtab);
 
-            TRACE("%d: %lx %s\n",
-                  i, msc_dbg->module->module.BaseOfImage + base + coff_sym->Value,
+            TRACE("%d: %s %s\n",
+                  i, wine_dbgstr_longlong(msc_dbg->module->module.BaseOfImage + base + coff_sym->Value),
                   nampnt);
             TRACE("\tAdding global data symbol %s\n", nampnt);
 
@@ -442,6 +442,12 @@ BOOL coff_process_info(const struct msc_
 	}
         HeapFree(GetProcessHeap(), 0, coff_files.files);
         msc_dbg->module->module.SymType = SymCoff;
+        /* FIXME: we could have a finer grain here */
+        msc_dbg->module->module.LineNumbers = TRUE;
+        msc_dbg->module->module.GlobalSymbols = TRUE;
+        msc_dbg->module->module.TypeInfo = FALSE;
+        msc_dbg->module->module.SourceIndexed = TRUE;
+        msc_dbg->module->module.Publics = TRUE;
         ret = TRUE;
     }
 
diff --git a/dlls/dbghelp/dbghelp_private.h b/dlls/dbghelp/dbghelp_private.h
index 50a38a4..72930ba 100644
--- a/dlls/dbghelp/dbghelp_private.h
+++ b/dlls/dbghelp/dbghelp_private.h
@@ -274,7 +274,7 @@ enum module_type
 
 struct module
 {
-    IMAGEHLP_MODULE             module;
+    IMAGEHLP_MODULE64           module;
     struct module*              next;
     enum module_type		type : 16;
     unsigned short              is_virtual : 1;
diff --git a/dlls/dbghelp/dwarf.c b/dlls/dbghelp/dwarf.c
index ec3a5e6..01250a5 100644
--- a/dlls/dbghelp/dwarf.c
+++ b/dlls/dbghelp/dwarf.c
@@ -1679,5 +1679,12 @@ BOOL dwarf2_parse(struct module* module,
         comp_unit_cursor += comp_unit.length + sizeof(unsigned);
     }
     module->module.SymType = SymDia;
+    module->module.CVSig = 'D' | ('W' << 8) | ('A' << 16) | ('R' << 24);
+    /* FIXME: we could have a finer grain here */
+    module->module.LineNumbers = TRUE;
+    module->module.GlobalSymbols = TRUE;
+    module->module.TypeInfo = TRUE;
+    module->module.SourceIndexed = TRUE;
+    module->module.Publics = TRUE;
     return TRUE;
 }
diff --git a/dlls/dbghelp/elf_module.c b/dlls/dbghelp/elf_module.c
index 495dcba..4e86ec2 100644
--- a/dlls/dbghelp/elf_module.c
+++ b/dlls/dbghelp/elf_module.c
@@ -929,7 +929,9 @@ static BOOL elf_load_debug_info_from_map
                 fmap_link.with_crc = 1;
                 lret = elf_load_debug_info_from_map(module, &fmap_link, pool,
                                                     ht_symtab);
-                if (!lret)
+                if (lret)
+                    strcpy(module->module.LoadedPdbName, dbg_link);
+                else
                     WARN("Couldn't load debug information from %s\n", dbg_link);
                 ret = ret || lret;
             }
diff --git a/dlls/dbghelp/module.c b/dlls/dbghelp/module.c
index c8bd0ce..c1c5ded 100644
--- a/dlls/dbghelp/module.c
+++ b/dlls/dbghelp/module.c
@@ -125,6 +125,20 @@ struct module* module_new(struct process
     module->module.TimeDateStamp = stamp;
     module->module.CheckSum = checksum;
 
+    memset(module->module.LoadedPdbName, 0, sizeof(module->module.CVData));
+    module->module.CVSig = 0;
+    memset(module->module.CVData, 0, sizeof(module->module.CVData));
+    module->module.PdbSig = 0;
+    memset(&module->module.PdbSig70, 0, sizeof(module->module.PdbSig70));
+    module->module.PdbAge = 0;
+    module->module.PdbUnmatched = FALSE;
+    module->module.DbgUnmatched = FALSE;
+    module->module.LineNumbers = FALSE;
+    module->module.GlobalSymbols = FALSE;
+    module->module.TypeInfo = FALSE;
+    module->module.SourceIndexed = 0;
+    module->module.Publics = 0;
+
     module->type              = type;
     module->is_virtual        = virtual ? TRUE : FALSE;
     module->sortlist_valid    = FALSE;
@@ -640,23 +654,34 @@ BOOL  WINAPI SymGetModuleInfo(HANDLE hPr
 {
     struct process*     pcs = process_find_by_handle(hProcess);
     struct module*      module;
+    IMAGEHLP_MODULE     mod;
 
     if (!pcs) return FALSE;
     if (ModuleInfo->SizeOfStruct < sizeof(*ModuleInfo)) return FALSE;
     module = module_find_by_addr(pcs, dwAddr, DMT_UNKNOWN);
     if (!module) return FALSE;
 
-    *ModuleInfo = module->module;
+    mod.SizeOfStruct = ModuleInfo->SizeOfStruct;
+    mod.BaseOfImage = module->module.BaseOfImage;
+    mod.ImageSize = module->module.ImageSize;
+    mod.TimeDateStamp = module->module.TimeDateStamp;
+    mod.CheckSum = module->module.CheckSum;
+    mod.NumSyms = module->module.NumSyms;
+    mod.SymType = module->module.SymType;
+    strcpy(mod.ModuleName, module->module.ModuleName);
+    strcpy(mod.ImageName, module->module.ImageName);
+    strcpy(mod.LoadedImageName, module->module.LoadedImageName);
+
     if (module->module.SymType == SymNone)
     {
         module = module_get_container(pcs, module);
         if (module && module->module.SymType != SymNone)
         {
-            ModuleInfo->SymType = module->module.SymType;
-            ModuleInfo->NumSyms = module->module.NumSyms;
+            mod.SymType = module->module.SymType;
+            mod.NumSyms = module->module.NumSyms;
         }
     }
-
+    memcpy(ModuleInfo, &mod, ModuleInfo->SizeOfStruct);
     return TRUE;
 }
 
@@ -702,8 +727,6 @@ BOOL  WINAPI SymGetModuleInfo64(HANDLE h
 {
     struct process*     pcs = process_find_by_handle(hProcess);
     struct module*      module;
-    IMAGEHLP_MODULE64   mod;
-    char*               ptr;
 
     TRACE("%p %s %p\n", hProcess, wine_dbgstr_longlong(dwAddr), ModuleInfo);
 
@@ -712,44 +735,17 @@ BOOL  WINAPI SymGetModuleInfo64(HANDLE h
     module = module_find_by_addr(pcs, dwAddr, DMT_UNKNOWN);
     if (!module) return FALSE;
 
-    mod.SizeOfStruct = ModuleInfo->SizeOfStruct;
-    mod.BaseOfImage = module->module.BaseOfImage;
-    mod.ImageSize = module->module.ImageSize;
-    mod.TimeDateStamp = module->module.TimeDateStamp;
-    mod.CheckSum = module->module.CheckSum;
-    mod.NumSyms = module->module.NumSyms;
-    mod.SymType = module->module.SymType;
-    strcpy(mod.ModuleName, module->module.ModuleName);
-    strcpy(mod.ImageName, module->module.ImageName);
-    strcpy(mod.LoadedImageName, module->module.LoadedImageName);
-    /* FIXME: for now, using some 'rather sane' value */
-    sprintf(mod.LoadedPdbName, ".\%s.pdb", module->module.ModuleName);
-    mod.CVSig = 0x53445352; /* RSDS */
-    memset(mod.CVData, 0, sizeof(mod.CVData));
-    strcpy(mod.CVData, module->module.LoadedImageName);
-    if ((ptr = strrchr(mod.CVData, '.')))
-        strcpy(ptr + 1, "pdb");
-    mod.PdbSig = 0;
-    memset(&mod.PdbSig70, 0, sizeof(mod.PdbSig70));
-    mod.PdbAge = 0;
-    mod.PdbUnmatched = FALSE;
-    mod.DbgUnmatched = FALSE;
-    mod.LineNumbers = TRUE;
-    mod.GlobalSymbols = TRUE;
-    mod.TypeInfo = TRUE;
-    mod.SourceIndexed = 0;
-    mod.Publics = 0;
+    memcpy(ModuleInfo, &module->module, ModuleInfo->SizeOfStruct);
 
     if (module->module.SymType == SymNone)
     {
         module = module_get_container(pcs, module);
         if (module && module->module.SymType != SymNone)
         {
-            mod.SymType = module->module.SymType;
-            mod.NumSyms = module->module.NumSyms;
+            ModuleInfo->SymType = module->module.SymType;
+            ModuleInfo->NumSyms = module->module.NumSyms;
         }
     }
-    memcpy(ModuleInfo, &mod, mod.SizeOfStruct);
     return TRUE;
 }
 
@@ -781,6 +777,8 @@ BOOL  WINAPI SymGetModuleInfoW64(HANDLE 
                         miw.ImageName, sizeof(miw.ImageName) / sizeof(WCHAR));
     MultiByteToWideChar(CP_ACP, 0, mi.LoadedImageName, -1,   
                         miw.LoadedImageName, sizeof(miw.LoadedImageName) / sizeof(WCHAR));
+    MultiByteToWideChar(CP_ACP, 0, mi.LoadedPdbName, -1,   
+                        miw.LoadedPdbName, sizeof(miw.LoadedPdbName) / sizeof(WCHAR));
 
     miw.CVSig         = mi.CVSig;
     MultiByteToWideChar(CP_ACP, 0, mi.CVData, -1,   
diff --git a/dlls/dbghelp/msc.c b/dlls/dbghelp/msc.c
index 2bde2bf..748f46b 100644
--- a/dlls/dbghelp/msc.c
+++ b/dlls/dbghelp/msc.c
@@ -2189,7 +2189,6 @@ static BOOL pdb_process_internal(const s
     else
         pdb_process_symbol_imports(pcs, msc_dbg, NULL, NULL, image, pdb_lookup, 
                                    module_index);
-    msc_dbg->module->module.SymType = SymCv;
     ret = TRUE;
 
  leave:
@@ -2214,6 +2213,22 @@ static BOOL pdb_process_file(const struc
     codeview_init_basic_types(msc_dbg->module);
     ret = pdb_process_internal(pcs, msc_dbg, pdb_lookup, -1);
     codeview_clear_type_table();
+    if (ret)
+    {
+        msc_dbg->module->module.SymType = SymCv;
+        if (pdb_lookup->kind == PDB_JG)
+            msc_dbg->module->module.PdbSig = pdb_lookup->u.jg.timestamp;
+        else
+            msc_dbg->module->module.PdbSig70 = pdb_lookup->u.ds.guid;
+        msc_dbg->module->module.PdbAge = pdb_lookup->age;
+        strcpy(msc_dbg->module->module.LoadedPdbName, pdb_lookup->filename);
+        /* FIXME: we could have a finer grain here */
+        msc_dbg->module->module.LineNumbers = TRUE;
+        msc_dbg->module->module.GlobalSymbols = TRUE;
+        msc_dbg->module->module.TypeInfo = TRUE;
+        msc_dbg->module->module.SourceIndexed = TRUE;
+        msc_dbg->module->module.Publics = TRUE;
+    }
     return ret;
 }
 
@@ -2336,6 +2351,12 @@ static BOOL codeview_process_info(const 
         }
 
         msc_dbg->module->module.SymType = SymCv;
+        /* FIXME: we could have a finer grain here */
+        msc_dbg->module->module.LineNumbers = TRUE;
+        msc_dbg->module->module.GlobalSymbols = TRUE;
+        msc_dbg->module->module.TypeInfo = TRUE;
+        msc_dbg->module->module.SourceIndexed = TRUE;
+        msc_dbg->module->module.Publics = TRUE;
         codeview_clear_type_table();
         ret = TRUE;
         break;
@@ -2362,6 +2383,7 @@ static BOOL codeview_process_info(const 
         pdb_lookup.kind = PDB_DS;
         pdb_lookup.u.ds.guid = rsds->guid;
         pdb_lookup.u.ds.toc = NULL;
+        pdb_lookup.age = rsds->unknown;
         ret = pdb_process_file(pcs, msc_dbg, &pdb_lookup);
         break;
     }
@@ -2370,7 +2392,12 @@ static BOOL codeview_process_info(const 
             cv->dwSignature, msc_dbg->module->module.ModuleName);
         break;
     }
-
+    if (ret)
+    {
+        msc_dbg->module->module.CVSig = cv->dwSignature;
+        memcpy(msc_dbg->module->module.CVData, cv,
+               sizeof(msc_dbg->module->module.CVData));
+    }
     return ret;
 }
 
diff --git a/dlls/dbghelp/stabs.c b/dlls/dbghelp/stabs.c
index bf5922a..e75b150 100644
--- a/dlls/dbghelp/stabs.c
+++ b/dlls/dbghelp/stabs.c
@@ -1534,6 +1534,13 @@ #endif
               stab_ptr->n_type, stab_ptr->n_value, debugstr_a(strs + stab_ptr->n_un.n_strx));
     }
     module->module.SymType = SymDia;
+    module->module.CVSig = 'S' | ('T' << 8) | ('A' << 16) | ('B' << 24);
+    /* FIXME: we could have a finer grain here */
+    module->module.LineNumbers = TRUE;
+    module->module.GlobalSymbols = TRUE;
+    module->module.TypeInfo = TRUE;
+    module->module.SourceIndexed = TRUE;
+    module->module.Publics = TRUE;
 done:
     HeapFree(GetProcessHeap(), 0, stabbuff);
     stabs_free_includes();



More information about the wine-patches mailing list