Eric Pouech : dbghelp/dwarf: Add support for local variables with constant values.

Alexandre Julliard julliard at winehq.org
Tue Sep 28 16:01:57 CDT 2021


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

Author: Eric Pouech <eric.pouech at gmail.com>
Date:   Tue Sep 28 17:21:24 2021 +0200

dbghelp/dwarf: Add support for local variables with constant values.

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

---

 dlls/dbghelp/dbghelp_private.h |  4 ++++
 dlls/dbghelp/dwarf.c           | 15 +++++++++++----
 dlls/dbghelp/symbol.c          | 39 +++++++++++++++++++++++++++++++++++++++
 3 files changed, 54 insertions(+), 4 deletions(-)

diff --git a/dlls/dbghelp/dbghelp_private.h b/dlls/dbghelp/dbghelp_private.h
index 2d4efafd041..0587ce13914 100644
--- a/dlls/dbghelp/dbghelp_private.h
+++ b/dlls/dbghelp/dbghelp_private.h
@@ -756,6 +756,10 @@ extern struct symt_data*
                                         enum DataKind dt, const struct location* loc,
                                         struct symt_block* block,
                                         struct symt* type, const char* name) DECLSPEC_HIDDEN;
+extern struct symt_data*
+                    symt_add_func_constant(struct module* module,
+                                           struct symt_function* func, struct symt_block* block,
+                                           struct symt* type, const char* name, VARIANT* v) DECLSPEC_HIDDEN;
 extern struct symt_block*
                     symt_open_func_block(struct module* module, 
                                          struct symt_function* func,
diff --git a/dlls/dbghelp/dwarf.c b/dlls/dbghelp/dwarf.c
index f05186eb9c0..33c3b7fc467 100644
--- a/dlls/dbghelp/dwarf.c
+++ b/dlls/dbghelp/dwarf.c
@@ -1880,8 +1880,7 @@ static void dwarf2_parse_variable(dwarf2_subprogram_t* subpgm,
     else if (dwarf2_find_attribute(di, DW_AT_const_value, &value))
     {
         VARIANT v;
-        if (subpgm->func) WARN("Unsupported constant %s in function\n", debugstr_a(name.u.string));
-        if (is_pmt)       FIXME("Unsupported constant (parameter) %s in function\n", debugstr_a(name.u.string));
+
         switch (value.form)
         {
         case DW_FORM_data1:
@@ -1936,8 +1935,16 @@ static void dwarf2_parse_variable(dwarf2_subprogram_t* subpgm,
                   debugstr_a(name.u.string), value.form);
             v.n1.n2.vt = VT_EMPTY;
         }
-        di->symt = &symt_new_constant(subpgm->ctx->module_ctx->module, subpgm->ctx->compiland,
-                                      name.u.string, param_type, &v)->symt;
+        if (subpgm->func)
+        {
+            if (is_pmt) FIXME("Unsupported constant (parameter) %s in function '%s'\n", debugstr_a(name.u.string), subpgm->func->hash_elt.name);
+            di->symt = &symt_add_func_constant(subpgm->ctx->module_ctx->module,
+                                               subpgm->func, block,
+                                               param_type, name.u.string, &v)->symt;
+        }
+        else
+            di->symt = &symt_new_constant(subpgm->ctx->module_ctx->module, subpgm->ctx->compiland,
+                                          name.u.string, param_type, &v)->symt;
     }
     else
     {
diff --git a/dlls/dbghelp/symbol.c b/dlls/dbghelp/symbol.c
index 29376812653..e2fde00456a 100644
--- a/dlls/dbghelp/symbol.c
+++ b/dlls/dbghelp/symbol.c
@@ -409,6 +409,42 @@ struct symt_data* symt_add_func_local(struct module* module,
     return locsym;
 }
 
+/******************************************************************
+ *             symt_add_func_local
+ *
+ * Adds a new (local) constant to a given function
+ */
+struct symt_data* symt_add_func_constant(struct module* module,
+                                         struct symt_function* func,
+                                         struct symt_block* block,
+                                         struct symt* type, const char* name,
+                                         VARIANT* v)
+{
+    struct symt_data*   locsym;
+    struct symt**       p;
+
+    TRACE_(dbghelp_symt)("Adding local constant (%s:%s): %s %p\n",
+                         debugstr_w(module->modulename), func->hash_elt.name,
+                         name, type);
+
+    assert(func);
+    assert(func->symt.tag == SymTagFunction);
+
+    locsym = pool_alloc(&module->pool, sizeof(*locsym));
+    locsym->symt.tag      = SymTagData;
+    locsym->hash_elt.name = pool_strdup(&module->pool, name);
+    locsym->hash_elt.next = NULL;
+    locsym->kind          = DataIsConstant;
+    locsym->container     = block ? &block->symt : &func->symt;
+    locsym->type          = type;
+    locsym->u.value       = *v;
+    if (block)
+        p = vector_add(&block->vchildren, &module->pool);
+    else
+        p = vector_add(&func->vchildren, &module->pool);
+    *p = &locsym->symt;
+    return locsym;
+}
 
 struct symt_block* symt_open_func_block(struct module* module, 
                                         struct symt_function* func,
@@ -653,6 +689,9 @@ static void symt_fill_sym_info(struct module_pair* pair,
                 break;
             case DataIsConstant:
                 sym_info->Flags |= SYMFLAG_VALUEPRESENT;
+                if (data->container &&
+                    (data->container->tag == SymTagFunction || data->container->tag == SymTagBlock))
+                    sym_info->Flags |= SYMFLAG_LOCAL;
                 switch (data->u.value.n1.n2.vt)
                 {
                 case VT_I4:  sym_info->Value = (ULONG)data->u.value.n1.n2.n3.lVal; break;




More information about the wine-cvs mailing list