* tracepoint.c (trace_save): Call the writer's start method.
[deliverable/binutils-gdb.git] / gdb / microblaze-tdep.c
CommitLineData
2d1c1221
ME
1/* Target-dependent code for Xilinx MicroBlaze.
2
0b1afbb3 3 Copyright (C) 2009-2013 Free Software Foundation, Inc.
2d1c1221
ME
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
19
20#include "defs.h"
21#include "arch-utils.h"
22#include "dis-asm.h"
23#include "frame.h"
24#include "trad-frame.h"
25#include "symtab.h"
26#include "value.h"
27#include "gdbcmd.h"
28#include "breakpoint.h"
29#include "inferior.h"
30#include "regcache.h"
31#include "target.h"
32#include "frame.h"
33#include "frame-base.h"
34#include "frame-unwind.h"
35#include "dwarf2-frame.h"
36#include "osabi.h"
37
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"
44\f
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) \
025bb325 52 ((op == addik || op == addi) && rd == REG_SP && ra == REG_SP)
2d1c1221 53#define IS_SPILL_SP(op, rd, ra) \
025bb325 54 ((op == swi || op == sw) && rd == REG_SP && ra == REG_SP)
2d1c1221 55#define IS_SPILL_REG(op, rd, ra) \
025bb325 56 ((op == swi || op == sw) && rd != REG_SP && ra == REG_SP)
2d1c1221 57#define IS_ALSO_SPILL_REG(op, rd, ra, rb) \
025bb325 58 ((op == swi || op == sw) && rd != REG_SP && ra == 0 && rb == REG_SP)
2d1c1221 59#define IS_SETUP_FP(op, ra, rb) \
025bb325 60 ((op == add || op == addik || op == addk) && ra == REG_SP && rb == 0)
2d1c1221 61#define IS_SPILL_REG_FP(op, rd, ra, fpregnum) \
025bb325 62 ((op == swi || op == sw) && rd != REG_SP && ra == fpregnum && ra != 0)
2d1c1221 63#define IS_SAVE_HIDDEN_PTR(op, rd, ra, rb) \
025bb325 64 ((op == add || op == addik) && ra == MICROBLAZE_FIRST_ARGREG && rb == 0)
2d1c1221 65
2d1c1221
ME
66/* The registers of the Xilinx microblaze processor. */
67
68static const char *microblaze_register_names[] =
69{
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"
78};
79
80#define MICROBLAZE_NUM_REGS ARRAY_SIZE (microblaze_register_names)
81\f
ccce17b0 82static unsigned int microblaze_debug_flag = 0;
2d1c1221 83
693be288 84static void
2d1c1221
ME
85microblaze_debug (const char *fmt, ...)
86{
87 if (microblaze_debug_flag)
88 {
89 va_list args;
90
91 va_start (args, fmt);
92 printf_unfiltered ("MICROBLAZE: ");
93 vprintf_unfiltered (fmt, args);
94 va_end (args);
95 }
96}
97\f
98/* Return the name of register REGNUM. */
99
100static const char *
101microblaze_register_name (struct gdbarch *gdbarch, int regnum)
102{
103 if (regnum >= 0 && regnum < MICROBLAZE_NUM_REGS)
104 return microblaze_register_names[regnum];
105 return NULL;
106}
107
108static struct type *
109microblaze_register_type (struct gdbarch *gdbarch, int regnum)
110{
111 if (regnum == MICROBLAZE_SP_REGNUM)
112 return builtin_type (gdbarch)->builtin_data_ptr;
113
114 if (regnum == MICROBLAZE_PC_REGNUM)
115 return builtin_type (gdbarch)->builtin_func_ptr;
116
117 return builtin_type (gdbarch)->builtin_int;
118}
119
120\f
121/* Fetch the instruction at PC. */
122
693be288 123static unsigned long
2d1c1221
ME
124microblaze_fetch_instruction (CORE_ADDR pc)
125{
f5656ead 126 enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
2d1c1221
ME
127 gdb_byte buf[4];
128
129 /* If we can't read the instruction at PC, return zero. */
130 if (target_read_memory (pc, buf, sizeof (buf)))
131 return 0;
132
133 return extract_unsigned_integer (buf, 4, byte_order);
134}
135\f
136
137static CORE_ADDR
138microblaze_push_dummy_code (struct gdbarch *gdbarch, CORE_ADDR sp,
139 CORE_ADDR funcaddr,
140 struct value **args, int nargs,
141 struct type *value_type,
142 CORE_ADDR *real_pc, CORE_ADDR *bp_addr,
143 struct regcache *regcache)
144{
145 error (_("push_dummy_code not implemented"));
146 return sp;
147}
148
149
150static CORE_ADDR
151microblaze_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)
155{
156 error (_("store_arguments not implemented"));
157 return sp;
158}
159
160static const gdb_byte *
161microblaze_breakpoint_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pc,
162 int *len)
163{
164 static gdb_byte break_insn[] = MICROBLAZE_BREAKPOINT;
165
166 *len = sizeof (break_insn);
167 return break_insn;
168}
169\f
170/* Allocate and initialize a frame cache. */
171
172static struct microblaze_frame_cache *
173microblaze_alloc_frame_cache (void)
174{
175 struct microblaze_frame_cache *cache;
2d1c1221
ME
176
177 cache = FRAME_OBSTACK_ZALLOC (struct microblaze_frame_cache);
178
179 /* Base address. */
180 cache->base = 0;
181 cache->pc = 0;
182
183 /* Frameless until proven otherwise. */
184 cache->frameless_p = 1;
185
186 return cache;
187}
188
189/* The base of the current frame is actually in the stack pointer.
190 This happens when there is no frame pointer (microblaze ABI does not
191 require a frame pointer) or when we're stopped in the prologue or
192 epilogue itself. In these cases, microblaze_analyze_prologue will need
193 to update fi->frame before returning or analyzing the register
194 save instructions. */
195#define MICROBLAZE_MY_FRAME_IN_SP 0x1
196
197/* The base of the current frame is in a frame pointer register.
198 This register is noted in frame_extra_info->fp_regnum.
199
200 Note that the existance of an FP might also indicate that the
201 function has called alloca. */
202#define MICROBLAZE_MY_FRAME_IN_FP 0x2
203
204/* Function prologues on the Xilinx microblaze processors consist of:
205
206 - adjustments to the stack pointer (r1) (addi r1, r1, imm)
207 - making a copy of r1 into another register (a "frame" pointer)
208 (add r?, r1, r0)
209 - store word/multiples that use r1 or the frame pointer as the
210 base address (swi r?, r1, imm OR swi r?, fp, imm)
211
212 Note that microblaze really doesn't have a real frame pointer.
213 Instead, the compiler may copy the SP into a register (usually
214 r19) to act as an arg pointer. For our target-dependent purposes,
215 the frame info's "frame" member will be the beginning of the
216 frame. The SP could, in fact, point below this.
217
218 The prologue ends when an instruction fails to meet either of
219 these criteria. */
220
221/* Analyze the prologue to determine where registers are saved,
222 the end of the prologue, etc. Return the address of the first line
025bb325 223 of "real" code (i.e., the end of the prologue). */
2d1c1221
ME
224
225static CORE_ADDR
226microblaze_analyze_prologue (struct gdbarch *gdbarch, CORE_ADDR pc,
227 CORE_ADDR current_pc,
228 struct microblaze_frame_cache *cache)
229{
2c02bd72 230 const char *name;
2d1c1221
ME
231 CORE_ADDR func_addr, func_end, addr, stop, prologue_end_addr = 0;
232 unsigned long insn;
22e048c9 233 int rd, ra, rb, imm;
2d1c1221
ME
234 enum microblaze_instr op;
235 int flags = 0;
236 int save_hidden_pointer_found = 0;
237 int non_stack_instruction_found = 0;
238
025bb325 239 /* Find the start of this function. */
2d1c1221
ME
240 find_pc_partial_function (pc, &name, &func_addr, &func_end);
241 if (func_addr < pc)
242 pc = func_addr;
243
244 if (current_pc < pc)
245 return current_pc;
246
247 /* Initialize info about frame. */
248 cache->framesize = 0;
249 cache->fp_regnum = MICROBLAZE_SP_REGNUM;
250 cache->frameless_p = 1;
251
252 /* Start decoding the prologue. We start by checking two special cases:
253
254 1. We're about to return
255 2. We're at the first insn of the prologue.
256
257 If we're about to return, our frame has already been deallocated.
258 If we are stopped at the first instruction of a prologue,
025bb325 259 then our frame has not yet been set up. */
2d1c1221
ME
260
261 /* Get the first insn from memory. */
262
263 insn = microblaze_fetch_instruction (pc);
264 op = microblaze_decode_insn (insn, &rd, &ra, &rb, &imm);
265
266 if (IS_RETURN(op))
267 return pc;
268
269 /* Start at beginning of function and analyze until we get to the
270 current pc, or the end of the function, whichever is first. */
271 stop = (current_pc < func_end ? current_pc : func_end);
272
273 microblaze_debug ("Scanning prologue: name=%s, func_addr=%s, stop=%s\n",
274 name, paddress (gdbarch, func_addr),
275 paddress (gdbarch, stop));
276
277 for (addr = func_addr; addr < stop; addr += INST_WORD_SIZE)
278 {
279 insn = microblaze_fetch_instruction (addr);
280 op = microblaze_decode_insn (insn, &rd, &ra, &rb, &imm);
281 microblaze_debug ("%s %08lx\n", paddress (gdbarch, pc), insn);
282
283 /* This code is very sensitive to what functions are present in the
284 prologue. It assumes that the (addi, addik, swi, sw) can be the
285 only instructions in the prologue. */
286 if (IS_UPDATE_SP(op, rd, ra))
287 {
288 microblaze_debug ("got addi r1,r1,%d; contnuing\n", imm);
289 if (cache->framesize)
290 break; /* break if framesize already computed. */
291 cache->framesize = -imm; /* stack grows towards low memory. */
292 cache->frameless_p = 0; /* Frame found. */
293 save_hidden_pointer_found = 0;
294 non_stack_instruction_found = 0;
295 continue;
296 }
297 else if (IS_SPILL_SP(op, rd, ra))
298 {
299 /* Spill stack pointer. */
300 cache->register_offsets[rd] = imm; /* SP spilled before updating. */
301
302 microblaze_debug ("swi r1 r1 %d, continuing\n", imm);
303 save_hidden_pointer_found = 0;
304 if (!cache->framesize)
305 non_stack_instruction_found = 0;
306 continue;
307 }
308 else if (IS_SPILL_REG(op, rd, ra))
309 {
310 /* Spill register. */
311 cache->register_offsets[rd] = imm - cache->framesize;
312
313 microblaze_debug ("swi %d r1 %d, continuing\n", rd, imm);
314 save_hidden_pointer_found = 0;
315 if (!cache->framesize)
316 non_stack_instruction_found = 0;
317 continue;
318 }
319 else if (IS_ALSO_SPILL_REG(op, rd, ra, rb))
320 {
321 /* Spill register. */
322 cache->register_offsets[rd] = 0 - cache->framesize;
323
324 microblaze_debug ("sw %d r0 r1, continuing\n", rd);
325 save_hidden_pointer_found = 0;
326 if (!cache->framesize)
327 non_stack_instruction_found = 0;
328 continue;
329 }
330 else if (IS_SETUP_FP(op, ra, rb))
331 {
332 /* We have a frame pointer. Note the register which is
025bb325 333 acting as the frame pointer. */
2d1c1221
ME
334 flags |= MICROBLAZE_MY_FRAME_IN_FP;
335 flags &= ~MICROBLAZE_MY_FRAME_IN_SP;
336 cache->fp_regnum = rd;
337 microblaze_debug ("Found a frame pointer: r%d\n", cache->fp_regnum);
338 save_hidden_pointer_found = 0;
339 if (!cache->framesize)
340 non_stack_instruction_found = 0;
341 continue;
342 }
343 else if (IS_SPILL_REG_FP(op, rd, ra, cache->fp_regnum))
344 {
345 /* reg spilled after updating. */
346 cache->register_offsets[rd] = imm - cache->framesize;
347
348 microblaze_debug ("swi %d %d %d, continuing\n", rd, ra, imm);
349 save_hidden_pointer_found = 0;
350 if (!cache->framesize)
351 non_stack_instruction_found = 0;
352 continue;
353 }
354 else if (IS_SAVE_HIDDEN_PTR(op, rd, ra, rb))
355 {
356 /* If the first argument is a hidden pointer to the area where the
357 return structure is to be saved, then it is saved as part of the
358 prologue. */
359
360 microblaze_debug ("add %d %d %d, continuing\n", rd, ra, rb);
361 save_hidden_pointer_found = 1;
362 if (!cache->framesize)
363 non_stack_instruction_found = 0;
364 continue;
365 }
366
367 /* As a result of the modification in the next step where we continue
368 to analyze the prologue till we reach a control flow instruction,
369 we need another variable to store when exactly a non-stack
370 instruction was encountered, which is the current definition
371 of a prologue. */
372 if (!non_stack_instruction_found)
373 prologue_end_addr = addr;
374 non_stack_instruction_found = 1;
375
376 /* When optimizations are enabled, it is not guaranteed that prologue
377 instructions are not mixed in with other instructions from the
025bb325 378 program. Some programs show this behavior at -O2. This can be
2d1c1221
ME
379 avoided by adding -fno-schedule-insns2 switch as of now (edk 8.1)
380 In such cases, we scan the function until we see the first control
381 instruction. */
382
383 {
384 unsigned op = (unsigned)insn >> 26;
385
386 /* continue if not control flow (branch, return). */
387 if (op != 0x26 && op != 0x27 && op != 0x2d && op != 0x2e && op != 0x2f)
388 continue;
389 else if (op == 0x2c)
390 continue; /* continue if imm. */
391 }
392
025bb325 393 /* This is not a prologue insn, so stop here. */
2d1c1221
ME
394 microblaze_debug ("insn is not a prologue insn -- ending scan\n");
395 break;
396 }
397
398 microblaze_debug ("done analyzing prologue\n");
399 microblaze_debug ("prologue end = 0x%x\n", (int) addr);
400
401 /* If the last instruction was an add rd, r5, r0 then don't count it as
402 part of the prologue. */
403 if (save_hidden_pointer_found)
404 prologue_end_addr -= INST_WORD_SIZE;
405
406 return prologue_end_addr;
407}
408
409static CORE_ADDR
410microblaze_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
411{
412 gdb_byte buf[4];
413 CORE_ADDR pc;
414
415 frame_unwind_register (next_frame, MICROBLAZE_PC_REGNUM, buf);
416 pc = extract_typed_address (buf, builtin_type (gdbarch)->builtin_func_ptr);
417 /* For sentinel frame, return address is actual PC. For other frames,
418 return address is pc+8. This is a workaround because gcc does not
419 generate correct return address in CIE. */
420 if (frame_relative_level (next_frame) >= 0)
421 pc += 8;
422 return pc;
423}
424
425/* Return PC of first real instruction of the function starting at
426 START_PC. */
427
693be288 428static CORE_ADDR
2d1c1221
ME
429microblaze_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc)
430{
431 struct symtab_and_line sal;
432 CORE_ADDR func_start, func_end, ostart_pc;
433 struct microblaze_frame_cache cache;
434
435 /* This is the preferred method, find the end of the prologue by
436 using the debugging information. Debugging info does not always
437 give the right answer since parameters are stored on stack after this.
438 Always analyze the prologue. */
439 if (find_pc_partial_function (start_pc, NULL, &func_start, &func_end))
440 {
441 sal = find_pc_line (func_start, 0);
442
443 if (sal.end < func_end
444 && start_pc <= sal.end)
445 start_pc = sal.end;
446 }
447
448 ostart_pc = microblaze_analyze_prologue (gdbarch, func_start, 0xffffffffUL,
449 &cache);
450
451 if (ostart_pc > start_pc)
452 return ostart_pc;
453 return start_pc;
454}
455
456/* Normal frames. */
457
693be288 458static struct microblaze_frame_cache *
2d1c1221
ME
459microblaze_frame_cache (struct frame_info *next_frame, void **this_cache)
460{
461 struct microblaze_frame_cache *cache;
462 struct gdbarch *gdbarch = get_frame_arch (next_frame);
22e048c9 463 CORE_ADDR func;
2d1c1221
ME
464 int rn;
465
466 if (*this_cache)
467 return *this_cache;
468
469 cache = microblaze_alloc_frame_cache ();
470 *this_cache = cache;
471 cache->saved_regs = trad_frame_alloc_saved_regs (next_frame);
472
473 /* Clear offsets to saved regs in frame. */
474 for (rn = 0; rn < gdbarch_num_regs (gdbarch); rn++)
475 cache->register_offsets[rn] = -1;
476
477 func = get_frame_func (next_frame);
478
479 cache->pc = get_frame_address_in_block (next_frame);
480
481 return cache;
482}
483
484static void
485microblaze_frame_this_id (struct frame_info *next_frame, void **this_cache,
486 struct frame_id *this_id)
487{
488 struct microblaze_frame_cache *cache =
489 microblaze_frame_cache (next_frame, this_cache);
490
491 /* This marks the outermost frame. */
492 if (cache->base == 0)
493 return;
494
495 (*this_id) = frame_id_build (cache->base, cache->pc);
496}
497
498static struct value *
499microblaze_frame_prev_register (struct frame_info *this_frame,
500 void **this_cache, int regnum)
501{
502 struct microblaze_frame_cache *cache =
503 microblaze_frame_cache (this_frame, this_cache);
504
505 if (cache->frameless_p)
506 {
507 if (regnum == MICROBLAZE_PC_REGNUM)
508 regnum = 15;
509 if (regnum == MICROBLAZE_SP_REGNUM)
510 regnum = 1;
025bb325
MS
511 return trad_frame_get_prev_register (this_frame,
512 cache->saved_regs, regnum);
2d1c1221
ME
513 }
514 else
515 return trad_frame_get_prev_register (this_frame, cache->saved_regs,
516 regnum);
517
518}
519
520static const struct frame_unwind microblaze_frame_unwind =
521{
522 NORMAL_FRAME,
8fbca658 523 default_frame_unwind_stop_reason,
2d1c1221
ME
524 microblaze_frame_this_id,
525 microblaze_frame_prev_register,
526 NULL,
527 default_frame_sniffer
528};
529\f
530static CORE_ADDR
025bb325
MS
531microblaze_frame_base_address (struct frame_info *next_frame,
532 void **this_cache)
2d1c1221
ME
533{
534 struct microblaze_frame_cache *cache =
535 microblaze_frame_cache (next_frame, this_cache);
536
537 return cache->base;
538}
539
540static const struct frame_base microblaze_frame_base =
541{
542 &microblaze_frame_unwind,
543 microblaze_frame_base_address,
544 microblaze_frame_base_address,
545 microblaze_frame_base_address
546};
547\f
548/* Extract from an array REGBUF containing the (raw) register state, a
549 function return value of TYPE, and copy that into VALBUF. */
550static void
551microblaze_extract_return_value (struct type *type, struct regcache *regcache,
552 gdb_byte *valbuf)
553{
554 gdb_byte buf[8];
555
556 /* Copy the return value (starting) in RETVAL_REGNUM to VALBUF. */
557 switch (TYPE_LENGTH (type))
558 {
559 case 1: /* return last byte in the register. */
560 regcache_cooked_read (regcache, MICROBLAZE_RETVAL_REGNUM, buf);
561 memcpy(valbuf, buf + MICROBLAZE_REGISTER_SIZE - 1, 1);
562 return;
563 case 2: /* return last 2 bytes in register. */
6425366c 564 regcache_cooked_read (regcache, MICROBLAZE_RETVAL_REGNUM, buf);
2d1c1221
ME
565 memcpy(valbuf, buf + MICROBLAZE_REGISTER_SIZE - 2, 2);
566 return;
567 case 4: /* for sizes 4 or 8, copy the required length. */
568 case 8:
569 regcache_cooked_read (regcache, MICROBLAZE_RETVAL_REGNUM, buf);
570 regcache_cooked_read (regcache, MICROBLAZE_RETVAL_REGNUM+1, buf+4);
571 memcpy (valbuf, buf, TYPE_LENGTH (type));
572 return;
573 default:
574 internal_error (__FILE__, __LINE__,
575 _("Unsupported return value size requested"));
576 }
577}
578
579/* Store the return value in VALBUF (of type TYPE) where the caller
580 expects to see it.
581
582 Integers up to four bytes are stored in r3.
583
584 Longs are stored in r3 (most significant word) and r4 (least
585 significant word).
586
025bb325 587 Small structures are always returned on stack. */
2d1c1221
ME
588
589static void
590microblaze_store_return_value (struct type *type, struct regcache *regcache,
591 const gdb_byte *valbuf)
592{
bad43aa5 593 int len = TYPE_LENGTH (type);
2d1c1221
ME
594 gdb_byte buf[8];
595
596 memset (buf, 0, sizeof(buf));
597
598 /* Integral and pointer return values. */
599
bad43aa5 600 if (len > 4)
2d1c1221 601 {
bad43aa5 602 gdb_assert (len == 8);
2d1c1221
ME
603 memcpy (buf, valbuf, 8);
604 regcache_cooked_write (regcache, MICROBLAZE_RETVAL_REGNUM+1, buf + 4);
605 }
606 else
607 /* ??? Do we need to do any sign-extension here? */
bad43aa5 608 memcpy (buf + 4 - len, valbuf, len);
2d1c1221
ME
609
610 regcache_cooked_write (regcache, MICROBLAZE_RETVAL_REGNUM, buf);
611}
612
613static enum return_value_convention
6a3a010b 614microblaze_return_value (struct gdbarch *gdbarch, struct value *function,
2d1c1221
ME
615 struct type *type, struct regcache *regcache,
616 gdb_byte *readbuf, const gdb_byte *writebuf)
617{
618 if (readbuf)
619 microblaze_extract_return_value (type, regcache, readbuf);
620 if (writebuf)
621 microblaze_store_return_value (type, regcache, writebuf);
622
623 return RETURN_VALUE_REGISTER_CONVENTION;
624}
625
626static int
627microblaze_stabs_argument_has_addr (struct gdbarch *gdbarch, struct type *type)
628{
629 return (TYPE_LENGTH (type) == 16);
630}
631
632static void
633microblaze_write_pc (struct regcache *regcache, CORE_ADDR pc)
634{
635 regcache_cooked_write_unsigned (regcache, MICROBLAZE_PC_REGNUM, pc);
636}
637\f
638static int dwarf2_to_reg_map[78] =
639{ 0 /* r0 */, 1 /* r1 */, 2 /* r2 */, 3 /* r3 */, /* 0- 3 */
640 4 /* r4 */, 5 /* r5 */, 6 /* r6 */, 7 /* r7 */, /* 4- 7 */
641 8 /* r8 */, 9 /* r9 */, 10 /* r10 */, 11 /* r11 */, /* 8-11 */
642 12 /* r12 */, 13 /* r13 */, 14 /* r14 */, 15 /* r15 */, /* 12-15 */
643 16 /* r16 */, 17 /* r17 */, 18 /* r18 */, 19 /* r19 */, /* 16-19 */
644 20 /* r20 */, 21 /* r21 */, 22 /* r22 */, 23 /* r23 */, /* 20-23 */
645 24 /* r24 */, 25 /* r25 */, 26 /* r26 */, 27 /* r27 */, /* 24-25 */
646 28 /* r28 */, 29 /* r29 */, 30 /* r30 */, 31 /* r31 */, /* 28-31 */
647 -1 /* $f0 */, -1 /* $f1 */, -1 /* $f2 */, -1 /* $f3 */, /* 32-35 */
648 -1 /* $f4 */, -1 /* $f5 */, -1 /* $f6 */, -1 /* $f7 */, /* 36-39 */
649 -1 /* $f8 */, -1 /* $f9 */, -1 /* $f10 */, -1 /* $f11 */, /* 40-43 */
650 -1 /* $f12 */, -1 /* $f13 */, -1 /* $f14 */, -1 /* $f15 */, /* 44-47 */
651 -1 /* $f16 */, -1 /* $f17 */, -1 /* $f18 */, -1 /* $f19 */, /* 48-51 */
652 -1 /* $f20 */, -1 /* $f21 */, -1 /* $f22 */, -1 /* $f23 */, /* 52-55 */
653 -1 /* $f24 */, -1 /* $f25 */, -1 /* $f26 */, -1 /* $f27 */, /* 56-59 */
654 -1 /* $f28 */, -1 /* $f29 */, -1 /* $f30 */, -1 /* $f31 */, /* 60-63 */
655 -1 /* hi */, -1 /* lo */, -1 /* accum*/, 33 /* rmsr */, /* 64-67 */
656 -1 /* $fcc1*/, -1 /* $fcc2*/, -1 /* $fcc3*/, -1 /* $fcc4*/, /* 68-71 */
657 -1 /* $fcc5*/, -1 /* $fcc6*/, -1 /* $fcc7*/, -1 /* $ap */, /* 72-75 */
658 -1 /* $rap */, -1 /* $frp */ /* 76-77 */
659};
660
661static int
662microblaze_dwarf2_reg_to_regnum (struct gdbarch *gdbarch, int reg)
663{
664 gdb_assert (reg < sizeof (dwarf2_to_reg_map));
665 return dwarf2_to_reg_map[reg];
666}
667
668static struct gdbarch *
669microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
670{
671 struct gdbarch_tdep *tdep;
672 struct gdbarch *gdbarch;
673
674 /* If there is already a candidate, use it. */
675 arches = gdbarch_list_lookup_by_info (arches, &info);
676 if (arches != NULL)
677 return arches->gdbarch;
678
679 /* Allocate space for the new architecture. */
680 tdep = XMALLOC (struct gdbarch_tdep);
681 gdbarch = gdbarch_alloc (&info, tdep);
682
683 set_gdbarch_long_double_bit (gdbarch, 128);
684
685 set_gdbarch_num_regs (gdbarch, MICROBLAZE_NUM_REGS);
686 set_gdbarch_register_name (gdbarch, microblaze_register_name);
687 set_gdbarch_register_type (gdbarch, microblaze_register_type);
688
689 /* Register numbers of various important registers. */
690 set_gdbarch_sp_regnum (gdbarch, MICROBLAZE_SP_REGNUM);
691 set_gdbarch_pc_regnum (gdbarch, MICROBLAZE_PC_REGNUM);
692
693 /* Map Dwarf2 registers to GDB registers. */
694 set_gdbarch_dwarf2_reg_to_regnum (gdbarch, microblaze_dwarf2_reg_to_regnum);
695
696 /* Call dummy code. */
697 set_gdbarch_call_dummy_location (gdbarch, ON_STACK);
698 set_gdbarch_push_dummy_code (gdbarch, microblaze_push_dummy_code);
699 set_gdbarch_push_dummy_call (gdbarch, microblaze_push_dummy_call);
700
701 set_gdbarch_return_value (gdbarch, microblaze_return_value);
702 set_gdbarch_stabs_argument_has_addr
703 (gdbarch, microblaze_stabs_argument_has_addr);
704
705 set_gdbarch_skip_prologue (gdbarch, microblaze_skip_prologue);
706
707 /* Stack grows downward. */
708 set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
709
710 set_gdbarch_breakpoint_from_pc (gdbarch, microblaze_breakpoint_from_pc);
711
712 set_gdbarch_frame_args_skip (gdbarch, 8);
713
714 set_gdbarch_print_insn (gdbarch, print_insn_microblaze);
715
716 set_gdbarch_write_pc (gdbarch, microblaze_write_pc);
717
718 set_gdbarch_unwind_pc (gdbarch, microblaze_unwind_pc);
719
720 frame_base_set_default (gdbarch, &microblaze_frame_base);
721
722 /* Hook in ABI-specific overrides, if they have been registered. */
723 gdbarch_init_osabi (info, gdbarch);
724
025bb325 725 /* Unwind the frame. */
2d1c1221
ME
726 dwarf2_append_unwinders (gdbarch);
727 frame_unwind_append_unwinder (gdbarch, &microblaze_frame_unwind);
728 frame_base_append_sniffer (gdbarch, dwarf2_frame_base_sniffer);
729
730 return gdbarch;
731}
732
733/* Provide a prototype to silence -Wmissing-prototypes. */
734void _initialize_microblaze_tdep (void);
735
736void
737_initialize_microblaze_tdep (void)
738{
739 register_gdbarch_init (bfd_arch_microblaze, microblaze_gdbarch_init);
740
741 /* Debug this files internals. */
ccce17b0
YQ
742 add_setshow_zuinteger_cmd ("microblaze", class_maintenance,
743 &microblaze_debug_flag, _("\
2d1c1221
ME
744Set microblaze debugging."), _("\
745Show microblaze debugging."), _("\
746When non-zero, microblaze specific debugging is enabled."),
ccce17b0
YQ
747 NULL,
748 NULL,
749 &setdebuglist, &showdebuglist);
2d1c1221
ME
750
751}
This page took 0.394525 seconds and 4 git commands to generate.