]> Git Repo - binutils.git/blob - gdb/sparc-tdep.c
2003-03-13 Andrew Cagney <[email protected]>
[binutils.git] / gdb / sparc-tdep.c
1 /* Target-dependent code for the SPARC for GDB, the GNU debugger.
2
3    Copyright 1986, 1987, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
4    1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation,
5    Inc.
6
7    This file is part of GDB.
8
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 2 of the License, or
12    (at your option) any later version.
13
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18
19    You should have received a copy of the GNU General Public License
20    along with this program; if not, write to the Free Software
21    Foundation, Inc., 59 Temple Place - Suite 330,
22    Boston, MA 02111-1307, USA.  */
23
24 /* ??? Support for calling functions from gdb in sparc64 is unfinished.  */
25
26 #include "defs.h"
27 #include "arch-utils.h"
28 #include "frame.h"
29 #include "inferior.h"
30 #include "target.h"
31 #include "value.h"
32 #include "bfd.h"
33 #include "gdb_string.h"
34 #include "regcache.h"
35 #include "osabi.h"
36
37 #ifdef  USE_PROC_FS
38 #include <sys/procfs.h>
39 /* Prototypes for supply_gregset etc. */
40 #include "gregset.h"
41 #endif
42
43 #include "gdbcore.h"
44
45 #include "symfile.h"    /* for 'entry_point_address' */
46
47 /*
48  * Some local macros that have multi-arch and non-multi-arch versions:
49  */
50
51 #if (GDB_MULTI_ARCH > 0)
52
53 /* Does the target have Floating Point registers?  */
54 #define SPARC_HAS_FPU     (gdbarch_tdep (current_gdbarch)->has_fpu)
55 /* Number of bytes devoted to Floating Point registers: */
56 #define FP_REGISTER_BYTES (gdbarch_tdep (current_gdbarch)->fp_register_bytes)
57 /* Highest numbered Floating Point register.  */
58 #define FP_MAX_REGNUM     (gdbarch_tdep (current_gdbarch)->fp_max_regnum)
59 /* Size of a general (integer) register: */
60 #define SPARC_INTREG_SIZE (gdbarch_tdep (current_gdbarch)->intreg_size)
61 /* Offset within the call dummy stack of the saved registers.  */
62 #define DUMMY_REG_SAVE_OFFSET (gdbarch_tdep (current_gdbarch)->reg_save_offset)
63
64 #else /* non-multi-arch */
65
66
67 /* Does the target have Floating Point registers?  */
68 #if defined(TARGET_SPARCLET) || defined(TARGET_SPARCLITE)
69 #define SPARC_HAS_FPU 0
70 #else
71 #define SPARC_HAS_FPU 1
72 #endif
73
74 /* Number of bytes devoted to Floating Point registers: */
75 #if (GDB_TARGET_IS_SPARC64)
76 #define FP_REGISTER_BYTES (64 * 4)
77 #else
78 #if (SPARC_HAS_FPU)
79 #define FP_REGISTER_BYTES (32 * 4)
80 #else
81 #define FP_REGISTER_BYTES 0
82 #endif
83 #endif
84
85 /* Highest numbered Floating Point register.  */
86 #if (GDB_TARGET_IS_SPARC64)
87 #define FP_MAX_REGNUM (FP0_REGNUM + 48)
88 #else
89 #define FP_MAX_REGNUM (FP0_REGNUM + 32)
90 #endif
91
92 /* Size of a general (integer) register: */
93 #define SPARC_INTREG_SIZE (REGISTER_RAW_SIZE (G0_REGNUM))
94
95 /* Offset within the call dummy stack of the saved registers.  */
96 #if (GDB_TARGET_IS_SPARC64)
97 #define DUMMY_REG_SAVE_OFFSET (128 + 16)
98 #else
99 #define DUMMY_REG_SAVE_OFFSET 0x60
100 #endif
101
102 #endif /* GDB_MULTI_ARCH */
103
104 struct gdbarch_tdep
105   {
106     int has_fpu;
107     int fp_register_bytes;
108     int y_regnum;
109     int fp_max_regnum;
110     int intreg_size;
111     int reg_save_offset;
112     int call_dummy_call_offset;
113     int print_insn_mach;
114   };
115
116 /* Now make GDB_TARGET_IS_SPARC64 a runtime test.  */
117 /* FIXME MVS: or try testing bfd_arch_info.arch and bfd_arch_info.mach ... 
118  * define GDB_TARGET_IS_SPARC64 \
119  *      (TARGET_ARCHITECTURE->arch == bfd_arch_sparc &&    \
120  *      (TARGET_ARCHITECTURE->mach == bfd_mach_sparc_v9 || \
121  *       TARGET_ARCHITECTURE->mach == bfd_mach_sparc_v9a))
122  */
123
124 /* From infrun.c */
125 extern int stop_after_trap;
126
127 /* We don't store all registers immediately when requested, since they
128    get sent over in large chunks anyway.  Instead, we accumulate most
129    of the changes and send them over once.  "deferred_stores" keeps
130    track of which sets of registers we have locally-changed copies of,
131    so we only need send the groups that have changed.  */
132
133 int deferred_stores = 0;    /* Accumulated stores we want to do eventually. */
134
135
136 /* Some machines, such as Fujitsu SPARClite 86x, have a bi-endian mode
137    where instructions are big-endian and data are little-endian.
138    This flag is set when we detect that the target is of this type. */
139
140 int bi_endian = 0;
141
142
143 /* Fetch a single instruction.  Even on bi-endian machines
144    such as sparc86x, instructions are always big-endian.  */
145
146 static unsigned long
147 fetch_instruction (CORE_ADDR pc)
148 {
149   unsigned long retval;
150   int i;
151   unsigned char buf[4];
152
153   read_memory (pc, buf, sizeof (buf));
154
155   /* Start at the most significant end of the integer, and work towards
156      the least significant.  */
157   retval = 0;
158   for (i = 0; i < sizeof (buf); ++i)
159     retval = (retval << 8) | buf[i];
160   return retval;
161 }
162
163
164 /* Branches with prediction are treated like their non-predicting cousins.  */
165 /* FIXME: What about floating point branches?  */
166
167 /* Macros to extract fields from sparc instructions.  */
168 #define X_OP(i) (((i) >> 30) & 0x3)
169 #define X_RD(i) (((i) >> 25) & 0x1f)
170 #define X_A(i) (((i) >> 29) & 1)
171 #define X_COND(i) (((i) >> 25) & 0xf)
172 #define X_OP2(i) (((i) >> 22) & 0x7)
173 #define X_IMM22(i) ((i) & 0x3fffff)
174 #define X_OP3(i) (((i) >> 19) & 0x3f)
175 #define X_RS1(i) (((i) >> 14) & 0x1f)
176 #define X_I(i) (((i) >> 13) & 1)
177 #define X_IMM13(i) ((i) & 0x1fff)
178 /* Sign extension macros.  */
179 #define X_SIMM13(i) ((X_IMM13 (i) ^ 0x1000) - 0x1000)
180 #define X_DISP22(i) ((X_IMM22 (i) ^ 0x200000) - 0x200000)
181 #define X_CC(i) (((i) >> 20) & 3)
182 #define X_P(i) (((i) >> 19) & 1)
183 #define X_DISP19(i) ((((i) & 0x7ffff) ^ 0x40000) - 0x40000)
184 #define X_RCOND(i) (((i) >> 25) & 7)
185 #define X_DISP16(i) ((((((i) >> 6) && 0xc000) | ((i) & 0x3fff)) ^ 0x8000) - 0x8000)
186 #define X_FCN(i) (((i) >> 25) & 31)
187
188 typedef enum
189 {
190   Error, not_branch, bicc, bicca, ba, baa, ticc, ta, done_retry
191 } branch_type;
192
193 /* Simulate single-step ptrace call for sun4.  Code written by Gary
194    Beihl ([email protected]).  */
195
196 /* npc4 and next_pc describe the situation at the time that the
197    step-breakpoint was set, not necessary the current value of NPC_REGNUM.  */
198 static CORE_ADDR next_pc, npc4, target;
199 static int brknpc4, brktrg;
200 typedef char binsn_quantum[BREAKPOINT_MAX];
201 static binsn_quantum break_mem[3];
202
203 static branch_type isbranch (long, CORE_ADDR, CORE_ADDR *);
204
205 /* single_step() is called just before we want to resume the inferior,
206    if we want to single-step it but there is no hardware or kernel single-step
207    support (as on all SPARCs).  We find all the possible targets of the
208    coming instruction and breakpoint them.
209
210    single_step is also called just after the inferior stops.  If we had
211    set up a simulated single-step, we undo our damage.  */
212
213 void
214 sparc_software_single_step (enum target_signal ignore,  /* pid, but we don't need it */
215                             int insert_breakpoints_p)
216 {
217   branch_type br;
218   CORE_ADDR pc;
219   long pc_instruction;
220
221   if (insert_breakpoints_p)
222     {
223       /* Always set breakpoint for NPC.  */
224       next_pc = read_register (NPC_REGNUM);
225       npc4 = next_pc + 4;       /* branch not taken */
226
227       target_insert_breakpoint (next_pc, break_mem[0]);
228       /* printf_unfiltered ("set break at %x\n",next_pc); */
229
230       pc = read_register (PC_REGNUM);
231       pc_instruction = fetch_instruction (pc);
232       br = isbranch (pc_instruction, pc, &target);
233       brknpc4 = brktrg = 0;
234
235       if (br == bicca)
236         {
237           /* Conditional annulled branch will either end up at
238              npc (if taken) or at npc+4 (if not taken).
239              Trap npc+4.  */
240           brknpc4 = 1;
241           target_insert_breakpoint (npc4, break_mem[1]);
242         }
243       else if (br == baa && target != next_pc)
244         {
245           /* Unconditional annulled branch will always end up at
246              the target.  */
247           brktrg = 1;
248           target_insert_breakpoint (target, break_mem[2]);
249         }
250       else if (GDB_TARGET_IS_SPARC64 && br == done_retry)
251         {
252           brktrg = 1;
253           target_insert_breakpoint (target, break_mem[2]);
254         }
255     }
256   else
257     {
258       /* Remove breakpoints */
259       target_remove_breakpoint (next_pc, break_mem[0]);
260
261       if (brknpc4)
262         target_remove_breakpoint (npc4, break_mem[1]);
263
264       if (brktrg)
265         target_remove_breakpoint (target, break_mem[2]);
266     }
267 }
268 \f
269 struct frame_extra_info 
270 {
271   CORE_ADDR bottom;
272   int in_prologue;
273   int flat;
274   /* Following fields only relevant for flat frames.  */
275   CORE_ADDR pc_addr;
276   CORE_ADDR fp_addr;
277   /* Add this to ->frame to get the value of the stack pointer at the 
278      time of the register saves.  */
279   int sp_offset;
280 };
281
282 /* Call this for each newly created frame.  For SPARC, we need to
283    calculate the bottom of the frame, and do some extra work if the
284    prologue has been generated via the -mflat option to GCC.  In
285    particular, we need to know where the previous fp and the pc have
286    been stashed, since their exact position within the frame may vary.  */
287
288 void
289 sparc_init_extra_frame_info (int fromleaf, struct frame_info *fi)
290 {
291   char *name;
292   CORE_ADDR prologue_start, prologue_end;
293   int insn;
294
295   frame_extra_info_zalloc (fi, sizeof (struct frame_extra_info));
296   frame_saved_regs_zalloc (fi);
297
298   get_frame_extra_info (fi)->bottom =
299     (get_next_frame (fi)
300      ? (get_frame_base (fi) == get_frame_base (get_next_frame (fi))
301         ? get_frame_extra_info (get_next_frame (fi))->bottom
302         : get_frame_base (get_next_frame (fi)))
303      : read_sp ());
304
305   /* If fi->next is NULL, then we already set ->frame by passing read_fp()
306      to create_new_frame.  */
307   if (get_next_frame (fi))
308     {
309       char *buf;
310
311       buf = alloca (MAX_REGISTER_RAW_SIZE);
312
313       /* Compute ->frame as if not flat.  If it is flat, we'll change
314          it later.  */
315       if (get_next_frame (get_next_frame (fi)) != NULL
316           && ((get_frame_type (get_next_frame (get_next_frame (fi))) == SIGTRAMP_FRAME)
317               || deprecated_frame_in_dummy (get_next_frame (get_next_frame (fi))))
318           && frameless_look_for_prologue (get_next_frame (fi)))
319         {
320           /* A frameless function interrupted by a signal did not change
321              the frame pointer, fix up frame pointer accordingly.  */
322           deprecated_update_frame_base_hack (fi, get_frame_base (get_next_frame (fi)));
323           get_frame_extra_info (fi)->bottom =
324             get_frame_extra_info (get_next_frame (fi))->bottom;
325         }
326       else
327         {
328           /* Should we adjust for stack bias here? */
329           get_saved_register (buf, 0, 0, fi, FP_REGNUM, 0);
330           deprecated_update_frame_base_hack (fi, extract_address (buf, REGISTER_RAW_SIZE (FP_REGNUM)));
331
332           if (GDB_TARGET_IS_SPARC64 && (get_frame_base (fi) & 1))
333             deprecated_update_frame_base_hack (fi, get_frame_base (fi) + 2047);
334         }
335     }
336
337   /* Decide whether this is a function with a ``flat register window''
338      frame.  For such functions, the frame pointer is actually in %i7.  */
339   get_frame_extra_info (fi)->flat = 0;
340   get_frame_extra_info (fi)->in_prologue = 0;
341   if (find_pc_partial_function (get_frame_pc (fi), &name, &prologue_start, &prologue_end))
342     {
343       /* See if the function starts with an add (which will be of a
344          negative number if a flat frame) to the sp.  FIXME: Does not
345          handle large frames which will need more than one instruction
346          to adjust the sp.  */
347       insn = fetch_instruction (prologue_start);
348       if (X_OP (insn) == 2 && X_RD (insn) == 14 && X_OP3 (insn) == 0
349           && X_I (insn) && X_SIMM13 (insn) < 0)
350         {
351           int offset = X_SIMM13 (insn);
352
353           /* Then look for a save of %i7 into the frame.  */
354           insn = fetch_instruction (prologue_start + 4);
355           if (X_OP (insn) == 3
356               && X_RD (insn) == 31
357               && X_OP3 (insn) == 4
358               && X_RS1 (insn) == 14)
359             {
360               char *buf;
361               
362               buf = alloca (MAX_REGISTER_RAW_SIZE);
363
364               /* We definitely have a flat frame now.  */
365               get_frame_extra_info (fi)->flat = 1;
366
367               get_frame_extra_info (fi)->sp_offset = offset;
368
369               /* Overwrite the frame's address with the value in %i7.  */
370               get_saved_register (buf, 0, 0, fi, I7_REGNUM, 0);
371               deprecated_update_frame_base_hack (fi, extract_address (buf, REGISTER_RAW_SIZE (I7_REGNUM)));
372
373               if (GDB_TARGET_IS_SPARC64 && (get_frame_base (fi) & 1))
374                 deprecated_update_frame_base_hack (fi, get_frame_base (fi) + 2047);
375
376               /* Record where the fp got saved.  */
377               get_frame_extra_info (fi)->fp_addr = 
378                 get_frame_base (fi) + get_frame_extra_info (fi)->sp_offset + X_SIMM13 (insn);
379
380               /* Also try to collect where the pc got saved to.  */
381               get_frame_extra_info (fi)->pc_addr = 0;
382               insn = fetch_instruction (prologue_start + 12);
383               if (X_OP (insn) == 3
384                   && X_RD (insn) == 15
385                   && X_OP3 (insn) == 4
386                   && X_RS1 (insn) == 14)
387                 get_frame_extra_info (fi)->pc_addr = 
388                   get_frame_base (fi) + get_frame_extra_info (fi)->sp_offset + X_SIMM13 (insn);
389             }
390         }
391       else
392         {
393           /* Check if the PC is in the function prologue before a SAVE
394              instruction has been executed yet.  If so, set the frame
395              to the current value of the stack pointer and set
396              the in_prologue flag.  */
397           CORE_ADDR addr;
398           struct symtab_and_line sal;
399
400           sal = find_pc_line (prologue_start, 0);
401           if (sal.line == 0)    /* no line info, use PC */
402             prologue_end = get_frame_pc (fi);
403           else if (sal.end < prologue_end)
404             prologue_end = sal.end;
405           if (get_frame_pc (fi) < prologue_end)
406             {
407               for (addr = prologue_start; addr < get_frame_pc (fi); addr += 4)
408                 {
409                   insn = read_memory_integer (addr, 4);
410                   if (X_OP (insn) == 2 && X_OP3 (insn) == 0x3c)
411                     break;      /* SAVE seen, stop searching */
412                 }
413               if (addr >= get_frame_pc (fi))
414                 {
415                   get_frame_extra_info (fi)->in_prologue = 1;
416                   deprecated_update_frame_base_hack (fi, read_register (SP_REGNUM));
417                 }
418             }
419         }
420     }
421   if (get_next_frame (fi) && get_frame_base (fi) == 0)
422     {
423       /* Kludge to cause init_prev_frame_info to destroy the new frame.  */
424       deprecated_update_frame_base_hack (fi, get_frame_base (get_next_frame (fi)));
425       deprecated_update_frame_pc_hack (fi, get_frame_pc (get_next_frame (fi)));
426     }
427 }
428
429 CORE_ADDR
430 sparc_frame_chain (struct frame_info *frame)
431 {
432   /* Value that will cause FRAME_CHAIN_VALID to not worry about the chain
433      value.  If it really is zero, we detect it later in
434      sparc_init_prev_frame.
435      
436      Note:  kevinb/2003-02-18:  The constant 1 used to be returned
437      here, but, after some recent changes to frame_chain_valid(),
438      this value is no longer suitable for causing frame_chain_valid()
439      to "not worry about the chain value."  The constant ~0 (i.e,
440      0xfff...) causes the failing test in frame_chain_valid() to
441      succeed thus preserving the "not worry" property.  I had considered
442      using something like ``get_frame_base (frame) + 1''.  However, I think
443      a constant value is better, because when debugging this problem,
444      I knew that something funny was going on as soon as I saw the
445      constant 1 being used as the frame chain elsewhere in GDB.  */
446
447   return ~ (CORE_ADDR) 0;
448 }
449
450 CORE_ADDR
451 sparc_extract_struct_value_address (char *regbuf)
452 {
453   return extract_address (regbuf + REGISTER_BYTE (O0_REGNUM),
454                           REGISTER_RAW_SIZE (O0_REGNUM));
455 }
456
457 /* Find the pc saved in frame FRAME.  */
458
459 CORE_ADDR
460 sparc_frame_saved_pc (struct frame_info *frame)
461 {
462   char *buf;
463   CORE_ADDR addr;
464
465   buf = alloca (MAX_REGISTER_RAW_SIZE);
466   if ((get_frame_type (frame) == SIGTRAMP_FRAME))
467     {
468       /* This is the signal trampoline frame.
469          Get the saved PC from the sigcontext structure.  */
470
471 #ifndef SIGCONTEXT_PC_OFFSET
472 #define SIGCONTEXT_PC_OFFSET 12
473 #endif
474
475       CORE_ADDR sigcontext_addr;
476       char *scbuf;
477       int saved_pc_offset = SIGCONTEXT_PC_OFFSET;
478       char *name = NULL;
479
480       scbuf = alloca (TARGET_PTR_BIT / HOST_CHAR_BIT);
481
482       /* Solaris2 ucbsigvechandler passes a pointer to a sigcontext
483          as the third parameter.  The offset to the saved pc is 12.  */
484       find_pc_partial_function (get_frame_pc (frame), &name,
485                                 (CORE_ADDR *) NULL, (CORE_ADDR *) NULL);
486       if (name && STREQ (name, "ucbsigvechandler"))
487         saved_pc_offset = 12;
488
489       /* The sigcontext address is contained in register O2.  */
490       get_saved_register (buf, (int *) NULL, (CORE_ADDR *) NULL,
491                           frame, O0_REGNUM + 2, (enum lval_type *) NULL);
492       sigcontext_addr = extract_address (buf, REGISTER_RAW_SIZE (O0_REGNUM + 2));
493
494       /* Don't cause a memory_error when accessing sigcontext in case the
495          stack layout has changed or the stack is corrupt.  */
496       target_read_memory (sigcontext_addr + saved_pc_offset,
497                           scbuf, sizeof (scbuf));
498       return extract_address (scbuf, sizeof (scbuf));
499     }
500   else if (get_frame_extra_info (frame)->in_prologue ||
501            (get_next_frame (frame) != NULL &&
502             ((get_frame_type (get_next_frame (frame)) == SIGTRAMP_FRAME) ||
503              deprecated_frame_in_dummy (get_next_frame (frame))) &&
504             frameless_look_for_prologue (frame)))
505     {
506       /* A frameless function interrupted by a signal did not save
507          the PC, it is still in %o7.  */
508       get_saved_register (buf, (int *) NULL, (CORE_ADDR *) NULL,
509                           frame, O7_REGNUM, (enum lval_type *) NULL);
510       return PC_ADJUST (extract_address (buf, SPARC_INTREG_SIZE));
511     }
512   if (get_frame_extra_info (frame)->flat)
513     addr = get_frame_extra_info (frame)->pc_addr;
514   else
515     addr = get_frame_extra_info (frame)->bottom + FRAME_SAVED_I0 +
516       SPARC_INTREG_SIZE * (I7_REGNUM - I0_REGNUM);
517
518   if (addr == 0)
519     /* A flat frame leaf function might not save the PC anywhere,
520        just leave it in %o7.  */
521     return PC_ADJUST (read_register (O7_REGNUM));
522
523   read_memory (addr, buf, SPARC_INTREG_SIZE);
524   return PC_ADJUST (extract_address (buf, SPARC_INTREG_SIZE));
525 }
526
527 /* Since an individual frame in the frame cache is defined by two
528    arguments (a frame pointer and a stack pointer), we need two
529    arguments to get info for an arbitrary stack frame.  This routine
530    takes two arguments and makes the cached frames look as if these
531    two arguments defined a frame on the cache.  This allows the rest
532    of info frame to extract the important arguments without
533    difficulty.  */
534
535 struct frame_info *
536 setup_arbitrary_frame (int argc, CORE_ADDR *argv)
537 {
538   struct frame_info *frame;
539
540   if (argc != 2)
541     error ("Sparc frame specifications require two arguments: fp and sp");
542
543   frame = create_new_frame (argv[0], 0);
544
545   if (!frame)
546     internal_error (__FILE__, __LINE__,
547                     "create_new_frame returned invalid frame");
548
549   get_frame_extra_info (frame)->bottom = argv[1];
550   deprecated_update_frame_pc_hack (frame, DEPRECATED_FRAME_SAVED_PC (frame));
551   return frame;
552 }
553
554 /* Given a pc value, skip it forward past the function prologue by
555    disassembling instructions that appear to be a prologue.
556
557    If FRAMELESS_P is set, we are only testing to see if the function
558    is frameless.  This allows a quicker answer.
559
560    This routine should be more specific in its actions; making sure
561    that it uses the same register in the initial prologue section.  */
562
563 static CORE_ADDR examine_prologue (CORE_ADDR, int, struct frame_info *,
564                                    CORE_ADDR *);
565
566 static CORE_ADDR
567 examine_prologue (CORE_ADDR start_pc, int frameless_p, struct frame_info *fi,
568                   CORE_ADDR *saved_regs)
569 {
570   int insn;
571   int dest = -1;
572   CORE_ADDR pc = start_pc;
573   int is_flat = 0;
574
575   insn = fetch_instruction (pc);
576
577   /* Recognize the `sethi' insn and record its destination.  */
578   if (X_OP (insn) == 0 && X_OP2 (insn) == 4)
579     {
580       dest = X_RD (insn);
581       pc += 4;
582       insn = fetch_instruction (pc);
583     }
584
585   /* Recognize an add immediate value to register to either %g1 or
586      the destination register recorded above.  Actually, this might
587      well recognize several different arithmetic operations.
588      It doesn't check that rs1 == rd because in theory "sub %g0, 5, %g1"
589      followed by "save %sp, %g1, %sp" is a valid prologue (Not that
590      I imagine any compiler really does that, however).  */
591   if (X_OP (insn) == 2
592       && X_I (insn)
593       && (X_RD (insn) == 1 || X_RD (insn) == dest))
594     {
595       pc += 4;
596       insn = fetch_instruction (pc);
597     }
598
599   /* Recognize any SAVE insn.  */
600   if (X_OP (insn) == 2 && X_OP3 (insn) == 60)
601     {
602       pc += 4;
603       if (frameless_p)          /* If the save is all we care about, */
604         return pc;              /* return before doing more work */
605       insn = fetch_instruction (pc);
606     }
607   /* Recognize add to %sp.  */
608   else if (X_OP (insn) == 2 && X_RD (insn) == 14 && X_OP3 (insn) == 0)
609     {
610       pc += 4;
611       if (frameless_p)          /* If the add is all we care about, */
612         return pc;              /* return before doing more work */
613       is_flat = 1;
614       insn = fetch_instruction (pc);
615       /* Recognize store of frame pointer (i7).  */
616       if (X_OP (insn) == 3
617           && X_RD (insn) == 31
618           && X_OP3 (insn) == 4
619           && X_RS1 (insn) == 14)
620         {
621           pc += 4;
622           insn = fetch_instruction (pc);
623
624           /* Recognize sub %sp, <anything>, %i7.  */
625           if (X_OP (insn) == 2
626               && X_OP3 (insn) == 4
627               && X_RS1 (insn) == 14
628               && X_RD (insn) == 31)
629             {
630               pc += 4;
631               insn = fetch_instruction (pc);
632             }
633           else
634             return pc;
635         }
636       else
637         return pc;
638     }
639   else
640     /* Without a save or add instruction, it's not a prologue.  */
641     return start_pc;
642
643   while (1)
644     {
645       /* Recognize stores into the frame from the input registers.
646          This recognizes all non alternate stores of an input register,
647          into a location offset from the frame pointer between
648          +68 and +92.  */
649
650       /* The above will fail for arguments that are promoted 
651          (eg. shorts to ints or floats to doubles), because the compiler
652          will pass them in positive-offset frame space, but the prologue
653          will save them (after conversion) in negative frame space at an
654          unpredictable offset.  Therefore I am going to remove the 
655          restriction on the target-address of the save, on the theory
656          that any unbroken sequence of saves from input registers must
657          be part of the prologue.  In un-optimized code (at least), I'm
658          fairly sure that the compiler would emit SOME other instruction
659          (eg. a move or add) before emitting another save that is actually
660          a part of the function body.
661
662          Besides, the reserved stack space is different for SPARC64 anyway.
663
664          MVS  4/23/2000  */
665
666       if (X_OP (insn) == 3
667           && (X_OP3 (insn) & 0x3c)       == 4   /* Store, non-alternate.  */
668           && (X_RD (insn) & 0x18) == 0x18       /* Input register.  */
669           && X_I (insn)                         /* Immediate mode.  */
670           && X_RS1 (insn) == 30)                /* Off of frame pointer.  */
671         ; /* empty statement -- fall thru to end of loop */
672       else if (GDB_TARGET_IS_SPARC64
673                && X_OP (insn) == 3
674                && (X_OP3 (insn) & 0x3c) == 12   /* store, extended (64-bit) */
675                && (X_RD (insn) & 0x18) == 0x18  /* input register */
676                && X_I (insn)                    /* immediate mode */
677                && X_RS1 (insn) == 30)           /* off of frame pointer */
678         ; /* empty statement -- fall thru to end of loop */
679       else if (X_OP (insn) == 3
680                && (X_OP3 (insn) & 0x3c) == 36   /* store, floating-point */
681                && X_I (insn)                    /* immediate mode */
682                && X_RS1 (insn) == 30)           /* off of frame pointer */
683         ; /* empty statement -- fall thru to end of loop */
684       else if (is_flat
685                && X_OP (insn) == 3
686                && X_OP3 (insn) == 4             /* store? */
687                && X_RS1 (insn) == 14)           /* off of frame pointer */
688         {
689           if (saved_regs && X_I (insn))
690             saved_regs[X_RD (insn)] =
691               get_frame_base (fi) + get_frame_extra_info (fi)->sp_offset + X_SIMM13 (insn);
692         }
693       else
694         break;
695       pc += 4;
696       insn = fetch_instruction (pc);
697     }
698
699   return pc;
700 }
701
702 /* Advance PC across any function entry prologue instructions to reach
703    some "real" code.  */
704
705 CORE_ADDR
706 sparc_skip_prologue (CORE_ADDR start_pc)
707 {
708   struct symtab_and_line sal;
709   CORE_ADDR func_start, func_end;
710
711   /* This is the preferred method, find the end of the prologue by
712      using the debugging information.  */
713   if (find_pc_partial_function (start_pc, NULL, &func_start, &func_end))
714     {
715       sal = find_pc_line (func_start, 0);
716
717       if (sal.end < func_end
718           && start_pc <= sal.end)
719         return sal.end;
720     }
721
722   /* Oh well, examine the code by hand.  */
723   return examine_prologue (start_pc, 0, NULL, NULL);
724 }
725
726 /* Is the prologue at IP frameless?  */
727
728 int
729 sparc_prologue_frameless_p (CORE_ADDR ip)
730 {
731   return ip == examine_prologue (ip, 1, NULL, NULL);
732 }
733
734 /* Check instruction at ADDR to see if it is a branch.
735    All non-annulled instructions will go to NPC or will trap.
736    Set *TARGET if we find a candidate branch; set to zero if not.
737
738    This isn't static as it's used by remote-sa.sparc.c.  */
739
740 static branch_type
741 isbranch (long instruction, CORE_ADDR addr, CORE_ADDR *target)
742 {
743   branch_type val = not_branch;
744   long int offset = 0;          /* Must be signed for sign-extend.  */
745
746   *target = 0;
747
748   if (X_OP (instruction) == 0
749       && (X_OP2 (instruction) == 2
750           || X_OP2 (instruction) == 6
751           || X_OP2 (instruction) == 1
752           || X_OP2 (instruction) == 3
753           || X_OP2 (instruction) == 5
754           || (GDB_TARGET_IS_SPARC64 && X_OP2 (instruction) == 7)))
755     {
756       if (X_COND (instruction) == 8)
757         val = X_A (instruction) ? baa : ba;
758       else
759         val = X_A (instruction) ? bicca : bicc;
760       switch (X_OP2 (instruction))
761         {
762         case 7:
763         if (!GDB_TARGET_IS_SPARC64)
764           break;
765         /* else fall thru */
766         case 2:
767         case 6:
768           offset = 4 * X_DISP22 (instruction);
769           break;
770         case 1:
771         case 5:
772           offset = 4 * X_DISP19 (instruction);
773           break;
774         case 3:
775           offset = 4 * X_DISP16 (instruction);
776           break;
777         }
778       *target = addr + offset;
779     }
780   else if (GDB_TARGET_IS_SPARC64
781            && X_OP (instruction) == 2
782            && X_OP3 (instruction) == 62)
783     {
784       if (X_FCN (instruction) == 0)
785         {
786           /* done */
787           *target = read_register (TNPC_REGNUM);
788           val = done_retry;
789         }
790       else if (X_FCN (instruction) == 1)
791         {
792           /* retry */
793           *target = read_register (TPC_REGNUM);
794           val = done_retry;
795         }
796     }
797
798   return val;
799 }
800 \f
801 /* Find register number REGNUM relative to FRAME and put its
802    (raw) contents in *RAW_BUFFER.  Set *OPTIMIZED if the variable
803    was optimized out (and thus can't be fetched).  If the variable
804    was fetched from memory, set *ADDRP to where it was fetched from,
805    otherwise it was fetched from a register.
806
807    The argument RAW_BUFFER must point to aligned memory.  */
808
809 void
810 sparc_get_saved_register (char *raw_buffer, int *optimized, CORE_ADDR *addrp,
811                           struct frame_info *frame, int regnum,
812                           enum lval_type *lval)
813 {
814   struct frame_info *frame1;
815   CORE_ADDR addr;
816
817   if (!target_has_registers)
818     error ("No registers.");
819
820   if (optimized)
821     *optimized = 0;
822
823   addr = 0;
824
825   /* FIXME This code extracted from infcmd.c; should put elsewhere! */
826   if (frame == NULL)
827     {
828       /* error ("No selected frame."); */
829       if (!target_has_registers)
830         error ("The program has no registers now.");
831       if (deprecated_selected_frame == NULL)
832         error ("No selected frame.");
833       /* Try to use selected frame */
834       frame = get_prev_frame (deprecated_selected_frame);
835       if (frame == 0)
836         error ("Cmd not meaningful in the outermost frame.");
837     }
838
839
840   frame1 = get_next_frame (frame);
841
842   /* Get saved PC from the frame info if not in innermost frame.  */
843   if (regnum == PC_REGNUM && frame1 != NULL)
844     {
845       if (lval != NULL)
846         *lval = not_lval;
847       if (raw_buffer != NULL)
848         {
849           /* Put it back in target format.  */
850           store_address (raw_buffer, REGISTER_RAW_SIZE (regnum), get_frame_pc (frame));
851         }
852       if (addrp != NULL)
853         *addrp = 0;
854       return;
855     }
856
857   while (frame1 != NULL)
858     {
859       /* FIXME MVS: wrong test for dummy frame at entry.  */
860
861       if (get_frame_pc (frame1) >= (get_frame_extra_info (frame1)->bottom
862                                     ? get_frame_extra_info (frame1)->bottom
863                                     : read_sp ())
864           && get_frame_pc (frame1) <= get_frame_base (frame1))
865         {
866           /* Dummy frame.  All but the window regs are in there somewhere.
867              The window registers are saved on the stack, just like in a
868              normal frame.  */
869           if (regnum >= G1_REGNUM && regnum < G1_REGNUM + 7)
870             addr = get_frame_base (frame1) + (regnum - G0_REGNUM) * SPARC_INTREG_SIZE
871               - (FP_REGISTER_BYTES + 8 * SPARC_INTREG_SIZE);
872           else if (regnum >= I0_REGNUM && regnum < I0_REGNUM + 8)
873             /* NOTE: cagney/2002-05-04: The call to get_prev_frame()
874                is safe/cheap - there will always be a prev frame.
875                This is because frame1 is initialized to frame->next
876                (frame1->prev == frame) and is then advanced towards
877                the innermost (next) frame.  */
878             addr = (get_frame_extra_info (get_prev_frame (frame1))->bottom
879                     + (regnum - I0_REGNUM) * SPARC_INTREG_SIZE
880                     + FRAME_SAVED_I0);
881           else if (regnum >= L0_REGNUM && regnum < L0_REGNUM + 8)
882             /* NOTE: cagney/2002-05-04: The call to get_prev_frame()
883                is safe/cheap - there will always be a prev frame.
884                This is because frame1 is initialized to frame->next
885                (frame1->prev == frame) and is then advanced towards
886                the innermost (next) frame.  */
887             addr = (get_frame_extra_info (get_prev_frame (frame1))->bottom
888                     + (regnum - L0_REGNUM) * SPARC_INTREG_SIZE
889                     + FRAME_SAVED_L0);
890           else if (regnum >= O0_REGNUM && regnum < O0_REGNUM + 8)
891             addr = get_frame_base (frame1) + (regnum - O0_REGNUM) * SPARC_INTREG_SIZE
892               - (FP_REGISTER_BYTES + 16 * SPARC_INTREG_SIZE);
893           else if (SPARC_HAS_FPU &&
894                    regnum >= FP0_REGNUM && regnum < FP0_REGNUM + 32)
895             addr = get_frame_base (frame1) + (regnum - FP0_REGNUM) * 4
896               - (FP_REGISTER_BYTES);
897           else if (GDB_TARGET_IS_SPARC64 && SPARC_HAS_FPU && 
898                    regnum >= FP0_REGNUM + 32 && regnum < FP_MAX_REGNUM)
899             addr = get_frame_base (frame1) + 32 * 4 + (regnum - FP0_REGNUM - 32) * 8
900               - (FP_REGISTER_BYTES);
901           else if (regnum >= Y_REGNUM && regnum < NUM_REGS)
902             addr = get_frame_base (frame1) + (regnum - Y_REGNUM) * SPARC_INTREG_SIZE
903               - (FP_REGISTER_BYTES + 24 * SPARC_INTREG_SIZE);
904         }
905       else if (get_frame_extra_info (frame1)->flat)
906         {
907
908           if (regnum == RP_REGNUM)
909             addr = get_frame_extra_info (frame1)->pc_addr;
910           else if (regnum == I7_REGNUM)
911             addr = get_frame_extra_info (frame1)->fp_addr;
912           else
913             {
914               CORE_ADDR func_start;
915               CORE_ADDR *regs;
916
917               regs = alloca (NUM_REGS * sizeof (CORE_ADDR)); 
918               memset (regs, 0, NUM_REGS * sizeof (CORE_ADDR));
919
920               find_pc_partial_function (get_frame_pc (frame1), NULL, &func_start, NULL);
921               examine_prologue (func_start, 0, frame1, regs);
922               addr = regs[regnum];
923             }
924         }
925       else
926         {
927           /* Normal frame.  Local and In registers are saved on stack.  */
928           if (regnum >= I0_REGNUM && regnum < I0_REGNUM + 8)
929             addr = (get_frame_extra_info (get_prev_frame (frame1))->bottom
930                     + (regnum - I0_REGNUM) * SPARC_INTREG_SIZE
931                     + FRAME_SAVED_I0);
932           else if (regnum >= L0_REGNUM && regnum < L0_REGNUM + 8)
933             addr = (get_frame_extra_info (get_prev_frame (frame1))->bottom
934                     + (regnum - L0_REGNUM) * SPARC_INTREG_SIZE
935                     + FRAME_SAVED_L0);
936           else if (regnum >= O0_REGNUM && regnum < O0_REGNUM + 8)
937             {
938               /* Outs become ins.  */
939               get_saved_register (raw_buffer, optimized, addrp, frame1,
940                                   (regnum - O0_REGNUM + I0_REGNUM), lval);
941               return;
942             }
943         }
944       if (addr != 0)
945         break;
946       frame1 = get_next_frame (frame1);
947     }
948   if (addr != 0)
949     {
950       if (lval != NULL)
951         *lval = lval_memory;
952       if (regnum == SP_REGNUM)
953         {
954           if (raw_buffer != NULL)
955             {
956               /* Put it back in target format.  */
957               store_address (raw_buffer, REGISTER_RAW_SIZE (regnum), addr);
958             }
959           if (addrp != NULL)
960             *addrp = 0;
961           return;
962         }
963       if (raw_buffer != NULL)
964         read_memory (addr, raw_buffer, REGISTER_RAW_SIZE (regnum));
965     }
966   else
967     {
968       if (lval != NULL)
969         *lval = lval_register;
970       addr = REGISTER_BYTE (regnum);
971       if (raw_buffer != NULL)
972         deprecated_read_register_gen (regnum, raw_buffer);
973     }
974   if (addrp != NULL)
975     *addrp = addr;
976 }
977
978 /* Push an empty stack frame, and record in it the current PC, regs, etc.
979
980    We save the non-windowed registers and the ins.  The locals and outs
981    are new; they don't need to be saved. The i's and l's of
982    the last frame were already saved on the stack.  */
983
984 /* Definitely see tm-sparc.h for more doc of the frame format here.  */
985
986 /* See tm-sparc.h for how this is calculated.  */
987
988 #define DUMMY_STACK_REG_BUF_SIZE \
989      (((8+8+8) * SPARC_INTREG_SIZE) + FP_REGISTER_BYTES)
990 #define DUMMY_STACK_SIZE \
991      (DUMMY_STACK_REG_BUF_SIZE + DUMMY_REG_SAVE_OFFSET)
992
993 void
994 sparc_push_dummy_frame (void)
995 {
996   CORE_ADDR sp, old_sp;
997   char *register_temp;
998
999   register_temp = alloca (DUMMY_STACK_SIZE);
1000
1001   old_sp = sp = read_sp ();
1002
1003   if (GDB_TARGET_IS_SPARC64)
1004     {
1005       /* PC, NPC, CCR, FSR, FPRS, Y, ASI */
1006       deprecated_read_register_bytes (REGISTER_BYTE (PC_REGNUM),
1007                                       &register_temp[0],
1008                                       REGISTER_RAW_SIZE (PC_REGNUM) * 7);
1009       deprecated_read_register_bytes (REGISTER_BYTE (PSTATE_REGNUM), 
1010                                       &register_temp[7 * SPARC_INTREG_SIZE],
1011                                       REGISTER_RAW_SIZE (PSTATE_REGNUM));
1012       /* FIXME: not sure what needs to be saved here.  */
1013     }
1014   else
1015     {
1016       /* Y, PS, WIM, TBR, PC, NPC, FPS, CPS regs */
1017       deprecated_read_register_bytes (REGISTER_BYTE (Y_REGNUM),
1018                                       &register_temp[0],
1019                                       REGISTER_RAW_SIZE (Y_REGNUM) * 8);
1020     }
1021
1022   deprecated_read_register_bytes (REGISTER_BYTE (O0_REGNUM),
1023                                   &register_temp[8 * SPARC_INTREG_SIZE],
1024                                   SPARC_INTREG_SIZE * 8);
1025
1026   deprecated_read_register_bytes (REGISTER_BYTE (G0_REGNUM),
1027                                   &register_temp[16 * SPARC_INTREG_SIZE],
1028                                   SPARC_INTREG_SIZE * 8);
1029
1030   if (SPARC_HAS_FPU)
1031     deprecated_read_register_bytes (REGISTER_BYTE (FP0_REGNUM),
1032                                     &register_temp[24 * SPARC_INTREG_SIZE],
1033                                     FP_REGISTER_BYTES);
1034
1035   sp -= DUMMY_STACK_SIZE;
1036
1037   write_sp (sp);
1038
1039   write_memory (sp + DUMMY_REG_SAVE_OFFSET, &register_temp[0],
1040                 DUMMY_STACK_REG_BUF_SIZE);
1041
1042   if (strcmp (target_shortname, "sim") != 0)
1043     {
1044       /* NOTE: cagney/2002-04-04: The code below originally contained
1045          GDB's _only_ call to write_fp().  That call was eliminated by
1046          inlining the corresponding code.  For the 64 bit case, the
1047          old function (sparc64_write_fp) did the below although I'm
1048          not clear why.  The same goes for why this is only done when
1049          the underlying target is a simulator.  */
1050       if (GDB_TARGET_IS_SPARC64)
1051         {
1052           /* Target is a 64 bit SPARC.  */
1053           CORE_ADDR oldfp = read_register (FP_REGNUM);
1054           if (oldfp & 1)
1055             write_register (FP_REGNUM, old_sp - 2047);
1056           else
1057             write_register (FP_REGNUM, old_sp);
1058         }
1059       else
1060         {
1061           /* Target is a 32 bit SPARC.  */
1062           write_register (FP_REGNUM, old_sp);
1063         }
1064       /* Set return address register for the call dummy to the current PC.  */
1065       write_register (I7_REGNUM, read_pc () - 8);
1066     }
1067   else
1068     {
1069       /* The call dummy will write this value to FP before executing
1070          the 'save'.  This ensures that register window flushes work
1071          correctly in the simulator.  */
1072       write_register (G0_REGNUM + 1, read_register (FP_REGNUM));
1073
1074       /* The call dummy will write this value to FP after executing
1075          the 'save'. */
1076       write_register (G0_REGNUM + 2, old_sp);
1077
1078       /* The call dummy will write this value to the return address (%i7) after
1079          executing the 'save'. */
1080       write_register (G0_REGNUM + 3, read_pc () - 8);
1081
1082       /* Set the FP that the call dummy will be using after the 'save'.
1083          This makes backtraces from an inferior function call work properly.  */
1084       write_register (FP_REGNUM, old_sp);
1085     }
1086 }
1087
1088 /* sparc_frame_find_saved_regs ().  This function is here only because
1089    pop_frame uses it.  Note there is an interesting corner case which
1090    I think few ports of GDB get right--if you are popping a frame
1091    which does not save some register that *is* saved by a more inner
1092    frame (such a frame will never be a dummy frame because dummy
1093    frames save all registers).  Rewriting pop_frame to use
1094    get_saved_register would solve this problem and also get rid of the
1095    ugly duplication between sparc_frame_find_saved_regs and
1096    get_saved_register.
1097
1098    Stores, into an array of CORE_ADDR, 
1099    the addresses of the saved registers of frame described by FRAME_INFO.
1100    This includes special registers such as pc and fp saved in special
1101    ways in the stack frame.  sp is even more special:
1102    the address we return for it IS the sp for the next frame.
1103
1104    Note that on register window machines, we are currently making the
1105    assumption that window registers are being saved somewhere in the
1106    frame in which they are being used.  If they are stored in an
1107    inferior frame, find_saved_register will break.
1108
1109    On the Sun 4, the only time all registers are saved is when
1110    a dummy frame is involved.  Otherwise, the only saved registers
1111    are the LOCAL and IN registers which are saved as a result
1112    of the "save/restore" opcodes.  This condition is determined
1113    by address rather than by value.
1114
1115    The "pc" is not stored in a frame on the SPARC.  (What is stored
1116    is a return address minus 8.)  sparc_pop_frame knows how to
1117    deal with that.  Other routines might or might not.
1118
1119    See tm-sparc.h (PUSH_DUMMY_FRAME and friends) for CRITICAL information
1120    about how this works.  */
1121
1122 static void sparc_frame_find_saved_regs (struct frame_info *, CORE_ADDR *);
1123
1124 static void
1125 sparc_frame_find_saved_regs (struct frame_info *fi, CORE_ADDR *saved_regs_addr)
1126 {
1127   register int regnum;
1128   CORE_ADDR frame_addr = get_frame_base (fi);
1129
1130   if (!fi)
1131     internal_error (__FILE__, __LINE__,
1132                     "Bad frame info struct in FRAME_FIND_SAVED_REGS");
1133
1134   memset (saved_regs_addr, 0, NUM_REGS * sizeof (CORE_ADDR));
1135
1136   if (get_frame_pc (fi) >= (get_frame_extra_info (fi)->bottom
1137                             ? get_frame_extra_info (fi)->bottom
1138                             : read_sp ())
1139       && get_frame_pc (fi) <= get_frame_base (fi))
1140     {
1141       /* Dummy frame.  All but the window regs are in there somewhere. */
1142       for (regnum = G1_REGNUM; regnum < G1_REGNUM + 7; regnum++)
1143         saved_regs_addr[regnum] =
1144           frame_addr + (regnum - G0_REGNUM) * SPARC_INTREG_SIZE
1145           - DUMMY_STACK_REG_BUF_SIZE + 16 * SPARC_INTREG_SIZE;
1146
1147       for (regnum = I0_REGNUM; regnum < I0_REGNUM + 8; regnum++)
1148         saved_regs_addr[regnum] =
1149           frame_addr + (regnum - I0_REGNUM) * SPARC_INTREG_SIZE
1150           - DUMMY_STACK_REG_BUF_SIZE + 8 * SPARC_INTREG_SIZE;
1151
1152       if (SPARC_HAS_FPU)
1153         for (regnum = FP0_REGNUM; regnum < FP_MAX_REGNUM; regnum++)
1154           saved_regs_addr[regnum] = frame_addr + (regnum - FP0_REGNUM) * 4
1155             - DUMMY_STACK_REG_BUF_SIZE + 24 * SPARC_INTREG_SIZE;
1156
1157       if (GDB_TARGET_IS_SPARC64)
1158         {
1159           for (regnum = PC_REGNUM; regnum < PC_REGNUM + 7; regnum++)
1160             {
1161               saved_regs_addr[regnum] =
1162                 frame_addr + (regnum - PC_REGNUM) * SPARC_INTREG_SIZE
1163                 - DUMMY_STACK_REG_BUF_SIZE;
1164             }
1165           saved_regs_addr[PSTATE_REGNUM] =
1166             frame_addr + 8 * SPARC_INTREG_SIZE - DUMMY_STACK_REG_BUF_SIZE;
1167         }
1168       else
1169         for (regnum = Y_REGNUM; regnum < NUM_REGS; regnum++)
1170           saved_regs_addr[regnum] =
1171             frame_addr + (regnum - Y_REGNUM) * SPARC_INTREG_SIZE
1172             - DUMMY_STACK_REG_BUF_SIZE;
1173
1174       frame_addr = (get_frame_extra_info (fi)->bottom
1175                     ? get_frame_extra_info (fi)->bottom
1176                     : read_sp ());
1177     }
1178   else if (get_frame_extra_info (fi)->flat)
1179     {
1180       CORE_ADDR func_start;
1181       find_pc_partial_function (get_frame_pc (fi), NULL, &func_start, NULL);
1182       examine_prologue (func_start, 0, fi, saved_regs_addr);
1183
1184       /* Flat register window frame.  */
1185       saved_regs_addr[RP_REGNUM] = get_frame_extra_info (fi)->pc_addr;
1186       saved_regs_addr[I7_REGNUM] = get_frame_extra_info (fi)->fp_addr;
1187     }
1188   else
1189     {
1190       /* Normal frame.  Just Local and In registers */
1191       frame_addr = (get_frame_extra_info (fi)->bottom
1192                     ? get_frame_extra_info (fi)->bottom
1193                     : read_sp ());
1194       for (regnum = L0_REGNUM; regnum < L0_REGNUM + 8; regnum++)
1195         saved_regs_addr[regnum] =
1196           (frame_addr + (regnum - L0_REGNUM) * SPARC_INTREG_SIZE
1197            + FRAME_SAVED_L0);
1198       for (regnum = I0_REGNUM; regnum < I0_REGNUM + 8; regnum++)
1199         saved_regs_addr[regnum] =
1200           (frame_addr + (regnum - I0_REGNUM) * SPARC_INTREG_SIZE
1201            + FRAME_SAVED_I0);
1202     }
1203   if (get_next_frame (fi))
1204     {
1205       if (get_frame_extra_info (fi)->flat)
1206         {
1207           saved_regs_addr[O7_REGNUM] = get_frame_extra_info (fi)->pc_addr;
1208         }
1209       else
1210         {
1211           /* Pull off either the next frame pointer or the stack pointer */
1212           CORE_ADDR next_next_frame_addr =
1213           (get_frame_extra_info (get_next_frame (fi))->bottom
1214            ? get_frame_extra_info (get_next_frame (fi))->bottom
1215            : read_sp ());
1216           for (regnum = O0_REGNUM; regnum < O0_REGNUM + 8; regnum++)
1217             saved_regs_addr[regnum] =
1218               (next_next_frame_addr
1219                + (regnum - O0_REGNUM) * SPARC_INTREG_SIZE
1220                + FRAME_SAVED_I0);
1221         }
1222     }
1223   /* Otherwise, whatever we would get from ptrace(GETREGS) is accurate */
1224   /* FIXME -- should this adjust for the sparc64 offset? */
1225   saved_regs_addr[SP_REGNUM] = get_frame_base (fi);
1226 }
1227
1228 /* Discard from the stack the innermost frame, restoring all saved registers.
1229
1230    Note that the values stored in fsr by
1231    deprecated_get_frame_saved_regs are *in the context of the called
1232    frame*.  What this means is that the i regs of fsr must be restored
1233    into the o regs of the (calling) frame that we pop into.  We don't
1234    care about the output regs of the calling frame, since unless it's
1235    a dummy frame, it won't have any output regs in it.
1236
1237    We never have to bother with %l (local) regs, since the called routine's
1238    locals get tossed, and the calling routine's locals are already saved
1239    on its stack.  */
1240
1241 /* Definitely see tm-sparc.h for more doc of the frame format here.  */
1242
1243 void
1244 sparc_pop_frame (void)
1245 {
1246   register struct frame_info *frame = get_current_frame ();
1247   register CORE_ADDR pc;
1248   CORE_ADDR *fsr;
1249   char *raw_buffer;
1250   int regnum;
1251
1252   fsr = alloca (NUM_REGS * sizeof (CORE_ADDR));
1253   raw_buffer = alloca (REGISTER_BYTES);
1254   sparc_frame_find_saved_regs (frame, &fsr[0]);
1255   if (SPARC_HAS_FPU)
1256     {
1257       if (fsr[FP0_REGNUM])
1258         {
1259           read_memory (fsr[FP0_REGNUM], raw_buffer, FP_REGISTER_BYTES);
1260           deprecated_write_register_bytes (REGISTER_BYTE (FP0_REGNUM),
1261                                            raw_buffer, FP_REGISTER_BYTES);
1262         }
1263       if (!(GDB_TARGET_IS_SPARC64))
1264         {
1265           if (fsr[FPS_REGNUM])
1266             {
1267               read_memory (fsr[FPS_REGNUM], raw_buffer, SPARC_INTREG_SIZE);
1268               deprecated_write_register_gen (FPS_REGNUM, raw_buffer);
1269             }
1270           if (fsr[CPS_REGNUM])
1271             {
1272               read_memory (fsr[CPS_REGNUM], raw_buffer, SPARC_INTREG_SIZE);
1273               deprecated_write_register_gen (CPS_REGNUM, raw_buffer);
1274             }
1275         }
1276     }
1277   if (fsr[G1_REGNUM])
1278     {
1279       read_memory (fsr[G1_REGNUM], raw_buffer, 7 * SPARC_INTREG_SIZE);
1280       deprecated_write_register_bytes (REGISTER_BYTE (G1_REGNUM), raw_buffer,
1281                                        7 * SPARC_INTREG_SIZE);
1282     }
1283
1284   if (get_frame_extra_info (frame)->flat)
1285     {
1286       /* Each register might or might not have been saved, need to test
1287          individually.  */
1288       for (regnum = L0_REGNUM; regnum < L0_REGNUM + 8; ++regnum)
1289         if (fsr[regnum])
1290           write_register (regnum, read_memory_integer (fsr[regnum],
1291                                                        SPARC_INTREG_SIZE));
1292       for (regnum = I0_REGNUM; regnum < I0_REGNUM + 8; ++regnum)
1293         if (fsr[regnum])
1294           write_register (regnum, read_memory_integer (fsr[regnum],
1295                                                        SPARC_INTREG_SIZE));
1296
1297       /* Handle all outs except stack pointer (o0-o5; o7).  */
1298       for (regnum = O0_REGNUM; regnum < O0_REGNUM + 6; ++regnum)
1299         if (fsr[regnum])
1300           write_register (regnum, read_memory_integer (fsr[regnum],
1301                                                        SPARC_INTREG_SIZE));
1302       if (fsr[O0_REGNUM + 7])
1303         write_register (O0_REGNUM + 7,
1304                         read_memory_integer (fsr[O0_REGNUM + 7],
1305                                              SPARC_INTREG_SIZE));
1306
1307       write_sp (get_frame_base (frame));
1308     }
1309   else if (fsr[I0_REGNUM])
1310     {
1311       CORE_ADDR sp;
1312
1313       char *reg_temp;
1314
1315       reg_temp = alloca (SPARC_INTREG_SIZE * 16);
1316
1317       read_memory (fsr[I0_REGNUM], raw_buffer, 8 * SPARC_INTREG_SIZE);
1318
1319       /* Get the ins and locals which we are about to restore.  Just
1320          moving the stack pointer is all that is really needed, except
1321          store_inferior_registers is then going to write the ins and
1322          locals from the registers array, so we need to muck with the
1323          registers array.  */
1324       sp = fsr[SP_REGNUM];
1325  
1326       if (GDB_TARGET_IS_SPARC64 && (sp & 1))
1327         sp += 2047;
1328
1329       read_memory (sp, reg_temp, SPARC_INTREG_SIZE * 16);
1330
1331       /* Restore the out registers.
1332          Among other things this writes the new stack pointer.  */
1333       deprecated_write_register_bytes (REGISTER_BYTE (O0_REGNUM), raw_buffer,
1334                                        SPARC_INTREG_SIZE * 8);
1335
1336       deprecated_write_register_bytes (REGISTER_BYTE (L0_REGNUM), reg_temp,
1337                                        SPARC_INTREG_SIZE * 16);
1338     }
1339
1340   if (!(GDB_TARGET_IS_SPARC64))
1341     if (fsr[PS_REGNUM])
1342       write_register (PS_REGNUM, 
1343                       read_memory_integer (fsr[PS_REGNUM], 
1344                                            REGISTER_RAW_SIZE (PS_REGNUM)));
1345
1346   if (fsr[Y_REGNUM])
1347     write_register (Y_REGNUM, 
1348                     read_memory_integer (fsr[Y_REGNUM], 
1349                                          REGISTER_RAW_SIZE (Y_REGNUM)));
1350   if (fsr[PC_REGNUM])
1351     {
1352       /* Explicitly specified PC (and maybe NPC) -- just restore them. */
1353       write_register (PC_REGNUM, 
1354                       read_memory_integer (fsr[PC_REGNUM],
1355                                            REGISTER_RAW_SIZE (PC_REGNUM)));
1356       if (fsr[NPC_REGNUM])
1357         write_register (NPC_REGNUM,
1358                         read_memory_integer (fsr[NPC_REGNUM],
1359                                              REGISTER_RAW_SIZE (NPC_REGNUM)));
1360     }
1361   else if (get_frame_extra_info (frame)->flat)
1362     {
1363       if (get_frame_extra_info (frame)->pc_addr)
1364         pc = PC_ADJUST ((CORE_ADDR)
1365                         read_memory_integer (get_frame_extra_info (frame)->pc_addr,
1366                                              REGISTER_RAW_SIZE (PC_REGNUM)));
1367       else
1368         {
1369           /* I think this happens only in the innermost frame, if so then
1370              it is a complicated way of saying
1371              "pc = read_register (O7_REGNUM);".  */
1372           char *buf;
1373
1374           buf = alloca (MAX_REGISTER_RAW_SIZE);
1375           get_saved_register (buf, 0, 0, frame, O7_REGNUM, 0);
1376           pc = PC_ADJUST (extract_address
1377                           (buf, REGISTER_RAW_SIZE (O7_REGNUM)));
1378         }
1379
1380       write_register (PC_REGNUM, pc);
1381       write_register (NPC_REGNUM, pc + 4);
1382     }
1383   else if (fsr[I7_REGNUM])
1384     {
1385       /* Return address in %i7 -- adjust it, then restore PC and NPC from it */
1386       pc = PC_ADJUST ((CORE_ADDR) read_memory_integer (fsr[I7_REGNUM],
1387                                                        SPARC_INTREG_SIZE));
1388       write_register (PC_REGNUM, pc);
1389       write_register (NPC_REGNUM, pc + 4);
1390     }
1391   flush_cached_frames ();
1392 }
1393
1394 /* On the Sun 4 under SunOS, the compile will leave a fake insn which
1395    encodes the structure size being returned.  If we detect such
1396    a fake insn, step past it.  */
1397
1398 CORE_ADDR
1399 sparc_pc_adjust (CORE_ADDR pc)
1400 {
1401   unsigned long insn;
1402   char buf[4];
1403   int err;
1404
1405   err = target_read_memory (pc + 8, buf, 4);
1406   insn = extract_unsigned_integer (buf, 4);
1407   if ((err == 0) && (insn & 0xffc00000) == 0)
1408     return pc + 12;
1409   else
1410     return pc + 8;
1411 }
1412
1413 /* If pc is in a shared library trampoline, return its target.
1414    The SunOs 4.x linker rewrites the jump table entries for PIC
1415    compiled modules in the main executable to bypass the dynamic linker
1416    with jumps of the form
1417    sethi %hi(addr),%g1
1418    jmp %g1+%lo(addr)
1419    and removes the corresponding jump table relocation entry in the
1420    dynamic relocations.
1421    find_solib_trampoline_target relies on the presence of the jump
1422    table relocation entry, so we have to detect these jump instructions
1423    by hand.  */
1424
1425 CORE_ADDR
1426 sunos4_skip_trampoline_code (CORE_ADDR pc)
1427 {
1428   unsigned long insn1;
1429   char buf[4];
1430   int err;
1431
1432   err = target_read_memory (pc, buf, 4);
1433   insn1 = extract_unsigned_integer (buf, 4);
1434   if (err == 0 && (insn1 & 0xffc00000) == 0x03000000)
1435     {
1436       unsigned long insn2;
1437
1438       err = target_read_memory (pc + 4, buf, 4);
1439       insn2 = extract_unsigned_integer (buf, 4);
1440       if (err == 0 && (insn2 & 0xffffe000) == 0x81c06000)
1441         {
1442           CORE_ADDR target_pc = (insn1 & 0x3fffff) << 10;
1443           int delta = insn2 & 0x1fff;
1444
1445           /* Sign extend the displacement.  */
1446           if (delta & 0x1000)
1447             delta |= ~0x1fff;
1448           return target_pc + delta;
1449         }
1450     }
1451   return find_solib_trampoline_target (pc);
1452 }
1453 \f
1454 #ifdef USE_PROC_FS              /* Target dependent support for /proc */
1455 /* *INDENT-OFF* */
1456 /*  The /proc interface divides the target machine's register set up into
1457     two different sets, the general register set (gregset) and the floating
1458     point register set (fpregset).  For each set, there is an ioctl to get
1459     the current register set and another ioctl to set the current values.
1460
1461     The actual structure passed through the ioctl interface is, of course,
1462     naturally machine dependent, and is different for each set of registers.
1463     For the sparc for example, the general register set is typically defined
1464     by:
1465
1466         typedef int gregset_t[38];
1467
1468         #define R_G0    0
1469         ...
1470         #define R_TBR   37
1471
1472     and the floating point set by:
1473
1474         typedef struct prfpregset {
1475                 union { 
1476                         u_long  pr_regs[32]; 
1477                         double  pr_dregs[16];
1478                 } pr_fr;
1479                 void *  pr_filler;
1480                 u_long  pr_fsr;
1481                 u_char  pr_qcnt;
1482                 u_char  pr_q_entrysize;
1483                 u_char  pr_en;
1484                 u_long  pr_q[64];
1485         } prfpregset_t;
1486
1487     These routines provide the packing and unpacking of gregset_t and
1488     fpregset_t formatted data.
1489
1490  */
1491 /* *INDENT-ON* */
1492
1493 /* Given a pointer to a general register set in /proc format (gregset_t *),
1494    unpack the register contents and supply them as gdb's idea of the current
1495    register values. */
1496
1497 void
1498 supply_gregset (gdb_gregset_t *gregsetp)
1499 {
1500   prgreg_t *regp = (prgreg_t *) gregsetp;
1501   int regi, offset = 0;
1502
1503   /* If the host is 64-bit sparc, but the target is 32-bit sparc, 
1504      then the gregset may contain 64-bit ints while supply_register
1505      is expecting 32-bit ints.  Compensate.  */
1506   if (sizeof (regp[0]) == 8 && SPARC_INTREG_SIZE == 4)
1507     offset = 4;
1508
1509   /* GDB register numbers for Gn, On, Ln, In all match /proc reg numbers.  */
1510   /* FIXME MVS: assumes the order of the first 32 elements... */
1511   for (regi = G0_REGNUM; regi <= I7_REGNUM; regi++)
1512     {
1513       supply_register (regi, ((char *) (regp + regi)) + offset);
1514     }
1515
1516   /* These require a bit more care.  */
1517   supply_register (PC_REGNUM, ((char *) (regp + R_PC)) + offset);
1518   supply_register (NPC_REGNUM, ((char *) (regp + R_nPC)) + offset);
1519   supply_register (Y_REGNUM, ((char *) (regp + R_Y)) + offset);
1520
1521   if (GDB_TARGET_IS_SPARC64)
1522     {
1523 #ifdef R_CCR
1524       supply_register (CCR_REGNUM, ((char *) (regp + R_CCR)) + offset);
1525 #else
1526       supply_register (CCR_REGNUM, NULL);
1527 #endif
1528 #ifdef R_FPRS
1529       supply_register (FPRS_REGNUM, ((char *) (regp + R_FPRS)) + offset);
1530 #else
1531       supply_register (FPRS_REGNUM, NULL);
1532 #endif
1533 #ifdef R_ASI
1534       supply_register (ASI_REGNUM, ((char *) (regp + R_ASI)) + offset);
1535 #else
1536       supply_register (ASI_REGNUM, NULL);
1537 #endif
1538     }
1539   else  /* sparc32 */
1540     {
1541 #ifdef R_PS
1542       supply_register (PS_REGNUM, ((char *) (regp + R_PS)) + offset);
1543 #else
1544       supply_register (PS_REGNUM, NULL);
1545 #endif
1546
1547       /* For 64-bit hosts, R_WIM and R_TBR may not be defined.
1548          Steal R_ASI and R_FPRS, and hope for the best!  */
1549
1550 #if !defined (R_WIM) && defined (R_ASI)
1551 #define R_WIM R_ASI
1552 #endif
1553
1554 #if !defined (R_TBR) && defined (R_FPRS)
1555 #define R_TBR R_FPRS
1556 #endif
1557
1558 #if defined (R_WIM)
1559       supply_register (WIM_REGNUM, ((char *) (regp + R_WIM)) + offset);
1560 #else
1561       supply_register (WIM_REGNUM, NULL);
1562 #endif
1563
1564 #if defined (R_TBR)
1565       supply_register (TBR_REGNUM, ((char *) (regp + R_TBR)) + offset);
1566 #else
1567       supply_register (TBR_REGNUM, NULL);
1568 #endif
1569     }
1570
1571   /* Fill inaccessible registers with zero.  */
1572   if (GDB_TARGET_IS_SPARC64)
1573     {
1574       /*
1575        * don't know how to get value of any of the following:
1576        */
1577       supply_register (VER_REGNUM, NULL);
1578       supply_register (TICK_REGNUM, NULL);
1579       supply_register (PIL_REGNUM, NULL);
1580       supply_register (PSTATE_REGNUM, NULL);
1581       supply_register (TSTATE_REGNUM, NULL);
1582       supply_register (TBA_REGNUM, NULL);
1583       supply_register (TL_REGNUM, NULL);
1584       supply_register (TT_REGNUM, NULL);
1585       supply_register (TPC_REGNUM, NULL);
1586       supply_register (TNPC_REGNUM, NULL);
1587       supply_register (WSTATE_REGNUM, NULL);
1588       supply_register (CWP_REGNUM, NULL);
1589       supply_register (CANSAVE_REGNUM, NULL);
1590       supply_register (CANRESTORE_REGNUM, NULL);
1591       supply_register (CLEANWIN_REGNUM, NULL);
1592       supply_register (OTHERWIN_REGNUM, NULL);
1593       supply_register (ASR16_REGNUM, NULL);
1594       supply_register (ASR17_REGNUM, NULL);
1595       supply_register (ASR18_REGNUM, NULL);
1596       supply_register (ASR19_REGNUM, NULL);
1597       supply_register (ASR20_REGNUM, NULL);
1598       supply_register (ASR21_REGNUM, NULL);
1599       supply_register (ASR22_REGNUM, NULL);
1600       supply_register (ASR23_REGNUM, NULL);
1601       supply_register (ASR24_REGNUM, NULL);
1602       supply_register (ASR25_REGNUM, NULL);
1603       supply_register (ASR26_REGNUM, NULL);
1604       supply_register (ASR27_REGNUM, NULL);
1605       supply_register (ASR28_REGNUM, NULL);
1606       supply_register (ASR29_REGNUM, NULL);
1607       supply_register (ASR30_REGNUM, NULL);
1608       supply_register (ASR31_REGNUM, NULL);
1609       supply_register (ICC_REGNUM, NULL);
1610       supply_register (XCC_REGNUM, NULL);
1611     }
1612   else
1613     {
1614       supply_register (CPS_REGNUM, NULL);
1615     }
1616 }
1617
1618 void
1619 fill_gregset (gdb_gregset_t *gregsetp, int regno)
1620 {
1621   prgreg_t *regp = (prgreg_t *) gregsetp;
1622   int regi, offset = 0;
1623
1624   /* If the host is 64-bit sparc, but the target is 32-bit sparc, 
1625      then the gregset may contain 64-bit ints while supply_register
1626      is expecting 32-bit ints.  Compensate.  */
1627   if (sizeof (regp[0]) == 8 && SPARC_INTREG_SIZE == 4)
1628     offset = 4;
1629
1630   for (regi = 0; regi <= R_I7; regi++)
1631     if ((regno == -1) || (regno == regi))
1632       deprecated_read_register_gen (regi, (char *) (regp + regi) + offset);
1633
1634   if ((regno == -1) || (regno == PC_REGNUM))
1635     deprecated_read_register_gen (PC_REGNUM, (char *) (regp + R_PC) + offset);
1636
1637   if ((regno == -1) || (regno == NPC_REGNUM))
1638     deprecated_read_register_gen (NPC_REGNUM, (char *) (regp + R_nPC) + offset);
1639
1640   if ((regno == -1) || (regno == Y_REGNUM))
1641     deprecated_read_register_gen (Y_REGNUM, (char *) (regp + R_Y) + offset);
1642
1643   if (GDB_TARGET_IS_SPARC64)
1644     {
1645 #ifdef R_CCR
1646       if (regno == -1 || regno == CCR_REGNUM)
1647         deprecated_read_register_gen (CCR_REGNUM, ((char *) (regp + R_CCR)) + offset);
1648 #endif
1649 #ifdef R_FPRS
1650       if (regno == -1 || regno == FPRS_REGNUM)
1651         deprecated_read_register_gen (FPRS_REGNUM, ((char *) (regp + R_FPRS)) + offset);
1652 #endif
1653 #ifdef R_ASI
1654       if (regno == -1 || regno == ASI_REGNUM)
1655         deprecated_read_register_gen (ASI_REGNUM, ((char *) (regp + R_ASI)) + offset);
1656 #endif
1657     }
1658   else /* sparc32 */
1659     {
1660 #ifdef R_PS
1661       if (regno == -1 || regno == PS_REGNUM)
1662         deprecated_read_register_gen (PS_REGNUM, ((char *) (regp + R_PS)) + offset);
1663 #endif
1664
1665       /* For 64-bit hosts, R_WIM and R_TBR may not be defined.
1666          Steal R_ASI and R_FPRS, and hope for the best!  */
1667
1668 #if !defined (R_WIM) && defined (R_ASI)
1669 #define R_WIM R_ASI
1670 #endif
1671
1672 #if !defined (R_TBR) && defined (R_FPRS)
1673 #define R_TBR R_FPRS
1674 #endif
1675
1676 #if defined (R_WIM)
1677       if (regno == -1 || regno == WIM_REGNUM)
1678         deprecated_read_register_gen (WIM_REGNUM, ((char *) (regp + R_WIM)) + offset);
1679 #else
1680       if (regno == -1 || regno == WIM_REGNUM)
1681         deprecated_read_register_gen (WIM_REGNUM, NULL);
1682 #endif
1683
1684 #if defined (R_TBR)
1685       if (regno == -1 || regno == TBR_REGNUM)
1686         deprecated_read_register_gen (TBR_REGNUM, ((char *) (regp + R_TBR)) + offset);
1687 #else
1688       if (regno == -1 || regno == TBR_REGNUM)
1689         deprecated_read_register_gen (TBR_REGNUM, NULL);
1690 #endif
1691     }
1692 }
1693
1694 /*  Given a pointer to a floating point register set in /proc format
1695    (fpregset_t *), unpack the register contents and supply them as gdb's
1696    idea of the current floating point register values. */
1697
1698 void
1699 supply_fpregset (gdb_fpregset_t *fpregsetp)
1700 {
1701   register int regi;
1702   char *from;
1703
1704   if (!SPARC_HAS_FPU)
1705     return;
1706
1707   for (regi = FP0_REGNUM; regi < FP_MAX_REGNUM; regi++)
1708     {
1709       from = (char *) &fpregsetp->pr_fr.pr_regs[regi - FP0_REGNUM];
1710       supply_register (regi, from);
1711     }
1712
1713   if (GDB_TARGET_IS_SPARC64)
1714     {
1715       /*
1716        * don't know how to get value of the following.  
1717        */
1718       supply_register (FSR_REGNUM, NULL);       /* zero it out for now */
1719       supply_register (FCC0_REGNUM, NULL);
1720       supply_register (FCC1_REGNUM, NULL); /* don't know how to get value */
1721       supply_register (FCC2_REGNUM, NULL); /* don't know how to get value */
1722       supply_register (FCC3_REGNUM, NULL); /* don't know how to get value */
1723     }
1724   else
1725     {
1726       supply_register (FPS_REGNUM, (char *) &(fpregsetp->pr_fsr));
1727     }
1728 }
1729
1730 /*  Given a pointer to a floating point register set in /proc format
1731    (fpregset_t *), update the register specified by REGNO from gdb's idea
1732    of the current floating point register set.  If REGNO is -1, update
1733    them all. */
1734 /* This will probably need some changes for sparc64.  */
1735
1736 void
1737 fill_fpregset (gdb_fpregset_t *fpregsetp, int regno)
1738 {
1739   int regi;
1740   char *to;
1741   char *from;
1742
1743   if (!SPARC_HAS_FPU)
1744     return;
1745
1746   for (regi = FP0_REGNUM; regi < FP_MAX_REGNUM; regi++)
1747     {
1748       if ((regno == -1) || (regno == regi))
1749         {
1750           from = (char *) &deprecated_registers[REGISTER_BYTE (regi)];
1751           to = (char *) &fpregsetp->pr_fr.pr_regs[regi - FP0_REGNUM];
1752           memcpy (to, from, REGISTER_RAW_SIZE (regi));
1753         }
1754     }
1755
1756   if (!(GDB_TARGET_IS_SPARC64)) /* FIXME: does Sparc64 have this register? */
1757     if ((regno == -1) || (regno == FPS_REGNUM))
1758       {
1759         from = (char *)&deprecated_registers[REGISTER_BYTE (FPS_REGNUM)];
1760         to = (char *) &fpregsetp->pr_fsr;
1761         memcpy (to, from, REGISTER_RAW_SIZE (FPS_REGNUM));
1762       }
1763 }
1764
1765 #endif /* USE_PROC_FS */
1766
1767 /* Because of Multi-arch, GET_LONGJMP_TARGET is always defined.  So test
1768    for a definition of JB_PC.  */
1769 #ifdef JB_PC
1770
1771 /* Figure out where the longjmp will land.  We expect that we have just entered
1772    longjmp and haven't yet setup the stack frame, so the args are still in the
1773    output regs.  %o0 (O0_REGNUM) points at the jmp_buf structure from which we
1774    extract the pc (JB_PC) that we will land at.  The pc is copied into ADDR.
1775    This routine returns true on success */
1776
1777 int
1778 get_longjmp_target (CORE_ADDR *pc)
1779 {
1780   CORE_ADDR jb_addr;
1781 #define LONGJMP_TARGET_SIZE 4
1782   char buf[LONGJMP_TARGET_SIZE];
1783
1784   jb_addr = read_register (O0_REGNUM);
1785
1786   if (target_read_memory (jb_addr + JB_PC * JB_ELEMENT_SIZE, buf,
1787                           LONGJMP_TARGET_SIZE))
1788     return 0;
1789
1790   *pc = extract_address (buf, LONGJMP_TARGET_SIZE);
1791
1792   return 1;
1793 }
1794 #endif /* GET_LONGJMP_TARGET */
1795 \f
1796 #ifdef STATIC_TRANSFORM_NAME
1797 /* SunPRO (3.0 at least), encodes the static variables.  This is not
1798    related to C++ mangling, it is done for C too.  */
1799
1800 char *
1801 sunpro_static_transform_name (char *name)
1802 {
1803   char *p;
1804   if (name[0] == '$')
1805     {
1806       /* For file-local statics there will be a dollar sign, a bunch
1807          of junk (the contents of which match a string given in the
1808          N_OPT), a period and the name.  For function-local statics
1809          there will be a bunch of junk (which seems to change the
1810          second character from 'A' to 'B'), a period, the name of the
1811          function, and the name.  So just skip everything before the
1812          last period.  */
1813       p = strrchr (name, '.');
1814       if (p != NULL)
1815         name = p + 1;
1816     }
1817   return name;
1818 }
1819 #endif /* STATIC_TRANSFORM_NAME */
1820 \f
1821
1822 /* Utilities for printing registers.
1823    Page numbers refer to the SPARC Architecture Manual.  */
1824
1825 static void dump_ccreg (char *, int);
1826
1827 static void
1828 dump_ccreg (char *reg, int val)
1829 {
1830   /* page 41 */
1831   printf_unfiltered ("%s:%s,%s,%s,%s", reg,
1832                      val & 8 ? "N" : "NN",
1833                      val & 4 ? "Z" : "NZ",
1834                      val & 2 ? "O" : "NO",
1835                      val & 1 ? "C" : "NC");
1836 }
1837
1838 static char *
1839 decode_asi (int val)
1840 {
1841   /* page 72 */
1842   switch (val)
1843     {
1844     case 4:
1845       return "ASI_NUCLEUS";
1846     case 0x0c:
1847       return "ASI_NUCLEUS_LITTLE";
1848     case 0x10:
1849       return "ASI_AS_IF_USER_PRIMARY";
1850     case 0x11:
1851       return "ASI_AS_IF_USER_SECONDARY";
1852     case 0x18:
1853       return "ASI_AS_IF_USER_PRIMARY_LITTLE";
1854     case 0x19:
1855       return "ASI_AS_IF_USER_SECONDARY_LITTLE";
1856     case 0x80:
1857       return "ASI_PRIMARY";
1858     case 0x81:
1859       return "ASI_SECONDARY";
1860     case 0x82:
1861       return "ASI_PRIMARY_NOFAULT";
1862     case 0x83:
1863       return "ASI_SECONDARY_NOFAULT";
1864     case 0x88:
1865       return "ASI_PRIMARY_LITTLE";
1866     case 0x89:
1867       return "ASI_SECONDARY_LITTLE";
1868     case 0x8a:
1869       return "ASI_PRIMARY_NOFAULT_LITTLE";
1870     case 0x8b:
1871       return "ASI_SECONDARY_NOFAULT_LITTLE";
1872     default:
1873       return NULL;
1874     }
1875 }
1876
1877 /* Pretty print various registers.  */
1878 /* FIXME: Would be nice if this did some fancy things for 32 bit sparc.  */
1879
1880 static void
1881 sparc_print_register_hook (int regno)
1882 {
1883   ULONGEST val;
1884
1885   /* Handle double/quad versions of lower 32 fp regs.  */
1886   if (regno >= FP0_REGNUM && regno < FP0_REGNUM + 32
1887       && (regno & 1) == 0)
1888     {
1889       char value[16];
1890
1891       if (frame_register_read (deprecated_selected_frame, regno, value)
1892           && frame_register_read (deprecated_selected_frame, regno + 1, value + 4))
1893         {
1894           printf_unfiltered ("\t");
1895           print_floating (value, builtin_type_double, gdb_stdout);
1896         }
1897 #if 0                           /* FIXME: gdb doesn't handle long doubles */
1898       if ((regno & 3) == 0)
1899         {
1900           if (frame_register_read (deprecated_selected_frame, regno + 2, value + 8)
1901               && frame_register_read (deprecated_selected_frame, regno + 3, value + 12))
1902             {
1903               printf_unfiltered ("\t");
1904               print_floating (value, builtin_type_long_double, gdb_stdout);
1905             }
1906         }
1907 #endif
1908       return;
1909     }
1910
1911 #if 0                           /* FIXME: gdb doesn't handle long doubles */
1912   /* Print upper fp regs as long double if appropriate.  */
1913   if (regno >= FP0_REGNUM + 32 && regno < FP_MAX_REGNUM
1914   /* We test for even numbered regs and not a multiple of 4 because
1915      the upper fp regs are recorded as doubles.  */
1916       && (regno & 1) == 0)
1917     {
1918       char value[16];
1919
1920       if (frame_register_read (deprecated_selected_frame, regno, value)
1921           && frame_register_read (deprecated_selected_frame, regno + 1, value + 8))
1922         {
1923           printf_unfiltered ("\t");
1924           print_floating (value, builtin_type_long_double, gdb_stdout);
1925         }
1926       return;
1927     }
1928 #endif
1929
1930   /* FIXME: Some of these are priviledged registers.
1931      Not sure how they should be handled.  */
1932
1933 #define BITS(n, mask) ((int) (((val) >> (n)) & (mask)))
1934
1935   val = read_register (regno);
1936
1937   /* pages 40 - 60 */
1938   if (GDB_TARGET_IS_SPARC64)
1939     switch (regno)
1940       {
1941       case CCR_REGNUM:
1942         printf_unfiltered ("\t");
1943         dump_ccreg ("xcc", val >> 4);
1944         printf_unfiltered (", ");
1945         dump_ccreg ("icc", val & 15);
1946         break;
1947       case FPRS_REGNUM:
1948         printf ("\tfef:%d, du:%d, dl:%d",
1949                 BITS (2, 1), BITS (1, 1), BITS (0, 1));
1950         break;
1951       case FSR_REGNUM:
1952         {
1953           static char *fcc[4] =
1954           {"=", "<", ">", "?"};
1955           static char *rd[4] =
1956           {"N", "0", "+", "-"};
1957           /* Long, but I'd rather leave it as is and use a wide screen.  */
1958           printf_filtered ("\t0:%s, 1:%s, 2:%s, 3:%s, rd:%s, tem:%d, ",
1959                            fcc[BITS (10, 3)], fcc[BITS (32, 3)],
1960                            fcc[BITS (34, 3)], fcc[BITS (36, 3)],
1961                            rd[BITS (30, 3)], BITS (23, 31));
1962           printf_filtered ("ns:%d, ver:%d, ftt:%d, qne:%d, aexc:%d, cexc:%d",
1963                            BITS (22, 1), BITS (17, 7), BITS (14, 7), 
1964                            BITS (13, 1), BITS (5, 31), BITS (0, 31));
1965           break;
1966         }
1967       case ASI_REGNUM:
1968         {
1969           char *asi = decode_asi (val);
1970           if (asi != NULL)
1971             printf ("\t%s", asi);
1972           break;
1973         }
1974       case VER_REGNUM:
1975         printf ("\tmanuf:%d, impl:%d, mask:%d, maxtl:%d, maxwin:%d",
1976                 BITS (48, 0xffff), BITS (32, 0xffff),
1977                 BITS (24, 0xff), BITS (8, 0xff), BITS (0, 31));
1978         break;
1979       case PSTATE_REGNUM:
1980         {
1981           static char *mm[4] =
1982           {"tso", "pso", "rso", "?"};
1983           printf_filtered ("\tcle:%d, tle:%d, mm:%s, red:%d, ",
1984                            BITS (9, 1), BITS (8, 1), 
1985                            mm[BITS (6, 3)], BITS (5, 1));
1986           printf_filtered ("pef:%d, am:%d, priv:%d, ie:%d, ag:%d",
1987                            BITS (4, 1), BITS (3, 1), BITS (2, 1), 
1988                            BITS (1, 1), BITS (0, 1));
1989           break;
1990         }
1991       case TSTATE_REGNUM:
1992         /* FIXME: print all 4? */
1993         break;
1994       case TT_REGNUM:
1995         /* FIXME: print all 4? */
1996         break;
1997       case TPC_REGNUM:
1998         /* FIXME: print all 4? */
1999         break;
2000       case TNPC_REGNUM:
2001         /* FIXME: print all 4? */
2002         break;
2003       case WSTATE_REGNUM:
2004         printf ("\tother:%d, normal:%d", BITS (3, 7), BITS (0, 7));
2005         break;
2006       case CWP_REGNUM:
2007         printf ("\t%d", BITS (0, 31));
2008         break;
2009       case CANSAVE_REGNUM:
2010         printf ("\t%-2d before spill", BITS (0, 31));
2011         break;
2012       case CANRESTORE_REGNUM:
2013         printf ("\t%-2d before fill", BITS (0, 31));
2014         break;
2015       case CLEANWIN_REGNUM:
2016         printf ("\t%-2d before clean", BITS (0, 31));
2017         break;
2018       case OTHERWIN_REGNUM:
2019         printf ("\t%d", BITS (0, 31));
2020         break;
2021       }
2022   else  /* Sparc32 */
2023     switch (regno) 
2024       {
2025       case PS_REGNUM:
2026         printf ("\ticc:%c%c%c%c, pil:%d, s:%d, ps:%d, et:%d, cwp:%d",
2027                 BITS (23, 1) ? 'N' : '-', BITS (22, 1) ? 'Z' : '-',
2028                 BITS (21, 1) ? 'V' : '-', BITS (20, 1) ? 'C' : '-',
2029                 BITS (8, 15), BITS (7, 1), BITS (6, 1), BITS (5, 1),
2030                 BITS (0, 31));
2031         break;
2032       case FPS_REGNUM:
2033         {
2034           static char *fcc[4] =
2035           {"=", "<", ">", "?"};
2036           static char *rd[4] =
2037           {"N", "0", "+", "-"};
2038           /* Long, but I'd rather leave it as is and use a wide screen.  */
2039           printf ("\trd:%s, tem:%d, ns:%d, ver:%d, ftt:%d, qne:%d, "
2040                   "fcc:%s, aexc:%d, cexc:%d",
2041                   rd[BITS (30, 3)], BITS (23, 31), BITS (22, 1), BITS (17, 7),
2042                   BITS (14, 7), BITS (13, 1), fcc[BITS (10, 3)], BITS (5, 31),
2043                   BITS (0, 31));
2044           break;
2045         }
2046       }
2047
2048 #undef BITS
2049 }
2050
2051 static void
2052 sparc_print_registers (struct gdbarch *gdbarch,
2053                        struct ui_file *file,
2054                        struct frame_info *frame,
2055                        int regnum, int print_all,
2056                        void (*print_register_hook) (int))
2057 {
2058   int i;
2059   const int numregs = NUM_REGS + NUM_PSEUDO_REGS;
2060   char *raw_buffer = alloca (MAX_REGISTER_RAW_SIZE);
2061   char *virtual_buffer = alloca (MAX_REGISTER_VIRTUAL_SIZE);
2062
2063   for (i = 0; i < numregs; i++)
2064     {
2065       /* Decide between printing all regs, non-float / vector regs, or
2066          specific reg.  */
2067       if (regnum == -1)
2068         {
2069           if (!print_all)
2070             {
2071               if (TYPE_CODE (REGISTER_VIRTUAL_TYPE (i)) == TYPE_CODE_FLT)
2072                 continue;
2073               if (TYPE_VECTOR (REGISTER_VIRTUAL_TYPE (i)))
2074                 continue;
2075             }
2076         }
2077       else
2078         {
2079           if (i != regnum)
2080             continue;
2081         }
2082
2083       /* If the register name is empty, it is undefined for this
2084          processor, so don't display anything.  */
2085       if (REGISTER_NAME (i) == NULL || *(REGISTER_NAME (i)) == '\0')
2086         continue;
2087
2088       fputs_filtered (REGISTER_NAME (i), file);
2089       print_spaces_filtered (15 - strlen (REGISTER_NAME (i)), file);
2090
2091       /* Get the data in raw format.  */
2092       if (! frame_register_read (frame, i, raw_buffer))
2093         {
2094           fprintf_filtered (file, "*value not available*\n");
2095           continue;
2096         }
2097
2098       /* FIXME: cagney/2002-08-03: This code shouldn't be necessary.
2099          The function frame_register_read() should have returned the
2100          pre-cooked register so no conversion is necessary.  */
2101       /* Convert raw data to virtual format if necessary.  */
2102       if (REGISTER_CONVERTIBLE (i))
2103         {
2104           REGISTER_CONVERT_TO_VIRTUAL (i, REGISTER_VIRTUAL_TYPE (i),
2105                                        raw_buffer, virtual_buffer);
2106         }
2107       else
2108         {
2109           memcpy (virtual_buffer, raw_buffer,
2110                   REGISTER_VIRTUAL_SIZE (i));
2111         }
2112
2113       /* If virtual format is floating, print it that way, and in raw
2114          hex.  */
2115       if (TYPE_CODE (REGISTER_VIRTUAL_TYPE (i)) == TYPE_CODE_FLT)
2116         {
2117           int j;
2118
2119           val_print (REGISTER_VIRTUAL_TYPE (i), virtual_buffer, 0, 0,
2120                      file, 0, 1, 0, Val_pretty_default);
2121
2122           fprintf_filtered (file, "\t(raw 0x");
2123           for (j = 0; j < REGISTER_RAW_SIZE (i); j++)
2124             {
2125               int idx;
2126               if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
2127                 idx = j;
2128               else
2129                 idx = REGISTER_RAW_SIZE (i) - 1 - j;
2130               fprintf_filtered (file, "%02x", (unsigned char) raw_buffer[idx]);
2131             }
2132           fprintf_filtered (file, ")");
2133         }
2134       else
2135         {
2136           /* Print the register in hex.  */
2137           val_print (REGISTER_VIRTUAL_TYPE (i), virtual_buffer, 0, 0,
2138                      file, 'x', 1, 0, Val_pretty_default);
2139           /* If not a vector register, print it also according to its
2140              natural format.  */
2141           if (TYPE_VECTOR (REGISTER_VIRTUAL_TYPE (i)) == 0)
2142             {
2143               fprintf_filtered (file, "\t");
2144               val_print (REGISTER_VIRTUAL_TYPE (i), virtual_buffer, 0, 0,
2145                          file, 0, 1, 0, Val_pretty_default);
2146             }
2147         }
2148
2149       /* Some sparc specific info.  */
2150       if (print_register_hook != NULL)
2151         print_register_hook (i);
2152
2153       fprintf_filtered (file, "\n");
2154     }
2155 }
2156
2157 static void
2158 sparc_print_registers_info (struct gdbarch *gdbarch,
2159                             struct ui_file *file,
2160                             struct frame_info *frame,
2161                             int regnum, int print_all)
2162 {
2163   sparc_print_registers (gdbarch, file, frame, regnum, print_all,
2164                          sparc_print_register_hook);
2165 }
2166
2167 void
2168 sparc_do_registers_info (int regnum, int all)
2169 {
2170   sparc_print_registers_info (current_gdbarch, gdb_stdout, deprecated_selected_frame,
2171                               regnum, all);
2172 }
2173
2174 static void
2175 sparclet_print_registers_info (struct gdbarch *gdbarch,
2176                                struct ui_file *file,
2177                                struct frame_info *frame,
2178                                int regnum, int print_all)
2179 {
2180   sparc_print_registers (gdbarch, file, frame, regnum, print_all, NULL);
2181 }
2182
2183 void
2184 sparclet_do_registers_info (int regnum, int all)
2185 {
2186   sparclet_print_registers_info (current_gdbarch, gdb_stdout,
2187                                  deprecated_selected_frame, regnum, all);
2188 }
2189
2190 \f
2191 int
2192 gdb_print_insn_sparc (bfd_vma memaddr, disassemble_info *info)
2193 {
2194   /* It's necessary to override mach again because print_insn messes it up. */
2195   info->mach = TARGET_ARCHITECTURE->mach;
2196   return print_insn_sparc (memaddr, info);
2197 }
2198 \f
2199 /* The SPARC passes the arguments on the stack; arguments smaller
2200    than an int are promoted to an int.  The first 6 words worth of 
2201    args are also passed in registers o0 - o5.  */
2202
2203 CORE_ADDR
2204 sparc32_push_arguments (int nargs, struct value **args, CORE_ADDR sp,
2205                         int struct_return, CORE_ADDR struct_addr)
2206 {
2207   int i, j, oregnum;
2208   int accumulate_size = 0;
2209   struct sparc_arg
2210     {
2211       char *contents;
2212       int len;
2213       int offset;
2214     };
2215   struct sparc_arg *sparc_args =
2216     (struct sparc_arg *) alloca (nargs * sizeof (struct sparc_arg));
2217   struct sparc_arg *m_arg;
2218
2219   /* Promote arguments if necessary, and calculate their stack offsets
2220      and sizes. */
2221   for (i = 0, m_arg = sparc_args; i < nargs; i++, m_arg++)
2222     {
2223       struct value *arg = args[i];
2224       struct type *arg_type = check_typedef (VALUE_TYPE (arg));
2225       /* Cast argument to long if necessary as the compiler does it too.  */
2226       switch (TYPE_CODE (arg_type))
2227         {
2228         case TYPE_CODE_INT:
2229         case TYPE_CODE_BOOL:
2230         case TYPE_CODE_CHAR:
2231         case TYPE_CODE_RANGE:
2232         case TYPE_CODE_ENUM:
2233           if (TYPE_LENGTH (arg_type) < TYPE_LENGTH (builtin_type_long))
2234             {
2235               arg_type = builtin_type_long;
2236               arg = value_cast (arg_type, arg);
2237             }
2238           break;
2239         default:
2240           break;
2241         }
2242       m_arg->len = TYPE_LENGTH (arg_type);
2243       m_arg->offset = accumulate_size;
2244       accumulate_size = (accumulate_size + m_arg->len + 3) & ~3;
2245       m_arg->contents = VALUE_CONTENTS (arg);
2246     }
2247
2248   /* Make room for the arguments on the stack.  */
2249   accumulate_size += CALL_DUMMY_STACK_ADJUST;
2250   sp = ((sp - accumulate_size) & ~7) + CALL_DUMMY_STACK_ADJUST;
2251
2252   /* `Push' arguments on the stack.  */
2253   for (i = 0, oregnum = 0, m_arg = sparc_args; 
2254        i < nargs;
2255        i++, m_arg++)
2256     {
2257       write_memory (sp + m_arg->offset, m_arg->contents, m_arg->len);
2258       for (j = 0; 
2259            j < m_arg->len && oregnum < 6; 
2260            j += SPARC_INTREG_SIZE, oregnum++)
2261         deprecated_write_register_gen (O0_REGNUM + oregnum, m_arg->contents + j);
2262     }
2263
2264   return sp;
2265 }
2266
2267
2268 /* Extract from an array REGBUF containing the (raw) register state
2269    a function return value of type TYPE, and copy that, in virtual format,
2270    into VALBUF.  */
2271
2272 void
2273 sparc32_extract_return_value (struct type *type, char *regbuf, char *valbuf)
2274 {
2275   int typelen = TYPE_LENGTH (type);
2276   int regsize = REGISTER_RAW_SIZE (O0_REGNUM);
2277
2278   if (TYPE_CODE (type) == TYPE_CODE_FLT && SPARC_HAS_FPU)
2279     memcpy (valbuf, &regbuf[REGISTER_BYTE (FP0_REGNUM)], typelen);
2280   else
2281     memcpy (valbuf,
2282             &regbuf[O0_REGNUM * regsize +
2283                     (typelen >= regsize
2284                      || TARGET_BYTE_ORDER == BFD_ENDIAN_LITTLE ? 0
2285                      : regsize - typelen)],
2286             typelen);
2287 }
2288
2289
2290 /* Write into appropriate registers a function return value
2291    of type TYPE, given in virtual format.  On SPARCs with FPUs,
2292    float values are returned in %f0 (and %f1).  In all other cases,
2293    values are returned in register %o0.  */
2294
2295 void
2296 sparc_store_return_value (struct type *type, char *valbuf)
2297 {
2298   int regno;
2299   char *buffer;
2300
2301   buffer = alloca (MAX_REGISTER_RAW_SIZE);
2302
2303   if (TYPE_CODE (type) == TYPE_CODE_FLT && SPARC_HAS_FPU)
2304     /* Floating-point values are returned in the register pair */
2305     /* formed by %f0 and %f1 (doubles are, anyway).  */
2306     regno = FP0_REGNUM;
2307   else
2308     /* Other values are returned in register %o0.  */
2309     regno = O0_REGNUM;
2310
2311   /* Add leading zeros to the value. */
2312   if (TYPE_LENGTH (type) < REGISTER_RAW_SIZE (regno))
2313     {
2314       memset (buffer, 0, REGISTER_RAW_SIZE (regno));
2315       memcpy (buffer + REGISTER_RAW_SIZE (regno) - TYPE_LENGTH (type), valbuf,
2316               TYPE_LENGTH (type));
2317       deprecated_write_register_gen (regno, buffer);
2318     }
2319   else
2320     deprecated_write_register_bytes (REGISTER_BYTE (regno), valbuf,
2321                                      TYPE_LENGTH (type));
2322 }
2323
2324 extern void
2325 sparclet_store_return_value (struct type *type, char *valbuf)
2326 {
2327   /* Other values are returned in register %o0.  */
2328   deprecated_write_register_bytes (REGISTER_BYTE (O0_REGNUM), valbuf,
2329                                    TYPE_LENGTH (type));
2330 }
2331
2332
2333 #ifndef CALL_DUMMY_CALL_OFFSET
2334 #define CALL_DUMMY_CALL_OFFSET \
2335      (gdbarch_tdep (current_gdbarch)->call_dummy_call_offset)
2336 #endif /* CALL_DUMMY_CALL_OFFSET */
2337
2338 /* Insert the function address into a call dummy instruction sequence
2339    stored at DUMMY.
2340
2341    For structs and unions, if the function was compiled with Sun cc,
2342    it expects 'unimp' after the call.  But gcc doesn't use that
2343    (twisted) convention.  So leave a nop there for gcc (FIX_CALL_DUMMY
2344    can assume it is operating on a pristine CALL_DUMMY, not one that
2345    has already been customized for a different function).  */
2346
2347 void
2348 sparc_fix_call_dummy (char *dummy, CORE_ADDR pc, CORE_ADDR fun,
2349                       struct type *value_type, int using_gcc)
2350 {
2351   int i;
2352
2353   /* Store the relative adddress of the target function into the
2354      'call' instruction. */
2355   store_unsigned_integer (dummy + CALL_DUMMY_CALL_OFFSET, 4,
2356                           (0x40000000
2357                            | (((fun - (pc + CALL_DUMMY_CALL_OFFSET)) >> 2)
2358                               & 0x3fffffff)));
2359
2360   /* If the called function returns an aggregate value, fill in the UNIMP
2361      instruction containing the size of the returned aggregate return value,
2362      which follows the call instruction.
2363      For details see the SPARC Architecture Manual Version 8, Appendix D.3.
2364
2365      Adjust the call_dummy_breakpoint_offset for the bp_call_dummy breakpoint
2366      to the proper address in the call dummy, so that `finish' after a stop
2367      in a call dummy works.
2368      Tweeking current_gdbarch is not an optimal solution, but the call to
2369      sparc_fix_call_dummy is immediately followed by a call to run_stack_dummy,
2370      which is the only function where dummy_breakpoint_offset is actually
2371      used, if it is non-zero.  */
2372   if (TYPE_CODE (value_type) == TYPE_CODE_STRUCT
2373        || TYPE_CODE (value_type) == TYPE_CODE_UNION)
2374     {
2375       store_unsigned_integer (dummy + CALL_DUMMY_CALL_OFFSET + 8, 4,
2376                               TYPE_LENGTH (value_type) & 0x1fff);
2377       set_gdbarch_call_dummy_breakpoint_offset (current_gdbarch, 0x30);
2378     }
2379   else
2380     set_gdbarch_call_dummy_breakpoint_offset (current_gdbarch, 0x2c);
2381
2382   if (!(GDB_TARGET_IS_SPARC64))
2383     {
2384       /* If this is not a simulator target, change the first four
2385          instructions of the call dummy to NOPs.  Those instructions
2386          include a 'save' instruction and are designed to work around
2387          problems with register window flushing in the simulator. */
2388       
2389       if (strcmp (target_shortname, "sim") != 0)
2390         {
2391           for (i = 0; i < 4; i++)
2392             store_unsigned_integer (dummy + (i * 4), 4, 0x01000000);
2393         }
2394     }
2395
2396   /* If this is a bi-endian target, GDB has written the call dummy
2397      in little-endian order.  We must byte-swap it back to big-endian. */
2398   if (bi_endian)
2399     {
2400       for (i = 0; i < CALL_DUMMY_LENGTH; i += 4)
2401         {
2402           char tmp = dummy[i];
2403           dummy[i] = dummy[i + 3];
2404           dummy[i + 3] = tmp;
2405           tmp = dummy[i + 1];
2406           dummy[i + 1] = dummy[i + 2];
2407           dummy[i + 2] = tmp;
2408         }
2409     }
2410 }
2411
2412
2413 /* Set target byte order based on machine type. */
2414
2415 static int
2416 sparc_target_architecture_hook (const bfd_arch_info_type *ap)
2417 {
2418   int i, j;
2419
2420   if (ap->mach == bfd_mach_sparc_sparclite_le)
2421     {
2422       target_byte_order = BFD_ENDIAN_LITTLE;
2423       bi_endian = 1;
2424     }
2425   else
2426     bi_endian = 0;
2427   return 1;
2428 }
2429 \f
2430
2431 /*
2432  * Module "constructor" function. 
2433  */
2434
2435 static struct gdbarch * sparc_gdbarch_init (struct gdbarch_info info,
2436                                             struct gdbarch_list *arches);
2437 static void sparc_dump_tdep (struct gdbarch *, struct ui_file *);
2438
2439 void
2440 _initialize_sparc_tdep (void)
2441 {
2442   /* Hook us into the gdbarch mechanism.  */
2443   gdbarch_register (bfd_arch_sparc, sparc_gdbarch_init, sparc_dump_tdep);
2444
2445   tm_print_insn = gdb_print_insn_sparc;
2446   tm_print_insn_info.mach = TM_PRINT_INSN_MACH;         /* Selects sparc/sparclite */
2447   target_architecture_hook = sparc_target_architecture_hook;
2448 }
2449
2450 /* Compensate for stack bias. Note that we currently don't handle
2451    mixed 32/64 bit code. */
2452
2453 CORE_ADDR
2454 sparc64_read_sp (void)
2455 {
2456   CORE_ADDR sp = read_register (SP_REGNUM);
2457
2458   if (sp & 1)
2459     sp += 2047;
2460   return sp;
2461 }
2462
2463 CORE_ADDR
2464 sparc64_read_fp (void)
2465 {
2466   CORE_ADDR fp = read_register (FP_REGNUM);
2467
2468   if (fp & 1)
2469     fp += 2047;
2470   return fp;
2471 }
2472
2473 void
2474 sparc64_write_sp (CORE_ADDR val)
2475 {
2476   CORE_ADDR oldsp = read_register (SP_REGNUM);
2477   if (oldsp & 1)
2478     write_register (SP_REGNUM, val - 2047);
2479   else
2480     write_register (SP_REGNUM, val);
2481 }
2482
2483 /* The SPARC 64 ABI passes floating-point arguments in FP0 to FP31,
2484    and all other arguments in O0 to O5.  They are also copied onto
2485    the stack in the correct places.  Apparently (empirically), 
2486    structs of less than 16 bytes are passed member-by-member in
2487    separate registers, but I am unable to figure out the algorithm.
2488    Some members go in floating point regs, but I don't know which.
2489
2490    FIXME: Handle small structs (less than 16 bytes containing floats).
2491
2492    The counting regimen for using both integer and FP registers
2493    for argument passing is rather odd -- a single counter is used
2494    for both; this means that if the arguments alternate between
2495    int and float, we will waste every other register of both types.  */
2496
2497 CORE_ADDR
2498 sparc64_push_arguments (int nargs, struct value **args, CORE_ADDR sp,
2499                         int struct_return, CORE_ADDR struct_retaddr)
2500 {
2501   int i, j, register_counter = 0;
2502   CORE_ADDR tempsp;
2503   struct type *sparc_intreg_type = 
2504     TYPE_LENGTH (builtin_type_long) == SPARC_INTREG_SIZE ?
2505     builtin_type_long : builtin_type_long_long;
2506
2507   sp = (sp & ~(((unsigned long) SPARC_INTREG_SIZE) - 1UL));
2508
2509   /* Figure out how much space we'll need. */
2510   for (i = nargs - 1; i >= 0; i--)
2511     {
2512       int len = TYPE_LENGTH (check_typedef (VALUE_TYPE (args[i])));
2513       struct value *copyarg = args[i];
2514       int copylen = len;
2515
2516       if (copylen < SPARC_INTREG_SIZE)
2517         {
2518           copyarg = value_cast (sparc_intreg_type, copyarg);
2519           copylen = SPARC_INTREG_SIZE;
2520         }
2521       sp -= copylen;
2522     }
2523
2524   /* Round down. */
2525   sp = sp & ~7;
2526   tempsp = sp;
2527
2528   /* if STRUCT_RETURN, then first argument is the struct return location. */
2529   if (struct_return)
2530     write_register (O0_REGNUM + register_counter++, struct_retaddr);
2531
2532   /* Now write the arguments onto the stack, while writing FP
2533      arguments into the FP registers, and other arguments into the
2534      first six 'O' registers.  */
2535
2536   for (i = 0; i < nargs; i++)
2537     {
2538       int len = TYPE_LENGTH (check_typedef (VALUE_TYPE (args[i])));
2539       struct value *copyarg = args[i];
2540       enum type_code typecode = TYPE_CODE (VALUE_TYPE (args[i]));
2541       int copylen = len;
2542
2543       if (typecode == TYPE_CODE_INT   ||
2544           typecode == TYPE_CODE_BOOL  ||
2545           typecode == TYPE_CODE_CHAR  ||
2546           typecode == TYPE_CODE_RANGE ||
2547           typecode == TYPE_CODE_ENUM)
2548         if (len < SPARC_INTREG_SIZE)
2549           {
2550             /* Small ints will all take up the size of one intreg on
2551                the stack.  */
2552             copyarg = value_cast (sparc_intreg_type, copyarg);
2553             copylen = SPARC_INTREG_SIZE;
2554           }
2555
2556       write_memory (tempsp, VALUE_CONTENTS (copyarg), copylen);
2557       tempsp += copylen;
2558
2559       /* Corner case: Structs consisting of a single float member are floats.
2560        * FIXME!  I don't know about structs containing multiple floats!
2561        * Structs containing mixed floats and ints are even more weird.
2562        */
2563
2564
2565
2566       /* Separate float args from all other args.  */
2567       if (typecode == TYPE_CODE_FLT && SPARC_HAS_FPU)
2568         {
2569           if (register_counter < 16)
2570             {
2571               /* This arg gets copied into a FP register. */
2572               int fpreg;
2573
2574               switch (len) {
2575               case 4:   /* Single-precision (float) */
2576                 fpreg = FP0_REGNUM + 2 * register_counter + 1;
2577                 register_counter += 1;
2578                 break;
2579               case 8:   /* Double-precision (double) */
2580                 fpreg = FP0_REGNUM + 2 * register_counter;
2581                 register_counter += 1;
2582                 break;
2583               case 16:  /* Quad-precision (long double) */
2584                 fpreg = FP0_REGNUM + 2 * register_counter;
2585                 register_counter += 2;
2586                 break;
2587               default:
2588                 internal_error (__FILE__, __LINE__, "bad switch");
2589               }
2590               deprecated_write_register_bytes (REGISTER_BYTE (fpreg),
2591                                                VALUE_CONTENTS (args[i]),
2592                                                len);
2593             }
2594         }
2595       else /* all other args go into the first six 'o' registers */
2596         {
2597           for (j = 0; 
2598                j < len && register_counter < 6; 
2599                j += SPARC_INTREG_SIZE)
2600             {
2601               int oreg = O0_REGNUM + register_counter;
2602
2603               deprecated_write_register_gen (oreg, VALUE_CONTENTS (copyarg) + j);
2604               register_counter += 1;
2605             }
2606         }
2607     }
2608   return sp;
2609 }
2610
2611 /* Values <= 32 bytes are returned in o0-o3 (floating-point values are
2612    returned in f0-f3). */
2613
2614 void
2615 sp64_extract_return_value (struct type *type, char *regbuf, char *valbuf,
2616                            int bitoffset)
2617 {
2618   int typelen = TYPE_LENGTH (type);
2619   int regsize = REGISTER_RAW_SIZE (O0_REGNUM);
2620
2621   if (TYPE_CODE (type) == TYPE_CODE_FLT && SPARC_HAS_FPU)
2622     {
2623       memcpy (valbuf, &regbuf[REGISTER_BYTE (FP0_REGNUM)], typelen);
2624       return;
2625     }
2626
2627   if (TYPE_CODE (type) != TYPE_CODE_STRUCT
2628       || (TYPE_LENGTH (type) > 32))
2629     {
2630       memcpy (valbuf,
2631               &regbuf[O0_REGNUM * regsize +
2632                       (typelen >= regsize ? 0 : regsize - typelen)],
2633               typelen);
2634       return;
2635     }
2636   else
2637     {
2638       char *o0 = &regbuf[O0_REGNUM * regsize];
2639       char *f0 = &regbuf[FP0_REGNUM * regsize];
2640       int x;
2641
2642       for (x = 0; x < TYPE_NFIELDS (type); x++)
2643         {
2644           struct field *f = &TYPE_FIELDS (type)[x];
2645           /* FIXME: We may need to handle static fields here. */
2646           int whichreg = (f->loc.bitpos + bitoffset) / 32;
2647           int remainder = ((f->loc.bitpos + bitoffset) % 32) / 8;
2648           int where = (f->loc.bitpos + bitoffset) / 8;
2649           int size = TYPE_LENGTH (f->type);
2650           int typecode = TYPE_CODE (f->type);
2651
2652           if (typecode == TYPE_CODE_STRUCT)
2653             {
2654               sp64_extract_return_value (f->type,
2655                                          regbuf,
2656                                          valbuf,
2657                                          bitoffset + f->loc.bitpos);
2658             }
2659           else if (typecode == TYPE_CODE_FLT && SPARC_HAS_FPU)
2660             {
2661               memcpy (valbuf + where, &f0[whichreg * 4] + remainder, size);
2662             }
2663           else
2664             {
2665               memcpy (valbuf + where, &o0[whichreg * 4] + remainder, size);
2666             }
2667         }
2668     }
2669 }
2670
2671 extern void
2672 sparc64_extract_return_value (struct type *type, char *regbuf, char *valbuf)
2673 {
2674   sp64_extract_return_value (type, regbuf, valbuf, 0);
2675 }
2676
2677 extern void 
2678 sparclet_extract_return_value (struct type *type,
2679                                char *regbuf, 
2680                                char *valbuf)
2681 {
2682   regbuf += REGISTER_RAW_SIZE (O0_REGNUM) * 8;
2683   if (TYPE_LENGTH (type) < REGISTER_RAW_SIZE (O0_REGNUM))
2684     regbuf += REGISTER_RAW_SIZE (O0_REGNUM) - TYPE_LENGTH (type);
2685
2686   memcpy ((void *) valbuf, regbuf, TYPE_LENGTH (type));
2687 }
2688
2689
2690 extern CORE_ADDR
2691 sparc32_stack_align (CORE_ADDR addr)
2692 {
2693   return ((addr + 7) & -8);
2694 }
2695
2696 extern CORE_ADDR
2697 sparc64_stack_align (CORE_ADDR addr)
2698 {
2699   return ((addr + 15) & -16);
2700 }
2701
2702 extern void
2703 sparc_print_extra_frame_info (struct frame_info *fi)
2704 {
2705   if (fi && get_frame_extra_info (fi) && get_frame_extra_info (fi)->flat)
2706     printf_filtered (" flat, pc saved at 0x%s, fp saved at 0x%s\n",
2707                      paddr_nz (get_frame_extra_info (fi)->pc_addr), 
2708                      paddr_nz (get_frame_extra_info (fi)->fp_addr));
2709 }
2710
2711 /* MULTI_ARCH support */
2712
2713 static const char *
2714 sparc32_register_name (int regno)
2715 {
2716   static char *register_names[] = 
2717   { "g0", "g1", "g2", "g3", "g4", "g5", "g6", "g7",
2718     "o0", "o1", "o2", "o3", "o4", "o5", "sp", "o7",
2719     "l0", "l1", "l2", "l3", "l4", "l5", "l6", "l7",
2720     "i0", "i1", "i2", "i3", "i4", "i5", "fp", "i7",
2721
2722     "f0",  "f1",  "f2",  "f3",  "f4",  "f5",  "f6",  "f7",
2723     "f8",  "f9",  "f10", "f11", "f12", "f13", "f14", "f15",
2724     "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
2725     "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
2726
2727     "y", "psr", "wim", "tbr", "pc", "npc", "fpsr", "cpsr"
2728   };
2729
2730   if (regno < 0 ||
2731       regno >= (sizeof (register_names) / sizeof (register_names[0])))
2732     return NULL;
2733   else
2734     return register_names[regno];
2735 }
2736
2737 static const char *
2738 sparc64_register_name (int regno)
2739 {
2740   static char *register_names[] = 
2741   { "g0", "g1", "g2", "g3", "g4", "g5", "g6", "g7",
2742     "o0", "o1", "o2", "o3", "o4", "o5", "sp", "o7",
2743     "l0", "l1", "l2", "l3", "l4", "l5", "l6", "l7",
2744     "i0", "i1", "i2", "i3", "i4", "i5", "fp", "i7",
2745
2746     "f0",  "f1",  "f2",  "f3",  "f4",  "f5",  "f6",  "f7",
2747     "f8",  "f9",  "f10", "f11", "f12", "f13", "f14", "f15",
2748     "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
2749     "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
2750     "f32", "f34", "f36", "f38", "f40", "f42", "f44", "f46",
2751     "f48", "f50", "f52", "f54", "f56", "f58", "f60", "f62",
2752
2753     "pc", "npc", "ccr", "fsr", "fprs", "y", "asi", "ver", 
2754     "tick", "pil", "pstate", "tstate", "tba", "tl", "tt", "tpc", 
2755     "tnpc", "wstate", "cwp", "cansave", "canrestore", "cleanwin", "otherwin",
2756     "asr16", "asr17", "asr18", "asr19", "asr20", "asr21", "asr22", "asr23", 
2757     "asr24", "asr25", "asr26", "asr27", "asr28", "asr29", "asr30", "asr31",
2758     /* These are here at the end to simplify removing them if we have to.  */
2759     "icc", "xcc", "fcc0", "fcc1", "fcc2", "fcc3"
2760   };
2761
2762   if (regno < 0 ||
2763       regno >= (sizeof (register_names) / sizeof (register_names[0])))
2764     return NULL;
2765   else
2766     return register_names[regno];
2767 }
2768
2769 static const char *
2770 sparclite_register_name (int regno)
2771 {
2772   static char *register_names[] = 
2773   { "g0", "g1", "g2", "g3", "g4", "g5", "g6", "g7",
2774     "o0", "o1", "o2", "o3", "o4", "o5", "sp", "o7",
2775     "l0", "l1", "l2", "l3", "l4", "l5", "l6", "l7",
2776     "i0", "i1", "i2", "i3", "i4", "i5", "fp", "i7",
2777
2778     "f0",  "f1",  "f2",  "f3",  "f4",  "f5",  "f6",  "f7",
2779     "f8",  "f9",  "f10", "f11", "f12", "f13", "f14", "f15",
2780     "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
2781     "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
2782
2783     "y", "psr", "wim", "tbr", "pc", "npc", "fpsr", "cpsr",
2784     "dia1", "dia2", "dda1", "dda2", "ddv1", "ddv2", "dcr", "dsr" 
2785   };
2786
2787   if (regno < 0 ||
2788       regno >= (sizeof (register_names) / sizeof (register_names[0])))
2789     return NULL;
2790   else
2791     return register_names[regno];
2792 }
2793
2794 static const char *
2795 sparclet_register_name (int regno)
2796 {
2797   static char *register_names[] = 
2798   { "g0", "g1", "g2", "g3", "g4", "g5", "g6", "g7",
2799     "o0", "o1", "o2", "o3", "o4", "o5", "sp", "o7",
2800     "l0", "l1", "l2", "l3", "l4", "l5", "l6", "l7",
2801     "i0", "i1", "i2", "i3", "i4", "i5", "fp", "i7",
2802
2803     "", "", "", "", "", "", "", "", /* no floating point registers */
2804     "", "", "", "", "", "", "", "",
2805     "", "", "", "", "", "", "", "",
2806     "", "", "", "", "", "", "", "",
2807
2808     "y", "psr", "wim", "tbr", "pc", "npc", "", "", /* no FPSR or CPSR */
2809     "ccsr", "ccpr", "cccrcr", "ccor", "ccobr", "ccibr", "ccir", "", 
2810
2811     /*       ASR15                 ASR19 (don't display them) */    
2812     "asr1",  "", "asr17", "asr18", "", "asr20", "asr21", "asr22"
2813     /* None of the rest get displayed */
2814 #if 0
2815     "awr0",  "awr1",  "awr2",  "awr3",  "awr4",  "awr5",  "awr6",  "awr7",  
2816     "awr8",  "awr9",  "awr10", "awr11", "awr12", "awr13", "awr14", "awr15", 
2817     "awr16", "awr17", "awr18", "awr19", "awr20", "awr21", "awr22", "awr23", 
2818     "awr24", "awr25", "awr26", "awr27", "awr28", "awr29", "awr30", "awr31", 
2819     "apsr"
2820 #endif /* 0 */
2821   };
2822
2823   if (regno < 0 ||
2824       regno >= (sizeof (register_names) / sizeof (register_names[0])))
2825     return NULL;
2826   else
2827     return register_names[regno];
2828 }
2829
2830 CORE_ADDR
2831 sparc_push_return_address (CORE_ADDR pc_unused, CORE_ADDR sp)
2832 {
2833   if (CALL_DUMMY_LOCATION == AT_ENTRY_POINT)
2834     {
2835       /* The return PC of the dummy_frame is the former 'current' PC
2836          (where we were before we made the target function call).
2837          This is saved in %i7 by push_dummy_frame.
2838
2839          We will save the 'call dummy location' (ie. the address
2840          to which the target function will return) in %o7.  
2841          This address will actually be the program's entry point.  
2842          There will be a special call_dummy breakpoint there.  */
2843
2844       write_register (O7_REGNUM, 
2845                       CALL_DUMMY_ADDRESS () - 8);
2846     }
2847
2848   return sp;
2849 }
2850
2851 /* Should call_function allocate stack space for a struct return?  */
2852
2853 static int
2854 sparc64_use_struct_convention (int gcc_p, struct type *type)
2855 {
2856   return (TYPE_LENGTH (type) > 32);
2857 }
2858
2859 /* Store the address of the place in which to copy the structure the
2860    subroutine will return.  This is called from call_function_by_hand.
2861    The ultimate mystery is, tho, what is the value "16"?
2862
2863    MVS: That's the offset from where the sp is now, to where the
2864    subroutine is gonna expect to find the struct return address.  */
2865
2866 static void
2867 sparc32_store_struct_return (CORE_ADDR addr, CORE_ADDR sp)
2868 {
2869   char *val;
2870   CORE_ADDR o7;
2871
2872   val = alloca (SPARC_INTREG_SIZE); 
2873   store_unsigned_integer (val, SPARC_INTREG_SIZE, addr);
2874   write_memory (sp + (16 * SPARC_INTREG_SIZE), val, SPARC_INTREG_SIZE); 
2875
2876   if (CALL_DUMMY_LOCATION == AT_ENTRY_POINT)
2877     {
2878       /* Now adjust the value of the link register, which was previously
2879          stored by push_return_address.  Functions that return structs are
2880          peculiar in that they return to link register + 12, rather than
2881          link register + 8.  */
2882
2883       o7 = read_register (O7_REGNUM);
2884       write_register (O7_REGNUM, o7 - 4);
2885     }
2886 }
2887
2888 static void
2889 sparc64_store_struct_return (CORE_ADDR addr, CORE_ADDR sp)
2890 {
2891   /* FIXME: V9 uses %o0 for this.  */
2892   /* FIXME MVS: Only for small enough structs!!! */
2893
2894   target_write_memory (sp + (16 * SPARC_INTREG_SIZE), 
2895                        (char *) &addr, SPARC_INTREG_SIZE); 
2896 #if 0
2897   if (CALL_DUMMY_LOCATION == AT_ENTRY_POINT)
2898     {
2899       /* Now adjust the value of the link register, which was previously
2900          stored by push_return_address.  Functions that return structs are
2901          peculiar in that they return to link register + 12, rather than
2902          link register + 8.  */
2903
2904       write_register (O7_REGNUM, read_register (O7_REGNUM) - 4);
2905     }
2906 #endif
2907 }
2908
2909 /* Default target data type for register REGNO.  */
2910
2911 static struct type *
2912 sparc32_register_virtual_type (int regno)
2913 {
2914   if (regno == PC_REGNUM ||
2915       regno == FP_REGNUM ||
2916       regno == SP_REGNUM)
2917     return builtin_type_unsigned_int;
2918   if (regno < 32)
2919     return builtin_type_int;
2920   if (regno < 64)
2921     return builtin_type_float;
2922   return builtin_type_int;
2923 }
2924
2925 static struct type *
2926 sparc64_register_virtual_type (int regno)
2927 {
2928   if (regno == PC_REGNUM ||
2929       regno == FP_REGNUM ||
2930       regno == SP_REGNUM)
2931     return builtin_type_unsigned_long_long;
2932   if (regno < 32)
2933     return builtin_type_long_long;
2934   if (regno < 64)
2935     return builtin_type_float;
2936   if (regno < 80)
2937     return builtin_type_double;
2938   return builtin_type_long_long;
2939 }
2940
2941 /* Number of bytes of storage in the actual machine representation for
2942    register REGNO.  */
2943
2944 static int
2945 sparc32_register_size (int regno)
2946 {
2947   return 4;
2948 }
2949
2950 static int
2951 sparc64_register_size (int regno)
2952 {
2953   return (regno < 32 ? 8 : regno < 64 ? 4 : 8);
2954 }
2955
2956 /* Index within the `registers' buffer of the first byte of the space
2957    for register REGNO.  */
2958
2959 static int
2960 sparc32_register_byte (int regno)
2961 {
2962   return (regno * 4);
2963 }
2964
2965 static int
2966 sparc64_register_byte (int regno)
2967 {
2968   if (regno < 32)
2969     return regno * 8;
2970   else if (regno < 64)
2971     return 32 * 8 + (regno - 32) * 4;
2972   else if (regno < 80)
2973     return 32 * 8 + 32 * 4 + (regno - 64) * 8;
2974   else
2975     return 64 * 8 + (regno - 80) * 8;
2976 }
2977
2978 /* Immediately after a function call, return the saved pc.
2979    Can't go through the frames for this because on some machines
2980    the new frame is not set up until the new function executes
2981    some instructions.  */
2982
2983 static CORE_ADDR
2984 sparc_saved_pc_after_call (struct frame_info *fi)
2985 {
2986   return sparc_pc_adjust (read_register (RP_REGNUM));
2987 }
2988
2989 /* Convert registers between 'raw' and 'virtual' formats.
2990    They are the same on sparc, so there's nothing to do.  */
2991
2992 static void
2993 sparc_convert_to_virtual (int regnum, struct type *type, char *from, char *to)
2994 {       /* do nothing (should never be called) */
2995 }
2996
2997 static void
2998 sparc_convert_to_raw (struct type *type, int regnum, char *from, char *to)
2999 {       /* do nothing (should never be called) */
3000 }
3001
3002 /* Init saved regs: nothing to do, just a place-holder function.  */
3003
3004 static void
3005 sparc_frame_init_saved_regs (struct frame_info *fi_ignored)
3006 {       /* no-op */
3007 }
3008
3009 /* gdbarch fix call dummy:
3010    All this function does is rearrange the arguments before calling
3011    sparc_fix_call_dummy (which does the real work).  */
3012
3013 static void
3014 sparc_gdbarch_fix_call_dummy (char *dummy, 
3015                               CORE_ADDR pc, 
3016                               CORE_ADDR fun, 
3017                               int nargs, 
3018                               struct value **args, 
3019                               struct type *type, 
3020                               int gcc_p)
3021 {
3022   if (CALL_DUMMY_LOCATION == ON_STACK)
3023     sparc_fix_call_dummy (dummy, pc, fun, type, gcc_p);
3024 }
3025
3026 /* CALL_DUMMY_ADDRESS: fetch the breakpoint address for a call dummy.  */
3027
3028 static CORE_ADDR
3029 sparc_call_dummy_address (void)
3030 {
3031   return (CALL_DUMMY_START_OFFSET) + CALL_DUMMY_BREAKPOINT_OFFSET;
3032 }
3033
3034 /* Supply the Y register number to those that need it.  */
3035
3036 int
3037 sparc_y_regnum (void)
3038 {
3039   return gdbarch_tdep (current_gdbarch)->y_regnum;
3040 }
3041
3042 int
3043 sparc_reg_struct_has_addr (int gcc_p, struct type *type)
3044 {
3045   if (GDB_TARGET_IS_SPARC64)
3046     return (TYPE_LENGTH (type) > 32);
3047   else
3048     return (gcc_p != 1);
3049 }
3050
3051 int
3052 sparc_intreg_size (void)
3053 {
3054   return SPARC_INTREG_SIZE;
3055 }
3056
3057 static int
3058 sparc_return_value_on_stack (struct type *type)
3059 {
3060   if (TYPE_CODE (type) == TYPE_CODE_FLT &&
3061       TYPE_LENGTH (type) > 8)
3062     return 1;
3063   else
3064     return 0;
3065 }
3066
3067 /*
3068  * Gdbarch "constructor" function.
3069  */
3070
3071 #define SPARC32_CALL_DUMMY_ON_STACK
3072
3073 #define SPARC_SP_REGNUM    14
3074 #define SPARC_FP_REGNUM    30
3075 #define SPARC_FP0_REGNUM   32
3076 #define SPARC32_NPC_REGNUM 69
3077 #define SPARC32_PC_REGNUM  68
3078 #define SPARC32_Y_REGNUM   64
3079 #define SPARC64_PC_REGNUM  80
3080 #define SPARC64_NPC_REGNUM 81
3081 #define SPARC64_Y_REGNUM   85
3082
3083 static struct gdbarch *
3084 sparc_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
3085 {
3086   struct gdbarch *gdbarch;
3087   struct gdbarch_tdep *tdep;
3088
3089   static LONGEST call_dummy_32[] = 
3090     { 0xbc100001, 0x9de38000, 0xbc100002, 0xbe100003,
3091       0xda03a058, 0xd803a054, 0xd603a050, 0xd403a04c,
3092       0xd203a048, 0x40000000, 0xd003a044, 0x01000000,
3093       0x91d02001, 0x01000000
3094     };
3095   static LONGEST call_dummy_64[] = 
3096     { 0x9de3bec0fd3fa7f7LL, 0xf93fa7eff53fa7e7LL,
3097       0xf13fa7dfed3fa7d7LL, 0xe93fa7cfe53fa7c7LL,
3098       0xe13fa7bfdd3fa7b7LL, 0xd93fa7afd53fa7a7LL,
3099       0xd13fa79fcd3fa797LL, 0xc93fa78fc53fa787LL,
3100       0xc13fa77fcc3fa777LL, 0xc83fa76fc43fa767LL,
3101       0xc03fa75ffc3fa757LL, 0xf83fa74ff43fa747LL,
3102       0xf03fa73f01000000LL, 0x0100000001000000LL,
3103       0x0100000091580000LL, 0xd027a72b93500000LL,
3104       0xd027a72791480000LL, 0xd027a72391400000LL,
3105       0xd027a71fda5ba8a7LL, 0xd85ba89fd65ba897LL,
3106       0xd45ba88fd25ba887LL, 0x9fc02000d05ba87fLL,
3107       0x0100000091d02001LL, 0x0100000001000000LL 
3108     };
3109   static LONGEST call_dummy_nil[] = {0};
3110
3111   /* Try to determine the OS ABI of the object we are loading.  */
3112
3113   if (info.abfd != NULL
3114       && info.osabi == GDB_OSABI_UNKNOWN)
3115     {
3116       /* If it's an ELF file, assume it's Solaris.  */
3117       if (bfd_get_flavour (info.abfd) == bfd_target_elf_flavour)
3118         info.osabi = GDB_OSABI_SOLARIS;
3119     }
3120
3121   /* First see if there is already a gdbarch that can satisfy the request.  */
3122   arches = gdbarch_list_lookup_by_info (arches, &info);
3123   if (arches != NULL)
3124     return arches->gdbarch;
3125
3126   /* None found: is the request for a sparc architecture? */
3127   if (info.bfd_arch_info->arch != bfd_arch_sparc)
3128     return NULL;        /* No; then it's not for us.  */
3129
3130   /* Yes: create a new gdbarch for the specified machine type.  */
3131   tdep = (struct gdbarch_tdep *) xmalloc (sizeof (struct gdbarch_tdep));
3132   gdbarch = gdbarch_alloc (&info, tdep);
3133
3134   /* First set settings that are common for all sparc architectures.  */
3135   set_gdbarch_believe_pcc_promotion (gdbarch, 1);
3136   set_gdbarch_breakpoint_from_pc (gdbarch, memory_breakpoint_from_pc);
3137   set_gdbarch_call_dummy_breakpoint_offset_p (gdbarch, 1);
3138   set_gdbarch_call_dummy_p (gdbarch, 1);
3139   set_gdbarch_call_dummy_stack_adjust_p (gdbarch, 1);
3140   set_gdbarch_decr_pc_after_break (gdbarch, 0);
3141   set_gdbarch_double_bit (gdbarch, 8 * TARGET_CHAR_BIT);
3142   set_gdbarch_deprecated_extract_struct_value_address (gdbarch, sparc_extract_struct_value_address);
3143   set_gdbarch_fix_call_dummy (gdbarch, sparc_gdbarch_fix_call_dummy);
3144   set_gdbarch_float_bit (gdbarch, 4 * TARGET_CHAR_BIT);
3145   set_gdbarch_fp_regnum (gdbarch, SPARC_FP_REGNUM);
3146   set_gdbarch_fp0_regnum (gdbarch, SPARC_FP0_REGNUM);
3147   set_gdbarch_frame_chain (gdbarch, sparc_frame_chain);
3148   set_gdbarch_deprecated_frame_init_saved_regs (gdbarch, sparc_frame_init_saved_regs);
3149   set_gdbarch_frame_num_args (gdbarch, frame_num_args_unknown);
3150   set_gdbarch_deprecated_frame_saved_pc (gdbarch, sparc_frame_saved_pc);
3151   set_gdbarch_frameless_function_invocation (gdbarch, 
3152                                              frameless_look_for_prologue);
3153   set_gdbarch_get_saved_register (gdbarch, sparc_get_saved_register);
3154   set_gdbarch_deprecated_init_extra_frame_info (gdbarch, sparc_init_extra_frame_info);
3155   set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
3156   set_gdbarch_int_bit (gdbarch, 4 * TARGET_CHAR_BIT);
3157   set_gdbarch_long_double_bit (gdbarch, 16 * TARGET_CHAR_BIT);
3158   set_gdbarch_long_long_bit (gdbarch, 8 * TARGET_CHAR_BIT);
3159   set_gdbarch_deprecated_max_register_raw_size (gdbarch, 8);
3160   set_gdbarch_deprecated_max_register_virtual_size (gdbarch, 8);
3161   set_gdbarch_deprecated_pop_frame (gdbarch, sparc_pop_frame);
3162   set_gdbarch_push_return_address (gdbarch, sparc_push_return_address);
3163   set_gdbarch_deprecated_push_dummy_frame (gdbarch, sparc_push_dummy_frame);
3164   set_gdbarch_read_pc (gdbarch, generic_target_read_pc);
3165   set_gdbarch_register_convert_to_raw (gdbarch, sparc_convert_to_raw);
3166   set_gdbarch_register_convert_to_virtual (gdbarch, 
3167                                            sparc_convert_to_virtual);
3168   set_gdbarch_register_convertible (gdbarch, 
3169                                     generic_register_convertible_not);
3170   set_gdbarch_reg_struct_has_addr (gdbarch, sparc_reg_struct_has_addr);
3171   set_gdbarch_return_value_on_stack (gdbarch, sparc_return_value_on_stack);
3172   set_gdbarch_saved_pc_after_call (gdbarch, sparc_saved_pc_after_call);
3173   set_gdbarch_prologue_frameless_p (gdbarch, sparc_prologue_frameless_p);
3174   set_gdbarch_short_bit (gdbarch, 2 * TARGET_CHAR_BIT);
3175   set_gdbarch_skip_prologue (gdbarch, sparc_skip_prologue);
3176   set_gdbarch_sp_regnum (gdbarch, SPARC_SP_REGNUM);
3177   set_gdbarch_deprecated_use_generic_dummy_frames (gdbarch, 0);
3178   set_gdbarch_write_pc (gdbarch, generic_target_write_pc);
3179
3180   /*
3181    * Settings that depend only on 32/64 bit word size 
3182    */
3183
3184   switch (info.bfd_arch_info->mach)
3185     {
3186     case bfd_mach_sparc:
3187     case bfd_mach_sparc_sparclet:
3188     case bfd_mach_sparc_sparclite:
3189     case bfd_mach_sparc_v8plus:
3190     case bfd_mach_sparc_v8plusa:
3191     case bfd_mach_sparc_sparclite_le:
3192       /* 32-bit machine types: */
3193
3194 #ifdef SPARC32_CALL_DUMMY_ON_STACK
3195       set_gdbarch_deprecated_pc_in_call_dummy (gdbarch, deprecated_pc_in_call_dummy_on_stack);
3196       set_gdbarch_call_dummy_address (gdbarch, sparc_call_dummy_address);
3197       set_gdbarch_call_dummy_breakpoint_offset (gdbarch, 0x30);
3198       set_gdbarch_call_dummy_length (gdbarch, 0x38);
3199
3200       /* NOTE: cagney/2002-04-26: Based from info posted by Peter
3201          Schauer around Oct '99.  Briefly, due to aspects of the SPARC
3202          ABI, it isn't possible to use ON_STACK with a strictly
3203          compliant compiler.
3204
3205          Peter Schauer writes ...
3206
3207          No, any call from GDB to a user function returning a
3208          struct/union will fail miserably. Try this:
3209
3210          *NOINDENT*
3211          struct x
3212          {
3213            int a[4];
3214          };
3215
3216          struct x gx;
3217
3218          struct x
3219          sret ()
3220          {
3221            return gx;
3222          }
3223
3224          main ()
3225          {
3226            int i;
3227            for (i = 0; i < 4; i++)
3228              gx.a[i] = i + 1;
3229            gx = sret ();
3230          }
3231          *INDENT*
3232
3233          Set a breakpoint at the gx = sret () statement, run to it and
3234          issue a `print sret()'. It will not succed with your
3235          approach, and I doubt that continuing the program will work
3236          as well.
3237
3238          For details of the ABI see the Sparc Architecture Manual.  I
3239          have Version 8 (Prentice Hall ISBN 0-13-825001-4) and the
3240          calling conventions for functions returning aggregate values
3241          are explained in Appendix D.3.  */
3242
3243       set_gdbarch_call_dummy_location (gdbarch, ON_STACK);
3244       set_gdbarch_call_dummy_words (gdbarch, call_dummy_32);
3245 #else
3246       set_gdbarch_deprecated_pc_in_call_dummy (gdbarch, deprecated_pc_in_call_dummy_at_entry_point);
3247       set_gdbarch_call_dummy_address (gdbarch, entry_point_address);
3248       set_gdbarch_call_dummy_breakpoint_offset (gdbarch, 0);
3249       set_gdbarch_call_dummy_length (gdbarch, 0);
3250       set_gdbarch_call_dummy_words (gdbarch, call_dummy_nil);
3251 #endif
3252       set_gdbarch_call_dummy_stack_adjust (gdbarch, 68);
3253       set_gdbarch_call_dummy_start_offset (gdbarch, 0);
3254       set_gdbarch_frame_args_skip (gdbarch, 68);
3255       set_gdbarch_function_start_offset (gdbarch, 0);
3256       set_gdbarch_long_bit (gdbarch, 4 * TARGET_CHAR_BIT);
3257       set_gdbarch_npc_regnum (gdbarch, SPARC32_NPC_REGNUM);
3258       set_gdbarch_pc_regnum (gdbarch, SPARC32_PC_REGNUM);
3259       set_gdbarch_ptr_bit (gdbarch, 4 * TARGET_CHAR_BIT);
3260       set_gdbarch_push_arguments (gdbarch, sparc32_push_arguments);
3261       set_gdbarch_read_fp (gdbarch, generic_target_read_fp);
3262       set_gdbarch_read_sp (gdbarch, generic_target_read_sp);
3263
3264       set_gdbarch_register_byte (gdbarch, sparc32_register_byte);
3265       set_gdbarch_register_raw_size (gdbarch, sparc32_register_size);
3266       set_gdbarch_register_size (gdbarch, 4);
3267       set_gdbarch_register_virtual_size (gdbarch, sparc32_register_size);
3268       set_gdbarch_register_virtual_type (gdbarch, 
3269                                          sparc32_register_virtual_type);
3270 #ifdef SPARC32_CALL_DUMMY_ON_STACK
3271       set_gdbarch_sizeof_call_dummy_words (gdbarch, sizeof (call_dummy_32));
3272 #else
3273       set_gdbarch_sizeof_call_dummy_words (gdbarch, 0);
3274 #endif
3275       set_gdbarch_stack_align (gdbarch, sparc32_stack_align);
3276       set_gdbarch_store_struct_return (gdbarch, sparc32_store_struct_return);
3277       set_gdbarch_use_struct_convention (gdbarch, 
3278                                          generic_use_struct_convention);
3279       set_gdbarch_write_sp (gdbarch, generic_target_write_sp);
3280       tdep->y_regnum = SPARC32_Y_REGNUM;
3281       tdep->fp_max_regnum = SPARC_FP0_REGNUM + 32;
3282       tdep->intreg_size = 4;
3283       tdep->reg_save_offset = 0x60;
3284       tdep->call_dummy_call_offset = 0x24;
3285       break;
3286
3287     case bfd_mach_sparc_v9:
3288     case bfd_mach_sparc_v9a:
3289       /* 64-bit machine types: */
3290     default:    /* Any new machine type is likely to be 64-bit.  */
3291
3292 #ifdef SPARC64_CALL_DUMMY_ON_STACK
3293       set_gdbarch_deprecated_pc_in_call_dummy (gdbarch, deprecated_pc_in_call_dummy_on_stack);
3294       set_gdbarch_call_dummy_address (gdbarch, sparc_call_dummy_address);
3295       set_gdbarch_call_dummy_breakpoint_offset (gdbarch, 8 * 4);
3296       set_gdbarch_call_dummy_length (gdbarch, 192);
3297       set_gdbarch_call_dummy_location (gdbarch, ON_STACK);
3298       set_gdbarch_call_dummy_start_offset (gdbarch, 148);
3299       set_gdbarch_call_dummy_words (gdbarch, call_dummy_64);
3300 #else
3301       set_gdbarch_deprecated_pc_in_call_dummy (gdbarch, deprecated_pc_in_call_dummy_at_entry_point);
3302       set_gdbarch_call_dummy_address (gdbarch, entry_point_address);
3303       set_gdbarch_call_dummy_breakpoint_offset (gdbarch, 0);
3304       set_gdbarch_call_dummy_length (gdbarch, 0);
3305       set_gdbarch_call_dummy_start_offset (gdbarch, 0);
3306       set_gdbarch_call_dummy_words (gdbarch, call_dummy_nil);
3307 #endif
3308       set_gdbarch_call_dummy_stack_adjust (gdbarch, 128);
3309       set_gdbarch_frame_args_skip (gdbarch, 136);
3310       set_gdbarch_function_start_offset (gdbarch, 0);
3311       set_gdbarch_long_bit (gdbarch, 8 * TARGET_CHAR_BIT);
3312       set_gdbarch_npc_regnum (gdbarch, SPARC64_NPC_REGNUM);
3313       set_gdbarch_pc_regnum (gdbarch, SPARC64_PC_REGNUM);
3314       set_gdbarch_ptr_bit (gdbarch, 8 * TARGET_CHAR_BIT);
3315       set_gdbarch_push_arguments (gdbarch, sparc64_push_arguments);
3316       /* NOTE different for at_entry */
3317       set_gdbarch_read_fp (gdbarch, sparc64_read_fp);
3318       set_gdbarch_read_sp (gdbarch, sparc64_read_sp);
3319       /* Some of the registers aren't 64 bits, but it's a lot simpler just
3320          to assume they all are (since most of them are).  */
3321       set_gdbarch_register_byte (gdbarch, sparc64_register_byte);
3322       set_gdbarch_register_raw_size (gdbarch, sparc64_register_size);
3323       set_gdbarch_register_size (gdbarch, 8);
3324       set_gdbarch_register_virtual_size (gdbarch, sparc64_register_size);
3325       set_gdbarch_register_virtual_type (gdbarch, 
3326                                          sparc64_register_virtual_type);
3327 #ifdef SPARC64_CALL_DUMMY_ON_STACK
3328       set_gdbarch_sizeof_call_dummy_words (gdbarch, sizeof (call_dummy_64));
3329 #else
3330       set_gdbarch_sizeof_call_dummy_words (gdbarch, 0);
3331 #endif
3332       set_gdbarch_stack_align (gdbarch, sparc64_stack_align);
3333       set_gdbarch_store_struct_return (gdbarch, sparc64_store_struct_return);
3334       set_gdbarch_use_struct_convention (gdbarch, 
3335                                          sparc64_use_struct_convention);
3336       set_gdbarch_write_sp (gdbarch, sparc64_write_sp);
3337       tdep->y_regnum = SPARC64_Y_REGNUM;
3338       tdep->fp_max_regnum = SPARC_FP0_REGNUM + 48;
3339       tdep->intreg_size = 8;
3340       tdep->reg_save_offset = 0x90;
3341       tdep->call_dummy_call_offset = 148 + 4 * 5;
3342       break;
3343     }
3344
3345   /* 
3346    * Settings that vary per-architecture:
3347    */
3348
3349   switch (info.bfd_arch_info->mach)
3350     {
3351     case bfd_mach_sparc:
3352       set_gdbarch_deprecated_extract_return_value (gdbarch, sparc32_extract_return_value);
3353       set_gdbarch_num_regs (gdbarch, 72);
3354       set_gdbarch_register_bytes (gdbarch, 32*4 + 32*4 + 8*4);
3355       set_gdbarch_register_name (gdbarch, sparc32_register_name);
3356       set_gdbarch_deprecated_store_return_value (gdbarch, sparc_store_return_value);
3357       tdep->has_fpu = 1;        /* (all but sparclet and sparclite) */
3358       tdep->fp_register_bytes = 32 * 4;
3359       tdep->print_insn_mach = bfd_mach_sparc;
3360       break;
3361     case bfd_mach_sparc_sparclet:
3362       set_gdbarch_deprecated_extract_return_value (gdbarch, sparclet_extract_return_value);
3363       set_gdbarch_num_regs (gdbarch, 32 + 32 + 8 + 8 + 8);
3364       set_gdbarch_register_bytes (gdbarch, 32*4 + 32*4 + 8*4 + 8*4 + 8*4);
3365       set_gdbarch_register_name (gdbarch, sparclet_register_name);
3366       set_gdbarch_deprecated_store_return_value (gdbarch, sparclet_store_return_value);
3367       tdep->has_fpu = 0;        /* (all but sparclet and sparclite) */
3368       tdep->fp_register_bytes = 0;
3369       tdep->print_insn_mach = bfd_mach_sparc_sparclet;
3370       break;
3371     case bfd_mach_sparc_sparclite:
3372       set_gdbarch_deprecated_extract_return_value (gdbarch, sparc32_extract_return_value);
3373       set_gdbarch_num_regs (gdbarch, 80);
3374       set_gdbarch_register_bytes (gdbarch, 32*4 + 32*4 + 8*4 + 8*4);
3375       set_gdbarch_register_name (gdbarch, sparclite_register_name);
3376       set_gdbarch_deprecated_store_return_value (gdbarch, sparc_store_return_value);
3377       tdep->has_fpu = 0;        /* (all but sparclet and sparclite) */
3378       tdep->fp_register_bytes = 0;
3379       tdep->print_insn_mach = bfd_mach_sparc_sparclite;
3380       break;
3381     case bfd_mach_sparc_v8plus:
3382       set_gdbarch_deprecated_extract_return_value (gdbarch, sparc32_extract_return_value);
3383       set_gdbarch_num_regs (gdbarch, 72);
3384       set_gdbarch_register_bytes (gdbarch, 32*4 + 32*4 + 8*4);
3385       set_gdbarch_register_name (gdbarch, sparc32_register_name);
3386       set_gdbarch_deprecated_store_return_value (gdbarch, sparc_store_return_value);
3387       tdep->print_insn_mach = bfd_mach_sparc;
3388       tdep->fp_register_bytes = 32 * 4;
3389       tdep->has_fpu = 1;        /* (all but sparclet and sparclite) */
3390       break;
3391     case bfd_mach_sparc_v8plusa:
3392       set_gdbarch_deprecated_extract_return_value (gdbarch, sparc32_extract_return_value);
3393       set_gdbarch_num_regs (gdbarch, 72);
3394       set_gdbarch_register_bytes (gdbarch, 32*4 + 32*4 + 8*4);
3395       set_gdbarch_register_name (gdbarch, sparc32_register_name);
3396       set_gdbarch_deprecated_store_return_value (gdbarch, sparc_store_return_value);
3397       tdep->has_fpu = 1;        /* (all but sparclet and sparclite) */
3398       tdep->fp_register_bytes = 32 * 4;
3399       tdep->print_insn_mach = bfd_mach_sparc;
3400       break;
3401     case bfd_mach_sparc_sparclite_le:
3402       set_gdbarch_deprecated_extract_return_value (gdbarch, sparc32_extract_return_value);
3403       set_gdbarch_num_regs (gdbarch, 80);
3404       set_gdbarch_register_bytes (gdbarch, 32*4 + 32*4 + 8*4 + 8*4);
3405       set_gdbarch_register_name (gdbarch, sparclite_register_name);
3406       set_gdbarch_deprecated_store_return_value (gdbarch, sparc_store_return_value);
3407       tdep->has_fpu = 0;        /* (all but sparclet and sparclite) */
3408       tdep->fp_register_bytes = 0;
3409       tdep->print_insn_mach = bfd_mach_sparc_sparclite;
3410       break;
3411     case bfd_mach_sparc_v9:
3412       set_gdbarch_deprecated_extract_return_value (gdbarch, sparc64_extract_return_value);
3413       set_gdbarch_num_regs (gdbarch, 125);
3414       set_gdbarch_register_bytes (gdbarch, 32*8 + 32*8 + 45*8);
3415       set_gdbarch_register_name (gdbarch, sparc64_register_name);
3416       set_gdbarch_deprecated_store_return_value (gdbarch, sparc_store_return_value);
3417       tdep->has_fpu = 1;        /* (all but sparclet and sparclite) */
3418       tdep->fp_register_bytes = 64 * 4;
3419       tdep->print_insn_mach = bfd_mach_sparc_v9a;
3420       break;
3421     case bfd_mach_sparc_v9a:
3422       set_gdbarch_deprecated_extract_return_value (gdbarch, sparc64_extract_return_value);
3423       set_gdbarch_num_regs (gdbarch, 125);
3424       set_gdbarch_register_bytes (gdbarch, 32*8 + 32*8 + 45*8);
3425       set_gdbarch_register_name (gdbarch, sparc64_register_name);
3426       set_gdbarch_deprecated_store_return_value (gdbarch, sparc_store_return_value);
3427       tdep->has_fpu = 1;        /* (all but sparclet and sparclite) */
3428       tdep->fp_register_bytes = 64 * 4;
3429       tdep->print_insn_mach = bfd_mach_sparc_v9a;
3430       break;
3431     }
3432
3433   /* Hook in OS ABI-specific overrides, if they have been registered.  */
3434   gdbarch_init_osabi (info, gdbarch);
3435
3436   return gdbarch;
3437 }
3438
3439 static void
3440 sparc_dump_tdep (struct gdbarch *current_gdbarch, struct ui_file *file)
3441 {
3442   struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
3443
3444   if (tdep == NULL)
3445     return;
3446
3447   fprintf_unfiltered (file, "sparc_dump_tdep: has_fpu = %d\n",
3448                       tdep->has_fpu);
3449   fprintf_unfiltered (file, "sparc_dump_tdep: fp_register_bytes = %d\n",
3450                       tdep->fp_register_bytes);
3451   fprintf_unfiltered (file, "sparc_dump_tdep: y_regnum = %d\n",
3452                       tdep->y_regnum);
3453   fprintf_unfiltered (file, "sparc_dump_tdep: fp_max_regnum = %d\n",
3454                       tdep->fp_max_regnum);
3455   fprintf_unfiltered (file, "sparc_dump_tdep: intreg_size = %d\n",
3456                       tdep->intreg_size);
3457   fprintf_unfiltered (file, "sparc_dump_tdep: reg_save_offset = %d\n",
3458                       tdep->reg_save_offset);
3459   fprintf_unfiltered (file, "sparc_dump_tdep: call_dummy_call_offset = %d\n",
3460                       tdep->call_dummy_call_offset);
3461   fprintf_unfiltered (file, "sparc_dump_tdep: print_insn_match = %d\n",
3462                       tdep->print_insn_mach);
3463 }
This page took 0.216538 seconds and 4 git commands to generate.