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