|
From: Nicholas N. <nj...@ca...> - 2004-09-11 23:48:27
|
CVS commit by nethercote:
Arch-abstraction:
- in vg_symtab2.c, abstract out mentions of specific registers.
M +3 -0 core.h 1.24
M +6 -35 vg_symtab2.c 1.89
M +37 -0 x86/state.c 1.8
--- valgrind/coregrind/core.h #1.23:1.24
@@ -1501,4 +1501,7 @@ extern void VGA_(cleanup_thread) ( arch_
extern void VGA_(setup_child) ( arch_thread_t*, arch_thread_t* );
+extern UInt* VGA_(reg_addr_from_BB) ( Int reg );
+extern UInt* VGA_(reg_addr_from_tst) ( Int reg, arch_thread_t* );
+
extern Bool VGA_(setup_pointercheck) ( void );
--- valgrind/coregrind/vg_symtab2.c #1.88:1.89
@@ -2003,38 +2003,8 @@ static UInt *regaddr(ThreadId tid, Int r
UInt *ret = 0;
- if (VG_(is_running_thread)(tid)) {
- Int idx;
-
- switch(regno) {
- case R_EAX: idx = VGOFF_(m_eax); break;
- case R_ECX: idx = VGOFF_(m_ecx); break;
- case R_EDX: idx = VGOFF_(m_edx); break;
- case R_EBX: idx = VGOFF_(m_ebx); break;
- case R_ESP: idx = VGOFF_(m_esp); break;
- case R_EBP: idx = VGOFF_(m_ebp); break;
- case R_ESI: idx = VGOFF_(m_esi); break;
- case R_EDI: idx = VGOFF_(m_edi); break;
- default:
- idx = -1;
- break;
- }
- if (idx != -1)
- ret = &VG_(baseBlock)[idx];
- } else {
- ThreadState *tst = &VG_(threads)[tid];
-
- switch(regno) {
- case R_EAX: ret = &tst->arch.m_eax; break;
- case R_ECX: ret = &tst->arch.m_ecx; break;
- case R_EDX: ret = &tst->arch.m_edx; break;
- case R_EBX: ret = &tst->arch.m_ebx; break;
- case R_ESP: ret = &tst->arch.m_esp; break;
- case R_EBP: ret = &tst->arch.m_ebp; break;
- case R_ESI: ret = &tst->arch.m_esi; break;
- case R_EDI: ret = &tst->arch.m_edi; break;
- default:
- break;
- }
- }
+ if (VG_(is_running_thread)(tid))
+ ret = VGA_(reg_addr_from_BB)(regno);
+ else
+ ret = VGA_(reg_addr_from_tst)(regno, &VG_(threads)[tid].arch);
if (ret == 0) {
@@ -2133,5 +2103,6 @@ Variable *VG_(get_scope_variables)(Threa
case SyEBPrel:
case SyESPrel:
- reg = *regaddr(tid, sym->kind == SyESPrel ? R_ESP : R_EBP);
+ reg = *regaddr(tid, sym->kind == SyESPrel ?
+ R_STACK_PTR : R_FRAME_PTR);
if (debug)
VG_(printf)("reg=%p+%d=%p\n", reg, sym->u.offset, reg+sym->u.offset);
--- valgrind/coregrind/x86/state.c #1.7:1.8
@@ -492,4 +492,41 @@ void VGA_(setup_child) ( arch_thread_t *
/*------------------------------------------------------------*/
+/*--- Symtab stuff ---*/
+/*------------------------------------------------------------*/
+
+UInt *VGA_(reg_addr_from_BB)(Int regno)
+{
+ Int r;
+ switch (regno) {
+ case R_EAX: r = VGOFF_(m_eax); break;
+ case R_ECX: r = VGOFF_(m_ecx); break;
+ case R_EDX: r = VGOFF_(m_edx); break;
+ case R_EBX: r = VGOFF_(m_ebx); break;
+ case R_ESP: r = VGOFF_(m_esp); break;
+ case R_EBP: r = VGOFF_(m_ebp); break;
+ case R_ESI: r = VGOFF_(m_esi); break;
+ case R_EDI: r = VGOFF_(m_edi); break;
+ default:
+ return NULL;
+ }
+ return &VG_(baseBlock)[r];
+}
+
+UInt *VGA_(reg_addr_from_tst)(Int regno, arch_thread_t *arch)
+{
+ switch (regno) {
+ case R_EAX: return &arch->m_eax;
+ case R_ECX: return &arch->m_ecx;
+ case R_EDX: return &arch->m_edx;
+ case R_EBX: return &arch->m_ebx;
+ case R_ESP: return &arch->m_esp;
+ case R_EBP: return &arch->m_ebp;
+ case R_ESI: return &arch->m_esi;
+ case R_EDI: return &arch->m_edi;
+ default: return NULL;
+ }
+}
+
+/*------------------------------------------------------------*/
/*--- pointercheck ---*/
/*------------------------------------------------------------*/
|