]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Arch-abstraction:
authorNicholas Nethercote <n.nethercote@gmail.com>
Sat, 11 Sep 2004 23:48:22 +0000 (23:48 +0000)
committerNicholas Nethercote <n.nethercote@gmail.com>
Sat, 11 Sep 2004 23:48:22 +0000 (23:48 +0000)
- in vg_symtab2.c, abstract out mentions of specific registers.

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@2703

coregrind/core.h
coregrind/vg_symtab2.c
coregrind/x86/state.c

index 2a99c42f50bc7d29c9a7c6e264f055101ff7fceb..6b279734af516c7104f156678ba8173c9661b9ab 100644 (file)
@@ -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 );
index 9df9f8364ed14f652ea763426b2726b72adcaad4..20a9d510a8b8d18537f7225ddc79eb5c7e9eff26 100644 (file)
@@ -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);
index 89fcff62befca54d82c065f8ae3862b87ca67a5d..05bb401665b361df26bb2a424c5c38282e9c18cb 100644 (file)
@@ -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                                         ---*/
 /*------------------------------------------------------------*/