Use gdbarch_tdep for 68hc11 specific data (stack_correction global)
authorStephane Carrez <stcarrez@nerim.fr>
Fri, 24 Nov 2000 20:59:42 +0000 (20:59 +0000)
committerStephane Carrez <stcarrez@nerim.fr>
Fri, 24 Nov 2000 20:59:42 +0000 (20:59 +0000)
gdb/ChangeLog
gdb/m68hc11-tdep.c

index 8d6ccfc..f1d5040 100644 (file)
@@ -1,3 +1,17 @@
+2000-11-24  Stephane Carrez  <Stephane.Carrez@worldnet.fr>
+
+       * m68hc11-tdep.c (gdbarch_tdep): Move stack_correction global to here.
+       (STACK_CORRECTION): Get stack correction using gdbarch_tdep.
+       (m68hc11_saved_pc_after_call): Use STACK_CORRECTION.
+       (m68hc11_frame_chain): Likewise.
+       (m68hc11_frame_init_saved_regs): Likewise.
+       (m68hc11_init_extra_frame_info): Likewise.
+       (m68hc11_push_arguments): Likewise.
+       (m68hc11_push_arguments): Likewise.
+       (m68hc11_store_struct_return): Likewise.
+       (m68hc11_push_return_address): Likewise.
+       (m68hc11_gdbarch_init): Setup stack_correction according to arch.
+
 Mon Nov 20 13:59:29 2000  Andrew Cagney  <cagney@b1.cygnus.com>
 
        * configure.in: Add support for configure option
index e059796..df22d6a 100644 (file)
@@ -81,8 +81,17 @@ struct gdbarch_tdep
   {
     /* from the elf header */
     int elf_flags;
+
+    /* Stack pointer correction value.  For 68hc11, the stack pointer points
+       to the next push location.  An offset of 1 must be applied to obtain
+       the address where the last value is saved.  For 68hc12, the stack
+       pointer points to the last value pushed.  No offset is necessary.  */
+    int stack_correction;
   };
 
+#define M6811_TDEP gdbarch_tdep (current_gdbarch)
+#define STACK_CORRECTION (M6811_TDEP->stack_correction)
+
 struct frame_extra_info
 {
   int frame_reg;
@@ -120,12 +129,6 @@ static int soft_min_addr;
 static int soft_max_addr;
 static int soft_reg_initialized = 0;
 
-/* Stack pointer correction value.  For 68hc11, the stack pointer points
-   to the next push location.  An offset of 1 must be applied to obtain
-   the address where the last value is saved.  For 68hc12, the stack
-   pointer points to the last value pushed.  No offset is necessary.  */
-static int stack_correction = 1;
-
 /* Look in the symbol table for the address of a pseudo register
    in memory.  If we don't find it, pretend the register is not used
    and not available.  */
@@ -281,7 +284,7 @@ m68hc11_saved_pc_after_call (struct frame_info *frame)
 {
   CORE_ADDR addr;
   
-  addr = read_register (HARD_SP_REGNUM) + stack_correction;
+  addr = read_register (HARD_SP_REGNUM) + STACK_CORRECTION;
   addr &= 0x0ffff;
   return read_memory_integer (addr, 2) & 0x0FFFF;
 }
@@ -634,7 +637,7 @@ m68hc11_frame_chain (struct frame_info *frame)
       return (CORE_ADDR) 0;
     }
 
-  addr = frame->frame + frame->extra_info->size + stack_correction - 2;
+  addr = frame->frame + frame->extra_info->size + STACK_CORRECTION - 2;
   addr = read_memory_unsigned_integer (addr, 2) & 0x0FFFF;
   if (addr == 0)
     {
@@ -664,7 +667,7 @@ m68hc11_frame_init_saved_regs (struct frame_info *fi)
   m68hc11_guess_from_prologue (pc, fi->frame, &pc, &fi->extra_info->size,
                                fi->saved_regs);
 
-  addr = fi->frame + fi->extra_info->size + stack_correction;
+  addr = fi->frame + fi->extra_info->size + STACK_CORRECTION;
   fi->saved_regs[SOFT_FP_REGNUM] = addr - 2;
   fi->saved_regs[HARD_SP_REGNUM] = addr;
   fi->saved_regs[HARD_PC_REGNUM] = fi->saved_regs[HARD_SP_REGNUM];
@@ -689,7 +692,7 @@ m68hc11_init_extra_frame_info (int fromleaf, struct frame_info *fi)
     }
   else
     {
-      addr = fi->frame + fi->extra_info->size + stack_correction;
+      addr = fi->frame + fi->extra_info->size + STACK_CORRECTION;
       addr = read_memory_unsigned_integer (addr, 2) & 0x0ffff;
       fi->extra_info->return_pc = addr;
 #if 0
@@ -777,7 +780,7 @@ m68hc11_push_arguments (int nargs,
       /* The struct is allocated on the stack and gdb used the stack
          pointer for the address of that struct.  We must apply the
          stack offset on the address.  */
-      write_register (HARD_D_REGNUM, struct_addr + stack_correction);
+      write_register (HARD_D_REGNUM, struct_addr + STACK_CORRECTION);
     }
   else if (nargs > 0)
     {
@@ -804,7 +807,7 @@ m68hc11_push_arguments (int nargs,
     }
   sp -= stack_alloc;
 
-  stack_offset = stack_correction;
+  stack_offset = STACK_CORRECTION;
   for (argnum = first_stack_argnum; argnum < nargs; argnum++)
     {
       type = VALUE_TYPE (args[argnum]);
@@ -845,7 +848,7 @@ m68hc11_store_struct_return (CORE_ADDR addr, CORE_ADDR sp)
   /* The struct address computed by gdb is on the stack.
      It uses the stack pointer so we must apply the stack
      correction offset.  */
-  write_register (HARD_D_REGNUM, addr + stack_correction);
+  write_register (HARD_D_REGNUM, addr + STACK_CORRECTION);
 }
 
 static void
@@ -944,7 +947,7 @@ m68hc11_push_return_address (CORE_ADDR pc, CORE_ADDR sp)
   pc = CALL_DUMMY_ADDRESS ();
   sp -= 2;
   store_unsigned_integer (valbuf, 2, pc);
-  write_memory (sp + stack_correction, valbuf, 2);
+  write_memory (sp + STACK_CORRECTION, valbuf, 2);
   return sp;
 }
 
@@ -993,7 +996,20 @@ m68hc11_gdbarch_init (struct gdbarch_info info,
   tdep = (struct gdbarch_tdep *) xmalloc (sizeof (struct gdbarch_tdep));
   gdbarch = gdbarch_alloc (&info, tdep);
   tdep->elf_flags = elf_flags;
+  switch (info.bfd_arch_info->arch)
+    {
+    case bfd_arch_m68hc11:
+      tdep->stack_correction = 1;
+      break;
 
+    case bfd_arch_m68hc12:
+      tdep->stack_correction = 0;
+      break;
+
+    default:
+      break;
+    }
+  
   /* Initially set everything according to the ABI.  */
   set_gdbarch_short_bit (gdbarch, 16);
   set_gdbarch_int_bit (gdbarch, 32);