wine/ include/dbghelp.h dlls/dbghelp/symbol.c ...

Alexandre Julliard julliard at wine.codeweavers.com
Thu Nov 3 03:51:26 CST 2005


ChangeSet ID:	21066
CVSROOT:	/opt/cvs-commit
Module name:	wine
Changes by:	julliard at winehq.org	2005/11/03 03:51:26

Modified files:
	include        : dbghelp.h 
	dlls/dbghelp   : symbol.c source.c dbghelp_private.h 
	                 dbghelp.spec 

Log message:
	Eric Pouech <eric.pouech at wanadoo.fr>
	Implemented SymEnumLines.

Patch: http://cvs.winehq.org/patch.py?id=21066

Old revision  New revision  Changes     Path
 1.14          1.15          +13 -0      wine/include/dbghelp.h
 1.17          1.18          +0 -13      wine/dlls/dbghelp/symbol.c
 1.3           1.4           +66 -0      wine/dlls/dbghelp/source.c
 1.16          1.17          +13 -0      wine/dlls/dbghelp/dbghelp_private.h
 1.10          1.11          +1 -0       wine/dlls/dbghelp/dbghelp.spec

Index: wine/include/dbghelp.h
diff -u -p wine/include/dbghelp.h:1.14 wine/include/dbghelp.h:1.15
--- wine/include/dbghelp.h:1.14	3 Nov 2005  9:51:26 -0000
+++ wine/include/dbghelp.h	3 Nov 2005  9:51:26 -0000
@@ -749,6 +749,19 @@ BOOL WINAPI SymEnumSourceFiles(HANDLE, U
 BOOL WINAPI SymGetLineFromAddr(HANDLE, DWORD, PDWORD, PIMAGEHLP_LINE);
 BOOL WINAPI SymGetLinePrev(HANDLE, PIMAGEHLP_LINE);
 BOOL WINAPI SymGetLineNext(HANDLE, PIMAGEHLP_LINE);
+typedef struct _SRCCODEINFO
+{
+    DWORD       SizeOfStruct;
+    PVOID       Key;
+    DWORD64     ModBase;
+    char        Obj[MAX_PATH+1];
+    char        FileName[MAX_PATH+1];
+    DWORD       LineNumber;
+    DWORD64     Address;
+} SRCCODEINFO, *PSRCCODEINFO;
+
+typedef BOOL (CALLBACK* PSYM_ENUMLINES_CALLBACK)(PSRCCODEINFO, PVOID);
+BOOL WINAPI SymEnumLines(HANDLE, ULONG64, PCSTR, PCSTR, PSYM_ENUMLINES_CALLBACK, PVOID);
 
 /*************************
  * File & image handling *
Index: wine/dlls/dbghelp/symbol.c
diff -u -p wine/dlls/dbghelp/symbol.c:1.17 wine/dlls/dbghelp/symbol.c:1.18
--- wine/dlls/dbghelp/symbol.c:1.17	3 Nov 2005  9:51:26 -0000
+++ wine/dlls/dbghelp/symbol.c	3 Nov 2005  9:51:26 -0000
@@ -40,19 +40,6 @@
 WINE_DEFAULT_DEBUG_CHANNEL(dbghelp);
 WINE_DECLARE_DEBUG_CHANNEL(dbghelp_symt);
 
-struct line_info
-{
-    unsigned long               is_first : 1,
-                                is_last : 1,
-                                is_source_file : 1,
-                                line_number;
-    union
-    {
-        unsigned long               pc_offset;   /* if is_source_file isn't set */
-        unsigned                    source_file; /* if is_source_file is set */
-    } u;
-};
-
 inline static int cmp_addr(ULONG64 a1, ULONG64 a2)
 {
     if (a1 > a2) return 1;
Index: wine/dlls/dbghelp/source.c
diff -u -p wine/dlls/dbghelp/source.c:1.3 wine/dlls/dbghelp/source.c:1.4
--- wine/dlls/dbghelp/source.c:1.3	3 Nov 2005  9:51:26 -0000
+++ wine/dlls/dbghelp/source.c	3 Nov 2005  9:51:26 -0000
@@ -26,6 +26,9 @@
 
 #include "dbghelp_private.h"
 #include "wine/debug.h"
+#ifdef HAVE_REGEX_H
+# include <regex.h>
+#endif
 
 WINE_DEFAULT_DEBUG_CHANNEL(dbghelp);
 
@@ -136,3 +139,66 @@ BOOL WINAPI SymEnumSourceFiles(HANDLE hP
 
     return TRUE;
 }
+
+/******************************************************************
+ *		SymEnumLines (DBGHELP.@)
+ *
+ */
+BOOL WINAPI SymEnumLines(HANDLE hProcess, ULONG64 base, PCSTR compiland,
+                         PCSTR srcfile, PSYM_ENUMLINES_CALLBACK cb, PVOID user)
+{
+    struct process*             pcs;
+    struct module*              module;
+    struct hash_table_iter      hti;
+    struct symt_ht*             sym;
+    regex_t                     re;
+    struct line_info*           dli;
+    void*                       ptr;
+    SRCCODEINFO                 sci;
+    char*                       file;
+
+    if (!cb) return FALSE;
+    pcs = process_find_by_handle(hProcess);
+    if (!pcs) return FALSE;
+    if (!(dbghelp_options & SYMOPT_LOAD_LINES)) return TRUE;
+    if (regcomp(&re, srcfile, REG_NOSUB))
+    {
+        FIXME("Couldn't compile %s\n", srcfile);
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return FALSE;
+    }
+    if (compiland) FIXME("Unsupported yet (filtering on compiland %s)\n", compiland);
+    module = module_find_by_addr(pcs, base, DMT_UNKNOWN);
+    if (!(module = module_get_debug(pcs, module))) return FALSE;
+
+    sci.SizeOfStruct = sizeof(sci);
+    sci.ModBase      = base;
+
+    hash_table_iter_init(&module->ht_symbols, &hti, NULL);
+    while ((ptr = hash_table_iter_up(&hti)))
+    {
+        sym = GET_ENTRY(ptr, struct symt_ht, hash_elt);
+        if (sym->symt.tag != SymTagFunction) continue;
+
+        dli = NULL;
+        sci.FileName[0] = '\0';
+        while ((dli = vector_iter_up(&((struct symt_function*)sym)->vlines, dli)))
+        {
+            if (dli->is_source_file)
+            {
+                file = (char*)source_get(module, dli->u.source_file);
+                if (regexec(&re, file, 0, NULL, 0) != 0) file = "";
+                strcpy(sci.FileName, file);
+            }
+            else if (sci.FileName[0])
+            {
+                sci.Key = dli;
+                sci.Obj[0] = '\0'; /* FIXME */
+                sci.LineNumber = dli->line_number;
+                sci.Address = dli->u.pc_offset;
+                if (!cb(&sci, user)) break;
+            }
+        }
+    }
+    return TRUE;
+}
Index: wine/dlls/dbghelp/dbghelp_private.h
diff -u -p wine/dlls/dbghelp/dbghelp_private.h:1.16 wine/dlls/dbghelp/dbghelp_private.h:1.17
--- wine/dlls/dbghelp/dbghelp_private.h:1.16	3 Nov 2005  9:51:26 -0000
+++ wine/dlls/dbghelp/dbghelp_private.h	3 Nov 2005  9:51:26 -0000
@@ -289,6 +289,19 @@ struct process 
     IMAGEHLP_STACK_FRAME        ctx_frame;
 };
 
