Eric Pouech : dbghelp: Created a CPU method to map dwarf register number to codeview register number .

Alexandre Julliard julliard at winehq.org
Thu Mar 25 11:44:42 CDT 2010


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

Author: Eric Pouech <eric.pouech at orange.fr>
Date:   Wed Mar 24 22:04:18 2010 +0100

dbghelp: Created a CPU method to map dwarf register number to codeview register number.

---

 dlls/dbghelp/cpu_i386.c        |   47 +++++++++++++++++++++++++++++++++
 dlls/dbghelp/cpu_ppc.c         |    7 +++++
 dlls/dbghelp/cpu_x86_64.c      |   56 ++++++++++++++++++++++++++++++++++++++++
 dlls/dbghelp/dbghelp_private.h |    3 ++
 dlls/dbghelp/dwarf.c           |   43 ++----------------------------
 include/cvconst.h              |    2 +
 6 files changed, 118 insertions(+), 40 deletions(-)

diff --git a/dlls/dbghelp/cpu_i386.c b/dlls/dbghelp/cpu_i386.c
index cf7e149..32d600c 100644
--- a/dlls/dbghelp/cpu_i386.c
+++ b/dlls/dbghelp/cpu_i386.c
@@ -404,10 +404,57 @@ done_err:
     return FALSE;
 }
 
+static unsigned i386_map_dwarf_register(unsigned regno)
+{
+    unsigned    reg;
+
+    switch (regno)
+    {
+    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;
+}
+
 struct cpu cpu_i386 = {
     IMAGE_FILE_MACHINE_I386,
     4,
     i386_get_addr,
     i386_stack_walk,
     NULL,
+    i386_map_dwarf_register,
 };
diff --git a/dlls/dbghelp/cpu_ppc.c b/dlls/dbghelp/cpu_ppc.c
index 16e4a97..9a17aee 100644
--- a/dlls/dbghelp/cpu_ppc.c
+++ b/dlls/dbghelp/cpu_ppc.c
@@ -54,10 +54,17 @@ static BOOL ppc_stack_walk(struct cpu_stack_walk* csw, LPSTACKFRAME64 frame, CON
     return FALSE;
 }
 
+static unsigned ppc_map_dwarf_register(unsigned regno)
+{
+    FIXME("not done\n");
+    return 0;
+}
+
 struct cpu cpu_ppc = {
     IMAGE_FILE_MACHINE_POWERPC,
     4,
     ppc_get_addr,
     ppc_stack_walk,
     NULL,
+    ppc_map_dwarf_register,
 };
diff --git a/dlls/dbghelp/cpu_x86_64.c b/dlls/dbghelp/cpu_x86_64.c
index fde771c..43af5e0 100644
--- a/dlls/dbghelp/cpu_x86_64.c
+++ b/dlls/dbghelp/cpu_x86_64.c
@@ -579,10 +579,66 @@ static void*    x86_64_find_runtime_function(struct module* module, DWORD64 addr
     return NULL;
 }
 
+static unsigned x86_64_map_dwarf_register(unsigned regno)
+{
+    unsigned    reg;
+
+    if (regno >= 17 && regno <= 24)
+        reg = CV_AMD64_XMM0 + regno - 17;
+    else if (regno >= 25 && regno <= 32)
+        reg = CV_AMD64_XMM8 + regno - 25;
+    else if (regno >= 33 && regno <= 40)
+        reg = CV_AMD64_ST0 + regno - 33;
+    else switch (regno)
+    {
+    case  0: reg = CV_AMD64_RAX;    break;
+    case  1: reg = CV_AMD64_RDX;    break;
+    case  2: reg = CV_AMD64_RCX;    break;
+    case  3: reg = CV_AMD64_RBX;    break;
+    case  4: reg = CV_AMD64_RSI;    break;
+    case  5: reg = CV_AMD64_RDI;    break;
+    case  6: reg = CV_AMD64_RBP;    break;
+    case  7: reg = CV_AMD64_RSP;    break;
+    case  8: reg = CV_AMD64_R8;     break;
+    case  9: reg = CV_AMD64_R9;     break;
+    case 10: reg = CV_AMD64_R10;    break;
+    case 11: reg = CV_AMD64_R11;    break;
+    case 12: reg = CV_AMD64_R12;    break;
+    case 13: reg = CV_AMD64_R13;    break;
+    case 14: reg = CV_AMD64_R14;    break;
+    case 15: reg = CV_AMD64_R15;    break;
+    case 16: reg = CV_AMD64_RIP;    break;
+    case 49: reg = CV_AMD64_EFLAGS; break;
+    case 50: reg = CV_AMD64_ES;     break;
+    case 51: reg = CV_AMD64_CS;     break;
+    case 52: reg = CV_AMD64_SS;     break;
+    case 53: reg = CV_AMD64_DS;     break;
+    case 54: reg = CV_AMD64_FS;     break;
+    case 55: reg = CV_AMD64_GS;     break;
+    case 62: reg = CV_AMD64_TR;     break;
+    case 63: reg = CV_AMD64_LDTR;   break;
+    case 64: reg = CV_AMD64_MXCSR;  break;
+    case 65: reg = CV_AMD64_CTRL;   break;
+    case 66: reg = CV_AMD64_STAT;   break;
+/*
+ * 56-57 reserved
+ * 58 %fs.base
+ * 59 %gs.base
+ * 60-61 reserved
+ */
+    default:
+        FIXME("Don't know how to map register %d\n", regno);
+        return 0;
+    }
+    return reg;
+}
+
+
 struct cpu cpu_x86_64 = {
     IMAGE_FILE_MACHINE_AMD64,
     8,
     x86_64_get_addr,
     x86_64_stack_walk,
     x86_64_find_runtime_function,
+    x86_64_map_dwarf_register,
 };
diff --git a/dlls/dbghelp/dbghelp_private.h b/dlls/dbghelp/dbghelp_private.h
index 70fb1b0..9f47b32 100644
--- a/dlls/dbghelp/dbghelp_private.h
+++ b/dlls/dbghelp/dbghelp_private.h
@@ -478,6 +478,9 @@ struct cpu
 
     /* module manipulation */
     void*       (*find_runtime_function)(struct module*, DWORD64 addr);
+
+    /* dwarf dedicated information */
+    unsigned    (*map_dwarf_register)(unsigned regno);
 };
 
 extern struct cpu*      dbghelp_current_cpu;
