[PATCH 21/31] [DbgHelp]: dwarf & func pmt

Eric Pouech eric.pouech at wanadoo.fr
Sun Jun 18 14:32:00 CDT 2006


- properly handling function formal parameters

A+
---

 dlls/dbghelp/dwarf.c |   82 +++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 74 insertions(+), 8 deletions(-)

diff --git a/dlls/dbghelp/dwarf.c b/dlls/dbghelp/dwarf.c
index bea4fbe..280e51d 100644
--- a/dlls/dbghelp/dwarf.c
+++ b/dlls/dbghelp/dwarf.c
@@ -59,6 +59,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(dbghelp_dwarf
  *      o unspecified parameters
  *      o inlined functions
  *      o line numbers
+ *      o Debug{Start|End}Point
  * - Udt
  *      o proper types loading (addresses, bitfield, nesting)
  */
@@ -955,20 +956,85 @@ static void dwarf2_parse_variable(dwarf2
     if (di->abbrev->have_child) FIXME("Unsupported children\n");
 }
 
+static unsigned dwarf2_map_register(int regno)
+{
+    unsigned    reg;
+
+    switch (regno)
+    {
+    case -1:
+    /* FIXME: this is a dirty hack */
+    case -2: reg = 0;          break;
+    case  0: reg = CV_REG_EAX; break;
+    case  1: reg = CV_REG_ECX; break;
+    case  2: reg = CV_REG_EDX; break;
+    case  3: reg = CV_REG_EBX; break;
+    case  4: reg = CV_REG_ESP; break;
+    case  5: reg = CV_REG_EBP; break;
+    case  6: reg = CV_REG_ESI; break;
+    case  7: reg = CV_REG_EDI; break;
+    case  8: reg = CV_REG_EIP; break;
+    case  9: reg = CV_REG_EFLAGS; break;
+    case 10: reg = CV_REG_CS;  break;
+    case 11: reg = CV_REG_SS;  break;
+    case 12: reg = CV_REG_DS;  break;
+    case 13: reg = CV_REG_ES;  break;
+    case 14: reg = CV_REG_FS;  break;
+    case 15: reg = CV_REG_GS;  break;
+    case 16: case 17: case 18: case 19:
+    case 20: case 21: case 22: case 23:
+        reg = CV_REG_ST0 + regno - 16; break;
+    case 24: reg = CV_REG_CTRL; break;
+    case 25: reg = CV_REG_STAT; break;
+    case 26: reg = CV_REG_TAG; break;
+/*
+reg: fiseg 27
+reg: fioff 28
+reg: foseg 29
+reg: fooff 30
+reg: fop   31
+*/
+    case 32: case 33: case 34: case 35:
+    case 36: case 37: case 38: case 39:
+        reg = CV_REG_XMM0 + regno - 32; break;
+    case 40: reg = CV_REG_MXCSR; break;
+    default:
+        FIXME("Don't know how to map register %d\n", regno);
+        return 0;
+    }
+    return reg;
+}
+
 static void dwarf2_parse_subprogram_parameter(dwarf2_parse_context_t* ctx,
-					      dwarf2_debug_info_t* di, 
-					      struct symt_function_signature* sig_type)
+                                              struct symt_function* func,
+					      struct symt_block* block,
+					      dwarf2_debug_info_t* di)
 {
     struct symt* param_type;
-    union attribute name;
+    union attribute loc;
 
     TRACE("%s, for %s\n", dwarf2_debug_ctx(ctx), dwarf2_debug_di(di));
 
     param_type = dwarf2_lookup_type(ctx, di);
-    dwarf2_find_name(ctx, di, &name, "parameter");
-    /* DW_AT_location */
-    if (sig_type) symt_add_function_signature_parameter(ctx->module, sig_type, param_type);
-    /* FIXME: add variable to func_type */
+    if (dwarf2_find_attribute(di, DW_AT_location, &loc))
+    {
+        union attribute name;
+        unsigned long offset;
+        int in_reg;
+
+        dwarf2_find_name(ctx, di, &name, "parameter");
+        offset = dwarf2_compute_location(ctx, loc.block, &in_reg);
+	TRACE("found parameter %s/%ld (reg=%d) at %s\n",
+              name.string, offset, in_reg, dwarf2_debug_ctx(ctx));
+        symt_add_func_local(ctx->module, func, 
+                            DataIsParam, dwarf2_map_register(in_reg), offset,
+                            block, param_type, name.string);
+    }
+    if (func && func->type)
+        symt_add_function_signature_parameter(ctx->module,
+                                              (struct symt_func_signature*)func->type,
+                                              param_type);
+
     if (di->abbrev->have_child) FIXME("Unsupported children\n");
 }
 
@@ -1137,7 +1203,7 @@ static struct symt* dwarf2_parse_subprog
             switch (child->abbrev->tag)
             {
             case DW_TAG_formal_parameter:
-                dwarf2_parse_subprogram_parameter(ctx, child, sig_type);
+                dwarf2_parse_subprogram_parameter(ctx, func, NULL, child);
                 break;
             case DW_TAG_lexical_block:
                 dwarf2_parse_subprogram_block(ctx, child, func);



More information about the wine-patches mailing list