Ken Thomases : dbghelp: Let stabs_parse call back for real (non-debug) symbol definitions.

Alexandre Julliard julliard at winehq.org
Thu Mar 12 09:54:31 CDT 2009


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

Author: Ken Thomases <ken at codeweavers.com>
Date:   Wed Mar 11 09:05:49 2009 -0500

dbghelp: Let stabs_parse call back for real (non-debug) symbol definitions.

---

 dlls/dbghelp/dbghelp_private.h |    7 ++++++-
 dlls/dbghelp/elf_module.c      |    3 ++-
 dlls/dbghelp/pe_module.c       |    3 ++-
 dlls/dbghelp/stabs.c           |   17 ++++++++++++++++-
 4 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/dlls/dbghelp/dbghelp_private.h b/dlls/dbghelp/dbghelp_private.h
index 132a6b9..5d3f401 100644
--- a/dlls/dbghelp/dbghelp_private.h
+++ b/dlls/dbghelp/dbghelp_private.h
@@ -487,9 +487,14 @@ extern unsigned     source_new(struct module* module, const char* basedir, const
 extern const char*  source_get(const struct module* module, unsigned idx);
 
 /* stabs.c */
+typedef void (*stabs_def_cb)(struct module* module, unsigned long load_offset,
+                                const char* name, unsigned long offset,
+                                BOOL is_public, BOOL is_global, unsigned char other,
+                                struct symt_compiland* compiland, void* user);
 extern BOOL         stabs_parse(struct module* module, unsigned long load_offset,
                                 const void* stabs, int stablen,
-                                const char* strs, int strtablen);
+                                const char* strs, int strtablen,
+                                stabs_def_cb callback, void* user);
 
 /* dwarf.c */
 extern BOOL         dwarf2_parse(struct module* module, unsigned long load_offset,
diff --git a/dlls/dbghelp/elf_module.c b/dlls/dbghelp/elf_module.c
index 820c972..3b6c7cc 100644
--- a/dlls/dbghelp/elf_module.c
+++ b/dlls/dbghelp/elf_module.c
@@ -1039,7 +1039,8 @@ static BOOL elf_load_debug_info_from_map(struct module* module,
                 /* OK, now just parse all of the stabs. */
                 lret = stabs_parse(module, module->elf_info->elf_addr,
                                    stab, elf_get_map_size(&stab_sect),
-                                   stabstr, elf_get_map_size(&stabstr_sect));
+                                   stabstr, elf_get_map_size(&stabstr_sect),
+                                   NULL, NULL);
                 if (lret)
                     /* and fill in the missing information for stabs */
                     elf_finish_stabs_info(module, ht_symtab);
diff --git a/dlls/dbghelp/pe_module.c b/dlls/dbghelp/pe_module.c
index 4e77790..91c7d80 100644
--- a/dlls/dbghelp/pe_module.c
+++ b/dlls/dbghelp/pe_module.c
@@ -72,7 +72,8 @@ static BOOL pe_load_stabs(const struct process* pcs, struct module* module,
                           RtlImageRvaToVa(nth, mapping, stabs, NULL),
                           stabsize,
                           RtlImageRvaToVa(nth, mapping, stabstr, NULL),
-                          stabstrsize);
+                          stabstrsize,
+                          NULL, NULL);
     }
 
     TRACE("%s the STABS debug info\n", ret ? "successfully loaded" : "failed to load");
diff --git a/dlls/dbghelp/stabs.c b/dlls/dbghelp/stabs.c
index 58c7783..aeac9cb 100644
--- a/dlls/dbghelp/stabs.c
+++ b/dlls/dbghelp/stabs.c
@@ -1191,7 +1191,8 @@ static void stabs_finalize_function(struct module* module, struct symt_function*
 
 BOOL stabs_parse(struct module* module, unsigned long load_offset, 
                  const void* pv_stab_ptr, int stablen,
-                 const char* strs, int strtablen)
+                 const char* strs, int strtablen,
+                 stabs_def_cb callback, void* user)
 {
     struct symt_function*       curr_func = NULL;
     struct symt_block*          block = NULL;
@@ -1547,6 +1548,20 @@ BOOL stabs_parse(struct module* module, unsigned long load_offset,
         case N_OSO:
             /* Always ignore these, they seem to be used only on Darwin. */
             break;
+        case N_ABS:
+            /* FIXME: Other definition types (N_TEXT, N_DATA, N_BSS, ...)? */
+            if (callback)
+            {
+                BOOL is_public = (stab_ptr->n_type & N_EXT);
+                BOOL is_global = is_public;
+
+                if (*ptr == '_') ptr++;
+                stab_strcpy(symname, sizeof(symname), ptr);
+
+                callback(module, load_offset, symname, stab_ptr->n_value,
+                         is_public, is_global, stab_ptr->n_other, compiland, user);
+            }
+            break;
         default:
             ERR("Unknown stab type 0x%02x\n", type);
             break;




More information about the wine-cvs mailing list