Add quotes to avoid a null test expression.
[deliverable/binutils-gdb.git] / gdb / m68hc11-tdep.c
index 70a1649fcba5126663186f926ed304d743d53fe7..ed4cac02778f6a49b87aae835228d63dd160c1d6 100644 (file)
@@ -1,5 +1,8 @@
 /* Target-dependent code for Motorola 68HC11 & 68HC12
-   Copyright 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+
+   Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software
+   Foundation, Inc.
+
    Contributed by Stephane Carrez, stcarrez@nerim.fr
 
 This file is part of GDB.
@@ -50,16 +53,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
    analysis to compute correct stack frame layout.
    
    The MSB of the minimal symbol's "info" field is used for this purpose.
-   This field is already being used to store the symbol size, so the
-   assumption is that the symbol size cannot exceed 2^30.
 
    MSYMBOL_SET_RTC     Actually sets the "RTC" bit.
    MSYMBOL_SET_RTI     Actually sets the "RTI" bit.
    MSYMBOL_IS_RTC       Tests the "RTC" bit in a minimal symbol.
-   MSYMBOL_IS_RTI       Tests the "RTC" bit in a minimal symbol.
-   MSYMBOL_SIZE         Returns the size of the minimal symbol,
-                       i.e. the "info" field with the "special" bit
-                       masked out.  */
+   MSYMBOL_IS_RTI       Tests the "RTC" bit in a minimal symbol.  */
 
 #define MSYMBOL_SET_RTC(msym)                                           \
         MSYMBOL_INFO (msym) = (char *) (((long) MSYMBOL_INFO (msym))   \
@@ -75,9 +73,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #define MSYMBOL_IS_RTI(msym)                           \
        (((long) MSYMBOL_INFO (msym) & 0x40000000) != 0)
 
-#define MSYMBOL_SIZE(msym)                             \
-       ((long) MSYMBOL_INFO (msym) & 0x3fffffff)
-
 enum insn_return_kind {
   RETURN_RTS,
   RETURN_RTC,
@@ -180,14 +175,6 @@ struct m68hc11_unwind_cache
   struct trad_frame_saved_reg *saved_regs;
 };
 
-struct frame_extra_info
-{
-  CORE_ADDR return_pc;
-  int frameless;
-  int size;
-  enum insn_return_kind return_kind;
-};
-
 /* Table of registers for 68HC11.  This includes the hard registers
    and the soft registers used by GCC.  */
 static char *
@@ -275,10 +262,8 @@ m68hc11_initialize_register_info (void)
     }
 
   if (soft_regs[SOFT_FP_REGNUM].name == 0)
-    {
-      warning ("No frame soft register found in the symbol table.\n");
-      warning ("Stack backtrace will not work.\n");
-    }
+    warning (_("No frame soft register found in the symbol table.\n"
+              "Stack backtrace will not work."));
   soft_reg_initialized = 1;
 }
 
@@ -398,6 +383,8 @@ m68hc11_register_name (int reg_nr)
   if (reg_nr >= M68HC11_ALL_REGS)
     return NULL;
 
+  m68hc11_initialize_register_info ();
+
   /* If we don't know the address of a soft register, pretend it
      does not exist.  */
   if (reg_nr > M68HC11_LAST_HARD_REG && soft_regs[reg_nr].name == 0)
@@ -414,59 +401,6 @@ m68hc11_breakpoint_from_pc (CORE_ADDR *pcptr, int *lenptr)
   return breakpoint;
 }
 
