add xfail for "print u_var" test in gdb.ada/packed_array.exp
[deliverable/binutils-gdb.git] / gdb / spu-tdep.c
index 2706c934a72d2d76ce7119f42197f6023e0bb187..0b0ea4ee60ff0342e647eed584ca6027f0f59576 100644 (file)
@@ -44,6 +44,7 @@
 #include "block.h"
 #include "observer.h"
 #include "infcall.h"
+#include "dwarf2.h"
 
 #include "spu-tdep.h"
 
@@ -176,7 +177,7 @@ spu_register_type (struct gdbarch *gdbarch, int reg_nr)
       return builtin_type (gdbarch)->builtin_uint32;
 
     default:
-      internal_error (__FILE__, __LINE__, "invalid regnum");
+      internal_error (__FILE__, __LINE__, _("invalid regnum"));
     }
 }
 
@@ -814,7 +815,7 @@ spu_virtual_frame_pointer (struct gdbarch *gdbarch, CORE_ADDR pc,
     }
   else
     {
-      /* ??? We don't really know ... */
+      /* ??? We don't really know ...  */
       *reg = SPU_SP_REGNUM;
       *offset = 0;
     }
@@ -1007,7 +1008,8 @@ spu_frame_unwind_cache (struct frame_info *this_frame,
        {
          /* Assume the link register is saved into its slot.  */
          if (backchain + 16 <= lslr)
-           info->saved_regs[SPU_LR_REGNUM].addr = SPUADDR (id, backchain + 16);
+           info->saved_regs[SPU_LR_REGNUM].addr = SPUADDR (id,
+                                                           backchain + 16);
 
           /* Frame bases.  */
          info->frame_base = SPUADDR (id, backchain);
@@ -1447,6 +1449,13 @@ spu_return_value (struct gdbarch *gdbarch, struct type *func_type,
                  gdb_byte *out, const gdb_byte *in)
 {
   enum return_value_convention rvc;
+  int opencl_vector = 0;
+
+  if (func_type
+      && TYPE_CALLING_CONVENTION (func_type) == DW_CC_GDB_IBM_OpenCL
+      && TYPE_CODE (type) == TYPE_CODE_ARRAY
+      && TYPE_VECTOR (type))
+    opencl_vector = 1;
 
   if (TYPE_LENGTH (type) <= (SPU_ARGN_REGNUM - SPU_ARG1_REGNUM + 1) * 16)
     rvc = RETURN_VALUE_REGISTER_CONVENTION;
@@ -1458,11 +1467,14 @@ spu_return_value (struct gdbarch *gdbarch, struct type *func_type,
       switch (rvc)
        {
        case RETURN_VALUE_REGISTER_CONVENTION:
-         spu_value_to_regcache (regcache, SPU_ARG1_REGNUM, type, in);
+         if (opencl_vector && TYPE_LENGTH (type) == 2)
+           regcache_cooked_write_part (regcache, SPU_ARG1_REGNUM, 2, 2, in);
+         else
+           spu_value_to_regcache (regcache, SPU_ARG1_REGNUM, type, in);
          break;
 
        case RETURN_VALUE_STRUCT_CONVENTION:
-         error ("Cannot set function return value.");
+         error (_("Cannot set function return value."));
          break;
        }
     }
@@ -1471,11 +1483,14 @@ spu_return_value (struct gdbarch *gdbarch, struct type *func_type,
       switch (rvc)
        {
        case RETURN_VALUE_REGISTER_CONVENTION:
-         spu_regcache_to_value (regcache, SPU_ARG1_REGNUM, type, out);
+         if (opencl_vector && TYPE_LENGTH (type) == 2)
+           regcache_cooked_read_part (regcache, SPU_ARG1_REGNUM, 2, 2, out);
+         else
+           spu_regcache_to_value (regcache, SPU_ARG1_REGNUM, type, out);
          break;
 
        case RETURN_VALUE_STRUCT_CONVENTION:
-         error ("Function return value unknown.");
+         error (_("Function return value unknown."));
          break;
        }
     }
@@ -1487,7 +1502,8 @@ spu_return_value (struct gdbarch *gdbarch, struct type *func_type,
 /* Breakpoints.  */
 
 static const gdb_byte *
-spu_breakpoint_from_pc (struct gdbarch *gdbarch, CORE_ADDR * pcptr, int *lenptr)
+spu_breakpoint_from_pc (struct gdbarch *gdbarch,
+                       CORE_ADDR * pcptr, int *lenptr)
 {
   static const gdb_byte breakpoint[] = { 0x00, 0x00, 0x3f, 0xff };
 
@@ -1628,8 +1644,9 @@ spu_dis_asm_print_address (bfd_vma addr, struct disassemble_info *info)
 static int
 gdb_print_insn_spu (bfd_vma memaddr, struct disassemble_info *info)
 {
-  /* The opcodes disassembler does 18-bit address arithmetic.  Make sure the
-     SPU ID encoded in the high bits is added back when we call print_address.  */
+  /* The opcodes disassembler does 18-bit address arithmetic.  Make
+     sure the SPU ID encoded in the high bits is added back when we
+     call print_address.  */
   struct disassemble_info spu_info = *info;
   struct spu_dis_asm_data data;
   data.gdbarch = info->application_data;
@@ -1663,11 +1680,12 @@ gdb_print_insn_spu (bfd_vma memaddr, struct disassemble_info *info)
 
    _ovly_table should never change.
 
-   Both tables are aligned to a 16-byte boundary, the symbols _ovly_table
-   and _ovly_buf_table are of type STT_OBJECT and their size set to the size
-   of the respective array. buf in _ovly_table is an index into _ovly_buf_table.
+   Both tables are aligned to a 16-byte boundary, the symbols
+   _ovly_table and _ovly_buf_table are of type STT_OBJECT and their
+   size set to the size of the respective array. buf in _ovly_table is
+   an index into _ovly_buf_table.
 
-   mapped is an index into _ovly_table. Both the mapped and buf indices start
+   mapped is an index into _ovly_table.  Both the mapped and buf indices start
    from one to reference the first entry in their respective tables.  */
 
 /* Using the per-objfile private data mechanism, we store for each
@@ -1710,7 +1728,8 @@ spu_get_overlay_table (struct objfile *objfile)
   if (!ovly_table_msym)
     return NULL;
 
-  ovly_buf_table_msym = lookup_minimal_symbol ("_ovly_buf_table", NULL, objfile);
+  ovly_buf_table_msym = lookup_minimal_symbol ("_ovly_buf_table",
+                                              NULL, objfile);
   if (!ovly_buf_table_msym)
     return NULL;
 
@@ -2532,7 +2551,8 @@ info_spu_proxydma_command (char *args, int from_tty)
 static void
 info_spu_command (char *args, int from_tty)
 {
-  printf_unfiltered (_("\"info spu\" must be followed by the name of an SPU facility.\n"));
+  printf_unfiltered (_("\"info spu\" must be followed by "
+                      "the name of an SPU facility.\n"));
   help_list (infospucmdlist, "info spu ", -1, gdb_stdout);
 }
 
This page took 0.031268 seconds and 4 git commands to generate.