[PATCH 2/2] [DbgHelp]: properly manage in dbghelp interfaces local variables and parameters that are constant

Eric Pouech eric.pouech at orange.fr
Mon Jun 7 14:50:46 CDT 2010


(those are generated by gcc 4.5)

A+
---

 dlls/dbghelp/dbghelp_private.h |    1 +
 dlls/dbghelp/module.c          |    1 +
 dlls/dbghelp/type.c            |   32 +++++++++++++++++++++++++++++---
 3 files changed, 31 insertions(+), 3 deletions(-)


diff --git a/dlls/dbghelp/dbghelp_private.h b/dlls/dbghelp/dbghelp_private.h
index de764ae..f4c88a0 100644
--- a/dlls/dbghelp/dbghelp_private.h
+++ b/dlls/dbghelp/dbghelp_private.h
@@ -347,6 +347,7 @@ struct module_format
 
 struct module
 {
+    struct process*             process;
     IMAGEHLP_MODULEW64          module;
     /* ANSI copy of module.ModuleName for efficiency */
     char                        module_name[MAX_PATH];
diff --git a/dlls/dbghelp/module.c b/dlls/dbghelp/module.c
index e99bd7f..89422a9 100644
--- a/dlls/dbghelp/module.c
+++ b/dlls/dbghelp/module.c
@@ -142,6 +142,7 @@ struct module* module_new(struct process* pcs, const WCHAR* name,
 
     pool_init(&module->pool, 65536);
 
+    module->process = pcs;
     module->module.SizeOfStruct = sizeof(module->module);
     module->module.BaseOfImage = mod_addr;
     module->module.ImageSize = size;
diff --git a/dlls/dbghelp/type.c b/dlls/dbghelp/type.c
index 2ef4bb4..e933e19 100644
--- a/dlls/dbghelp/type.c
+++ b/dlls/dbghelp/type.c
@@ -803,9 +803,35 @@ BOOL symt_get_info(struct module* module, const struct symt* type,
         break;
 
     case TI_GET_VALUE:
-        if (type->tag != SymTagData || ((const struct symt_data*)type)->kind != DataIsConstant)
-            return FALSE;
-        X(VARIANT) = ((const struct symt_data*)type)->u.value;
+        if (type->tag != SymTagData) return FALSE;
+        switch (((const struct symt_data*)type)->kind)
+        {
+        case DataIsConstant: X(VARIANT) = ((const struct symt_data*)type)->u.value; break;
+        case DataIsLocal:
+        case DataIsParam:
+            {
+                struct location loc = ((const struct symt_data*)type)->u.var;
+                unsigned                i;
+                struct module_format*   modfmt;
+
+                if (loc.kind < loc_user) return FALSE;
+                for (i = 0; i < DFI_LAST; i++)
+                {
+                    modfmt = module->format_info[i];
+                    if (modfmt && modfmt->loc_compute)
+                    {
+                        modfmt->loc_compute(module->process, modfmt,
+                                            (const struct symt_function*)((const struct symt_data*)type)->container, &loc);
+                        break;
+                    }
+                }
+                if (loc.kind != loc_absolute) return FALSE;
+                X(VARIANT).n1.n2.vt = VT_UI4; /* FIXME */
+                X(VARIANT).n1.n2.n3.uiVal = loc.offset;
+            }
+            break;
+        default: return FALSE;
+        }
         break;
 
     case TI_GET_CALLING_CONVENTION:






More information about the wine-patches mailing list