From: Nicholas Nethercote Date: Sat, 11 Sep 2004 23:48:22 +0000 (+0000) Subject: Arch-abstraction: X-Git-Tag: svn/VALGRIND_3_0_0~1583 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=68da16321d487c68ac521eee558e7ebfb3e2adf1;p=thirdparty%2Fvalgrind.git Arch-abstraction: - in vg_symtab2.c, abstract out mentions of specific registers. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@2703 --- diff --git a/coregrind/core.h b/coregrind/core.h index 2a99c42f50..6b279734af 100644 --- a/coregrind/core.h +++ b/coregrind/core.h @@ -1500,6 +1500,9 @@ extern void VGA_(init_thread) ( arch_thread_t * ); extern void VGA_(cleanup_thread) ( arch_thread_t* ); 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 ); extern Int VGA_(ptrace_setregs_from_BB) ( Int pid ); diff --git a/coregrind/vg_symtab2.c b/coregrind/vg_symtab2.c index 9df9f8364e..20a9d510a8 100644 --- a/coregrind/vg_symtab2.c +++ b/coregrind/vg_symtab2.c @@ -2002,40 +2002,10 @@ static UInt *regaddr(ThreadId tid, Int regno) { 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) { Char file[100]; @@ -2132,7 +2102,8 @@ Variable *VG_(get_scope_variables)(ThreadId tid) 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); v->valuep = (Addr)(reg + sym->u.offset); diff --git a/coregrind/x86/state.c b/coregrind/x86/state.c index 89fcff62be..05bb401665 100644 --- a/coregrind/x86/state.c +++ b/coregrind/x86/state.c @@ -490,6 +490,43 @@ void VGA_(setup_child) ( arch_thread_t *regs, arch_thread_t *parent_regs ) VG_(baseBlock)[VGOFF_(tls_ptr)] = (UInt) regs->tls; } +/*------------------------------------------------------------*/ +/*--- 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 ---*/ /*------------------------------------------------------------*/