1 /* Target-dependent code for the SPARC for GDB, the GNU debugger.
2 Copyright 1986, 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996
3 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
21 /* ??? Support for calling functions from gdb in sparc64 is unfinished. */
32 #include <sys/procfs.h>
37 #ifdef GDB_TARGET_IS_SPARC64
38 #define FP_REGISTER_BYTES (64 * 4)
40 #define FP_REGISTER_BYTES (32 * 4)
43 /* If not defined, assume 32 bit sparc. */
45 #define FP_MAX_REGNUM (FP0_REGNUM + 32)
48 #define SPARC_INTREG_SIZE (REGISTER_RAW_SIZE (G0_REGNUM))
51 extern int stop_after_trap;
53 /* We don't store all registers immediately when requested, since they
54 get sent over in large chunks anyway. Instead, we accumulate most
55 of the changes and send them over once. "deferred_stores" keeps
56 track of which sets of registers we have locally-changed copies of,
57 so we only need send the groups that have changed. */
59 int deferred_stores = 0; /* Cumulates stores we want to do eventually. */
61 /* Branches with prediction are treated like their non-predicting cousins. */
62 /* FIXME: What about floating point branches? */
64 /* Macros to extract fields from sparc instructions. */
65 #define X_OP(i) (((i) >> 30) & 0x3)
66 #define X_RD(i) (((i) >> 25) & 0x1f)
67 #define X_A(i) (((i) >> 29) & 1)
68 #define X_COND(i) (((i) >> 25) & 0xf)
69 #define X_OP2(i) (((i) >> 22) & 0x7)
70 #define X_IMM22(i) ((i) & 0x3fffff)
71 #define X_OP3(i) (((i) >> 19) & 0x3f)
72 #define X_RS1(i) (((i) >> 14) & 0x1f)
73 #define X_I(i) (((i) >> 13) & 1)
74 #define X_IMM13(i) ((i) & 0x1fff)
75 /* Sign extension macros. */
76 #define X_SIMM13(i) ((X_IMM13 (i) ^ 0x1000) - 0x1000)
77 #define X_DISP22(i) ((X_IMM22 (i) ^ 0x200000) - 0x200000)
78 #ifdef GDB_TARGET_IS_SPARC64
79 #define X_CC(i) (((i) >> 20) & 3)
80 #define X_P(i) (((i) >> 19) & 1)
81 #define X_DISP19(i) ((((i) & 0x7ffff) ^ 0x40000) - 0x40000)
82 #define X_RCOND(i) (((i) >> 25) & 7)
83 #define X_DISP16(i) ((((((i) >> 6) && 0xc000) | ((i) & 0x3fff)) ^ 0x8000) - 0x8000)
84 #define X_FCN(i) (((i) >> 25) & 31)
89 Error, not_branch, bicc, bicca, ba, baa, ticc, ta,
90 #ifdef GDB_TARGET_IS_SPARC64
95 /* Simulate single-step ptrace call for sun4. Code written by Gary
98 /* npc4 and next_pc describe the situation at the time that the
99 step-breakpoint was set, not necessary the current value of NPC_REGNUM. */
100 static CORE_ADDR next_pc, npc4, target;
101 static int brknpc4, brktrg;
102 typedef char binsn_quantum[BREAKPOINT_MAX];
103 static binsn_quantum break_mem[3];
105 /* Non-zero if we just simulated a single-step ptrace call. This is
106 needed because we cannot remove the breakpoints in the inferior
107 process until after the `wait' in `wait_for_inferior'. Used for
112 /* single_step() is called just before we want to resume the inferior,
113 if we want to single-step it but there is no hardware or kernel single-step
114 support (as on all SPARCs). We find all the possible targets of the
115 coming instruction and breakpoint them.
117 single_step is also called just after the inferior stops. If we had
118 set up a simulated single-step, we undo our damage. */
122 int ignore; /* pid, but we don't need it */
124 branch_type br, isbranch();
130 /* Always set breakpoint for NPC. */
131 next_pc = read_register (NPC_REGNUM);
132 npc4 = next_pc + 4; /* branch not taken */
134 target_insert_breakpoint (next_pc, break_mem[0]);
135 /* printf_unfiltered ("set break at %x\n",next_pc); */
137 pc = read_register (PC_REGNUM);
138 pc_instruction = read_memory_integer (pc, 4);
139 br = isbranch (pc_instruction, pc, &target);
140 brknpc4 = brktrg = 0;
144 /* Conditional annulled branch will either end up at
145 npc (if taken) or at npc+4 (if not taken).
148 target_insert_breakpoint (npc4, break_mem[1]);
150 else if (br == baa && target != next_pc)
152 /* Unconditional annulled branch will always end up at
155 target_insert_breakpoint (target, break_mem[2]);
157 #ifdef GDB_TARGET_IS_SPARC64
158 else if (br == done_retry)
161 target_insert_breakpoint (target, break_mem[2]);
165 /* We are ready to let it go */
171 /* Remove breakpoints */
172 target_remove_breakpoint (next_pc, break_mem[0]);
175 target_remove_breakpoint (npc4, break_mem[1]);
178 target_remove_breakpoint (target, break_mem[2]);
184 /* Call this for each newly created frame. For SPARC, we need to calculate
185 the bottom of the frame, and do some extra work if the prologue
186 has been generated via the -mflat option to GCC. In particular,
187 we need to know where the previous fp and the pc have been stashed,
188 since their exact position within the frame may vary. */
191 sparc_init_extra_frame_info (fromleaf, fi)
193 struct frame_info *fi;
201 (fi->frame == fi->next->frame ? fi->next->bottom : fi->next->frame) :
202 read_register (SP_REGNUM));
204 /* If fi->next is NULL, then we already set ->frame by passing read_fp()
205 to create_new_frame. */
208 char buf[MAX_REGISTER_RAW_SIZE];
211 /* Compute ->frame as if not flat. If it is flat, we'll change
213 /* FIXME: If error reading memory, should just stop backtracing, rather
215 get_saved_register (buf, 0, 0, fi, FP_REGNUM, 0);
216 fi->frame = extract_address (buf, REGISTER_RAW_SIZE (FP_REGNUM));
219 /* Decide whether this is a function with a ``flat register window''
220 frame. For such functions, the frame pointer is actually in %i7. */
222 if (find_pc_partial_function (fi->pc, &name, &addr, NULL))
224 /* See if the function starts with an add (which will be of a
225 negative number if a flat frame) to the sp. FIXME: Does not
226 handle large frames which will need more than one instruction
228 insn = read_memory_integer (addr, 4);
229 if (X_OP (insn) == 2 && X_RD (insn) == 14 && X_OP3 (insn) == 0
230 && X_I (insn) && X_SIMM13 (insn) < 0)
232 int offset = X_SIMM13 (insn);
234 /* Then look for a save of %i7 into the frame. */
235 insn = read_memory_integer (addr + 4, 4);
239 && X_RS1 (insn) == 14)
241 char buf[MAX_REGISTER_RAW_SIZE];
243 /* We definitely have a flat frame now. */
246 fi->sp_offset = offset;
248 /* Overwrite the frame's address with the value in %i7. */
249 get_saved_register (buf, 0, 0, fi, I7_REGNUM, 0);
250 fi->frame = extract_address (buf, REGISTER_RAW_SIZE (I7_REGNUM));
252 /* Record where the fp got saved. */
253 fi->fp_addr = fi->frame + fi->sp_offset + X_SIMM13 (insn);
255 /* Also try to collect where the pc got saved to. */
257 insn = read_memory_integer (addr + 12, 4);
261 && X_RS1 (insn) == 14)
262 fi->pc_addr = fi->frame + fi->sp_offset + X_SIMM13 (insn);
266 if (fi->next && fi->frame == 0)
268 /* Kludge to cause init_prev_frame_info to destroy the new frame. */
269 fi->frame = fi->next->frame;
270 fi->pc = fi->next->pc;
275 sparc_frame_chain (frame)
276 struct frame_info *frame;
278 /* Value that will cause FRAME_CHAIN_VALID to not worry about the chain
279 value. If it realy is zero, we detect it later in
280 sparc_init_prev_frame. */
285 sparc_extract_struct_value_address (regbuf)
286 char regbuf[REGISTER_BYTES];
288 #ifdef GDB_TARGET_IS_SPARC64
289 return extract_address (regbuf + REGISTER_BYTE (O0_REGNUM),
290 REGISTER_RAW_SIZE (O0_REGNUM));
292 return read_memory_integer (((int *)(regbuf)) [SP_REGNUM] + (16 * SPARC_INTREG_SIZE),
293 TARGET_PTR_BIT / TARGET_CHAR_BIT);
297 /* Find the pc saved in frame FRAME. */
300 sparc_frame_saved_pc (frame)
301 struct frame_info *frame;
303 char buf[MAX_REGISTER_RAW_SIZE];
306 if (frame->signal_handler_caller)
308 /* This is the signal trampoline frame.
309 Get the saved PC from the sigcontext structure. */
311 #ifndef SIGCONTEXT_PC_OFFSET
312 #define SIGCONTEXT_PC_OFFSET 12
315 CORE_ADDR sigcontext_addr;
316 char scbuf[TARGET_PTR_BIT / HOST_CHAR_BIT];
317 int saved_pc_offset = SIGCONTEXT_PC_OFFSET;
320 /* Solaris2 ucbsigvechandler passes a pointer to a sigcontext
321 as the third parameter. The offset to the saved pc is 12. */
322 find_pc_partial_function (frame->pc, &name,
323 (CORE_ADDR *)NULL,(CORE_ADDR *)NULL);
324 if (name && STREQ (name, "ucbsigvechandler"))
325 saved_pc_offset = 12;
327 /* The sigcontext address is contained in register O2. */
328 get_saved_register (buf, (int *)NULL, (CORE_ADDR *)NULL,
329 frame, O0_REGNUM + 2, (enum lval_type *)NULL);
330 sigcontext_addr = extract_address (buf, REGISTER_RAW_SIZE (O0_REGNUM + 2));
332 /* Don't cause a memory_error when accessing sigcontext in case the
333 stack layout has changed or the stack is corrupt. */
334 target_read_memory (sigcontext_addr + saved_pc_offset,
335 scbuf, sizeof (scbuf));
336 return extract_address (scbuf, sizeof (scbuf));
339 addr = frame->pc_addr;
341 addr = frame->bottom + FRAME_SAVED_I0 +
342 SPARC_INTREG_SIZE * (I7_REGNUM - I0_REGNUM);
345 /* A flat frame leaf function might not save the PC anywhere,
346 just leave it in %o7. */
347 return PC_ADJUST (read_register (O7_REGNUM));
349 read_memory (addr, buf, SPARC_INTREG_SIZE);
350 return PC_ADJUST (extract_address (buf, SPARC_INTREG_SIZE));
353 /* Since an individual frame in the frame cache is defined by two
354 arguments (a frame pointer and a stack pointer), we need two
355 arguments to get info for an arbitrary stack frame. This routine
356 takes two arguments and makes the cached frames look as if these
357 two arguments defined a frame on the cache. This allows the rest
358 of info frame to extract the important arguments without
362 setup_arbitrary_frame (argc, argv)
366 struct frame_info *frame;
369 error ("Sparc frame specifications require two arguments: fp and sp");
371 frame = create_new_frame (argv[0], 0);
374 fatal ("internal: create_new_frame returned invalid frame");
376 frame->bottom = argv[1];
377 frame->pc = FRAME_SAVED_PC (frame);
381 /* Given a pc value, skip it forward past the function prologue by
382 disassembling instructions that appear to be a prologue.
384 If FRAMELESS_P is set, we are only testing to see if the function
385 is frameless. This allows a quicker answer.
387 This routine should be more specific in its actions; making sure
388 that it uses the same register in the initial prologue section. */
390 static CORE_ADDR examine_prologue PARAMS ((CORE_ADDR, int, struct frame_info *,
391 struct frame_saved_regs *));
394 examine_prologue (start_pc, frameless_p, fi, saved_regs)
397 struct frame_info *fi;
398 struct frame_saved_regs *saved_regs;
402 CORE_ADDR pc = start_pc;
405 insn = read_memory_integer (pc, 4);
407 /* Recognize the `sethi' insn and record its destination. */
408 if (X_OP (insn) == 0 && X_OP2 (insn) == 4)
412 insn = read_memory_integer (pc, 4);
415 /* Recognize an add immediate value to register to either %g1 or
416 the destination register recorded above. Actually, this might
417 well recognize several different arithmetic operations.
418 It doesn't check that rs1 == rd because in theory "sub %g0, 5, %g1"
419 followed by "save %sp, %g1, %sp" is a valid prologue (Not that
420 I imagine any compiler really does that, however). */
423 && (X_RD (insn) == 1 || X_RD (insn) == dest))
426 insn = read_memory_integer (pc, 4);
429 /* Recognize any SAVE insn. */
430 if (X_OP (insn) == 2 && X_OP3 (insn) == 60)
433 if (frameless_p) /* If the save is all we care about, */
434 return pc; /* return before doing more work */
435 insn = read_memory_integer (pc, 4);
437 /* Recognize add to %sp. */
438 else if (X_OP (insn) == 2 && X_RD (insn) == 14 && X_OP3 (insn) == 0)
441 if (frameless_p) /* If the add is all we care about, */
442 return pc; /* return before doing more work */
444 insn = read_memory_integer (pc, 4);
445 /* Recognize store of frame pointer (i7). */
449 && X_RS1 (insn) == 14)
452 insn = read_memory_integer (pc, 4);
454 /* Recognize sub %sp, <anything>, %i7. */
457 && X_RS1 (insn) == 14
458 && X_RD (insn) == 31)
461 insn = read_memory_integer (pc, 4);
470 /* Without a save or add instruction, it's not a prologue. */
475 /* Recognize stores into the frame from the input registers.
476 This recognizes all non alternate stores of input register,
477 into a location offset from the frame pointer. */
478 if ((X_OP (insn) == 3
479 && (X_OP3 (insn) & 0x3c) == 4 /* Store, non-alternate. */
480 && (X_RD (insn) & 0x18) == 0x18 /* Input register. */
481 && X_I (insn) /* Immediate mode. */
482 && X_RS1 (insn) == 30 /* Off of frame pointer. */
483 /* Into reserved stack space. */
484 && X_SIMM13 (insn) >= 0x44
485 && X_SIMM13 (insn) < 0x5b))
490 && X_RS1 (insn) == 14
493 if (saved_regs && X_I (insn))
494 saved_regs->regs[X_RD (insn)] =
495 fi->frame + fi->sp_offset + X_SIMM13 (insn);
500 insn = read_memory_integer (pc, 4);
507 skip_prologue (start_pc, frameless_p)
511 return examine_prologue (start_pc, frameless_p, NULL, NULL);
514 /* Check instruction at ADDR to see if it is a branch.
515 All non-annulled instructions will go to NPC or will trap.
516 Set *TARGET if we find a candidate branch; set to zero if not.
518 This isn't static as it's used by remote-sa.sparc.c. */
521 isbranch (instruction, addr, target)
523 CORE_ADDR addr, *target;
525 branch_type val = not_branch;
526 long int offset; /* Must be signed for sign-extend. */
530 if (X_OP (instruction) == 0
531 && (X_OP2 (instruction) == 2
532 || X_OP2 (instruction) == 6
533 #ifdef GDB_TARGET_IS_SPARC64
534 || X_OP2 (instruction) == 1
535 || X_OP2 (instruction) == 3
536 || X_OP2 (instruction) == 5
538 || X_OP2 (instruction) == 7
542 if (X_COND (instruction) == 8)
543 val = X_A (instruction) ? baa : ba;
545 val = X_A (instruction) ? bicca : bicc;
546 switch (X_OP2 (instruction))
550 #ifndef GDB_TARGET_IS_SPARC64
553 offset = 4 * X_DISP22 (instruction);
555 #ifdef GDB_TARGET_IS_SPARC64
558 offset = 4 * X_DISP19 (instruction);
561 offset = 4 * X_DISP16 (instruction);
565 *target = addr + offset;
567 #ifdef GDB_TARGET_IS_SPARC64
568 else if (X_OP (instruction) == 2
569 && X_OP3 (instruction) == 62)
571 if (X_FCN (instruction) == 0)
574 *target = read_register (TNPC_REGNUM);
577 else if (X_FCN (instruction) == 1)
580 *target = read_register (TPC_REGNUM);
589 /* Find register number REGNUM relative to FRAME and put its
590 (raw) contents in *RAW_BUFFER. Set *OPTIMIZED if the variable
591 was optimized out (and thus can't be fetched). If the variable
592 was fetched from memory, set *ADDRP to where it was fetched from,
593 otherwise it was fetched from a register.
595 The argument RAW_BUFFER must point to aligned memory. */
598 get_saved_register (raw_buffer, optimized, addrp, frame, regnum, lval)
602 struct frame_info *frame;
604 enum lval_type *lval;
606 struct frame_info *frame1;
609 if (!target_has_registers)
610 error ("No registers.");
617 /* FIXME This code extracted from infcmd.c; should put elsewhere! */
620 /* error ("No selected frame."); */
621 if (!target_has_registers)
622 error ("The program has no registers now.");
623 if (selected_frame == NULL)
624 error ("No selected frame.");
625 /* Try to use selected frame */
626 frame = get_prev_frame (selected_frame);
628 error ("Cmd not meaningful in the outermost frame.");
632 frame1 = frame->next;
633 while (frame1 != NULL)
635 if (frame1->pc >= (frame1->bottom ? frame1->bottom :
636 read_register (SP_REGNUM))
637 && frame1->pc <= FRAME_FP (frame1))
639 /* Dummy frame. All but the window regs are in there somewhere.
640 The window registers are saved on the stack, just like in a
642 if (regnum >= G1_REGNUM && regnum < G1_REGNUM + 7)
643 addr = frame1->frame + (regnum - G0_REGNUM) * SPARC_INTREG_SIZE
644 - (FP_REGISTER_BYTES + 8 * SPARC_INTREG_SIZE);
645 else if (regnum >= I0_REGNUM && regnum < I0_REGNUM + 8)
646 addr = (frame1->prev->bottom
647 + (regnum - I0_REGNUM) * SPARC_INTREG_SIZE
649 else if (regnum >= L0_REGNUM && regnum < L0_REGNUM + 8)
650 addr = (frame1->prev->bottom
651 + (regnum - L0_REGNUM) * SPARC_INTREG_SIZE
653 else if (regnum >= O0_REGNUM && regnum < O0_REGNUM + 8)
654 addr = frame1->frame + (regnum - O0_REGNUM) * SPARC_INTREG_SIZE
655 - (FP_REGISTER_BYTES + 16 * SPARC_INTREG_SIZE);
657 else if (regnum >= FP0_REGNUM && regnum < FP0_REGNUM + 32)
658 addr = frame1->frame + (regnum - FP0_REGNUM) * 4
659 - (FP_REGISTER_BYTES);
660 #ifdef GDB_TARGET_IS_SPARC64
661 else if (regnum >= FP0_REGNUM + 32 && regnum < FP_MAX_REGNUM)
662 addr = frame1->frame + 32 * 4 + (regnum - FP0_REGNUM - 32) * 8
663 - (FP_REGISTER_BYTES);
665 #endif /* FP0_REGNUM */
666 else if (regnum >= Y_REGNUM && regnum < NUM_REGS)
667 addr = frame1->frame + (regnum - Y_REGNUM) * SPARC_INTREG_SIZE
668 - (FP_REGISTER_BYTES + 24 * SPARC_INTREG_SIZE);
670 else if (frame1->flat)
673 if (regnum == RP_REGNUM)
674 addr = frame1->pc_addr;
675 else if (regnum == I7_REGNUM)
676 addr = frame1->fp_addr;
679 CORE_ADDR func_start;
680 struct frame_saved_regs regs;
681 memset (®s, 0, sizeof (regs));
683 find_pc_partial_function (frame1->pc, NULL, &func_start, NULL);
684 examine_prologue (func_start, 0, frame1, ®s);
685 addr = regs.regs[regnum];
690 /* Normal frame. Local and In registers are saved on stack. */
691 if (regnum >= I0_REGNUM && regnum < I0_REGNUM + 8)
692 addr = (frame1->prev->bottom
693 + (regnum - I0_REGNUM) * SPARC_INTREG_SIZE
695 else if (regnum >= L0_REGNUM && regnum < L0_REGNUM + 8)
696 addr = (frame1->prev->bottom
697 + (regnum - L0_REGNUM) * SPARC_INTREG_SIZE
699 else if (regnum >= O0_REGNUM && regnum < O0_REGNUM + 8)
701 /* Outs become ins. */
702 get_saved_register (raw_buffer, optimized, addrp, frame1,
703 (regnum - O0_REGNUM + I0_REGNUM), lval);
709 frame1 = frame1->next;
715 if (regnum == SP_REGNUM)
717 if (raw_buffer != NULL)
719 /* Put it back in target format. */
720 store_address (raw_buffer, REGISTER_RAW_SIZE (regnum), addr);
726 if (raw_buffer != NULL)
727 read_memory (addr, raw_buffer, REGISTER_RAW_SIZE (regnum));
732 *lval = lval_register;
733 addr = REGISTER_BYTE (regnum);
734 if (raw_buffer != NULL)
735 read_register_gen (regnum, raw_buffer);
741 /* Push an empty stack frame, and record in it the current PC, regs, etc.
743 We save the non-windowed registers and the ins. The locals and outs
744 are new; they don't need to be saved. The i's and l's of
745 the last frame were already saved on the stack. */
747 /* Definitely see tm-sparc.h for more doc of the frame format here. */
749 #ifdef GDB_TARGET_IS_SPARC64
750 #define DUMMY_REG_SAVE_OFFSET (128 + 16)
752 #define DUMMY_REG_SAVE_OFFSET 0x60
755 /* See tm-sparc.h for how this is calculated. */
757 #define DUMMY_STACK_REG_BUF_SIZE \
758 (((8+8+8) * SPARC_INTREG_SIZE) + (32 * REGISTER_RAW_SIZE (FP0_REGNUM)))
760 #define DUMMY_STACK_REG_BUF_SIZE \
761 (((8+8+8) * SPARC_INTREG_SIZE) )
762 #endif /* FP0_REGNUM */
763 #define DUMMY_STACK_SIZE (DUMMY_STACK_REG_BUF_SIZE + DUMMY_REG_SAVE_OFFSET)
766 sparc_push_dummy_frame ()
768 CORE_ADDR sp, old_sp;
769 char register_temp[DUMMY_STACK_SIZE];
771 old_sp = sp = read_register (SP_REGNUM);
773 #ifdef GDB_TARGET_IS_SPARC64
774 /* FIXME: not sure what needs to be saved here. */
776 /* Y, PS, WIM, TBR, PC, NPC, FPS, CPS regs */
777 read_register_bytes (REGISTER_BYTE (Y_REGNUM), ®ister_temp[0],
778 REGISTER_RAW_SIZE (Y_REGNUM) * 8);
781 read_register_bytes (REGISTER_BYTE (O0_REGNUM),
782 ®ister_temp[8 * SPARC_INTREG_SIZE],
783 SPARC_INTREG_SIZE * 8);
785 read_register_bytes (REGISTER_BYTE (G0_REGNUM),
786 ®ister_temp[16 * SPARC_INTREG_SIZE],
787 SPARC_INTREG_SIZE * 8);
790 read_register_bytes (REGISTER_BYTE (FP0_REGNUM),
791 ®ister_temp[24 * SPARC_INTREG_SIZE],
793 #endif /* FP0_REGNUM */
795 sp -= DUMMY_STACK_SIZE;
797 write_register (SP_REGNUM, sp);
799 write_memory (sp + DUMMY_REG_SAVE_OFFSET, ®ister_temp[0],
800 DUMMY_STACK_REG_BUF_SIZE);
802 write_register (FP_REGNUM, old_sp);
804 /* Set return address register for the call dummy to the current PC. */
805 write_register (I7_REGNUM, read_pc() - 8);
808 /* sparc_frame_find_saved_regs (). This function is here only because
809 pop_frame uses it. Note there is an interesting corner case which
810 I think few ports of GDB get right--if you are popping a frame
811 which does not save some register that *is* saved by a more inner
812 frame (such a frame will never be a dummy frame because dummy
813 frames save all registers). Rewriting pop_frame to use
814 get_saved_register would solve this problem and also get rid of the
815 ugly duplication between sparc_frame_find_saved_regs and
818 Stores, into a struct frame_saved_regs,
819 the addresses of the saved registers of frame described by FRAME_INFO.
820 This includes special registers such as pc and fp saved in special
821 ways in the stack frame. sp is even more special:
822 the address we return for it IS the sp for the next frame.
824 Note that on register window machines, we are currently making the
825 assumption that window registers are being saved somewhere in the
826 frame in which they are being used. If they are stored in an
827 inferior frame, find_saved_register will break.
829 On the Sun 4, the only time all registers are saved is when
830 a dummy frame is involved. Otherwise, the only saved registers
831 are the LOCAL and IN registers which are saved as a result
832 of the "save/restore" opcodes. This condition is determined
833 by address rather than by value.
835 The "pc" is not stored in a frame on the SPARC. (What is stored
836 is a return address minus 8.) sparc_pop_frame knows how to
837 deal with that. Other routines might or might not.
839 See tm-sparc.h (PUSH_FRAME and friends) for CRITICAL information
840 about how this works. */
842 static void sparc_frame_find_saved_regs PARAMS ((struct frame_info *,
843 struct frame_saved_regs *));
846 sparc_frame_find_saved_regs (fi, saved_regs_addr)
847 struct frame_info *fi;
848 struct frame_saved_regs *saved_regs_addr;
851 CORE_ADDR frame_addr = FRAME_FP (fi);
854 fatal ("Bad frame info struct in FRAME_FIND_SAVED_REGS");
856 memset (saved_regs_addr, 0, sizeof (*saved_regs_addr));
858 if (fi->pc >= (fi->bottom ? fi->bottom :
859 read_register (SP_REGNUM))
860 && fi->pc <= FRAME_FP(fi))
862 /* Dummy frame. All but the window regs are in there somewhere. */
863 for (regnum = G1_REGNUM; regnum < G1_REGNUM+7; regnum++)
864 saved_regs_addr->regs[regnum] =
865 frame_addr + (regnum - G0_REGNUM) * SPARC_INTREG_SIZE
866 - (FP_REGISTER_BYTES + 8 * SPARC_INTREG_SIZE);
867 for (regnum = I0_REGNUM; regnum < I0_REGNUM+8; regnum++)
868 saved_regs_addr->regs[regnum] =
869 frame_addr + (regnum - I0_REGNUM) * SPARC_INTREG_SIZE
870 - (FP_REGISTER_BYTES + 16 * SPARC_INTREG_SIZE);
872 for (regnum = FP0_REGNUM; regnum < FP0_REGNUM + 32; regnum++)
873 saved_regs_addr->regs[regnum] =
874 frame_addr + (regnum - FP0_REGNUM) * 4
875 - (FP_REGISTER_BYTES);
876 #ifdef GDB_TARGET_IS_SPARC64
877 for (regnum = FP0_REGNUM + 32; regnum < FP_MAX_REGNUM; regnum++)
878 saved_regs_addr->regs[regnum] =
879 frame_addr + 32 * 4 + (regnum - FP0_REGNUM - 32) * 8
880 - (FP_REGISTER_BYTES);
882 #endif /* FP0_REGNUM */
883 for (regnum = Y_REGNUM; regnum < NUM_REGS; regnum++)
884 saved_regs_addr->regs[regnum] =
885 frame_addr + (regnum - Y_REGNUM) * SPARC_INTREG_SIZE - 0xe0;
886 - (FP_REGISTER_BYTES + 24 * SPARC_INTREG_SIZE);
887 frame_addr = fi->bottom ?
888 fi->bottom : read_register (SP_REGNUM);
892 CORE_ADDR func_start;
893 find_pc_partial_function (fi->pc, NULL, &func_start, NULL);
894 examine_prologue (func_start, 0, fi, saved_regs_addr);
896 /* Flat register window frame. */
897 saved_regs_addr->regs[RP_REGNUM] = fi->pc_addr;
898 saved_regs_addr->regs[I7_REGNUM] = fi->fp_addr;
902 /* Normal frame. Just Local and In registers */
903 frame_addr = fi->bottom ?
904 fi->bottom : read_register (SP_REGNUM);
905 for (regnum = L0_REGNUM; regnum < L0_REGNUM+8; regnum++)
906 saved_regs_addr->regs[regnum] =
907 (frame_addr + (regnum - L0_REGNUM) * SPARC_INTREG_SIZE
909 for (regnum = I0_REGNUM; regnum < I0_REGNUM+8; regnum++)
910 saved_regs_addr->regs[regnum] =
911 (frame_addr + (regnum - I0_REGNUM) * SPARC_INTREG_SIZE
918 saved_regs_addr->regs[O7_REGNUM] = fi->pc_addr;
922 /* Pull off either the next frame pointer or the stack pointer */
923 CORE_ADDR next_next_frame_addr =
926 read_register (SP_REGNUM));
927 for (regnum = O0_REGNUM; regnum < O0_REGNUM+8; regnum++)
928 saved_regs_addr->regs[regnum] =
929 (next_next_frame_addr
930 + (regnum - O0_REGNUM) * SPARC_INTREG_SIZE
934 /* Otherwise, whatever we would get from ptrace(GETREGS) is accurate */
935 saved_regs_addr->regs[SP_REGNUM] = FRAME_FP (fi);
938 /* Discard from the stack the innermost frame, restoring all saved registers.
940 Note that the values stored in fsr by get_frame_saved_regs are *in
941 the context of the called frame*. What this means is that the i
942 regs of fsr must be restored into the o regs of the (calling) frame that
943 we pop into. We don't care about the output regs of the calling frame,
944 since unless it's a dummy frame, it won't have any output regs in it.
946 We never have to bother with %l (local) regs, since the called routine's
947 locals get tossed, and the calling routine's locals are already saved
950 /* Definitely see tm-sparc.h for more doc of the frame format here. */
955 register struct frame_info *frame = get_current_frame ();
956 register CORE_ADDR pc;
957 struct frame_saved_regs fsr;
958 char raw_buffer[REGISTER_BYTES];
961 sparc_frame_find_saved_regs (frame, &fsr);
963 if (fsr.regs[FP0_REGNUM])
965 read_memory (fsr.regs[FP0_REGNUM], raw_buffer, FP_REGISTER_BYTES);
966 write_register_bytes (REGISTER_BYTE (FP0_REGNUM),
967 raw_buffer, FP_REGISTER_BYTES);
969 #ifndef GDB_TARGET_IS_SPARC64
970 if (fsr.regs[FPS_REGNUM])
972 read_memory (fsr.regs[FPS_REGNUM], raw_buffer, 4);
973 write_register_bytes (REGISTER_BYTE (FPS_REGNUM), raw_buffer, 4);
975 if (fsr.regs[CPS_REGNUM])
977 read_memory (fsr.regs[CPS_REGNUM], raw_buffer, 4);
978 write_register_bytes (REGISTER_BYTE (CPS_REGNUM), raw_buffer, 4);
981 #endif /* FP0_REGNUM */
982 if (fsr.regs[G1_REGNUM])
984 read_memory (fsr.regs[G1_REGNUM], raw_buffer, 7 * SPARC_INTREG_SIZE);
985 write_register_bytes (REGISTER_BYTE (G1_REGNUM), raw_buffer,
986 7 * SPARC_INTREG_SIZE);
991 /* Each register might or might not have been saved, need to test
993 for (regnum = L0_REGNUM; regnum < L0_REGNUM + 8; ++regnum)
994 if (fsr.regs[regnum])
995 write_register (regnum, read_memory_integer (fsr.regs[regnum],
997 for (regnum = I0_REGNUM; regnum < I0_REGNUM + 8; ++regnum)
998 if (fsr.regs[regnum])
999 write_register (regnum, read_memory_integer (fsr.regs[regnum],
1000 SPARC_INTREG_SIZE));
1002 /* Handle all outs except stack pointer (o0-o5; o7). */
1003 for (regnum = O0_REGNUM; regnum < O0_REGNUM + 6; ++regnum)
1004 if (fsr.regs[regnum])
1005 write_register (regnum, read_memory_integer (fsr.regs[regnum],
1006 SPARC_INTREG_SIZE));
1007 if (fsr.regs[O0_REGNUM + 7])
1008 write_register (O0_REGNUM + 7,
1009 read_memory_integer (fsr.regs[O0_REGNUM + 7],
1010 SPARC_INTREG_SIZE));
1012 write_register (SP_REGNUM, frame->frame);
1014 else if (fsr.regs[I0_REGNUM])
1018 char reg_temp[REGISTER_BYTES];
1020 read_memory (fsr.regs[I0_REGNUM], raw_buffer, 8 * SPARC_INTREG_SIZE);
1022 /* Get the ins and locals which we are about to restore. Just
1023 moving the stack pointer is all that is really needed, except
1024 store_inferior_registers is then going to write the ins and
1025 locals from the registers array, so we need to muck with the
1027 sp = fsr.regs[SP_REGNUM];
1028 read_memory (sp, reg_temp, SPARC_INTREG_SIZE * 16);
1030 /* Restore the out registers.
1031 Among other things this writes the new stack pointer. */
1032 write_register_bytes (REGISTER_BYTE (O0_REGNUM), raw_buffer,
1033 SPARC_INTREG_SIZE * 8);
1035 write_register_bytes (REGISTER_BYTE (L0_REGNUM), reg_temp,
1036 SPARC_INTREG_SIZE * 16);
1038 #ifndef GDB_TARGET_IS_SPARC64
1039 if (fsr.regs[PS_REGNUM])
1040 write_register (PS_REGNUM, read_memory_integer (fsr.regs[PS_REGNUM], 4));
1042 if (fsr.regs[Y_REGNUM])
1043 write_register (Y_REGNUM, read_memory_integer (fsr.regs[Y_REGNUM], REGISTER_RAW_SIZE (Y_REGNUM)));
1044 if (fsr.regs[PC_REGNUM])
1046 /* Explicitly specified PC (and maybe NPC) -- just restore them. */
1047 write_register (PC_REGNUM, read_memory_integer (fsr.regs[PC_REGNUM],
1048 REGISTER_RAW_SIZE (PC_REGNUM)));
1049 if (fsr.regs[NPC_REGNUM])
1050 write_register (NPC_REGNUM,
1051 read_memory_integer (fsr.regs[NPC_REGNUM],
1052 REGISTER_RAW_SIZE (NPC_REGNUM)));
1054 else if (frame->flat)
1057 pc = PC_ADJUST ((CORE_ADDR)
1058 read_memory_integer (frame->pc_addr,
1059 REGISTER_RAW_SIZE (PC_REGNUM)));
1062 /* I think this happens only in the innermost frame, if so then
1063 it is a complicated way of saying
1064 "pc = read_register (O7_REGNUM);". */
1065 char buf[MAX_REGISTER_RAW_SIZE];
1066 get_saved_register (buf, 0, 0, frame, O7_REGNUM, 0);
1067 pc = PC_ADJUST (extract_address
1068 (buf, REGISTER_RAW_SIZE (O7_REGNUM)));
1071 write_register (PC_REGNUM, pc);
1072 write_register (NPC_REGNUM, pc + 4);
1074 else if (fsr.regs[I7_REGNUM])
1076 /* Return address in %i7 -- adjust it, then restore PC and NPC from it */
1077 pc = PC_ADJUST ((CORE_ADDR) read_memory_integer (fsr.regs[I7_REGNUM],
1078 SPARC_INTREG_SIZE));
1079 write_register (PC_REGNUM, pc);
1080 write_register (NPC_REGNUM, pc + 4);
1082 flush_cached_frames ();
1085 /* On the Sun 4 under SunOS, the compile will leave a fake insn which
1086 encodes the structure size being returned. If we detect such
1087 a fake insn, step past it. */
1097 err = target_read_memory (pc + 8, buf, sizeof(long));
1098 insn = extract_unsigned_integer (buf, 4);
1099 if ((err == 0) && (insn & 0xffc00000) == 0)
1105 /* If pc is in a shared library trampoline, return its target.
1106 The SunOs 4.x linker rewrites the jump table entries for PIC
1107 compiled modules in the main executable to bypass the dynamic linker
1108 with jumps of the form
1111 and removes the corresponding jump table relocation entry in the
1112 dynamic relocations.
1113 find_solib_trampoline_target relies on the presence of the jump
1114 table relocation entry, so we have to detect these jump instructions
1118 sunos4_skip_trampoline_code (pc)
1121 unsigned long insn1;
1125 err = target_read_memory (pc, buf, 4);
1126 insn1 = extract_unsigned_integer (buf, 4);
1127 if (err == 0 && (insn1 & 0xffc00000) == 0x03000000)
1129 unsigned long insn2;
1131 err = target_read_memory (pc + 4, buf, 4);
1132 insn2 = extract_unsigned_integer (buf, 4);
1133 if (err == 0 && (insn2 & 0xffffe000) == 0x81c06000)
1135 CORE_ADDR target_pc = (insn1 & 0x3fffff) << 10;
1136 int delta = insn2 & 0x1fff;
1138 /* Sign extend the displacement. */
1141 return target_pc + delta;
1144 return find_solib_trampoline_target (pc);
1147 #ifdef USE_PROC_FS /* Target dependent support for /proc */
1149 /* The /proc interface divides the target machine's register set up into
1150 two different sets, the general register set (gregset) and the floating
1151 point register set (fpregset). For each set, there is an ioctl to get
1152 the current register set and another ioctl to set the current values.
1154 The actual structure passed through the ioctl interface is, of course,
1155 naturally machine dependent, and is different for each set of registers.
1156 For the sparc for example, the general register set is typically defined
1159 typedef int gregset_t[38];
1165 and the floating point set by:
1167 typedef struct prfpregset {
1170 double pr_dregs[16];
1175 u_char pr_q_entrysize;
1180 These routines provide the packing and unpacking of gregset_t and
1181 fpregset_t formatted data.
1185 /* Given a pointer to a general register set in /proc format (gregset_t *),
1186 unpack the register contents and supply them as gdb's idea of the current
1190 supply_gregset (gregsetp)
1191 prgregset_t *gregsetp;
1194 register prgreg_t *regp = (prgreg_t *) gregsetp;
1195 static char zerobuf[MAX_REGISTER_RAW_SIZE] = {0};
1197 /* GDB register numbers for Gn, On, Ln, In all match /proc reg numbers. */
1198 for (regi = G0_REGNUM ; regi <= I7_REGNUM ; regi++)
1200 supply_register (regi, (char *) (regp + regi));
1203 /* These require a bit more care. */
1204 supply_register (PS_REGNUM, (char *) (regp + R_PS));
1205 supply_register (PC_REGNUM, (char *) (regp + R_PC));
1206 supply_register (NPC_REGNUM,(char *) (regp + R_nPC));
1207 supply_register (Y_REGNUM, (char *) (regp + R_Y));
1209 /* Fill inaccessible registers with zero. */
1210 supply_register (WIM_REGNUM, zerobuf);
1211 supply_register (TBR_REGNUM, zerobuf);
1212 supply_register (CPS_REGNUM, zerobuf);
1216 fill_gregset (gregsetp, regno)
1217 prgregset_t *gregsetp;
1221 register prgreg_t *regp = (prgreg_t *) gregsetp;
1223 for (regi = 0 ; regi <= R_I7 ; regi++)
1225 if ((regno == -1) || (regno == regi))
1227 *(regp + regi) = *(int *) ®isters[REGISTER_BYTE (regi)];
1230 if ((regno == -1) || (regno == PS_REGNUM))
1232 *(regp + R_PS) = *(int *) ®isters[REGISTER_BYTE (PS_REGNUM)];
1234 if ((regno == -1) || (regno == PC_REGNUM))
1236 *(regp + R_PC) = *(int *) ®isters[REGISTER_BYTE (PC_REGNUM)];
1238 if ((regno == -1) || (regno == NPC_REGNUM))
1240 *(regp + R_nPC) = *(int *) ®isters[REGISTER_BYTE (NPC_REGNUM)];
1242 if ((regno == -1) || (regno == Y_REGNUM))
1244 *(regp + R_Y) = *(int *) ®isters[REGISTER_BYTE (Y_REGNUM)];
1248 #if defined (FP0_REGNUM)
1250 /* Given a pointer to a floating point register set in /proc format
1251 (fpregset_t *), unpack the register contents and supply them as gdb's
1252 idea of the current floating point register values. */
1255 supply_fpregset (fpregsetp)
1256 prfpregset_t *fpregsetp;
1261 for (regi = FP0_REGNUM ; regi < FP_MAX_REGNUM ; regi++)
1263 from = (char *) &fpregsetp->pr_fr.pr_regs[regi-FP0_REGNUM];
1264 supply_register (regi, from);
1266 supply_register (FPS_REGNUM, (char *) &(fpregsetp->pr_fsr));
1269 /* Given a pointer to a floating point register set in /proc format
1270 (fpregset_t *), update the register specified by REGNO from gdb's idea
1271 of the current floating point register set. If REGNO is -1, update
1273 /* ??? This will probably need some changes for sparc64. */
1276 fill_fpregset (fpregsetp, regno)
1277 prfpregset_t *fpregsetp;
1284 for (regi = FP0_REGNUM ; regi < FP_MAX_REGNUM ; regi++)
1286 if ((regno == -1) || (regno == regi))
1288 from = (char *) ®isters[REGISTER_BYTE (regi)];
1289 to = (char *) &fpregsetp->pr_fr.pr_regs[regi-FP0_REGNUM];
1290 memcpy (to, from, REGISTER_RAW_SIZE (regi));
1293 if ((regno == -1) || (regno == FPS_REGNUM))
1295 fpregsetp->pr_fsr = *(int *) ®isters[REGISTER_BYTE (FPS_REGNUM)];
1299 #endif /* defined (FP0_REGNUM) */
1301 #endif /* USE_PROC_FS */
1304 #ifdef GET_LONGJMP_TARGET
1306 /* Figure out where the longjmp will land. We expect that we have just entered
1307 longjmp and haven't yet setup the stack frame, so the args are still in the
1308 output regs. %o0 (O0_REGNUM) points at the jmp_buf structure from which we
1309 extract the pc (JB_PC) that we will land at. The pc is copied into ADDR.
1310 This routine returns true on success */
1313 get_longjmp_target (pc)
1317 #define LONGJMP_TARGET_SIZE 4
1318 char buf[LONGJMP_TARGET_SIZE];
1320 jb_addr = read_register (O0_REGNUM);
1322 if (target_read_memory (jb_addr + JB_PC * JB_ELEMENT_SIZE, buf,
1323 LONGJMP_TARGET_SIZE))
1326 *pc = extract_address (buf, LONGJMP_TARGET_SIZE);
1330 #endif /* GET_LONGJMP_TARGET */
1332 #ifdef STATIC_TRANSFORM_NAME
1333 /* SunPRO (3.0 at least), encodes the static variables. This is not
1334 related to C++ mangling, it is done for C too. */
1337 sunpro_static_transform_name (name)
1343 /* For file-local statics there will be a dollar sign, a bunch
1344 of junk (the contents of which match a string given in the
1345 N_OPT), a period and the name. For function-local statics
1346 there will be a bunch of junk (which seems to change the
1347 second character from 'A' to 'B'), a period, the name of the
1348 function, and the name. So just skip everything before the
1350 p = strrchr (name, '.');
1356 #endif /* STATIC_TRANSFORM_NAME */
1358 #ifdef GDB_TARGET_IS_SPARC64
1360 /* Utilities for printing registers.
1361 Page numbers refer to the SPARC Architecture Manual. */
1363 static void dump_ccreg PARAMS ((char *, int));
1366 dump_ccreg (reg, val)
1371 printf_unfiltered ("%s:%s,%s,%s,%s", reg,
1372 val & 8 ? "N" : "NN",
1373 val & 4 ? "Z" : "NZ",
1374 val & 2 ? "O" : "NO",
1375 val & 1 ? "C" : "NC"
1386 case 4 : return "ASI_NUCLEUS";
1387 case 0x0c : return "ASI_NUCLEUS_LITTLE";
1388 case 0x10 : return "ASI_AS_IF_USER_PRIMARY";
1389 case 0x11 : return "ASI_AS_IF_USER_SECONDARY";
1390 case 0x18 : return "ASI_AS_IF_USER_PRIMARY_LITTLE";
1391 case 0x19 : return "ASI_AS_IF_USER_SECONDARY_LITTLE";
1392 case 0x80 : return "ASI_PRIMARY";
1393 case 0x81 : return "ASI_SECONDARY";
1394 case 0x82 : return "ASI_PRIMARY_NOFAULT";
1395 case 0x83 : return "ASI_SECONDARY_NOFAULT";
1396 case 0x88 : return "ASI_PRIMARY_LITTLE";
1397 case 0x89 : return "ASI_SECONDARY_LITTLE";
1398 case 0x8a : return "ASI_PRIMARY_NOFAULT_LITTLE";
1399 case 0x8b : return "ASI_SECONDARY_NOFAULT_LITTLE";
1400 default : return NULL;
1404 /* PRINT_REGISTER_HOOK routine.
1405 Pretty print various registers. */
1406 /* FIXME: Would be nice if this did some fancy things for 32 bit sparc. */
1409 sparc_print_register_hook (regno)
1412 unsigned LONGEST val;
1414 /* Handle double/quad versions of lower 32 fp regs. */
1415 if (regno >= FP0_REGNUM && regno < FP0_REGNUM + 32
1416 && (regno & 1) == 0)
1420 if (!read_relative_register_raw_bytes (regno, value)
1421 && !read_relative_register_raw_bytes (regno + 1, value + 4))
1423 printf_unfiltered ("\t");
1424 print_floating (value, builtin_type_double, gdb_stdout);
1426 #if 0 /* FIXME: gdb doesn't handle long doubles */
1427 if ((regno & 3) == 0)
1429 if (!read_relative_register_raw_bytes (regno + 2, value + 8)
1430 && !read_relative_register_raw_bytes (regno + 3, value + 12))
1432 printf_unfiltered ("\t");
1433 print_floating (value, builtin_type_long_double, gdb_stdout);
1440 #if 0 /* FIXME: gdb doesn't handle long doubles */
1441 /* Print upper fp regs as long double if appropriate. */
1442 if (regno >= FP0_REGNUM + 32 && regno < FP_MAX_REGNUM
1443 /* We test for even numbered regs and not a multiple of 4 because
1444 the upper fp regs are recorded as doubles. */
1445 && (regno & 1) == 0)
1449 if (!read_relative_register_raw_bytes (regno, value)
1450 && !read_relative_register_raw_bytes (regno + 1, value + 8))
1452 printf_unfiltered ("\t");
1453 print_floating (value, builtin_type_long_double, gdb_stdout);
1459 /* FIXME: Some of these are priviledged registers.
1460 Not sure how they should be handled. */
1462 #define BITS(n, mask) ((int) (((val) >> (n)) & (mask)))
1464 val = read_register (regno);
1470 printf_unfiltered("\t");
1471 dump_ccreg ("xcc", val >> 4);
1472 printf_unfiltered(", ");
1473 dump_ccreg ("icc", val & 15);
1476 printf ("\tfef:%d, du:%d, dl:%d",
1477 BITS (2, 1), BITS (1, 1), BITS (0, 1));
1481 static char *fcc[4] = { "=", "<", ">", "?" };
1482 static char *rd[4] = { "N", "0", "+", "-" };
1483 /* Long, yes, but I'd rather leave it as is and use a wide screen. */
1484 printf ("\t0:%s, 1:%s, 2:%s, 3:%s, rd:%s, tem:%d, ns:%d, ver:%d, ftt:%d, qne:%d, aexc:%d, cexc:%d",
1485 fcc[BITS (10, 3)], fcc[BITS (32, 3)],
1486 fcc[BITS (34, 3)], fcc[BITS (36, 3)],
1487 rd[BITS (30, 3)], BITS (23, 31), BITS (22, 1), BITS (17, 7),
1488 BITS (14, 7), BITS (13, 1), BITS (5, 31), BITS (0, 31));
1493 char *asi = decode_asi (val);
1495 printf ("\t%s", asi);
1499 printf ("\tmanuf:%d, impl:%d, mask:%d, maxtl:%d, maxwin:%d",
1500 BITS (48, 0xffff), BITS (32, 0xffff),
1501 BITS (24, 0xff), BITS (8, 0xff), BITS (0, 31));
1503 case PSTATE_REGNUM :
1505 static char *mm[4] = { "tso", "pso", "rso", "?" };
1506 printf ("\tcle:%d, tle:%d, mm:%s, red:%d, pef:%d, am:%d, priv:%d, ie:%d, ag:%d",
1507 BITS (9, 1), BITS (8, 1), mm[BITS (6, 3)], BITS (5, 1),
1508 BITS (4, 1), BITS (3, 1), BITS (2, 1), BITS (1, 1),
1512 case TSTATE_REGNUM :
1513 /* FIXME: print all 4? */
1516 /* FIXME: print all 4? */
1519 /* FIXME: print all 4? */
1522 /* FIXME: print all 4? */
1524 case WSTATE_REGNUM :
1525 printf ("\tother:%d, normal:%d", BITS (3, 7), BITS (0, 7));
1528 printf ("\t%d", BITS (0, 31));
1530 case CANSAVE_REGNUM :
1531 printf ("\t%-2d before spill", BITS (0, 31));
1533 case CANRESTORE_REGNUM :
1534 printf ("\t%-2d before fill", BITS (0, 31));
1536 case CLEANWIN_REGNUM :
1537 printf ("\t%-2d before clean", BITS (0, 31));
1539 case OTHERWIN_REGNUM :
1540 printf ("\t%d", BITS (0, 31));
1550 _initialize_sparc_tdep ()
1552 tm_print_insn = print_insn_sparc;
1553 tm_print_insn_info.mach = TM_PRINT_INSN_MACH; /* Selects sparc/sparclite */