1 /* Target-dependent code for Xilinx MicroBlaze.
3 Copyright 2009, 2010 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 3 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, see <http://www.gnu.org/licenses/>. */
21 #include "arch-utils.h"
24 #include "trad-frame.h"
28 #include "breakpoint.h"
33 #include "frame-base.h"
34 #include "frame-unwind.h"
35 #include "dwarf2-frame.h"
38 #include "gdb_assert.h"
39 #include "gdb_string.h"
40 #include "target-descriptions.h"
41 #include "opcodes/microblaze-opcm.h"
42 #include "opcodes/microblaze-dis.h"
43 #include "microblaze-tdep.h"
45 /* Instruction macros used for analyzing the prologue. */
46 /* This set of instruction macros need to be changed whenever the
47 prologue generated by the compiler could have more instructions or
48 different type of instructions.
49 This set also needs to be verified if it is complete. */
50 #define IS_RETURN(op) (op == rtsd || op == rtid)
51 #define IS_UPDATE_SP(op, rd, ra) \
52 ((op == addik || op == addi) && rd == REG_SP && ra == REG_SP)
53 #define IS_SPILL_SP(op, rd, ra) \
54 ((op == swi || op == sw) && rd == REG_SP && ra == REG_SP)
55 #define IS_SPILL_REG(op, rd, ra) \
56 ((op == swi || op == sw) && rd != REG_SP && ra == REG_SP)
57 #define IS_ALSO_SPILL_REG(op, rd, ra, rb) \
58 ((op == swi || op == sw) && rd != REG_SP && ra == 0 && rb == REG_SP)
59 #define IS_SETUP_FP(op, ra, rb) \
60 ((op == add || op == addik || op == addk) && ra == REG_SP && rb == 0)
61 #define IS_SPILL_REG_FP(op, rd, ra, fpregnum) \
62 ((op == swi || op == sw) && rd != REG_SP && ra == fpregnum && ra != 0)
63 #define IS_SAVE_HIDDEN_PTR(op, rd, ra, rb) \
64 ((op == add || op == addik) && ra == MICROBLAZE_FIRST_ARGREG && rb == 0)
66 /* The registers of the Xilinx microblaze processor. */
68 static const char *microblaze_register_names[] =
70 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
71 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
72 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
73 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
74 "rpc", "rmsr", "rear", "resr", "rfsr", "rbtr",
75 "rpvr0", "rpvr1", "rpvr2", "rpvr3", "rpvr4", "rpvr5", "rpvr6",
76 "rpvr7", "rpvr8", "rpvr9", "rpvr10", "rpvr11",
77 "redr", "rpid", "rzpr", "rtlbx", "rtlbsx", "rtlblo", "rtlbhi"
80 #define MICROBLAZE_NUM_REGS ARRAY_SIZE (microblaze_register_names)
82 static int microblaze_debug_flag = 0;
85 microblaze_debug (const char *fmt, ...)
87 if (microblaze_debug_flag)
92 printf_unfiltered ("MICROBLAZE: ");
93 vprintf_unfiltered (fmt, args);
98 /* Return the name of register REGNUM. */
101 microblaze_register_name (struct gdbarch *gdbarch, int regnum)
103 if (regnum >= 0 && regnum < MICROBLAZE_NUM_REGS)
104 return microblaze_register_names[regnum];
109 microblaze_register_type (struct gdbarch *gdbarch, int regnum)
111 if (regnum == MICROBLAZE_SP_REGNUM)
112 return builtin_type (gdbarch)->builtin_data_ptr;
114 if (regnum == MICROBLAZE_PC_REGNUM)
115 return builtin_type (gdbarch)->builtin_func_ptr;
117 return builtin_type (gdbarch)->builtin_int;
121 /* Fetch the instruction at PC. */
124 microblaze_fetch_instruction (CORE_ADDR pc)
126 enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch);
129 /* If we can't read the instruction at PC, return zero. */
130 if (target_read_memory (pc, buf, sizeof (buf)))
133 return extract_unsigned_integer (buf, 4, byte_order);
138 microblaze_push_dummy_code (struct gdbarch *gdbarch, CORE_ADDR sp,
140 struct value **args, int nargs,
141 struct type *value_type,
142 CORE_ADDR *real_pc, CORE_ADDR *bp_addr,
143 struct regcache *regcache)
145 error (_("push_dummy_code not implemented"));
151 microblaze_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
152 struct regcache *regcache, CORE_ADDR bp_addr,
153 int nargs, struct value **args, CORE_ADDR sp,
154 int struct_return, CORE_ADDR struct_addr)
156 error (_("store_arguments not implemented"));
160 static const gdb_byte *
161 microblaze_breakpoint_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pc,
164 static gdb_byte break_insn[] = MICROBLAZE_BREAKPOINT;
166 *len = sizeof (break_insn);
170 /* Allocate and initialize a frame cache. */
172 static struct microblaze_frame_cache *
173 microblaze_alloc_frame_cache (void)
175 struct microblaze_frame_cache *cache;
178 cache = FRAME_OBSTACK_ZALLOC (struct microblaze_frame_cache);
184 /* Frameless until proven otherwise. */
185 cache->frameless_p = 1;
190 /* The base of the current frame is actually in the stack pointer.
191 This happens when there is no frame pointer (microblaze ABI does not
192 require a frame pointer) or when we're stopped in the prologue or
193 epilogue itself. In these cases, microblaze_analyze_prologue will need
194 to update fi->frame before returning or analyzing the register
195 save instructions. */
196 #define MICROBLAZE_MY_FRAME_IN_SP 0x1
198 /* The base of the current frame is in a frame pointer register.
199 This register is noted in frame_extra_info->fp_regnum.
201 Note that the existance of an FP might also indicate that the
202 function has called alloca. */
203 #define MICROBLAZE_MY_FRAME_IN_FP 0x2
205 /* Function prologues on the Xilinx microblaze processors consist of:
207 - adjustments to the stack pointer (r1) (addi r1, r1, imm)
208 - making a copy of r1 into another register (a "frame" pointer)
210 - store word/multiples that use r1 or the frame pointer as the
211 base address (swi r?, r1, imm OR swi r?, fp, imm)
213 Note that microblaze really doesn't have a real frame pointer.
214 Instead, the compiler may copy the SP into a register (usually
215 r19) to act as an arg pointer. For our target-dependent purposes,
216 the frame info's "frame" member will be the beginning of the
217 frame. The SP could, in fact, point below this.
219 The prologue ends when an instruction fails to meet either of
222 /* Analyze the prologue to determine where registers are saved,
223 the end of the prologue, etc. Return the address of the first line
224 of "real" code (i.e., the end of the prologue). */
227 microblaze_analyze_prologue (struct gdbarch *gdbarch, CORE_ADDR pc,
228 CORE_ADDR current_pc,
229 struct microblaze_frame_cache *cache)
232 CORE_ADDR func_addr, func_end, addr, stop, prologue_end_addr = 0;
234 int rn, rd, ra, rb, imm;
235 enum microblaze_instr op;
237 int save_hidden_pointer_found = 0;
238 int non_stack_instruction_found = 0;
240 /* Find the start of this function. */
241 find_pc_partial_function (pc, &name, &func_addr, &func_end);
248 /* Initialize info about frame. */
249 cache->framesize = 0;
250 cache->fp_regnum = MICROBLAZE_SP_REGNUM;
251 cache->frameless_p = 1;
253 /* Start decoding the prologue. We start by checking two special cases:
255 1. We're about to return
256 2. We're at the first insn of the prologue.
258 If we're about to return, our frame has already been deallocated.
259 If we are stopped at the first instruction of a prologue,
260 then our frame has not yet been set up. */
262 /* Get the first insn from memory. */
264 insn = microblaze_fetch_instruction (pc);
265 op = microblaze_decode_insn (insn, &rd, &ra, &rb, &imm);
270 /* Start at beginning of function and analyze until we get to the
271 current pc, or the end of the function, whichever is first. */
272 stop = (current_pc < func_end ? current_pc : func_end);
274 microblaze_debug ("Scanning prologue: name=%s, func_addr=%s, stop=%s\n",
275 name, paddress (gdbarch, func_addr),
276 paddress (gdbarch, stop));
278 for (addr = func_addr; addr < stop; addr += INST_WORD_SIZE)
280 insn = microblaze_fetch_instruction (addr);
281 op = microblaze_decode_insn (insn, &rd, &ra, &rb, &imm);
282 microblaze_debug ("%s %08lx\n", paddress (gdbarch, pc), insn);
284 /* This code is very sensitive to what functions are present in the
285 prologue. It assumes that the (addi, addik, swi, sw) can be the
286 only instructions in the prologue. */
287 if (IS_UPDATE_SP(op, rd, ra))
289 microblaze_debug ("got addi r1,r1,%d; contnuing\n", imm);
290 if (cache->framesize)
291 break; /* break if framesize already computed. */
292 cache->framesize = -imm; /* stack grows towards low memory. */
293 cache->frameless_p = 0; /* Frame found. */
294 save_hidden_pointer_found = 0;
295 non_stack_instruction_found = 0;
298 else if (IS_SPILL_SP(op, rd, ra))
300 /* Spill stack pointer. */
301 cache->register_offsets[rd] = imm; /* SP spilled before updating. */
303 microblaze_debug ("swi r1 r1 %d, continuing\n", imm);
304 save_hidden_pointer_found = 0;
305 if (!cache->framesize)
306 non_stack_instruction_found = 0;
309 else if (IS_SPILL_REG(op, rd, ra))
311 /* Spill register. */
312 cache->register_offsets[rd] = imm - cache->framesize;
314 microblaze_debug ("swi %d r1 %d, continuing\n", rd, imm);
315 save_hidden_pointer_found = 0;
316 if (!cache->framesize)
317 non_stack_instruction_found = 0;
320 else if (IS_ALSO_SPILL_REG(op, rd, ra, rb))
322 /* Spill register. */
323 cache->register_offsets[rd] = 0 - cache->framesize;
325 microblaze_debug ("sw %d r0 r1, continuing\n", rd);
326 save_hidden_pointer_found = 0;
327 if (!cache->framesize)
328 non_stack_instruction_found = 0;
331 else if (IS_SETUP_FP(op, ra, rb))
333 /* We have a frame pointer. Note the register which is
334 acting as the frame pointer. */
335 flags |= MICROBLAZE_MY_FRAME_IN_FP;
336 flags &= ~MICROBLAZE_MY_FRAME_IN_SP;
337 cache->fp_regnum = rd;
338 microblaze_debug ("Found a frame pointer: r%d\n", cache->fp_regnum);
339 save_hidden_pointer_found = 0;
340 if (!cache->framesize)
341 non_stack_instruction_found = 0;
344 else if (IS_SPILL_REG_FP(op, rd, ra, cache->fp_regnum))
346 /* reg spilled after updating. */
347 cache->register_offsets[rd] = imm - cache->framesize;
349 microblaze_debug ("swi %d %d %d, continuing\n", rd, ra, imm);
350 save_hidden_pointer_found = 0;
351 if (!cache->framesize)
352 non_stack_instruction_found = 0;
355 else if (IS_SAVE_HIDDEN_PTR(op, rd, ra, rb))
357 /* If the first argument is a hidden pointer to the area where the
358 return structure is to be saved, then it is saved as part of the
361 microblaze_debug ("add %d %d %d, continuing\n", rd, ra, rb);
362 save_hidden_pointer_found = 1;
363 if (!cache->framesize)
364 non_stack_instruction_found = 0;
368 /* As a result of the modification in the next step where we continue
369 to analyze the prologue till we reach a control flow instruction,
370 we need another variable to store when exactly a non-stack
371 instruction was encountered, which is the current definition
373 if (!non_stack_instruction_found)
374 prologue_end_addr = addr;
375 non_stack_instruction_found = 1;
377 /* When optimizations are enabled, it is not guaranteed that prologue
378 instructions are not mixed in with other instructions from the
379 program. Some programs show this behavior at -O2. This can be
380 avoided by adding -fno-schedule-insns2 switch as of now (edk 8.1)
381 In such cases, we scan the function until we see the first control
385 unsigned op = (unsigned)insn >> 26;
387 /* continue if not control flow (branch, return). */
388 if (op != 0x26 && op != 0x27 && op != 0x2d && op != 0x2e && op != 0x2f)
391 continue; /* continue if imm. */
394 /* This is not a prologue insn, so stop here. */
395 microblaze_debug ("insn is not a prologue insn -- ending scan\n");
399 microblaze_debug ("done analyzing prologue\n");
400 microblaze_debug ("prologue end = 0x%x\n", (int) addr);
402 /* If the last instruction was an add rd, r5, r0 then don't count it as
403 part of the prologue. */
404 if (save_hidden_pointer_found)
405 prologue_end_addr -= INST_WORD_SIZE;
407 return prologue_end_addr;
411 microblaze_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
416 frame_unwind_register (next_frame, MICROBLAZE_PC_REGNUM, buf);
417 pc = extract_typed_address (buf, builtin_type (gdbarch)->builtin_func_ptr);
418 /* For sentinel frame, return address is actual PC. For other frames,
419 return address is pc+8. This is a workaround because gcc does not
420 generate correct return address in CIE. */
421 if (frame_relative_level (next_frame) >= 0)
426 /* Return PC of first real instruction of the function starting at
430 microblaze_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc)
432 struct symtab_and_line sal;
433 CORE_ADDR func_start, func_end, ostart_pc;
434 struct microblaze_frame_cache cache;
436 /* This is the preferred method, find the end of the prologue by
437 using the debugging information. Debugging info does not always
438 give the right answer since parameters are stored on stack after this.
439 Always analyze the prologue. */
440 if (find_pc_partial_function (start_pc, NULL, &func_start, &func_end))
442 sal = find_pc_line (func_start, 0);
444 if (sal.end < func_end
445 && start_pc <= sal.end)
449 ostart_pc = microblaze_analyze_prologue (gdbarch, func_start, 0xffffffffUL,
452 if (ostart_pc > start_pc)
459 struct microblaze_frame_cache *
460 microblaze_frame_cache (struct frame_info *next_frame, void **this_cache)
462 struct microblaze_frame_cache *cache;
463 struct gdbarch *gdbarch = get_frame_arch (next_frame);
464 CORE_ADDR func, pc, fp;
470 cache = microblaze_alloc_frame_cache ();
472 cache->saved_regs = trad_frame_alloc_saved_regs (next_frame);
474 /* Clear offsets to saved regs in frame. */
475 for (rn = 0; rn < gdbarch_num_regs (gdbarch); rn++)
476 cache->register_offsets[rn] = -1;
478 func = get_frame_func (next_frame);
480 cache->pc = get_frame_address_in_block (next_frame);
486 microblaze_frame_this_id (struct frame_info *next_frame, void **this_cache,
487 struct frame_id *this_id)
489 struct microblaze_frame_cache *cache =
490 microblaze_frame_cache (next_frame, this_cache);
492 /* This marks the outermost frame. */
493 if (cache->base == 0)
496 (*this_id) = frame_id_build (cache->base, cache->pc);
499 static struct value *
500 microblaze_frame_prev_register (struct frame_info *this_frame,
501 void **this_cache, int regnum)
503 struct microblaze_frame_cache *cache =
504 microblaze_frame_cache (this_frame, this_cache);
506 if (cache->frameless_p)
508 if (regnum == MICROBLAZE_PC_REGNUM)
510 if (regnum == MICROBLAZE_SP_REGNUM)
512 return trad_frame_get_prev_register (this_frame, cache->saved_regs, regnum);
515 return trad_frame_get_prev_register (this_frame, cache->saved_regs,
520 static const struct frame_unwind microblaze_frame_unwind =
523 microblaze_frame_this_id,
524 microblaze_frame_prev_register,
526 default_frame_sniffer
530 microblaze_frame_base_address (struct frame_info *next_frame, void **this_cache)
532 struct microblaze_frame_cache *cache =
533 microblaze_frame_cache (next_frame, this_cache);
538 static const struct frame_base microblaze_frame_base =
540 µblaze_frame_unwind,
541 microblaze_frame_base_address,
542 microblaze_frame_base_address,
543 microblaze_frame_base_address
546 /* Extract from an array REGBUF containing the (raw) register state, a
547 function return value of TYPE, and copy that into VALBUF. */
549 microblaze_extract_return_value (struct type *type, struct regcache *regcache,
554 /* Copy the return value (starting) in RETVAL_REGNUM to VALBUF. */
555 switch (TYPE_LENGTH (type))
557 case 1: /* return last byte in the register. */
558 regcache_cooked_read (regcache, MICROBLAZE_RETVAL_REGNUM, buf);
559 memcpy(valbuf, buf + MICROBLAZE_REGISTER_SIZE - 1, 1);
561 case 2: /* return last 2 bytes in register. */
562 memcpy(valbuf, buf + MICROBLAZE_REGISTER_SIZE - 2, 2);
564 case 4: /* for sizes 4 or 8, copy the required length. */
566 regcache_cooked_read (regcache, MICROBLAZE_RETVAL_REGNUM, buf);
567 regcache_cooked_read (regcache, MICROBLAZE_RETVAL_REGNUM+1, buf+4);
568 memcpy (valbuf, buf, TYPE_LENGTH (type));
571 internal_error (__FILE__, __LINE__,
572 _("Unsupported return value size requested"));
576 /* Store the return value in VALBUF (of type TYPE) where the caller
579 Integers up to four bytes are stored in r3.
581 Longs are stored in r3 (most significant word) and r4 (least
584 Small structures are always returned on stack.
588 microblaze_store_return_value (struct type *type, struct regcache *regcache,
589 const gdb_byte *valbuf)
591 int len = TYPE_LENGTH (type);
594 memset (buf, 0, sizeof(buf));
596 /* Integral and pointer return values. */
600 gdb_assert (len == 8);
601 memcpy (buf, valbuf, 8);
602 regcache_cooked_write (regcache, MICROBLAZE_RETVAL_REGNUM+1, buf + 4);
605 /* ??? Do we need to do any sign-extension here? */
606 memcpy (buf + 4 - len, valbuf, len);
608 regcache_cooked_write (regcache, MICROBLAZE_RETVAL_REGNUM, buf);
611 static enum return_value_convention
612 microblaze_return_value (struct gdbarch *gdbarch, struct type *func_type,
613 struct type *type, struct regcache *regcache,
614 gdb_byte *readbuf, const gdb_byte *writebuf)
617 microblaze_extract_return_value (type, regcache, readbuf);
619 microblaze_store_return_value (type, regcache, writebuf);
621 return RETURN_VALUE_REGISTER_CONVENTION;
625 microblaze_stabs_argument_has_addr (struct gdbarch *gdbarch, struct type *type)
627 return (TYPE_LENGTH (type) == 16);
631 microblaze_write_pc (struct regcache *regcache, CORE_ADDR pc)
633 regcache_cooked_write_unsigned (regcache, MICROBLAZE_PC_REGNUM, pc);
636 static int dwarf2_to_reg_map[78] =
637 { 0 /* r0 */, 1 /* r1 */, 2 /* r2 */, 3 /* r3 */, /* 0- 3 */
638 4 /* r4 */, 5 /* r5 */, 6 /* r6 */, 7 /* r7 */, /* 4- 7 */
639 8 /* r8 */, 9 /* r9 */, 10 /* r10 */, 11 /* r11 */, /* 8-11 */
640 12 /* r12 */, 13 /* r13 */, 14 /* r14 */, 15 /* r15 */, /* 12-15 */
641 16 /* r16 */, 17 /* r17 */, 18 /* r18 */, 19 /* r19 */, /* 16-19 */
642 20 /* r20 */, 21 /* r21 */, 22 /* r22 */, 23 /* r23 */, /* 20-23 */
643 24 /* r24 */, 25 /* r25 */, 26 /* r26 */, 27 /* r27 */, /* 24-25 */
644 28 /* r28 */, 29 /* r29 */, 30 /* r30 */, 31 /* r31 */, /* 28-31 */
645 -1 /* $f0 */, -1 /* $f1 */, -1 /* $f2 */, -1 /* $f3 */, /* 32-35 */
646 -1 /* $f4 */, -1 /* $f5 */, -1 /* $f6 */, -1 /* $f7 */, /* 36-39 */
647 -1 /* $f8 */, -1 /* $f9 */, -1 /* $f10 */, -1 /* $f11 */, /* 40-43 */
648 -1 /* $f12 */, -1 /* $f13 */, -1 /* $f14 */, -1 /* $f15 */, /* 44-47 */
649 -1 /* $f16 */, -1 /* $f17 */, -1 /* $f18 */, -1 /* $f19 */, /* 48-51 */
650 -1 /* $f20 */, -1 /* $f21 */, -1 /* $f22 */, -1 /* $f23 */, /* 52-55 */
651 -1 /* $f24 */, -1 /* $f25 */, -1 /* $f26 */, -1 /* $f27 */, /* 56-59 */
652 -1 /* $f28 */, -1 /* $f29 */, -1 /* $f30 */, -1 /* $f31 */, /* 60-63 */
653 -1 /* hi */, -1 /* lo */, -1 /* accum*/, 33 /* rmsr */, /* 64-67 */
654 -1 /* $fcc1*/, -1 /* $fcc2*/, -1 /* $fcc3*/, -1 /* $fcc4*/, /* 68-71 */
655 -1 /* $fcc5*/, -1 /* $fcc6*/, -1 /* $fcc7*/, -1 /* $ap */, /* 72-75 */
656 -1 /* $rap */, -1 /* $frp */ /* 76-77 */
660 microblaze_dwarf2_reg_to_regnum (struct gdbarch *gdbarch, int reg)
662 gdb_assert (reg < sizeof (dwarf2_to_reg_map));
663 return dwarf2_to_reg_map[reg];
666 static struct gdbarch *
667 microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
669 struct gdbarch_tdep *tdep;
670 struct gdbarch *gdbarch;
672 /* If there is already a candidate, use it. */
673 arches = gdbarch_list_lookup_by_info (arches, &info);
675 return arches->gdbarch;
677 /* Allocate space for the new architecture. */
678 tdep = XMALLOC (struct gdbarch_tdep);
679 gdbarch = gdbarch_alloc (&info, tdep);
681 set_gdbarch_long_double_bit (gdbarch, 128);
683 set_gdbarch_num_regs (gdbarch, MICROBLAZE_NUM_REGS);
684 set_gdbarch_register_name (gdbarch, microblaze_register_name);
685 set_gdbarch_register_type (gdbarch, microblaze_register_type);
687 /* Register numbers of various important registers. */
688 set_gdbarch_sp_regnum (gdbarch, MICROBLAZE_SP_REGNUM);
689 set_gdbarch_pc_regnum (gdbarch, MICROBLAZE_PC_REGNUM);
691 /* Map Dwarf2 registers to GDB registers. */
692 set_gdbarch_dwarf2_reg_to_regnum (gdbarch, microblaze_dwarf2_reg_to_regnum);
694 /* Call dummy code. */
695 set_gdbarch_call_dummy_location (gdbarch, ON_STACK);
696 set_gdbarch_push_dummy_code (gdbarch, microblaze_push_dummy_code);
697 set_gdbarch_push_dummy_call (gdbarch, microblaze_push_dummy_call);
699 set_gdbarch_return_value (gdbarch, microblaze_return_value);
700 set_gdbarch_stabs_argument_has_addr
701 (gdbarch, microblaze_stabs_argument_has_addr);
703 set_gdbarch_skip_prologue (gdbarch, microblaze_skip_prologue);
705 /* Stack grows downward. */
706 set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
708 set_gdbarch_breakpoint_from_pc (gdbarch, microblaze_breakpoint_from_pc);
710 set_gdbarch_frame_args_skip (gdbarch, 8);
712 set_gdbarch_print_insn (gdbarch, print_insn_microblaze);
714 set_gdbarch_write_pc (gdbarch, microblaze_write_pc);
716 set_gdbarch_unwind_pc (gdbarch, microblaze_unwind_pc);
718 frame_base_set_default (gdbarch, µblaze_frame_base);
720 /* Hook in ABI-specific overrides, if they have been registered. */
721 gdbarch_init_osabi (info, gdbarch);
723 /* Unwind the frame. */
724 dwarf2_append_unwinders (gdbarch);
725 frame_unwind_append_unwinder (gdbarch, µblaze_frame_unwind);
726 frame_base_append_sniffer (gdbarch, dwarf2_frame_base_sniffer);
731 /* Provide a prototype to silence -Wmissing-prototypes. */
732 void _initialize_microblaze_tdep (void);
735 _initialize_microblaze_tdep (void)
737 register_gdbarch_init (bfd_arch_microblaze, microblaze_gdbarch_init);
739 /* Debug this files internals. */
740 add_setshow_zinteger_cmd ("microblaze", class_maintenance,
741 µblaze_debug_flag, _("\
742 Set microblaze debugging."), _("\
743 Show microblaze debugging."), _("\
744 When non-zero, microblaze specific debugging is enabled."),
747 &setdebuglist, &showdebuglist);