2011-02-28 Michael Snyder <msnyder@vmware.com>
[deliverable/binutils-gdb.git] / gdb / m32c-tdep.c
index b67169f6fa40bf8a9e236fd23873300c4855e1bc..3484b00c8878e9da0b59a27dd3ba4aeefc82877a 100644 (file)
@@ -1,6 +1,7 @@
 /* Renesas M32C target-dependent code for GDB, the GNU debugger.
 
-   Copyright 2004, 2005, 2007, 2008, 2009 Free Software Foundation, Inc.
+   Copyright 2004, 2005, 2007, 2008, 2009, 2010, 2011
+   Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -187,14 +188,15 @@ make_types (struct gdbarch *arch)
       break;
 
     default:
-      gdb_assert (0);
+      gdb_assert_not_reached ("unexpected mach");
     }
 
   /* The builtin_type_mumble variables are sometimes uninitialized when
      this is called, so we avoid using them.  */
   tdep->voyd = arch_type (arch, TYPE_CODE_VOID, 1, "void");
   tdep->ptr_voyd
-    = arch_type (arch, TYPE_CODE_PTR, gdbarch_ptr_bit (arch), NULL);
+    = arch_type (arch, TYPE_CODE_PTR, gdbarch_ptr_bit (arch) / TARGET_CHAR_BIT,
+                 NULL);
   TYPE_TARGET_TYPE (tdep->ptr_voyd) = tdep->voyd;
   TYPE_UNSIGNED (tdep->ptr_voyd) = 1;
   tdep->func_voyd = lookup_function_type (tdep->voyd);
@@ -202,14 +204,16 @@ make_types (struct gdbarch *arch)
   sprintf (type_name, "%s_data_addr_t",
           gdbarch_bfd_arch_info (arch)->printable_name);
   tdep->data_addr_reg_type
-    = arch_type (arch, TYPE_CODE_PTR, data_addr_reg_bits, xstrdup (type_name));
+    = arch_type (arch, TYPE_CODE_PTR, data_addr_reg_bits / TARGET_CHAR_BIT,
+                 xstrdup (type_name));
   TYPE_TARGET_TYPE (tdep->data_addr_reg_type) = tdep->voyd;
   TYPE_UNSIGNED (tdep->data_addr_reg_type) = 1;
 
   sprintf (type_name, "%s_code_addr_t",
           gdbarch_bfd_arch_info (arch)->printable_name);
   tdep->code_addr_reg_type
-    = arch_type (arch, TYPE_CODE_PTR, code_addr_reg_bits, xstrdup (type_name));
+    = arch_type (arch, TYPE_CODE_PTR, code_addr_reg_bits / TARGET_CHAR_BIT,
+                 xstrdup (type_name));
   TYPE_TARGET_TYPE (tdep->code_addr_reg_type) = tdep->func_voyd;
   TYPE_UNSIGNED (tdep->code_addr_reg_type) = 1;
 
@@ -1239,7 +1243,7 @@ m32c_decode_srcdest4 (struct m32c_pv_state *st,
     case 0xf: sd.addr = pv_constant (m32c_udisp16 (st)); break;
 
     default:
-      gdb_assert (0);
+      gdb_assert_not_reached ("unexpected srcdest4");
     }
 
   return sd;
@@ -1298,7 +1302,7 @@ m32c_decode_sd23 (struct m32c_pv_state *st, int code, int size, int ind)
     case 0x0f: sd.addr = pv_constant (m32c_udisp16 (st)); break;
     case 0x0e: sd.addr = pv_constant (m32c_udisp24 (st)); break;
     default:
-      gdb_assert (0);
+      gdb_assert_not_reached ("unexpected sd23");
     }
 
   if (ind)
@@ -1883,7 +1887,7 @@ m32c_frame_base (struct frame_info *this_frame,
       return 0;
 
     default:
-      gdb_assert (0);
+      gdb_assert_not_reached ("unexpected prologue kind");
     }
 }
 