diff --git a/dlls/dbghelp/dwarf.c b/dlls/dbghelp/dwarf.c
index 5513bed..e3c9ed9 100644
--- a/dlls/dbghelp/dwarf.c
+++ b/dlls/dbghelp/dwarf.c
@@ -629,49 +629,12 @@ static void dwarf2_load_one_entry(dwarf2_parse_context_t*, dwarf2_debug_info_t*,
 
 static unsigned dwarf2_map_register(int regno)
 {
-    unsigned    reg;
-
-    switch (regno)
+    if (regno == Wine_DW_no_register)
     {
-    case Wine_DW_no_register: FIXME("What the heck map reg 0x%x\n",regno); 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);
+        FIXME("What the heck map reg 0x%x\n",regno);
         return 0;
     }
-    return reg;
+    return dbghelp_current_cpu->map_dwarf_register(regno);
 }
 
 static enum location_error
diff --git a/include/cvconst.h b/include/cvconst.h
index 86dd3f1..1599a26 100644
--- a/include/cvconst.h
+++ b/include/cvconst.h
@@ -511,6 +511,8 @@ enum CV_HREG_e
     CV_AMD64_MM70       = CV_REG_MM70,
     CV_AMD64_MM71       = CV_REG_MM71,
 
+    CV_AMD64_XMM8       = 252,           /* this includes XMM9 to XMM15 */
+
     CV_AMD64_RAX        = 328,
     CV_AMD64_RBX        = 329,
     CV_AMD64_RCX        = 330,




More information about the wine-cvs mailing list