- in vg_symtab2.c, abstract out mentions of specific registers.
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@2703
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 );
{
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];
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);
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 ---*/
/*------------------------------------------------------------*/