@@ -2003,6 +2007,7 @@ m32c_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
                      CORE_ADDR struct_addr)
 {
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   unsigned long mach = gdbarch_bfd_arch_info (gdbarch)->mach;
   CORE_ADDR cfa;
   int i;
@@ -2040,7 +2045,7 @@ m32c_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
     {
       int ptr_len = TYPE_LENGTH (tdep->ptr_voyd);
       sp -= ptr_len;
-      write_memory_unsigned_integer (sp, ptr_len, struct_addr);
+      write_memory_unsigned_integer (sp, ptr_len, byte_order, struct_addr);
     }
 
   /* Push the arguments.  */
@@ -2061,7 +2066,8 @@ m32c_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
             sure it ends up in the least significant end of r1.  (GDB
             should avoid assuming endianness, even on uni-endian
             processors.)  */
-         ULONGEST u = extract_unsigned_integer (arg_bits, arg_size);
+         ULONGEST u = extract_unsigned_integer (arg_bits, arg_size,
+                                                byte_order);
          struct m32c_reg *reg = (mach == bfd_mach_m16c) ? tdep->r1 : tdep->r0;
          regcache_cooked_write_unsigned (regcache, reg->num, u);
        }
@@ -2092,7 +2098,8 @@ m32c_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 
   /* Push the return address.  */
   sp -= tdep->ret_addr_bytes;
-  write_memory_unsigned_integer (sp, tdep->ret_addr_bytes, bp_addr);
+  write_memory_unsigned_integer (sp, tdep->ret_addr_bytes, byte_order,
+                                bp_addr);
 
   /* Update the stack pointer.  */
   regcache_cooked_write_unsigned (regcache, tdep->sp->num, sp);
