Eric Pouech : dbghelp: Extended CPU structure by adding a default register number for frame.
Alexandre Julliard
julliard at winehq.org
Tue Apr 12 11:07:35 CDT 2011
Module: wine
Branch: master
Commit: 9c09f14270fb7b6fd37f153910fd61979fb93074
URL: http://source.winehq.org/git/wine.git/?a=commit;h=9c09f14270fb7b6fd37f153910fd61979fb93074
Author: Eric Pouech <eric.pouech at orange.fr>
Date: Mon Apr 11 20:47:19 2011 +0200
dbghelp: Extended CPU structure by adding a default register number for frame.
---
dlls/dbghelp/cpu_arm.c | 1 +
dlls/dbghelp/cpu_i386.c | 1 +
dlls/dbghelp/cpu_ppc.c | 1 +
dlls/dbghelp/cpu_sparc.c | 1 +
dlls/dbghelp/cpu_x86_64.c | 1 +
dlls/dbghelp/dbghelp_private.h | 2 ++
dlls/dbghelp/dwarf.c | 2 +-
dlls/dbghelp/stabs.c | 4 ++--
dlls/dbghelp/symbol.c | 5 +++--
9 files changed, 13 insertions(+), 5 deletions(-)
diff --git a/dlls/dbghelp/cpu_arm.c b/dlls/dbghelp/cpu_arm.c
index fd0b781..4365828 100644
--- a/dlls/dbghelp/cpu_arm.c
+++ b/dlls/dbghelp/cpu_arm.c
@@ -73,6 +73,7 @@ static const char* arm_fetch_regname(unsigned regno)
struct cpu cpu_arm = {
IMAGE_FILE_MACHINE_ARM,
4,
+ CV_ARM_NOREG, /* FIXME */
arm_get_addr,
arm_stack_walk,
NULL,
diff --git a/dlls/dbghelp/cpu_i386.c b/dlls/dbghelp/cpu_i386.c
index 09d88a6..6abcddc 100644
--- a/dlls/dbghelp/cpu_i386.c
+++ b/dlls/dbghelp/cpu_i386.c
@@ -635,6 +635,7 @@ static const char* i386_fetch_regname(unsigned regno)
struct cpu cpu_i386 = {
IMAGE_FILE_MACHINE_I386,
4,
+ CV_REG_EBP,
i386_get_addr,
i386_stack_walk,
NULL,
diff --git a/dlls/dbghelp/cpu_ppc.c b/dlls/dbghelp/cpu_ppc.c
index 938e371..96a5d7d 100644
--- a/dlls/dbghelp/cpu_ppc.c
+++ b/dlls/dbghelp/cpu_ppc.c
@@ -75,6 +75,7 @@ static const char* ppc_fetch_regname(unsigned regno)
struct cpu cpu_ppc = {
IMAGE_FILE_MACHINE_POWERPC,
4,
+ CV_REG_NONE, /* FIXME */
ppc_get_addr,
ppc_stack_walk,
NULL,
diff --git a/dlls/dbghelp/cpu_sparc.c b/dlls/dbghelp/cpu_sparc.c
index c69e419..1de9436 100644
--- a/dlls/dbghelp/cpu_sparc.c
+++ b/dlls/dbghelp/cpu_sparc.c
@@ -70,6 +70,7 @@ static const char* sparc_fetch_regname(unsigned regno)
struct cpu cpu_sparc = {
IMAGE_FILE_MACHINE_SPARC,
4,
+ CV_REG_NONE, /* FIXME */
sparc_get_addr,
sparc_stack_walk,
NULL,
diff --git a/dlls/dbghelp/cpu_x86_64.c b/dlls/dbghelp/cpu_x86_64.c
index 375c0d8..5c0dece 100644
--- a/dlls/dbghelp/cpu_x86_64.c
+++ b/dlls/dbghelp/cpu_x86_64.c
@@ -799,6 +799,7 @@ static const char* x86_64_fetch_regname(unsigned regno)
struct cpu cpu_x86_64 = {
IMAGE_FILE_MACHINE_AMD64,
8,
+ CV_AMD64_RSP,
x86_64_get_addr,
x86_64_stack_walk,
x86_64_find_runtime_function,
diff --git a/dlls/dbghelp/dbghelp_private.h b/dlls/dbghelp/dbghelp_private.h
index 7975379..3c878cc 100644
--- a/dlls/dbghelp/dbghelp_private.h
+++ b/dlls/dbghelp/dbghelp_private.h
@@ -470,6 +470,8 @@ struct cpu
{
DWORD machine;
DWORD word_size;
+ DWORD frame_regno;
+
/* address manipulation */
unsigned (*get_addr)(HANDLE hThread, const CONTEXT* ctx,
enum cpu_addr, ADDRESS64* addr);
diff --git a/dlls/dbghelp/dwarf.c b/dlls/dbghelp/dwarf.c
index 5b2cb01..103bdbf 100644
--- a/dlls/dbghelp/dwarf.c
+++ b/dlls/dbghelp/dwarf.c
@@ -1899,7 +1899,7 @@ static struct symt* dwarf2_parse_subprogram(dwarf2_parse_context_t* ctx,
{
/* on stack !! */
subpgm.frame.kind = loc_regrel;
- subpgm.frame.reg = 0;
+ subpgm.frame.reg = dbghelp_current_cpu->frame_regno;
subpgm.frame.offset = 0;
}
subpgm.non_computed_variable = FALSE;
diff --git a/dlls/dbghelp/stabs.c b/dlls/dbghelp/stabs.c
index 721d5e7..3f28009 100644
--- a/dlls/dbghelp/stabs.c
+++ b/dlls/dbghelp/stabs.c
@@ -1417,7 +1417,7 @@ BOOL stabs_parse(struct module* module, unsigned long load_offset,
struct symt* param_type = stabs_parse_type(ptr);
stab_strcpy(symname, sizeof(symname), ptr);
loc.kind = loc_regrel;
- loc.reg = 0; /* FIXME */
+ loc.reg = dbghelp_current_cpu->frame_regno;
loc.offset = stab_ptr->n_value;
symt_add_func_local(module, curr_func,
(int)stab_ptr->n_value >= 0 ? DataIsParam : DataIsLocal,
@@ -1492,7 +1492,7 @@ BOOL stabs_parse(struct module* module, unsigned long load_offset,
case N_LSYM:
/* These are local variables */
loc.kind = loc_regrel;
- loc.reg = 0; /* FIXME */
+ loc.reg = dbghelp_current_cpu->frame_regno;
loc.offset = stab_ptr->n_value;
if (curr_func != NULL) pending_add_var(&pending_block, ptr, DataIsLocal, &loc);
break;
diff --git a/dlls/dbghelp/symbol.c b/dlls/dbghelp/symbol.c
index e92d998..16923e4 100644
--- a/dlls/dbghelp/symbol.c
+++ b/dlls/dbghelp/symbol.c
@@ -721,8 +721,9 @@ static void symt_fill_sym_info(struct module_pair* pair,
break;
case loc_regrel:
sym_info->Flags |= SYMFLAG_LOCAL | SYMFLAG_REGREL;
- /* FIXME: it's i386 dependent !!! */
- sym_info->Register = loc.reg ? loc.reg : CV_REG_EBP;
+ sym_info->Register = loc.reg;
+ if (loc.reg == CV_REG_NONE || (int)loc.reg < 0 /* error */)
+ FIXME("suspicious register value %x\n", loc.reg);
sym_info->Address = loc.offset;
break;
case loc_absolute:
More information about the wine-cvs
mailing list