linux-record: Squash cases with identical handling
[external/binutils.git] / gdb / rs6000-lynx178-tdep.c
1 /* Copyright (C) 2012-2016 Free Software Foundation, Inc.
2
3    This file is part of GDB.
4
5    This program is free software; you can redistribute it and/or modify
6    it under the terms of the GNU General Public License as published by
7    the Free Software Foundation; either version 3 of the License, or
8    (at your option) any later version.
9
10    This program is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13    GNU General Public License for more details.
14
15    You should have received a copy of the GNU General Public License
16    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
17
18 #include "defs.h"
19 #include "osabi.h"
20 #include "regcache.h"
21 #include "gdbcore.h"
22 #include "gdbtypes.h"
23 #include "infcall.h"
24 #include "ppc-tdep.h"
25 #include "value.h"
26 #include "xcoffread.h"
27
28 /* Implement the "push_dummy_call" gdbarch method.  */
29
30 static CORE_ADDR
31 rs6000_lynx178_push_dummy_call (struct gdbarch *gdbarch,
32                                 struct value *function,
33                                 struct regcache *regcache, CORE_ADDR bp_addr,
34                                 int nargs, struct value **args, CORE_ADDR sp,
35                                 int struct_return, CORE_ADDR struct_addr)
36 {
37   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
38   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
39   int ii;
40   int len = 0;
41   int argno;                    /* current argument number */
42   int argbytes;                 /* current argument byte */
43   gdb_byte tmp_buffer[50];
44   int f_argno = 0;              /* current floating point argno */
45   int wordsize = gdbarch_tdep (gdbarch)->wordsize;
46   CORE_ADDR func_addr = find_function_addr (function, NULL);
47
48   struct value *arg = 0;
49   struct type *type;
50
51   ULONGEST saved_sp;
52
53   /* The calling convention this function implements assumes the
54      processor has floating-point registers.  We shouldn't be using it
55      on PPC variants that lack them.  */
56   gdb_assert (ppc_floating_point_unit_p (gdbarch));
57
58   /* The first eight words of ther arguments are passed in registers.
59      Copy them appropriately.  */
60   ii = 0;
61
62   /* If the function is returning a `struct', then the first word
63      (which will be passed in r3) is used for struct return address.
64      In that case we should advance one word and start from r4
65      register to copy parameters.  */
66   if (struct_return)
67     {
68       regcache_raw_write_unsigned (regcache, tdep->ppc_gp0_regnum + 3,
69                                    struct_addr);
70       ii++;
71     }
72
73   /* Effectively indirect call... gcc does...
74
75      return_val example( float, int);
76
77      eabi:
78      float in fp0, int in r3
79      offset of stack on overflow 8/16
80      for varargs, must go by type.
81      power open:
82      float in r3&r4, int in r5
83      offset of stack on overflow different
84      both:
85      return in r3 or f0.  If no float, must study how gcc emulates floats;
86      pay attention to arg promotion.
87      User may have to cast\args to handle promotion correctly
88      since gdb won't know if prototype supplied or not.  */
89
90   for (argno = 0, argbytes = 0; argno < nargs && ii < 8; ++ii)
91     {
92       int reg_size = register_size (gdbarch, ii + 3);
93
94       arg = args[argno];
95       type = check_typedef (value_type (arg));
96       len = TYPE_LENGTH (type);
97
98       if (TYPE_CODE (type) == TYPE_CODE_FLT)
99         {
100
101           /* Floating point arguments are passed in fpr's, as well as gpr's.
102              There are 13 fpr's reserved for passing parameters.  At this point
103              there is no way we would run out of them.
104
105              Always store the floating point value using the register's
106              floating-point format.  */
107           const int fp_regnum = tdep->ppc_fp0_regnum + 1 + f_argno;
108           gdb_byte reg_val[MAX_REGISTER_SIZE];
109           struct type *reg_type = register_type (gdbarch, fp_regnum);
110
111           gdb_assert (len <= 8);
112
113           convert_typed_floating (value_contents (arg), type,
114                                   reg_val, reg_type);
115           regcache_cooked_write (regcache, fp_regnum, reg_val);
116           ++f_argno;
117         }
118
119       if (len > reg_size)
120         {
121
122           /* Argument takes more than one register.  */
123           while (argbytes < len)
124             {
125               gdb_byte word[MAX_REGISTER_SIZE];
126               memset (word, 0, reg_size);
127               memcpy (word,
128                       ((char *) value_contents (arg)) + argbytes,
129                       (len - argbytes) > reg_size
130                         ? reg_size : len - argbytes);
131               regcache_cooked_write (regcache,
132                                     tdep->ppc_gp0_regnum + 3 + ii,
133                                     word);
134               ++ii, argbytes += reg_size;
135
136               if (ii >= 8)
137                 goto ran_out_of_registers_for_arguments;
138             }
139           argbytes = 0;
140           --ii;
141         }
142       else
143         {
144           /* Argument can fit in one register.  No problem.  */
145           int adj = gdbarch_byte_order (gdbarch)
146                     == BFD_ENDIAN_BIG ? reg_size - len : 0;
147           gdb_byte word[MAX_REGISTER_SIZE];
148
149           memset (word, 0, reg_size);
150           memcpy (word, value_contents (arg), len);
151           regcache_cooked_write (regcache, tdep->ppc_gp0_regnum + 3 +ii, word);
152         }
153       ++argno;
154     }
155
156 ran_out_of_registers_for_arguments:
157
158   regcache_cooked_read_unsigned (regcache,
159                                  gdbarch_sp_regnum (gdbarch),
160                                  &saved_sp);
161
162   /* Location for 8 parameters are always reserved.  */
163   sp -= wordsize * 8;
164
165   /* Another six words for back chain, TOC register, link register, etc.  */
166   sp -= wordsize * 6;
167
168   /* Stack pointer must be quadword aligned.  */
169   sp = align_down (sp, 16);
170
171   /* If there are more arguments, allocate space for them in
172      the stack, then push them starting from the ninth one.  */
173
174   if ((argno < nargs) || argbytes)
175     {
176       int space = 0, jj;
177
178       if (argbytes)
179         {
180           space += align_up (len - argbytes, 4);
181           jj = argno + 1;
182         }
183       else
184         jj = argno;
185
186       for (; jj < nargs; ++jj)
187         {
188           struct value *val = args[jj];
189
190           space += align_up (TYPE_LENGTH (value_type (val)), 4);
191         }
192
193       /* Add location required for the rest of the parameters.  */
194       space = align_up (space, 16);
195       sp -= space;
196
197       /* This is another instance we need to be concerned about
198          securing our stack space.  If we write anything underneath %sp
199          (r1), we might conflict with the kernel who thinks he is free
200          to use this area.  So, update %sp first before doing anything
201          else.  */
202
203       regcache_raw_write_signed (regcache,
204                                  gdbarch_sp_regnum (gdbarch), sp);
205
206       /* If the last argument copied into the registers didn't fit there
207          completely, push the rest of it into stack.  */
208
209       if (argbytes)
210         {
211           write_memory (sp + 24 + (ii * 4),
212                         value_contents (arg) + argbytes,
213                         len - argbytes);
214           ++argno;
215           ii += align_up (len - argbytes, 4) / 4;
216         }
217
218       /* Push the rest of the arguments into stack.  */
219       for (; argno < nargs; ++argno)
220         {
221
222           arg = args[argno];
223           type = check_typedef (value_type (arg));
224           len = TYPE_LENGTH (type);
225
226
227           /* Float types should be passed in fpr's, as well as in the
228              stack.  */
229           if (TYPE_CODE (type) == TYPE_CODE_FLT && f_argno < 13)
230             {
231
232               gdb_assert (len <= 8);
233
234               regcache_cooked_write (regcache,
235                                      tdep->ppc_fp0_regnum + 1 + f_argno,
236                                      value_contents (arg));
237               ++f_argno;
238             }
239
240           write_memory (sp + 24 + (ii * 4), value_contents (arg), len);
241           ii += align_up (len, 4) / 4;
242         }
243     }
244
245   /* Set the stack pointer.  According to the ABI, the SP is meant to
246      be set _before_ the corresponding stack space is used.  On AIX,
247      this even applies when the target has been completely stopped!
248      Not doing this can lead to conflicts with the kernel which thinks
249      that it still has control over this not-yet-allocated stack
250      region.  */
251   regcache_raw_write_signed (regcache, gdbarch_sp_regnum (gdbarch), sp);
252
253   /* Set back chain properly.  */
254   store_unsigned_integer (tmp_buffer, wordsize, byte_order, saved_sp);
255   write_memory (sp, tmp_buffer, wordsize);
256
257   /* Point the inferior function call's return address at the dummy's
258      breakpoint.  */
259   regcache_raw_write_signed (regcache, tdep->ppc_lr_regnum, bp_addr);
260
261   target_store_registers (regcache, -1);
262   return sp;
263 }
264
265 /* Implement the "return_value" gdbarch method.  */
266
267 static enum return_value_convention
268 rs6000_lynx178_return_value (struct gdbarch *gdbarch, struct value *function,
269                              struct type *valtype, struct regcache *regcache,
270                              gdb_byte *readbuf, const gdb_byte *writebuf)
271 {
272   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
273   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
274
275   /* The calling convention this function implements assumes the
276      processor has floating-point registers.  We shouldn't be using it
277      on PowerPC variants that lack them.  */
278   gdb_assert (ppc_floating_point_unit_p (gdbarch));
279
280   /* AltiVec extension: Functions that declare a vector data type as a
281      return value place that return value in VR2.  */
282   if (TYPE_CODE (valtype) == TYPE_CODE_ARRAY && TYPE_VECTOR (valtype)
283       && TYPE_LENGTH (valtype) == 16)
284     {
285       if (readbuf)
286         regcache_cooked_read (regcache, tdep->ppc_vr0_regnum + 2, readbuf);
287       if (writebuf)
288         regcache_cooked_write (regcache, tdep->ppc_vr0_regnum + 2, writebuf);
289
290       return RETURN_VALUE_REGISTER_CONVENTION;
291     }
292
293   /* If the called subprogram returns an aggregate, there exists an
294      implicit first argument, whose value is the address of a caller-
295      allocated buffer into which the callee is assumed to store its
296      return value.  All explicit parameters are appropriately
297      relabeled.  */
298   if (TYPE_CODE (valtype) == TYPE_CODE_STRUCT
299       || TYPE_CODE (valtype) == TYPE_CODE_UNION
300       || TYPE_CODE (valtype) == TYPE_CODE_ARRAY)
301     return RETURN_VALUE_STRUCT_CONVENTION;
302
303   /* Scalar floating-point values are returned in FPR1 for float or
304      double, and in FPR1:FPR2 for quadword precision.  Fortran
305      complex*8 and complex*16 are returned in FPR1:FPR2, and
306      complex*32 is returned in FPR1:FPR4.  */
307   if (TYPE_CODE (valtype) == TYPE_CODE_FLT
308       && (TYPE_LENGTH (valtype) == 4 || TYPE_LENGTH (valtype) == 8))
309     {
310       struct type *regtype = register_type (gdbarch, tdep->ppc_fp0_regnum);
311       gdb_byte regval[8];
312
313       /* FIXME: kettenis/2007-01-01: Add support for quadword
314          precision and complex.  */
315
316       if (readbuf)
317         {
318           regcache_cooked_read (regcache, tdep->ppc_fp0_regnum + 1, regval);
319           convert_typed_floating (regval, regtype, readbuf, valtype);
320         }
321       if (writebuf)
322         {
323           convert_typed_floating (writebuf, valtype, regval, regtype);
324           regcache_cooked_write (regcache, tdep->ppc_fp0_regnum + 1, regval);
325         }
326
327       return RETURN_VALUE_REGISTER_CONVENTION;
328   }
329
330   /* Values of the types int, long, short, pointer, and char (length
331      is less than or equal to four bytes), as well as bit values of
332      lengths less than or equal to 32 bits, must be returned right
333      justified in GPR3 with signed values sign extended and unsigned
334      values zero extended, as necessary.  */
335   if (TYPE_LENGTH (valtype) <= tdep->wordsize)
336     {
337       if (readbuf)
338         {
339           ULONGEST regval;
340
341           /* For reading we don't have to worry about sign extension.  */
342           regcache_cooked_read_unsigned (regcache, tdep->ppc_gp0_regnum + 3,
343                                          &regval);
344           store_unsigned_integer (readbuf, TYPE_LENGTH (valtype), byte_order,
345                                   regval);
346         }
347       if (writebuf)
348         {
349           /* For writing, use unpack_long since that should handle any
350              required sign extension.  */
351           regcache_cooked_write_unsigned (regcache, tdep->ppc_gp0_regnum + 3,
352                                           unpack_long (valtype, writebuf));
353         }
354
355       return RETURN_VALUE_REGISTER_CONVENTION;
356     }
357
358   /* Eight-byte non-floating-point scalar values must be returned in
359      GPR3:GPR4.  */
360
361   if (TYPE_LENGTH (valtype) == 8)
362     {
363       gdb_assert (TYPE_CODE (valtype) != TYPE_CODE_FLT);
364       gdb_assert (tdep->wordsize == 4);
365
366       if (readbuf)
367         {
368           gdb_byte regval[8];
369
370           regcache_cooked_read (regcache, tdep->ppc_gp0_regnum + 3, regval);
371           regcache_cooked_read (regcache, tdep->ppc_gp0_regnum + 4,
372                                 regval + 4);
373           memcpy (readbuf, regval, 8);
374         }
375       if (writebuf)
376         {
377           regcache_cooked_write (regcache, tdep->ppc_gp0_regnum + 3, writebuf);
378           regcache_cooked_write (regcache, tdep->ppc_gp0_regnum + 4,
379                                  writebuf + 4);
380         }
381
382       return RETURN_VALUE_REGISTER_CONVENTION;
383     }
384
385   return RETURN_VALUE_STRUCT_CONVENTION;
386 }
387
388 /* PowerPC Lynx178 OSABI sniffer.  */
389
390 static enum gdb_osabi
391 rs6000_lynx178_osabi_sniffer (bfd *abfd)
392 {
393   if (bfd_get_flavour (abfd) != bfd_target_xcoff_flavour)
394     return GDB_OSABI_UNKNOWN;
395
396   /* The only noticeable difference between Lynx178 XCOFF files and
397      AIX XCOFF files comes from the fact that there are no shared
398      libraries on Lynx178.  So if the number of import files is
399      different from zero, it cannot be a Lynx178 binary.  */
400   if (xcoff_get_n_import_files (abfd) != 0)
401     return GDB_OSABI_UNKNOWN;
402
403   return GDB_OSABI_LYNXOS178;
404 }
405
406 /* Callback for powerpc-lynx178 initialization.  */
407
408 static void
409 rs6000_lynx178_init_osabi (struct gdbarch_info info, struct gdbarch *gdbarch)
410 {
411   set_gdbarch_push_dummy_call (gdbarch, rs6000_lynx178_push_dummy_call);
412   set_gdbarch_return_value (gdbarch, rs6000_lynx178_return_value);
413   set_gdbarch_long_double_bit (gdbarch, 8 * TARGET_CHAR_BIT);
414 }
415
416 /* -Wmissing-prototypes.  */
417 extern initialize_file_ftype _initialize_rs6000_lynx178_tdep;
418
419 void
420 _initialize_rs6000_lynx178_tdep (void)
421 {
422   gdbarch_register_osabi_sniffer (bfd_arch_rs6000,
423                                   bfd_target_xcoff_flavour,
424                                   rs6000_lynx178_osabi_sniffer);
425   gdbarch_register_osabi (bfd_arch_rs6000, 0, GDB_OSABI_LYNXOS178,
426                           rs6000_lynx178_init_osabi);
427 }
428