@@ -2178,6 +2185,7 @@ m32c_return_value (struct gdbarch *gdbarch,
                   const gdb_byte *writebuf)
 {
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   enum return_value_convention conv;
   ULONGEST valtype_len = TYPE_LENGTH (valtype);
 
@@ -2200,7 +2208,7 @@ m32c_return_value (struct gdbarch *gdbarch,
        {
          ULONGEST u;
          regcache_cooked_read_unsigned (regcache, tdep->r0->num, &u);
-         store_unsigned_integer (readbuf, valtype_len, u);
+         store_unsigned_integer (readbuf, valtype_len, byte_order, u);
        }
       else
        {
@@ -2211,9 +2219,9 @@ m32c_return_value (struct gdbarch *gdbarch,
            = lookup_minimal_symbol ("mem0", NULL, NULL);
 
          if (! mem0)
-           error ("The return value is stored in memory at 'mem0', "
-                  "but GDB cannot find\n"
-                  "its address.");
+           error (_("The return value is stored in memory at 'mem0', "
+                    "but GDB cannot find\n"
+                    "its address."));
          read_memory (SYMBOL_VALUE_ADDRESS (mem0), readbuf, valtype_len);
        }
     }
@@ -2230,7 +2238,8 @@ m32c_return_value (struct gdbarch *gdbarch,
       /* Anything that fits in r0 is returned there.  */
       if (valtype_len <= TYPE_LENGTH (tdep->r0->type))
        {
-         ULONGEST u = extract_unsigned_integer (writebuf, valtype_len);
+         ULONGEST u = extract_unsigned_integer (writebuf, valtype_len,
+                                                byte_order);
          regcache_cooked_write_unsigned (regcache, tdep->r0->num, u);
        }
       else
@@ -2242,9 +2251,9 @@ m32c_return_value (struct gdbarch *gdbarch,
            = lookup_minimal_symbol ("mem0", NULL, NULL);
 
          if (! mem0)
-           error ("The return value is stored in memory at 'mem0', "
-                  "but GDB cannot find\n"
-                  " its address.");
+           error (_("The return value is stored in memory at 'mem0', "
+                    "but GDB cannot find\n"
+                    " its address."));
          write_memory (SYMBOL_VALUE_ADDRESS (mem0),
                         (char *) writebuf, valtype_len);
        }
@@ -2306,7 +2315,9 @@ m32c_return_value (struct gdbarch *gdbarch,
 static CORE_ADDR
 m32c_skip_trampoline_code (struct frame_info *frame, CORE_ADDR stop_pc)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (get_frame_arch (frame));
+  struct gdbarch *gdbarch = get_frame_arch (frame);
+  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
 
   /* It would be nicer to simply look up the addresses of known
      trampolines once, and then compare stop_pc with them.  However,
@@ -2329,13 +2340,14 @@ m32c_skip_trampoline_code (struct frame_info *frame, CORE_ADDR stop_pc)
             m32c_jsri*16*.  */
          CORE_ADDR sp = get_frame_sp (get_current_frame ());
          CORE_ADDR target
-           = read_memory_unsigned_integer (sp + tdep->ret_addr_bytes, 2);
+           = read_memory_unsigned_integer (sp + tdep->ret_addr_bytes,
+                                           2, byte_order);
 
          /* What we have now is the address of a jump instruction.
             What we need is the destination of that jump.
-            The opcode is 1 byte, and the destination is the next 3 bytes.
-         */
-         target = read_memory_unsigned_integer (target + 1, 3);
+            The opcode is 1 byte, and the destination is the next 3 bytes.  */
+
+         target = read_memory_unsigned_integer (target + 1, 3, byte_order);
          return target;
        }
     }
@@ -2403,6 +2415,7 @@ static void
 m32c_m16c_address_to_pointer (struct gdbarch *gdbarch,
                              struct type *type, gdb_byte *buf, CORE_ADDR addr)
 {
+  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   enum type_code target_code;
   gdb_assert (TYPE_CODE (type) == TYPE_CODE_PTR ||
              TYPE_CODE (type) == TYPE_CODE_REF);
@@ -2419,9 +2432,9 @@ m32c_m16c_address_to_pointer (struct gdbarch *gdbarch,
       struct minimal_symbol *func_msym = lookup_minimal_symbol_by_pc (addr);
 
       if (! func_msym)
-        error ("Cannot convert code address %s to function pointer:\n"
-               "couldn't find a symbol at that address, to find trampoline.",
-               paddr_nz (addr));
+        error (_("Cannot convert code address %s to function pointer:\n"
+               "couldn't find a symbol at that address, to find trampoline."),
+               paddress (gdbarch, addr));
 
       func_name = SYMBOL_LINKAGE_NAME (func_msym);
       tramp_name = xmalloc (strlen (func_name) + 5);
@@ -2436,15 +2449,42 @@ m32c_m16c_address_to_pointer (struct gdbarch *gdbarch,
       xfree (tramp_name);
 
       if (! tramp_msym)
-        error ("Cannot convert code address %s to function pointer:\n"
-               "couldn't find trampoline named '%s.plt'.",
-               paddr_nz (addr), func_name);
+       {
+         CORE_ADDR ptrval;
+
+         /* No PLT entry found.  Mask off the upper bits of the address
+            to make a pointer.  As noted in the warning to the user
+            below, this value might be useful if converted back into
+            an address by GDB, but will otherwise, almost certainly,
+            be garbage.
+            
+            Using this masked result does seem to be useful
+            in gdb.cp/cplusfuncs.exp in which ~40 FAILs turn into
+            PASSes.  These results appear to be correct as well.
+            
+            We print a warning here so that the user can make a
+            determination about whether the result is useful or not.  */
+         ptrval = addr & 0xffff;
+
+         warning (_("Cannot convert code address %s to function pointer:\n"
+                  "couldn't find trampoline named '%s.plt'.\n"
+                  "Returning pointer value %s instead; this may produce\n"
+                  "a useful result if converted back into an address by GDB,\n"
+                  "but will most likely not be useful otherwise.\n"),
+                  paddress (gdbarch, addr), func_name,
+                  paddress (gdbarch, ptrval));
+
+         addr = ptrval;
 
-      /* The trampoline's address is our pointer.  */
-      addr = SYMBOL_VALUE_ADDRESS (tramp_msym);
+       }
+      else
+       {
+         /* The trampoline's address is our pointer.  */
+         addr = SYMBOL_VALUE_ADDRESS (tramp_msym);
+       }
     }
 
-  store_unsigned_integer (buf, TYPE_LENGTH (type), addr);
+  store_unsigned_integer (buf, TYPE_LENGTH (type), byte_order, addr);
 }
 
 
@@ -2452,13 +2492,14 @@ static CORE_ADDR
 m32c_m16c_pointer_to_address (struct gdbarch *gdbarch,
                              struct type *type, const gdb_byte *buf)
 {
+  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   CORE_ADDR ptr;
   enum type_code target_code;
 
   gdb_assert (TYPE_CODE (type) == TYPE_CODE_PTR ||
              TYPE_CODE (type) == TYPE_CODE_REF);
 
-  ptr = extract_unsigned_integer (buf, TYPE_LENGTH (type));
+  ptr = extract_unsigned_integer (buf, TYPE_LENGTH (type), byte_order);
 
   target_code = TYPE_CODE (TYPE_TARGET_TYPE (type));
 
@@ -2495,6 +2536,18 @@ m32c_m16c_pointer_to_address (struct gdbarch *gdbarch,
                 ptr = SYMBOL_VALUE_ADDRESS (func_msym);
             }
         }
+      else
+       {
+         int aspace;
+
+         for (aspace = 1; aspace <= 15; aspace++)
+           {
+             ptr_msym = lookup_minimal_symbol_by_pc ((aspace << 16) | ptr);
+             
+             if (ptr_msym)
+               ptr |= aspace << 16;
+           }
+       }
     }
 
   return ptr;
@@ -2513,7 +2566,8 @@ m32c_virtual_frame_pointer (struct gdbarch *gdbarch, CORE_ADDR pc,
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
   
   if (!find_pc_partial_function (pc, &name, &func_addr, &func_end))
-    internal_error (__FILE__, __LINE__, _("No virtual frame pointer available"));
+    internal_error (__FILE__, __LINE__,
+                   _("No virtual frame pointer available"));
 
   m32c_analyze_prologue (gdbarch, func_addr, pc, &p);
   switch (p.kind)
@@ -2533,7 +2587,8 @@ m32c_virtual_frame_pointer (struct gdbarch *gdbarch, CORE_ADDR pc,
     }
   /* Sanity check */
   if (*frame_regnum > gdbarch_num_regs (gdbarch))
-    internal_error (__FILE__, __LINE__, _("No virtual frame pointer available"));
+    internal_error (__FILE__, __LINE__,
+                   _("No virtual frame pointer available"));
 }
 
 \f
@@ -2585,8 +2640,7 @@ m32c_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
      They may be in the dwarf2 cfi code in GDB, or they may be in
      the debug info emitted by the upstream toolchain.  I don't 
      know which, but I do know that the prologue analyzer works better.
-     MVS 04/13/06
-  */
+     MVS 04/13/06  */
   dwarf2_append_sniffers (arch);
 #endif
   frame_unwind_append_unwinder (arch, &m32c_unwind);
@@ -2604,7 +2658,7 @@ m32c_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   /* m32c function boundary addresses are not necessarily even.
      Therefore, the `vbit', which indicates a pointer to a virtual
      member function, is stored in the delta field, rather than as
-     the low bit of a function pointer address.  
+     the low bit of a function pointer address.
 
      In order to verify this, see the definition of
      TARGET_PTRMEMFUNC_VBIT_LOCATION in gcc/defaults.h along with the
This page took 0.030123 seconds and 4 git commands to generate.