-/* Immediately after a function call, return the saved pc before the frame
-   is setup.  */
-
-static CORE_ADDR
-m68hc11_saved_pc_after_call (struct frame_info *frame)
-{
-  CORE_ADDR addr;
-  ULONGEST sp;
-
-  regcache_cooked_read_unsigned (current_regcache, HARD_SP_REGNUM, &sp);
-  sp += STACK_CORRECTION;
-  addr = sp & 0x0ffff;
-  return read_memory_integer (addr, 2) & 0x0FFFF;
-}
-
-static CORE_ADDR
-m68hc11_frame_saved_pc (struct frame_info *frame)
-{
-  return get_frame_extra_info (frame)->return_pc;
-}
-
-/* Discard from the stack the innermost frame, restoring all saved
-   registers.  */
-
-static void
-m68hc11_pop_frame (void)
-{
-  register struct frame_info *frame = get_current_frame ();
-  register CORE_ADDR fp, sp;
-  register int regnum;
-
-  if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (frame),
-                                  get_frame_base (frame),
-                                  get_frame_base (frame)))
-    generic_pop_dummy_frame ();
-  else
-    {
-      fp = get_frame_base (frame);
-      DEPRECATED_FRAME_INIT_SAVED_REGS (frame);
-
-      /* Copy regs from where they were saved in the frame.  */
-      for (regnum = 0; regnum < M68HC11_ALL_REGS; regnum++)
-       if (get_frame_saved_regs (frame)[regnum])
-         write_register (regnum,
-                          read_memory_integer (get_frame_saved_regs (frame)[regnum], 2));
-
-      write_register (HARD_PC_REGNUM, get_frame_extra_info (frame)->return_pc);
-      sp = (fp + get_frame_extra_info (frame)->size + 2) & 0x0ffff;
-      write_register (HARD_SP_REGNUM, sp);
-    }
-  flush_cached_frames ();
-}
-
 \f
 /* 68HC11 & 68HC12 prologue analysis.
 
@@ -829,118 +763,6 @@ m68hc11_skip_prologue (CORE_ADDR pc)
   return pc;
 }
 
-/* Given a GDB frame, determine the address of the calling function's
-   frame.  This will be used to create a new GDB frame struct, and
-   then DEPRECATED_INIT_EXTRA_FRAME_INFO and DEPRECATED_INIT_FRAME_PC
-   will be called for the new frame.  */
-
-static CORE_ADDR
-m68hc11_frame_chain (struct frame_info *frame)
-{
-  CORE_ADDR addr;
-
-  if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (frame),
-                                  get_frame_base (frame),
-                                  get_frame_base (frame)))
-    return get_frame_base (frame);     /* dummy frame same as caller's frame */
-
-  if (get_frame_extra_info (frame)->return_pc == 0
-      || inside_entry_file (get_frame_extra_info (frame)->return_pc))
-    return (CORE_ADDR) 0;
-
-  if (get_frame_base (frame) == 0)
-    {
-      return (CORE_ADDR) 0;
-    }
-
-  addr = get_frame_base (frame) + get_frame_extra_info (frame)->size + STACK_CORRECTION - 2;
-  addr = read_memory_unsigned_integer (addr, 2) & 0x0FFFF;
-  return addr;
-}  
-#if 0
-/* Put here the code to store, into a struct frame_saved_regs, the
-   addresses of the saved registers of frame described by FRAME_INFO.
-   This includes special registers such as pc and fp saved in special
-   ways in the stack frame.   sp is even more special: the address we
-   return for it IS the sp for the next frame.  */
-static void
-m68hc11_frame_init_saved_regs (struct frame_info *fi)
-{
-  CORE_ADDR pc;
-  CORE_ADDR addr;
-
-  if (get_frame_saved_regs (fi) == NULL)
-    frame_saved_regs_zalloc (fi);
-  else
-    memset (get_frame_saved_regs (fi), 0, SIZEOF_FRAME_SAVED_REGS);
-
-  pc = get_frame_pc (fi);
-  get_frame_extra_info (fi)->return_kind = m68hc11_get_return_insn (pc);
-  m68hc11_guess_from_prologue (pc, pc, get_frame_base (fi), &pc,
-                              &get_frame_extra_info (fi)->size,
-                               get_frame_saved_regs (fi));
-
-  addr = get_frame_base (fi) + get_frame_extra_info (fi)->size + STACK_CORRECTION;
-  if (soft_regs[SOFT_FP_REGNUM].name)
-    get_frame_saved_regs (fi)[SOFT_FP_REGNUM] = addr - 2;
-
-  /* Take into account how the function was called/returns.  */
-  if (get_frame_extra_info (fi)->return_kind == RETURN_RTC)
-    {
-      get_frame_saved_regs (fi)[HARD_PAGE_REGNUM] = addr;
-      addr++;
-    }
-  else if (get_frame_extra_info (fi)->return_kind == RETURN_RTI)
-    {
-      get_frame_saved_regs (fi)[HARD_CCR_REGNUM] = addr;
-      get_frame_saved_regs (fi)[HARD_D_REGNUM] = addr + 1;
-      get_frame_saved_regs (fi)[HARD_X_REGNUM] = addr + 3;
-      get_frame_saved_regs (fi)[HARD_Y_REGNUM] = addr + 5;
-      addr += 7;
-    }
-  get_frame_saved_regs (fi)[HARD_SP_REGNUM] = addr;
-  get_frame_saved_regs (fi)[HARD_PC_REGNUM] = get_frame_saved_regs (fi)[HARD_SP_REGNUM];
-}
-
-static void
-m68hc11_init_extra_frame_info (int fromleaf, struct frame_info *fi)
-{
-  CORE_ADDR addr;
-
-  frame_extra_info_zalloc (fi, sizeof (struct frame_extra_info));
-  
-  if (get_next_frame (fi))
-    deprecated_update_frame_pc_hack (fi, DEPRECATED_FRAME_SAVED_PC (get_next_frame (fi)));
-  
-  m68hc11_frame_init_saved_regs (fi);
-
-  if (fromleaf)
-    {
-      get_frame_extra_info (fi)->return_kind = m68hc11_get_return_insn (get_frame_pc (fi));
-      get_frame_extra_info (fi)->return_pc = m68hc11_saved_pc_after_call (fi);
-    }
-  else
-    {
-      addr = get_frame_saved_regs (fi)[HARD_PC_REGNUM];
-      addr = read_memory_unsigned_integer (addr, 2) & 0x0ffff;
-
-      /* Take into account the 68HC12 specific call (PC + page).  */
-      if (get_frame_extra_info (fi)->return_kind == RETURN_RTC
-          && addr >= 0x08000 && addr < 0x0c000
-          && USE_PAGE_REGISTER)
-        {
-          CORE_ADDR page_addr = get_frame_saved_regs (fi)[HARD_PAGE_REGNUM];
-
-          unsigned page = read_memory_unsigned_integer (page_addr, 1);
-          addr -= 0x08000;
-          addr += ((page & 0x0ff) << 14);
-          addr += 0x1000000;
-        }
-      get_frame_extra_info (fi)->return_pc = addr;
-    }
-}
-#endif
-
 static CORE_ADDR
 m68hc11_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
 {
@@ -1067,11 +889,6 @@ m68hc11_frame_this_id (struct frame_info *next_frame,
   /* The FUNC is easy.  */
   func = frame_func_unwind (next_frame);
 
-  /* This is meant to halt the backtrace at "_start".  Make sure we
-     don't halt it at a generic dummy frame. */
-  if (inside_entry_file (func))
-    return;
-
   /* Hopefully the prologue analysis either correctly determined the
      frame's base (which is the SP from the previous frame), or set
      that base to "NULL".  */
@@ -1080,16 +897,6 @@ m68hc11_frame_this_id (struct frame_info *next_frame,
     return;
 
   id = frame_id_build (base, func);
-#if 0
-  /* Check that we're not going round in circles with the same frame
-     ID (but avoid applying the test to sentinel frames which do go
-     round in circles).  Can't use frame_id_eq() as that doesn't yet
-     compare the frame's PC value.  */
-  if (frame_relative_level (next_frame) >= 0
-      && get_frame_type (next_frame) != DUMMY_FRAME
-      && frame_id_eq (get_frame_id (next_frame), id))
-    return;
-#endif
   (*this_id) = id;
 }
 
@@ -1103,8 +910,8 @@ m68hc11_frame_prev_register (struct frame_info *next_frame,
   struct m68hc11_unwind_cache *info
     = m68hc11_frame_unwind_cache (next_frame, this_prologue_cache);
 
-  trad_frame_prev_register (next_frame, info->saved_regs, regnum,
-                            optimizedp, lvalp, addrp, realnump, bufferp);
+  trad_frame_get_prev_register (next_frame, info->saved_regs, regnum,
+                               optimizedp, lvalp, addrp, realnump, bufferp);
 
   if (regnum == HARD_PC_REGNUM)
     {
@@ -1117,9 +924,9 @@ m68hc11_frame_prev_register (struct frame_info *next_frame,
 
           CORE_ADDR page;
 
-          trad_frame_prev_register (next_frame, info->saved_regs,
-                                    HARD_PAGE_REGNUM, &page_optimized,
-                                    0, &page, 0, 0);
+          trad_frame_get_prev_register (next_frame, info->saved_regs,
+                                       HARD_PAGE_REGNUM, &page_optimized,
+                                       0, &page, 0, 0);
           *addrp -= 0x08000;
           *addrp += ((page & 0x0ff) << 14);
           *addrp += 0x1000000;
@@ -1134,7 +941,7 @@ static const struct frame_unwind m68hc11_frame_unwind = {
 };
 
 const struct frame_unwind *
-m68hc11_frame_p (CORE_ADDR pc)
+m68hc11_frame_sniffer (struct frame_info *next_frame)
 {
   return &m68hc11_frame_unwind;
 }
@@ -1205,9 +1012,9 @@ m68hc11_print_register (struct gdbarch *gdbarch, struct ui_file *file,
 
   if (regno == HARD_PC_REGNUM || regno == HARD_SP_REGNUM
       || regno == SOFT_FP_REGNUM || regno == M68HC12_HARD_PC_REGNUM)
-    frame_read_unsigned_register (frame, regno, &rval);
+    rval = get_frame_register_unsigned (frame, regno);
   else
-    frame_read_signed_register (frame, regno, &rval);
+    rval = get_frame_register_signed (frame, regno);
 
   if (regno == HARD_A_REGNUM || regno == HARD_B_REGNUM
       || regno == HARD_CCR_REGNUM || regno == HARD_PAGE_REGNUM)
@@ -1222,7 +1029,7 @@ m68hc11_print_register (struct gdbarch *gdbarch, struct ui_file *file,
         {
           ULONGEST page;
 
-          frame_read_unsigned_register (frame, HARD_PAGE_REGNUM, &page);
+          page = get_frame_register_unsigned (frame, HARD_PAGE_REGNUM);
           fprintf_filtered (file, "0x%02x:%04x ", (unsigned) page,
                             (unsigned) rval);
         }
@@ -1348,14 +1155,6 @@ m68hc11_print_registers_info (struct gdbarch *gdbarch, struct ui_file *file,
     }
 }
 
-/* Same as 'info reg' but prints the registers in a different way.  */
-static void
-show_regs (char *args, int from_tty)
-{
-  m68hc11_print_registers_info (current_gdbarch, gdb_stdout,
-                                get_current_frame (), -1, 1);
-}
-
 static CORE_ADDR
 m68hc11_stack_align (CORE_ADDR addr)
 {
@@ -1363,7 +1162,7 @@ m68hc11_stack_align (CORE_ADDR addr)
 }
 
 static CORE_ADDR
-m68hc11_push_dummy_call (struct gdbarch *gdbarch, CORE_ADDR func_addr,
+m68hc11_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
                          struct regcache *regcache, CORE_ADDR bp_addr,
                          int nargs, struct value **args, CORE_ADDR sp,
                          int struct_return, CORE_ADDR struct_addr)
@@ -1386,7 +1185,7 @@ m68hc11_push_dummy_call (struct gdbarch *gdbarch, CORE_ADDR func_addr,
     }
   else if (nargs > 0)
     {
-      type = VALUE_TYPE (args[0]);
+      type = value_type (args[0]);
       len = TYPE_LENGTH (type);
 
       /* First argument is passed in D and X registers.  */
@@ -1394,7 +1193,7 @@ m68hc11_push_dummy_call (struct gdbarch *gdbarch, CORE_ADDR func_addr,
         {
           ULONGEST v;
 
-          v = extract_unsigned_integer (VALUE_CONTENTS (args[0]), len);
+          v = extract_unsigned_integer (value_contents (args[0]), len);
           first_stack_argnum = 1;
 
           regcache_cooked_write_unsigned (regcache, HARD_D_REGNUM, v);
@@ -1408,7 +1207,7 @@ m68hc11_push_dummy_call (struct gdbarch *gdbarch, CORE_ADDR func_addr,
 
   for (argnum = nargs - 1; argnum >= first_stack_argnum; argnum--)
     {
-      type = VALUE_TYPE (args[argnum]);
+      type = value_type (args[argnum]);
       len = TYPE_LENGTH (type);
 
       if (len & 1)
@@ -1418,7 +1217,7 @@ m68hc11_push_dummy_call (struct gdbarch *gdbarch, CORE_ADDR func_addr,
           sp--;
           write_memory (sp, &zero, 1);
         }
-      val = (char*) VALUE_CONTENTS (args[argnum]);
+      val = (char*) value_contents (args[argnum]);
       sp -= len;
       write_memory (sp, val, len);
     }
@@ -1463,15 +1262,6 @@ m68hc11_register_type (struct gdbarch *gdbarch, int reg_nr)
     }
 }
 
-static void
-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);
-}
-
 static void
 m68hc11_store_return_value (struct type *type, struct regcache *regcache,
                             const void *valbuf)
@@ -1490,7 +1280,7 @@ m68hc11_store_return_value (struct type *type, struct regcache *regcache,
       regcache_raw_write (regcache, HARD_D_REGNUM, (char*) valbuf + (len - 2));
     }
   else
-    error ("return of value > 4 is not supported.");
+    error (_("return of value > 4 is not supported."));
 }
 
 
@@ -1528,35 +1318,28 @@ m68hc11_extract_return_value (struct type *type, struct regcache *regcache,
       break;
 
     default:
-      error ("bad size for return value");
+      error (_("bad size for return value"));
     }
 }
 
-/* Should call_function allocate stack space for a struct return?  */
-static int
-m68hc11_use_struct_convention (int gcc_p, struct type *type)
+enum return_value_convention
+m68hc11_return_value (struct gdbarch *gdbarch, struct type *valtype,
+                     struct regcache *regcache, void *readbuf,
+                     const void *writebuf)
 {
-  return (TYPE_CODE (type) == TYPE_CODE_STRUCT
-          || TYPE_CODE (type) == TYPE_CODE_UNION
-          || TYPE_LENGTH (type) > 4);
-}
-
-static int
-m68hc11_return_value_on_stack (struct type *type)
-{
-  return TYPE_LENGTH (type) > 4;
-}
-
-/* Extract from an array REGBUF containing the (raw) register state
-   the address in which a function should return its structure value,
-   as a CORE_ADDR (or an expression that can be used as one).  */
-static CORE_ADDR
-m68hc11_extract_struct_value_address (struct regcache *regcache)
-{
-  char buf[M68HC11_REG_SIZE];
-
-  regcache_cooked_read (regcache, HARD_D_REGNUM, buf);
-  return extract_unsigned_integer (buf, M68HC11_REG_SIZE);
+  if (TYPE_CODE (valtype) == TYPE_CODE_STRUCT
+      || TYPE_CODE (valtype) == TYPE_CODE_UNION
+      || TYPE_CODE (valtype) == TYPE_CODE_ARRAY 
+      || TYPE_LENGTH (valtype) > 4)
+    return RETURN_VALUE_STRUCT_CONVENTION;
+  else
+    {
+      if (readbuf != NULL)
+       m68hc11_extract_return_value (valtype, regcache, readbuf);
+      if (writebuf != NULL)
+       m68hc11_store_return_value (valtype, regcache, writebuf);
+      return RETURN_VALUE_REGISTER_CONVENTION;
+    }
 }
 
 /* Test whether the ELF symbol corresponds to a function using rtc or
@@ -1728,7 +1511,6 @@ m68hc11_gdbarch_init (struct gdbarch_info info,
 
   /* Set register info.  */
   set_gdbarch_fp0_regnum (gdbarch, -1);
-  set_gdbarch_frame_args_skip (gdbarch, 0);
 
   set_gdbarch_write_pc (gdbarch, generic_target_write_pc);
 
@@ -1740,21 +1522,11 @@ m68hc11_gdbarch_init (struct gdbarch_info info,
 
   set_gdbarch_push_dummy_call (gdbarch, m68hc11_push_dummy_call);
 
-  set_gdbarch_extract_return_value (gdbarch, m68hc11_extract_return_value);
-  set_gdbarch_return_value_on_stack (gdbarch, m68hc11_return_value_on_stack);
-
-  set_gdbarch_store_return_value (gdbarch, m68hc11_store_return_value);
-  set_gdbarch_extract_struct_value_address (gdbarch, m68hc11_extract_struct_value_address);
-
-  set_gdbarch_store_return_value (gdbarch, m68hc11_store_return_value);
-  set_gdbarch_extract_struct_value_address (gdbarch, m68hc11_extract_struct_value_address);
-  set_gdbarch_use_struct_convention (gdbarch, m68hc11_use_struct_convention);
+  set_gdbarch_return_value (gdbarch, m68hc11_return_value);
   set_gdbarch_skip_prologue (gdbarch, m68hc11_skip_prologue);
   set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
-  set_gdbarch_decr_pc_after_break (gdbarch, 0);
-  set_gdbarch_function_start_offset (gdbarch, 0);
   set_gdbarch_breakpoint_from_pc (gdbarch, m68hc11_breakpoint_from_pc);
-  set_gdbarch_stack_align (gdbarch, m68hc11_stack_align);
+  set_gdbarch_deprecated_stack_align (gdbarch, m68hc11_stack_align);
   set_gdbarch_print_insn (gdbarch, gdb_print_insn_m68hc11);
 
   m68hc11_add_reggroups (gdbarch);
@@ -1763,9 +1535,8 @@ m68hc11_gdbarch_init (struct gdbarch_info info,
 
   /* Hook in the DWARF CFI frame unwinder.  */
   frame_unwind_append_sniffer (gdbarch, dwarf2_frame_sniffer);
-  set_gdbarch_dwarf2_build_frame_info (gdbarch, dwarf2_build_frame_info);
 
-  frame_unwind_append_predicate (gdbarch, m68hc11_frame_p);
+  frame_unwind_append_sniffer (gdbarch, m68hc11_frame_sniffer);
   frame_base_set_default (gdbarch, &m68hc11_frame_base);
   
   /* Methods for saving / extracting a dummy frame's ID.  The ID's
@@ -1793,9 +1564,5 @@ _initialize_m68hc11_tdep (void)
   register_gdbarch_init (bfd_arch_m68hc11, m68hc11_gdbarch_init);
   register_gdbarch_init (bfd_arch_m68hc12, m68hc11_gdbarch_init);
   m68hc11_init_reggroups ();
-
-  deprecate_cmd (add_com ("regs", class_vars, show_regs,
-                          "Print all registers"),
-                 "info registers");
 } 
 
This page took 0.029555 seconds and 4 git commands to generate.