+struct line_info
+{
+    unsigned long               is_first : 1,
+                                is_last : 1,
+                                is_source_file : 1,
+                                line_number;
+    union
+    {
+        unsigned long               pc_offset;   /* if is_source_file isn't set */
+        unsigned                    source_file; /* if is_source_file is set */
+    } u;
+};
+
 /* dbghelp.c */
 extern struct process* process_find_by_handle(HANDLE hProcess);
 extern HANDLE hMsvcrt;
Index: wine/dlls/dbghelp/dbghelp.spec
diff -u -p wine/dlls/dbghelp/dbghelp.spec:1.10 wine/dlls/dbghelp/dbghelp.spec:1.11
--- wine/dlls/dbghelp/dbghelp.spec:1.10	3 Nov 2005  9:51:26 -0000
+++ wine/dlls/dbghelp/dbghelp.spec	3 Nov 2005  9:51:26 -0000
@@ -26,6 +26,7 @@
 @ stub StackWalk64
 @ stdcall StackWalk(long long long ptr ptr ptr ptr ptr ptr)
 @ stdcall SymCleanup(long)
+@ stdcall SymEnumLines(ptr double str str ptr ptr)
 @ stdcall SymEnumSourceFiles(ptr double str ptr ptr)
 @ stub SymEnumSym
 @ stdcall SymEnumSymbols(ptr double str ptr ptr)



More information about the wine-cvs mailing list