"finish" does not work on sparc if function returns array.
[external/binutils.git] / gdb / sparc64-tdep.c
1 /* Target-dependent code for UltraSPARC.
2
3    Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
4    Free Software Foundation, Inc.
5
6    This file is part of GDB.
7
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 3 of the License, or
11    (at your option) any later version.
12
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
20
21 #include "defs.h"
22 #include "arch-utils.h"
23 #include "dwarf2-frame.h"
24 #include "floatformat.h"
25 #include "frame.h"
26 #include "frame-base.h"
27 #include "frame-unwind.h"
28 #include "gdbcore.h"
29 #include "gdbtypes.h"
30 #include "inferior.h"
31 #include "symtab.h"
32 #include "objfiles.h"
33 #include "osabi.h"
34 #include "regcache.h"
35 #include "target.h"
36 #include "value.h"
37
38 #include "gdb_assert.h"
39 #include "gdb_string.h"
40
41 #include "sparc64-tdep.h"
42
43 /* This file implements the The SPARC 64-bit ABI as defined by the
44    section "Low-Level System Information" of the SPARC Compliance
45    Definition (SCD) 2.4.1, which is the 64-bit System V psABI for
46    SPARC.  */
47
48 /* Please use the sparc32_-prefix for 32-bit specific code, the
49    sparc64_-prefix for 64-bit specific code and the sparc_-prefix for
50    code can handle both.  */
51 \f
52 /* The functions on this page are intended to be used to classify
53    function arguments.  */
54
55 /* Check whether TYPE is "Integral or Pointer".  */
56
57 static int
58 sparc64_integral_or_pointer_p (const struct type *type)
59 {
60   switch (TYPE_CODE (type))
61     {
62     case TYPE_CODE_INT:
63     case TYPE_CODE_BOOL:
64     case TYPE_CODE_CHAR:
65     case TYPE_CODE_ENUM:
66     case TYPE_CODE_RANGE:
67       {
68         int len = TYPE_LENGTH (type);
69         gdb_assert (len == 1 || len == 2 || len == 4 || len == 8);
70       }
71       return 1;
72     case TYPE_CODE_PTR:
73     case TYPE_CODE_REF:
74       {
75         int len = TYPE_LENGTH (type);
76         gdb_assert (len == 8);
77       }
78       return 1;
79     default:
80       break;
81     }
82
83   return 0;
84 }
85
86 /* Check whether TYPE is "Floating".  */
87
88 static int
89 sparc64_floating_p (const struct type *type)
90 {
91   switch (TYPE_CODE (type))
92     {
93     case TYPE_CODE_FLT:
94       {
95         int len = TYPE_LENGTH (type);
96         gdb_assert (len == 4 || len == 8 || len == 16);
97       }
98       return 1;
99     default:
100       break;
101     }
102
103   return 0;
104 }
105
106 /* Check whether TYPE is "Structure or Union".
107
108    In terms of Ada subprogram calls, arrays are treated the same as
109    struct and union types.  So this function also returns non-zero
110    for array types.  */
111
112 static int
113 sparc64_structure_or_union_p (const struct type *type)
114 {
115   switch (TYPE_CODE (type))
116     {
117     case TYPE_CODE_STRUCT:
118     case TYPE_CODE_UNION:
119     case TYPE_CODE_ARRAY:
120       return 1;
121     default:
122       break;
123     }
124
125   return 0;
126 }
127 \f
128
129 /* Construct types for ISA-specific registers.  */
130
131 static struct type *
132 sparc64_pstate_type (struct gdbarch *gdbarch)
133 {
134   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
135
136   if (!tdep->sparc64_pstate_type)
137     {
138       struct type *type;
139
140       type = arch_flags_type (gdbarch, "builtin_type_sparc64_pstate", 8);
141       append_flags_type_flag (type, 0, "AG");
142       append_flags_type_flag (type, 1, "IE");
143       append_flags_type_flag (type, 2, "PRIV");
144       append_flags_type_flag (type, 3, "AM");
145       append_flags_type_flag (type, 4, "PEF");
146       append_flags_type_flag (type, 5, "RED");
147       append_flags_type_flag (type, 8, "TLE");
148       append_flags_type_flag (type, 9, "CLE");
149       append_flags_type_flag (type, 10, "PID0");
150       append_flags_type_flag (type, 11, "PID1");
151
152       tdep->sparc64_pstate_type = type;
153     }
154
155   return tdep->sparc64_pstate_type;
156 }
157
158 static struct type *
159 sparc64_fsr_type (struct gdbarch *gdbarch)
160 {
161   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
162
163   if (!tdep->sparc64_fsr_type)
164     {
165       struct type *type;
166
167       type = arch_flags_type (gdbarch, "builtin_type_sparc64_fsr", 8);
168       append_flags_type_flag (type, 0, "NXA");
169       append_flags_type_flag (type, 1, "DZA");
170       append_flags_type_flag (type, 2, "UFA");
171       append_flags_type_flag (type, 3, "OFA");
172       append_flags_type_flag (type, 4, "NVA");
173       append_flags_type_flag (type, 5, "NXC");
174       append_flags_type_flag (type, 6, "DZC");
175       append_flags_type_flag (type, 7, "UFC");
176       append_flags_type_flag (type, 8, "OFC");
177       append_flags_type_flag (type, 9, "NVC");
178       append_flags_type_flag (type, 22, "NS");
179       append_flags_type_flag (type, 23, "NXM");
180       append_flags_type_flag (type, 24, "DZM");
181       append_flags_type_flag (type, 25, "UFM");
182       append_flags_type_flag (type, 26, "OFM");
183       append_flags_type_flag (type, 27, "NVM");
184
185       tdep->sparc64_fsr_type = type;
186     }
187
188   return tdep->sparc64_fsr_type;
189 }
190
191 static struct type *
192 sparc64_fprs_type (struct gdbarch *gdbarch)
193 {
194   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
195
196   if (!tdep->sparc64_fprs_type)
197     {
198       struct type *type;
199
200       type = arch_flags_type (gdbarch, "builtin_type_sparc64_fprs", 8);
201       append_flags_type_flag (type, 0, "DL");
202       append_flags_type_flag (type, 1, "DU");
203       append_flags_type_flag (type, 2, "FEF");
204
205       tdep->sparc64_fprs_type = type;
206     }
207
208   return tdep->sparc64_fprs_type;
209 }
210
211
212 /* Register information.  */
213
214 static const char *sparc64_register_names[] =
215 {
216   "g0", "g1", "g2", "g3", "g4", "g5", "g6", "g7",
217   "o0", "o1", "o2", "o3", "o4", "o5", "sp", "o7",
218   "l0", "l1", "l2", "l3", "l4", "l5", "l6", "l7",
219   "i0", "i1", "i2", "i3", "i4", "i5", "fp", "i7",
220
221   "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
222   "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
223   "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
224   "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
225   "f32", "f34", "f36", "f38", "f40", "f42", "f44", "f46",
226   "f48", "f50", "f52", "f54", "f56", "f58", "f60", "f62",
227
228   "pc", "npc",
229   
230   /* FIXME: Give "state" a name until we start using register groups.  */
231   "state",
232   "fsr",
233   "fprs",
234   "y",
235 };
236
237 /* Total number of registers.  */
238 #define SPARC64_NUM_REGS ARRAY_SIZE (sparc64_register_names)
239
240 /* We provide the aliases %d0..%d62 and %q0..%q60 for the floating
241    registers as "psuedo" registers.  */
242
243 static const char *sparc64_pseudo_register_names[] =
244 {
245   "cwp", "pstate", "asi", "ccr",
246
247   "d0", "d2", "d4", "d6", "d8", "d10", "d12", "d14",
248   "d16", "d18", "d20", "d22", "d24", "d26", "d28", "d30",
249   "d32", "d34", "d36", "d38", "d40", "d42", "d44", "d46",
250   "d48", "d50", "d52", "d54", "d56", "d58", "d60", "d62",
251
252   "q0", "q4", "q8", "q12", "q16", "q20", "q24", "q28",
253   "q32", "q36", "q40", "q44", "q48", "q52", "q56", "q60",
254 };
255
256 /* Total number of pseudo registers.  */
257 #define SPARC64_NUM_PSEUDO_REGS ARRAY_SIZE (sparc64_pseudo_register_names)
258
259 /* Return the name of register REGNUM.  */
260
261 static const char *
262 sparc64_register_name (struct gdbarch *gdbarch, int regnum)
263 {
264   if (regnum >= 0 && regnum < SPARC64_NUM_REGS)
265     return sparc64_register_names[regnum];
266
267   if (regnum >= SPARC64_NUM_REGS
268       && regnum < SPARC64_NUM_REGS + SPARC64_NUM_PSEUDO_REGS)
269     return sparc64_pseudo_register_names[regnum - SPARC64_NUM_REGS];
270
271   return NULL;
272 }
273
274 /* Return the GDB type object for the "standard" data type of data in
275    register REGNUM. */
276
277 static struct type *
278 sparc64_register_type (struct gdbarch *gdbarch, int regnum)
279 {
280   /* Raw registers.  */
281
282   if (regnum == SPARC_SP_REGNUM || regnum == SPARC_FP_REGNUM)
283     return builtin_type (gdbarch)->builtin_data_ptr;
284   if (regnum >= SPARC_G0_REGNUM && regnum <= SPARC_I7_REGNUM)
285     return builtin_type (gdbarch)->builtin_int64;
286   if (regnum >= SPARC_F0_REGNUM && regnum <= SPARC_F31_REGNUM)
287     return builtin_type (gdbarch)->builtin_float;
288   if (regnum >= SPARC64_F32_REGNUM && regnum <= SPARC64_F62_REGNUM)
289     return builtin_type (gdbarch)->builtin_double;
290   if (regnum == SPARC64_PC_REGNUM || regnum == SPARC64_NPC_REGNUM)
291     return builtin_type (gdbarch)->builtin_func_ptr;
292   /* This raw register contains the contents of %cwp, %pstate, %asi
293      and %ccr as laid out in a %tstate register.  */
294   if (regnum == SPARC64_STATE_REGNUM)
295     return builtin_type (gdbarch)->builtin_int64;
296   if (regnum == SPARC64_FSR_REGNUM)
297     return sparc64_fsr_type (gdbarch);
298   if (regnum == SPARC64_FPRS_REGNUM)
299     return sparc64_fprs_type (gdbarch);
300   /* "Although Y is a 64-bit register, its high-order 32 bits are
301      reserved and always read as 0."  */
302   if (regnum == SPARC64_Y_REGNUM)
303     return builtin_type (gdbarch)->builtin_int64;
304
305   /* Pseudo registers.  */
306
307   if (regnum == SPARC64_CWP_REGNUM)
308     return builtin_type (gdbarch)->builtin_int64;
309   if (regnum == SPARC64_PSTATE_REGNUM)
310     return sparc64_pstate_type (gdbarch);
311   if (regnum == SPARC64_ASI_REGNUM)
312     return builtin_type (gdbarch)->builtin_int64;
313   if (regnum == SPARC64_CCR_REGNUM)
314     return builtin_type (gdbarch)->builtin_int64;
315   if (regnum >= SPARC64_D0_REGNUM && regnum <= SPARC64_D62_REGNUM)
316     return builtin_type (gdbarch)->builtin_double;
317   if (regnum >= SPARC64_Q0_REGNUM && regnum <= SPARC64_Q60_REGNUM)
318     return builtin_type (gdbarch)->builtin_long_double;
319
320   internal_error (__FILE__, __LINE__, _("invalid regnum"));
321 }
322
323 static void
324 sparc64_pseudo_register_read (struct gdbarch *gdbarch,
325                               struct regcache *regcache,
326                               int regnum, gdb_byte *buf)
327 {
328   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
329   gdb_assert (regnum >= SPARC64_NUM_REGS);
330
331   if (regnum >= SPARC64_D0_REGNUM && regnum <= SPARC64_D30_REGNUM)
332     {
333       regnum = SPARC_F0_REGNUM + 2 * (regnum - SPARC64_D0_REGNUM);
334       regcache_raw_read (regcache, regnum, buf);
335       regcache_raw_read (regcache, regnum + 1, buf + 4);
336     }
337   else if (regnum >= SPARC64_D32_REGNUM && regnum <= SPARC64_D62_REGNUM)
338     {
339       regnum = SPARC64_F32_REGNUM + (regnum - SPARC64_D32_REGNUM);
340       regcache_raw_read (regcache, regnum, buf);
341     }
342   else if (regnum >= SPARC64_Q0_REGNUM && regnum <= SPARC64_Q28_REGNUM)
343     {
344       regnum = SPARC_F0_REGNUM + 4 * (regnum - SPARC64_Q0_REGNUM);
345       regcache_raw_read (regcache, regnum, buf);
346       regcache_raw_read (regcache, regnum + 1, buf + 4);
347       regcache_raw_read (regcache, regnum + 2, buf + 8);
348       regcache_raw_read (regcache, regnum + 3, buf + 12);
349     }
350   else if (regnum >= SPARC64_Q32_REGNUM && regnum <= SPARC64_Q60_REGNUM)
351     {
352       regnum = SPARC64_F32_REGNUM + 2 * (regnum - SPARC64_Q32_REGNUM);
353       regcache_raw_read (regcache, regnum, buf);
354       regcache_raw_read (regcache, regnum + 1, buf + 8);
355     }
356   else if (regnum == SPARC64_CWP_REGNUM
357            || regnum == SPARC64_PSTATE_REGNUM
358            || regnum == SPARC64_ASI_REGNUM
359            || regnum == SPARC64_CCR_REGNUM)
360     {
361       ULONGEST state;
362
363       regcache_raw_read_unsigned (regcache, SPARC64_STATE_REGNUM, &state);
364       switch (regnum)
365         {
366         case SPARC64_CWP_REGNUM:
367           state = (state >> 0) & ((1 << 5) - 1);
368           break;
369         case SPARC64_PSTATE_REGNUM:
370           state = (state >> 8) & ((1 << 12) - 1);
371           break;
372         case SPARC64_ASI_REGNUM:
373           state = (state >> 24) & ((1 << 8) - 1);
374           break;
375         case SPARC64_CCR_REGNUM:
376           state = (state >> 32) & ((1 << 8) - 1);
377           break;
378         }
379       store_unsigned_integer (buf, 8, byte_order, state);
380     }
381 }
382
383 static void
384 sparc64_pseudo_register_write (struct gdbarch *gdbarch,
385                                struct regcache *regcache,
386                                int regnum, const gdb_byte *buf)
387 {
388   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
389   gdb_assert (regnum >= SPARC64_NUM_REGS);
390
391   if (regnum >= SPARC64_D0_REGNUM && regnum <= SPARC64_D30_REGNUM)
392     {
393       regnum = SPARC_F0_REGNUM + 2 * (regnum - SPARC64_D0_REGNUM);
394       regcache_raw_write (regcache, regnum, buf);
395       regcache_raw_write (regcache, regnum + 1, buf + 4);
396     }
397   else if (regnum >= SPARC64_D32_REGNUM && regnum <= SPARC64_D62_REGNUM)
398     {
399       regnum = SPARC64_F32_REGNUM + (regnum - SPARC64_D32_REGNUM);
400       regcache_raw_write (regcache, regnum, buf);
401     }
402   else if (regnum >= SPARC64_Q0_REGNUM && regnum <= SPARC64_Q28_REGNUM)
403     {
404       regnum = SPARC_F0_REGNUM + 4 * (regnum - SPARC64_Q0_REGNUM);
405       regcache_raw_write (regcache, regnum, buf);
406       regcache_raw_write (regcache, regnum + 1, buf + 4);
407       regcache_raw_write (regcache, regnum + 2, buf + 8);
408       regcache_raw_write (regcache, regnum + 3, buf + 12);
409     }
410   else if (regnum >= SPARC64_Q32_REGNUM && regnum <= SPARC64_Q60_REGNUM)
411     {
412       regnum = SPARC64_F32_REGNUM + 2 * (regnum - SPARC64_Q32_REGNUM);
413       regcache_raw_write (regcache, regnum, buf);
414       regcache_raw_write (regcache, regnum + 1, buf + 8);
415     }
416   else if (regnum == SPARC64_CWP_REGNUM
417            || regnum == SPARC64_PSTATE_REGNUM
418            || regnum == SPARC64_ASI_REGNUM
419            || regnum == SPARC64_CCR_REGNUM)
420     {
421       ULONGEST state, bits;
422
423       regcache_raw_read_unsigned (regcache, SPARC64_STATE_REGNUM, &state);
424       bits = extract_unsigned_integer (buf, 8, byte_order);
425       switch (regnum)
426         {
427         case SPARC64_CWP_REGNUM:
428           state |= ((bits & ((1 << 5) - 1)) << 0);
429           break;
430         case SPARC64_PSTATE_REGNUM:
431           state |= ((bits & ((1 << 12) - 1)) << 8);
432           break;
433         case SPARC64_ASI_REGNUM:
434           state |= ((bits & ((1 << 8) - 1)) << 24);
435           break;
436         case SPARC64_CCR_REGNUM:
437           state |= ((bits & ((1 << 8) - 1)) << 32);
438           break;
439         }
440       regcache_raw_write_unsigned (regcache, SPARC64_STATE_REGNUM, state);
441     }
442 }
443 \f
444
445 /* Return PC of first real instruction of the function starting at
446    START_PC.  */
447
448 static CORE_ADDR
449 sparc64_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc)
450 {
451   struct symtab_and_line sal;
452   CORE_ADDR func_start, func_end;
453   struct sparc_frame_cache cache;
454
455   /* This is the preferred method, find the end of the prologue by
456      using the debugging information.  */
457   if (find_pc_partial_function (start_pc, NULL, &func_start, &func_end))
458     {
459       sal = find_pc_line (func_start, 0);
460
461       if (sal.end < func_end
462           && start_pc <= sal.end)
463         return sal.end;
464     }
465
466   return sparc_analyze_prologue (gdbarch, start_pc, 0xffffffffffffffffULL,
467                                  &cache);
468 }
469
470 /* Normal frames.  */
471
472 static struct sparc_frame_cache *
473 sparc64_frame_cache (struct frame_info *this_frame, void **this_cache)
474 {
475   return sparc_frame_cache (this_frame, this_cache);
476 }
477
478 static void
479 sparc64_frame_this_id (struct frame_info *this_frame, void **this_cache,
480                        struct frame_id *this_id)
481 {
482   struct sparc_frame_cache *cache =
483     sparc64_frame_cache (this_frame, this_cache);
484
485   /* This marks the outermost frame.  */
486   if (cache->base == 0)
487     return;
488
489   (*this_id) = frame_id_build (cache->base, cache->pc);
490 }
491
492 static struct value *
493 sparc64_frame_prev_register (struct frame_info *this_frame, void **this_cache,
494                              int regnum)
495 {
496   struct gdbarch *gdbarch = get_frame_arch (this_frame);
497   struct sparc_frame_cache *cache =
498     sparc64_frame_cache (this_frame, this_cache);
499
500   if (regnum == SPARC64_PC_REGNUM || regnum == SPARC64_NPC_REGNUM)
501     {
502       CORE_ADDR pc = (regnum == SPARC64_NPC_REGNUM) ? 4 : 0;
503
504       regnum = cache->frameless_p ? SPARC_O7_REGNUM : SPARC_I7_REGNUM;
505       pc += get_frame_register_unsigned (this_frame, regnum) + 8;
506       return frame_unwind_got_constant (this_frame, regnum, pc);
507     }
508
509   /* Handle StackGhost.  */
510   {
511     ULONGEST wcookie = sparc_fetch_wcookie (gdbarch);
512
513     if (wcookie != 0 && !cache->frameless_p && regnum == SPARC_I7_REGNUM)
514       {
515         CORE_ADDR addr = cache->base + (regnum - SPARC_L0_REGNUM) * 8;
516         ULONGEST i7;
517
518         /* Read the value in from memory.  */
519         i7 = get_frame_memory_unsigned (this_frame, addr, 8);
520         return frame_unwind_got_constant (this_frame, regnum, i7 ^ wcookie);
521       }
522   }
523
524   /* The previous frame's `local' and `in' registers have been saved
525      in the register save area.  */
526   if (!cache->frameless_p
527       && regnum >= SPARC_L0_REGNUM && regnum <= SPARC_I7_REGNUM)
528     {
529       CORE_ADDR addr = cache->base + (regnum - SPARC_L0_REGNUM) * 8;
530
531       return frame_unwind_got_memory (this_frame, regnum, addr);
532     }
533
534   /* The previous frame's `out' registers are accessable as the
535      current frame's `in' registers.  */
536   if (!cache->frameless_p
537       && regnum >= SPARC_O0_REGNUM && regnum <= SPARC_O7_REGNUM)
538     regnum += (SPARC_I0_REGNUM - SPARC_O0_REGNUM);
539
540   return frame_unwind_got_register (this_frame, regnum, regnum);
541 }
542
543 static const struct frame_unwind sparc64_frame_unwind =
544 {
545   NORMAL_FRAME,
546   sparc64_frame_this_id,
547   sparc64_frame_prev_register,
548   NULL,
549   default_frame_sniffer
550 };
551 \f
552
553 static CORE_ADDR
554 sparc64_frame_base_address (struct frame_info *this_frame, void **this_cache)
555 {
556   struct sparc_frame_cache *cache =
557     sparc64_frame_cache (this_frame, this_cache);
558
559   return cache->base;
560 }
561
562 static const struct frame_base sparc64_frame_base =
563 {
564   &sparc64_frame_unwind,
565   sparc64_frame_base_address,
566   sparc64_frame_base_address,
567   sparc64_frame_base_address
568 };
569 \f
570 /* Check whether TYPE must be 16-byte aligned.  */
571
572 static int
573 sparc64_16_byte_align_p (struct type *type)
574 {
575   if (sparc64_floating_p (type) && TYPE_LENGTH (type) == 16)
576     return 1;
577
578   if (sparc64_structure_or_union_p (type))
579     {
580       int i;
581
582       for (i = 0; i < TYPE_NFIELDS (type); i++)
583         {
584           struct type *subtype = check_typedef (TYPE_FIELD_TYPE (type, i));
585
586           if (sparc64_16_byte_align_p (subtype))
587             return 1;
588         }
589     }
590
591   return 0;
592 }
593
594 /* Store floating fields of element ELEMENT of an "parameter array"
595    that has type TYPE and is stored at BITPOS in VALBUF in the
596    apropriate registers of REGCACHE.  This function can be called
597    recursively and therefore handles floating types in addition to
598    structures.  */
599
600 static void
601 sparc64_store_floating_fields (struct regcache *regcache, struct type *type,
602                                const gdb_byte *valbuf, int element, int bitpos)
603 {
604   gdb_assert (element < 16);
605
606   if (sparc64_floating_p (type))
607     {
608       int len = TYPE_LENGTH (type);
609       int regnum;
610
611       if (len == 16)
612         {
613           gdb_assert (bitpos == 0);
614           gdb_assert ((element % 2) == 0);
615
616           regnum = SPARC64_Q0_REGNUM + element / 2;
617           regcache_cooked_write (regcache, regnum, valbuf);
618         }
619       else if (len == 8)
620         {
621           gdb_assert (bitpos == 0 || bitpos == 64);
622
623           regnum = SPARC64_D0_REGNUM + element + bitpos / 64;
624           regcache_cooked_write (regcache, regnum, valbuf + (bitpos / 8));
625         }
626       else
627         {
628           gdb_assert (len == 4);
629           gdb_assert (bitpos % 32 == 0 && bitpos >= 0 && bitpos < 128);
630
631           regnum = SPARC_F0_REGNUM + element * 2 + bitpos / 32;
632           regcache_cooked_write (regcache, regnum, valbuf + (bitpos / 8));
633         }
634     }
635   else if (sparc64_structure_or_union_p (type))
636     {
637       int i;
638
639       for (i = 0; i < TYPE_NFIELDS (type); i++)
640         {
641           struct type *subtype = check_typedef (TYPE_FIELD_TYPE (type, i));
642           int subpos = bitpos + TYPE_FIELD_BITPOS (type, i);
643
644           sparc64_store_floating_fields (regcache, subtype, valbuf,
645                                          element, subpos);
646         }
647
648       /* GCC has an interesting bug.  If TYPE is a structure that has
649          a single `float' member, GCC doesn't treat it as a structure
650          at all, but rather as an ordinary `float' argument.  This
651          argument will be stored in %f1, as required by the psABI.
652          However, as a member of a structure the psABI requires it to
653          be stored in %f0.  This bug is present in GCC 3.3.2, but
654          probably in older releases to.  To appease GCC, if a
655          structure has only a single `float' member, we store its
656          value in %f1 too (we already have stored in %f0).  */
657       if (TYPE_NFIELDS (type) == 1)
658         {
659           struct type *subtype = check_typedef (TYPE_FIELD_TYPE (type, 0));
660
661           if (sparc64_floating_p (subtype) && TYPE_LENGTH (subtype) == 4)
662             regcache_cooked_write (regcache, SPARC_F1_REGNUM, valbuf);
663         }
664     }
665 }
666
667 /* Fetch floating fields from a variable of type TYPE from the
668    appropriate registers for BITPOS in REGCACHE and store it at BITPOS
669    in VALBUF.  This function can be called recursively and therefore
670    handles floating types in addition to structures.  */
671
672 static void
673 sparc64_extract_floating_fields (struct regcache *regcache, struct type *type,
674                                  gdb_byte *valbuf, int bitpos)
675 {
676   if (sparc64_floating_p (type))
677     {
678       int len = TYPE_LENGTH (type);
679       int regnum;
680
681       if (len == 16)
682         {
683           gdb_assert (bitpos == 0 || bitpos == 128);
684
685           regnum = SPARC64_Q0_REGNUM + bitpos / 128;
686           regcache_cooked_read (regcache, regnum, valbuf + (bitpos / 8));
687         }
688       else if (len == 8)
689         {
690           gdb_assert (bitpos % 64 == 0 && bitpos >= 0 && bitpos < 256);
691
692           regnum = SPARC64_D0_REGNUM + bitpos / 64;
693           regcache_cooked_read (regcache, regnum, valbuf + (bitpos / 8));
694         }
695       else
696         {
697           gdb_assert (len == 4);
698           gdb_assert (bitpos % 32 == 0 && bitpos >= 0 && bitpos < 256);
699
700           regnum = SPARC_F0_REGNUM + bitpos / 32;
701           regcache_cooked_read (regcache, regnum, valbuf + (bitpos / 8));
702         }
703     }
704   else if (sparc64_structure_or_union_p (type))
705     {
706       int i;
707
708       for (i = 0; i < TYPE_NFIELDS (type); i++)
709         {
710           struct type *subtype = check_typedef (TYPE_FIELD_TYPE (type, i));
711           int subpos = bitpos + TYPE_FIELD_BITPOS (type, i);
712
713           sparc64_extract_floating_fields (regcache, subtype, valbuf, subpos);
714         }
715     }
716 }
717
718 /* Store the NARGS arguments ARGS and STRUCT_ADDR (if STRUCT_RETURN is
719    non-zero) in REGCACHE and on the stack (starting from address SP).  */
720
721 static CORE_ADDR
722 sparc64_store_arguments (struct regcache *regcache, int nargs,
723                          struct value **args, CORE_ADDR sp,
724                          int struct_return, CORE_ADDR struct_addr)
725 {
726   struct gdbarch *gdbarch = get_regcache_arch (regcache);
727   /* Number of extended words in the "parameter array".  */
728   int num_elements = 0;
729   int element = 0;
730   int i;
731
732   /* Take BIAS into account.  */
733   sp += BIAS;
734
735   /* First we calculate the number of extended words in the "parameter
736      array".  While doing so we also convert some of the arguments.  */
737
738   if (struct_return)
739     num_elements++;
740
741   for (i = 0; i < nargs; i++)
742     {
743       struct type *type = value_type (args[i]);
744       int len = TYPE_LENGTH (type);
745
746       if (sparc64_structure_or_union_p (type))
747         {
748           /* Structure or Union arguments.  */
749           if (len <= 16)
750             {
751               if (num_elements % 2 && sparc64_16_byte_align_p (type))
752                 num_elements++;
753               num_elements += ((len + 7) / 8);
754             }
755           else
756             {
757               /* The psABI says that "Structures or unions larger than
758                  sixteen bytes are copied by the caller and passed
759                  indirectly; the caller will pass the address of a
760                  correctly aligned structure value.  This sixty-four
761                  bit address will occupy one word in the parameter
762                  array, and may be promoted to an %o register like any
763                  other pointer value."  Allocate memory for these
764                  values on the stack.  */
765               sp -= len;
766
767               /* Use 16-byte alignment for these values.  That's
768                  always correct, and wasting a few bytes shouldn't be
769                  a problem.  */
770               sp &= ~0xf;
771
772               write_memory (sp, value_contents (args[i]), len);
773               args[i] = value_from_pointer (lookup_pointer_type (type), sp);
774               num_elements++;
775             }
776         }
777       else if (sparc64_floating_p (type))
778         {
779           /* Floating arguments.  */
780
781           if (len == 16)
782             {
783               /* The psABI says that "Each quad-precision parameter
784                  value will be assigned to two extended words in the
785                  parameter array.  */
786               num_elements += 2;
787
788               /* The psABI says that "Long doubles must be
789                  quad-aligned, and thus a hole might be introduced
790                  into the parameter array to force alignment."  Skip
791                  an element if necessary.  */
792               if (num_elements % 2)
793                 num_elements++;
794             }
795           else
796             num_elements++;
797         }
798       else
799         {
800           /* Integral and pointer arguments.  */
801           gdb_assert (sparc64_integral_or_pointer_p (type));
802
803           /* The psABI says that "Each argument value of integral type
804              smaller than an extended word will be widened by the
805              caller to an extended word according to the signed-ness
806              of the argument type."  */
807           if (len < 8)
808             args[i] = value_cast (builtin_type (gdbarch)->builtin_int64,
809                                   args[i]);
810           num_elements++;
811         }
812     }
813
814   /* Allocate the "parameter array".  */
815   sp -= num_elements * 8;
816
817   /* The psABI says that "Every stack frame must be 16-byte aligned."  */
818   sp &= ~0xf;
819
820   /* Now we store the arguments in to the "paramater array".  Some
821      Integer or Pointer arguments and Structure or Union arguments
822      will be passed in %o registers.  Some Floating arguments and
823      floating members of structures are passed in floating-point
824      registers.  However, for functions with variable arguments,
825      floating arguments are stored in an %0 register, and for
826      functions without a prototype floating arguments are stored in
827      both a floating-point and an %o registers, or a floating-point
828      register and memory.  To simplify the logic here we always pass
829      arguments in memory, an %o register, and a floating-point
830      register if appropriate.  This should be no problem since the
831      contents of any unused memory or registers in the "parameter
832      array" are undefined.  */
833
834   if (struct_return)
835     {
836       regcache_cooked_write_unsigned (regcache, SPARC_O0_REGNUM, struct_addr);
837       element++;
838     }
839
840   for (i = 0; i < nargs; i++)
841     {
842       const gdb_byte *valbuf = value_contents (args[i]);
843       struct type *type = value_type (args[i]);
844       int len = TYPE_LENGTH (type);
845       int regnum = -1;
846       gdb_byte buf[16];
847
848       if (sparc64_structure_or_union_p (type))
849         {
850           /* Structure or Union arguments.  */
851           gdb_assert (len <= 16);
852           memset (buf, 0, sizeof (buf));
853           valbuf = memcpy (buf, valbuf, len);
854
855           if (element % 2 && sparc64_16_byte_align_p (type))
856             element++;
857
858           if (element < 6)
859             {
860               regnum = SPARC_O0_REGNUM + element;
861               if (len > 8 && element < 5)
862                 regcache_cooked_write (regcache, regnum + 1, valbuf + 8);
863             }
864
865           if (element < 16)
866             sparc64_store_floating_fields (regcache, type, valbuf, element, 0);
867         }
868       else if (sparc64_floating_p (type))
869         {
870           /* Floating arguments.  */
871           if (len == 16)
872             {
873               if (element % 2)
874                 element++;
875               if (element < 16)
876                 regnum = SPARC64_Q0_REGNUM + element / 2;
877             }
878           else if (len == 8)
879             {
880               if (element < 16)
881                 regnum = SPARC64_D0_REGNUM + element;
882             }
883           else
884             {
885               /* The psABI says "Each single-precision parameter value
886                  will be assigned to one extended word in the
887                  parameter array, and right-justified within that
888                  word; the left half (even floatregister) is
889                  undefined."  Even though the psABI says that "the
890                  left half is undefined", set it to zero here.  */
891               memset (buf, 0, 4);
892               memcpy (buf + 4, valbuf, 4);
893               valbuf = buf;
894               len = 8;
895               if (element < 16)
896                 regnum = SPARC64_D0_REGNUM + element;
897             }
898         }
899       else
900         {
901           /* Integral and pointer arguments.  */
902           gdb_assert (len == 8);
903           if (element < 6)
904             regnum = SPARC_O0_REGNUM + element;
905         }
906
907       if (regnum != -1)
908         {
909           regcache_cooked_write (regcache, regnum, valbuf);
910
911           /* If we're storing the value in a floating-point register,
912              also store it in the corresponding %0 register(s).  */
913           if (regnum >= SPARC64_D0_REGNUM && regnum <= SPARC64_D10_REGNUM)
914             {
915               gdb_assert (element < 6);
916               regnum = SPARC_O0_REGNUM + element;
917               regcache_cooked_write (regcache, regnum, valbuf);
918             }
919           else if (regnum >= SPARC64_Q0_REGNUM && regnum <= SPARC64_Q8_REGNUM)
920             {
921               gdb_assert (element < 6);
922               regnum = SPARC_O0_REGNUM + element;
923               regcache_cooked_write (regcache, regnum, valbuf);
924               regcache_cooked_write (regcache, regnum + 1, valbuf + 8);
925             }
926         }
927
928       /* Always store the argument in memory.  */
929       write_memory (sp + element * 8, valbuf, len);
930       element += ((len + 7) / 8);
931     }
932
933   gdb_assert (element == num_elements);
934
935   /* Take BIAS into account.  */
936   sp -= BIAS;
937   return sp;
938 }
939
940 static CORE_ADDR
941 sparc64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
942                          struct regcache *regcache, CORE_ADDR bp_addr,
943                          int nargs, struct value **args, CORE_ADDR sp,
944                          int struct_return, CORE_ADDR struct_addr)
945 {
946   /* Set return address.  */
947   regcache_cooked_write_unsigned (regcache, SPARC_O7_REGNUM, bp_addr - 8);
948
949   /* Set up function arguments.  */
950   sp = sparc64_store_arguments (regcache, nargs, args, sp,
951                                 struct_return, struct_addr);
952
953   /* Allocate the register save area.  */
954   sp -= 16 * 8;
955
956   /* Stack should be 16-byte aligned at this point.  */
957   gdb_assert ((sp + BIAS) % 16 == 0);
958
959   /* Finally, update the stack pointer.  */
960   regcache_cooked_write_unsigned (regcache, SPARC_SP_REGNUM, sp);
961
962   return sp + BIAS;
963 }
964 \f
965
966 /* Extract from an array REGBUF containing the (raw) register state, a
967    function return value of TYPE, and copy that into VALBUF.  */
968
969 static void
970 sparc64_extract_return_value (struct type *type, struct regcache *regcache,
971                               gdb_byte *valbuf)
972 {
973   int len = TYPE_LENGTH (type);
974   gdb_byte buf[32];
975   int i;
976
977   if (sparc64_structure_or_union_p (type))
978     {
979       /* Structure or Union return values.  */
980       gdb_assert (len <= 32);
981
982       for (i = 0; i < ((len + 7) / 8); i++)
983         regcache_cooked_read (regcache, SPARC_O0_REGNUM + i, buf + i * 8);
984       if (TYPE_CODE (type) != TYPE_CODE_UNION)
985         sparc64_extract_floating_fields (regcache, type, buf, 0);
986       memcpy (valbuf, buf, len);
987     }
988   else if (sparc64_floating_p (type))
989     {
990       /* Floating return values.  */
991       for (i = 0; i < len / 4; i++)
992         regcache_cooked_read (regcache, SPARC_F0_REGNUM + i, buf + i * 4);
993       memcpy (valbuf, buf, len);
994     }
995   else if (TYPE_CODE (type) == TYPE_CODE_ARRAY)
996     {
997       /* Small arrays are returned the same way as small structures.  */
998       gdb_assert (len <= 32);
999
1000       for (i = 0; i < ((len + 7) / 8); i++)
1001         regcache_cooked_read (regcache, SPARC_O0_REGNUM + i, buf + i * 8);
1002       memcpy (valbuf, buf, len);
1003     }
1004   else
1005     {
1006       /* Integral and pointer return values.  */
1007       gdb_assert (sparc64_integral_or_pointer_p (type));
1008
1009       /* Just stripping off any unused bytes should preserve the
1010          signed-ness just fine.  */
1011       regcache_cooked_read (regcache, SPARC_O0_REGNUM, buf);
1012       memcpy (valbuf, buf + 8 - len, len);
1013     }
1014 }
1015
1016 /* Write into the appropriate registers a function return value stored
1017    in VALBUF of type TYPE.  */
1018
1019 static void
1020 sparc64_store_return_value (struct type *type, struct regcache *regcache,
1021                             const gdb_byte *valbuf)
1022 {
1023   int len = TYPE_LENGTH (type);
1024   gdb_byte buf[16];
1025   int i;
1026
1027   if (sparc64_structure_or_union_p (type))
1028     {
1029       /* Structure or Union return values.  */
1030       gdb_assert (len <= 32);
1031
1032       /* Simplify matters by storing the complete value (including
1033          floating members) into %o0 and %o1.  Floating members are
1034          also store in the appropriate floating-point registers.  */
1035       memset (buf, 0, sizeof (buf));
1036       memcpy (buf, valbuf, len);
1037       for (i = 0; i < ((len + 7) / 8); i++)
1038         regcache_cooked_write (regcache, SPARC_O0_REGNUM + i, buf + i * 8);
1039       if (TYPE_CODE (type) != TYPE_CODE_UNION)
1040         sparc64_store_floating_fields (regcache, type, buf, 0, 0);
1041     }
1042   else if (sparc64_floating_p (type))
1043     {
1044       /* Floating return values.  */
1045       memcpy (buf, valbuf, len);
1046       for (i = 0; i < len / 4; i++)
1047         regcache_cooked_write (regcache, SPARC_F0_REGNUM + i, buf + i * 4);
1048     }
1049   else if (TYPE_CODE (type) == TYPE_CODE_ARRAY)
1050     {
1051       /* Small arrays are returned the same way as small structures.  */
1052       gdb_assert (len <= 32);
1053
1054       memset (buf, 0, sizeof (buf));
1055       memcpy (buf, valbuf, len);
1056       for (i = 0; i < ((len + 7) / 8); i++)
1057         regcache_cooked_write (regcache, SPARC_O0_REGNUM + i, buf + i * 8);
1058     }
1059   else
1060     {
1061       /* Integral and pointer return values.  */
1062       gdb_assert (sparc64_integral_or_pointer_p (type));
1063
1064       /* ??? Do we need to do any sign-extension here?  */
1065       memset (buf, 0, 8);
1066       memcpy (buf + 8 - len, valbuf, len);
1067       regcache_cooked_write (regcache, SPARC_O0_REGNUM, buf);
1068     }
1069 }
1070
1071 static enum return_value_convention
1072 sparc64_return_value (struct gdbarch *gdbarch, struct type *func_type,
1073                       struct type *type, struct regcache *regcache,
1074                       gdb_byte *readbuf, const gdb_byte *writebuf)
1075 {
1076   if (TYPE_LENGTH (type) > 32)
1077     return RETURN_VALUE_STRUCT_CONVENTION;
1078
1079   if (readbuf)
1080     sparc64_extract_return_value (type, regcache, readbuf);
1081   if (writebuf)
1082     sparc64_store_return_value (type, regcache, writebuf);
1083
1084   return RETURN_VALUE_REGISTER_CONVENTION;
1085 }
1086 \f
1087
1088 static void
1089 sparc64_dwarf2_frame_init_reg (struct gdbarch *gdbarch, int regnum,
1090                                struct dwarf2_frame_state_reg *reg,
1091                                struct frame_info *this_frame)
1092 {
1093   switch (regnum)
1094     {
1095     case SPARC_G0_REGNUM:
1096       /* Since %g0 is always zero, there is no point in saving it, and
1097          people will be inclined omit it from the CFI.  Make sure we
1098          don't warn about that.  */
1099       reg->how = DWARF2_FRAME_REG_SAME_VALUE;
1100       break;
1101     case SPARC_SP_REGNUM:
1102       reg->how = DWARF2_FRAME_REG_CFA;
1103       break;
1104     case SPARC64_PC_REGNUM:
1105       reg->how = DWARF2_FRAME_REG_RA_OFFSET;
1106       reg->loc.offset = 8;
1107       break;
1108     case SPARC64_NPC_REGNUM:
1109       reg->how = DWARF2_FRAME_REG_RA_OFFSET;
1110       reg->loc.offset = 12;
1111       break;
1112     }
1113 }
1114
1115 void
1116 sparc64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
1117 {
1118   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
1119
1120   tdep->pc_regnum = SPARC64_PC_REGNUM;
1121   tdep->npc_regnum = SPARC64_NPC_REGNUM;
1122
1123   /* This is what all the fuss is about.  */
1124   set_gdbarch_long_bit (gdbarch, 64);
1125   set_gdbarch_long_long_bit (gdbarch, 64);
1126   set_gdbarch_ptr_bit (gdbarch, 64);
1127
1128   set_gdbarch_num_regs (gdbarch, SPARC64_NUM_REGS);
1129   set_gdbarch_register_name (gdbarch, sparc64_register_name);
1130   set_gdbarch_register_type (gdbarch, sparc64_register_type);
1131   set_gdbarch_num_pseudo_regs (gdbarch, SPARC64_NUM_PSEUDO_REGS);
1132   set_gdbarch_pseudo_register_read (gdbarch, sparc64_pseudo_register_read);
1133   set_gdbarch_pseudo_register_write (gdbarch, sparc64_pseudo_register_write);
1134
1135   /* Register numbers of various important registers.  */
1136   set_gdbarch_pc_regnum (gdbarch, SPARC64_PC_REGNUM); /* %pc */
1137
1138   /* Call dummy code.  */
1139   set_gdbarch_call_dummy_location (gdbarch, AT_ENTRY_POINT);
1140   set_gdbarch_push_dummy_code (gdbarch, NULL);
1141   set_gdbarch_push_dummy_call (gdbarch, sparc64_push_dummy_call);
1142
1143   set_gdbarch_return_value (gdbarch, sparc64_return_value);
1144   set_gdbarch_stabs_argument_has_addr
1145     (gdbarch, default_stabs_argument_has_addr);
1146
1147   set_gdbarch_skip_prologue (gdbarch, sparc64_skip_prologue);
1148
1149   /* Hook in the DWARF CFI frame unwinder.  */
1150   dwarf2_frame_set_init_reg (gdbarch, sparc64_dwarf2_frame_init_reg);
1151   /* FIXME: kettenis/20050423: Don't enable the unwinder until the
1152      StackGhost issues have been resolved.  */
1153
1154   frame_unwind_append_unwinder (gdbarch, &sparc64_frame_unwind);
1155   frame_base_set_default (gdbarch, &sparc64_frame_base);
1156 }
1157 \f
1158
1159 /* Helper functions for dealing with register sets.  */
1160
1161 #define TSTATE_CWP      0x000000000000001fULL
1162 #define TSTATE_ICC      0x0000000f00000000ULL
1163 #define TSTATE_XCC      0x000000f000000000ULL
1164
1165 #define PSR_S           0x00000080
1166 #define PSR_ICC         0x00f00000
1167 #define PSR_VERS        0x0f000000
1168 #define PSR_IMPL        0xf0000000
1169 #define PSR_V8PLUS      0xff000000
1170 #define PSR_XCC         0x000f0000
1171
1172 void
1173 sparc64_supply_gregset (const struct sparc_gregset *gregset,
1174                         struct regcache *regcache,
1175                         int regnum, const void *gregs)
1176 {
1177   struct gdbarch *gdbarch = get_regcache_arch (regcache);
1178   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1179   int sparc32 = (gdbarch_ptr_bit (gdbarch) == 32);
1180   const gdb_byte *regs = gregs;
1181   int i;
1182
1183   if (sparc32)
1184     {
1185       if (regnum == SPARC32_PSR_REGNUM || regnum == -1)
1186         {
1187           int offset = gregset->r_tstate_offset;
1188           ULONGEST tstate, psr;
1189           gdb_byte buf[4];
1190
1191           tstate = extract_unsigned_integer (regs + offset, 8, byte_order);
1192           psr = ((tstate & TSTATE_CWP) | PSR_S | ((tstate & TSTATE_ICC) >> 12)
1193                  | ((tstate & TSTATE_XCC) >> 20) | PSR_V8PLUS);
1194           store_unsigned_integer (buf, 4, byte_order, psr);
1195           regcache_raw_supply (regcache, SPARC32_PSR_REGNUM, buf);
1196         }
1197
1198       if (regnum == SPARC32_PC_REGNUM || regnum == -1)
1199         regcache_raw_supply (regcache, SPARC32_PC_REGNUM,
1200                              regs + gregset->r_pc_offset + 4);
1201
1202       if (regnum == SPARC32_NPC_REGNUM || regnum == -1)
1203         regcache_raw_supply (regcache, SPARC32_NPC_REGNUM,
1204                              regs + gregset->r_npc_offset + 4);
1205
1206       if (regnum == SPARC32_Y_REGNUM || regnum == -1)
1207         {
1208           int offset = gregset->r_y_offset + 8 - gregset->r_y_size;
1209           regcache_raw_supply (regcache, SPARC32_Y_REGNUM, regs + offset);
1210         }
1211     }
1212   else
1213     {
1214       if (regnum == SPARC64_STATE_REGNUM || regnum == -1)
1215         regcache_raw_supply (regcache, SPARC64_STATE_REGNUM,
1216                              regs + gregset->r_tstate_offset);
1217
1218       if (regnum == SPARC64_PC_REGNUM || regnum == -1)
1219         regcache_raw_supply (regcache, SPARC64_PC_REGNUM,
1220                              regs + gregset->r_pc_offset);
1221
1222       if (regnum == SPARC64_NPC_REGNUM || regnum == -1)
1223         regcache_raw_supply (regcache, SPARC64_NPC_REGNUM,
1224                              regs + gregset->r_npc_offset);
1225
1226       if (regnum == SPARC64_Y_REGNUM || regnum == -1)
1227         {
1228           gdb_byte buf[8];
1229
1230           memset (buf, 0, 8);
1231           memcpy (buf + 8 - gregset->r_y_size,
1232                   regs + gregset->r_y_offset, gregset->r_y_size);
1233           regcache_raw_supply (regcache, SPARC64_Y_REGNUM, buf);
1234         }
1235
1236       if ((regnum == SPARC64_FPRS_REGNUM || regnum == -1)
1237           && gregset->r_fprs_offset != -1)
1238         regcache_raw_supply (regcache, SPARC64_FPRS_REGNUM,
1239                              regs + gregset->r_fprs_offset);
1240     }
1241
1242   if (regnum == SPARC_G0_REGNUM || regnum == -1)
1243     regcache_raw_supply (regcache, SPARC_G0_REGNUM, NULL);
1244
1245   if ((regnum >= SPARC_G1_REGNUM && regnum <= SPARC_O7_REGNUM) || regnum == -1)
1246     {
1247       int offset = gregset->r_g1_offset;
1248
1249       if (sparc32)
1250         offset += 4;
1251
1252       for (i = SPARC_G1_REGNUM; i <= SPARC_O7_REGNUM; i++)
1253         {
1254           if (regnum == i || regnum == -1)
1255             regcache_raw_supply (regcache, i, regs + offset);
1256           offset += 8;
1257         }
1258     }
1259
1260   if ((regnum >= SPARC_L0_REGNUM && regnum <= SPARC_I7_REGNUM) || regnum == -1)
1261     {
1262       /* Not all of the register set variants include Locals and
1263          Inputs.  For those that don't, we read them off the stack.  */
1264       if (gregset->r_l0_offset == -1)
1265         {
1266           ULONGEST sp;
1267
1268           regcache_cooked_read_unsigned (regcache, SPARC_SP_REGNUM, &sp);
1269           sparc_supply_rwindow (regcache, sp, regnum);
1270         }
1271       else
1272         {
1273           int offset = gregset->r_l0_offset;
1274
1275           if (sparc32)
1276             offset += 4;
1277
1278           for (i = SPARC_L0_REGNUM; i <= SPARC_I7_REGNUM; i++)
1279             {
1280               if (regnum == i || regnum == -1)
1281                 regcache_raw_supply (regcache, i, regs + offset);
1282               offset += 8;
1283             }
1284         }
1285     }
1286 }
1287
1288 void
1289 sparc64_collect_gregset (const struct sparc_gregset *gregset,
1290                          const struct regcache *regcache,
1291                          int regnum, void *gregs)
1292 {
1293   struct gdbarch *gdbarch = get_regcache_arch (regcache);
1294   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1295   int sparc32 = (gdbarch_ptr_bit (gdbarch) == 32);
1296   gdb_byte *regs = gregs;
1297   int i;
1298
1299   if (sparc32)
1300     {
1301       if (regnum == SPARC32_PSR_REGNUM || regnum == -1)
1302         {
1303           int offset = gregset->r_tstate_offset;
1304           ULONGEST tstate, psr;
1305           gdb_byte buf[8];
1306
1307           tstate = extract_unsigned_integer (regs + offset, 8, byte_order);
1308           regcache_raw_collect (regcache, SPARC32_PSR_REGNUM, buf);
1309           psr = extract_unsigned_integer (buf, 4, byte_order);
1310           tstate |= (psr & PSR_ICC) << 12;
1311           if ((psr & (PSR_VERS | PSR_IMPL)) == PSR_V8PLUS)
1312             tstate |= (psr & PSR_XCC) << 20;
1313           store_unsigned_integer (buf, 8, byte_order, tstate);
1314           memcpy (regs + offset, buf, 8);
1315         }
1316
1317       if (regnum == SPARC32_PC_REGNUM || regnum == -1)
1318         regcache_raw_collect (regcache, SPARC32_PC_REGNUM,
1319                               regs + gregset->r_pc_offset + 4);
1320
1321       if (regnum == SPARC32_NPC_REGNUM || regnum == -1)
1322         regcache_raw_collect (regcache, SPARC32_NPC_REGNUM,
1323                               regs + gregset->r_npc_offset + 4);
1324
1325       if (regnum == SPARC32_Y_REGNUM || regnum == -1)
1326         {
1327           int offset = gregset->r_y_offset + 8 - gregset->r_y_size;
1328           regcache_raw_collect (regcache, SPARC32_Y_REGNUM, regs + offset);
1329         }
1330     }
1331   else
1332     {
1333       if (regnum == SPARC64_STATE_REGNUM || regnum == -1)
1334         regcache_raw_collect (regcache, SPARC64_STATE_REGNUM,
1335                               regs + gregset->r_tstate_offset);
1336
1337       if (regnum == SPARC64_PC_REGNUM || regnum == -1)
1338         regcache_raw_collect (regcache, SPARC64_PC_REGNUM,
1339                               regs + gregset->r_pc_offset);
1340
1341       if (regnum == SPARC64_NPC_REGNUM || regnum == -1)
1342         regcache_raw_collect (regcache, SPARC64_NPC_REGNUM,
1343                               regs + gregset->r_npc_offset);
1344
1345       if (regnum == SPARC64_Y_REGNUM || regnum == -1)
1346         {
1347           gdb_byte buf[8];
1348
1349           regcache_raw_collect (regcache, SPARC64_Y_REGNUM, buf);
1350           memcpy (regs + gregset->r_y_offset,
1351                   buf + 8 - gregset->r_y_size, gregset->r_y_size);
1352         }
1353
1354       if ((regnum == SPARC64_FPRS_REGNUM || regnum == -1)
1355           && gregset->r_fprs_offset != -1)
1356         regcache_raw_collect (regcache, SPARC64_FPRS_REGNUM,
1357                               regs + gregset->r_fprs_offset);
1358
1359     }
1360
1361   if ((regnum >= SPARC_G1_REGNUM && regnum <= SPARC_O7_REGNUM) || regnum == -1)
1362     {
1363       int offset = gregset->r_g1_offset;
1364
1365       if (sparc32)
1366         offset += 4;
1367
1368       /* %g0 is always zero.  */
1369       for (i = SPARC_G1_REGNUM; i <= SPARC_O7_REGNUM; i++)
1370         {
1371           if (regnum == i || regnum == -1)
1372             regcache_raw_collect (regcache, i, regs + offset);
1373           offset += 8;
1374         }
1375     }
1376
1377   if ((regnum >= SPARC_L0_REGNUM && regnum <= SPARC_I7_REGNUM) || regnum == -1)
1378     {
1379       /* Not all of the register set variants include Locals and
1380          Inputs.  For those that don't, we read them off the stack.  */
1381       if (gregset->r_l0_offset != -1)
1382         {
1383           int offset = gregset->r_l0_offset;
1384
1385           if (sparc32)
1386             offset += 4;
1387
1388           for (i = SPARC_L0_REGNUM; i <= SPARC_I7_REGNUM; i++)
1389             {
1390               if (regnum == i || regnum == -1)
1391                 regcache_raw_collect (regcache, i, regs + offset);
1392               offset += 8;
1393             }
1394         }
1395     }
1396 }
1397
1398 void
1399 sparc64_supply_fpregset (struct regcache *regcache,
1400                          int regnum, const void *fpregs)
1401 {
1402   int sparc32 = (gdbarch_ptr_bit (get_regcache_arch (regcache)) == 32);
1403   const gdb_byte *regs = fpregs;
1404   int i;
1405
1406   for (i = 0; i < 32; i++)
1407     {
1408       if (regnum == (SPARC_F0_REGNUM + i) || regnum == -1)
1409         regcache_raw_supply (regcache, SPARC_F0_REGNUM + i, regs + (i * 4));
1410     }
1411
1412   if (sparc32)
1413     {
1414       if (regnum == SPARC32_FSR_REGNUM || regnum == -1)
1415         regcache_raw_supply (regcache, SPARC32_FSR_REGNUM,
1416                              regs + (32 * 4) + (16 * 8) + 4);
1417     }
1418   else
1419     {
1420       for (i = 0; i < 16; i++)
1421         {
1422           if (regnum == (SPARC64_F32_REGNUM + i) || regnum == -1)
1423             regcache_raw_supply (regcache, SPARC64_F32_REGNUM + i,
1424                                  regs + (32 * 4) + (i * 8));
1425         }
1426
1427       if (regnum == SPARC64_FSR_REGNUM || regnum == -1)
1428         regcache_raw_supply (regcache, SPARC64_FSR_REGNUM,
1429                              regs + (32 * 4) + (16 * 8));
1430     }
1431 }
1432
1433 void
1434 sparc64_collect_fpregset (const struct regcache *regcache,
1435                           int regnum, void *fpregs)
1436 {
1437   int sparc32 = (gdbarch_ptr_bit (get_regcache_arch (regcache)) == 32);
1438   gdb_byte *regs = fpregs;
1439   int i;
1440
1441   for (i = 0; i < 32; i++)
1442     {
1443       if (regnum == (SPARC_F0_REGNUM + i) || regnum == -1)
1444         regcache_raw_collect (regcache, SPARC_F0_REGNUM + i, regs + (i * 4));
1445     }
1446
1447   if (sparc32)
1448     {
1449       if (regnum == SPARC32_FSR_REGNUM || regnum == -1)
1450         regcache_raw_collect (regcache, SPARC32_FSR_REGNUM,
1451                               regs + (32 * 4) + (16 * 8) + 4);
1452     }
1453   else
1454     {
1455       for (i = 0; i < 16; i++)
1456         {
1457           if (regnum == (SPARC64_F32_REGNUM + i) || regnum == -1)
1458             regcache_raw_collect (regcache, SPARC64_F32_REGNUM + i,
1459                                   regs + (32 * 4) + (i * 8));
1460         }
1461
1462       if (regnum == SPARC64_FSR_REGNUM || regnum == -1)
1463         regcache_raw_collect (regcache, SPARC64_FSR_REGNUM,
1464                               regs + (32 * 4) + (16 * 8));
1465     }
1466 }
1467