1 /* Target-dependent code for the NEC V850 for GDB, the GNU debugger.
2 Copyright 1996, 1998, 1999, 2000, 2001, 2002, 2003
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,
20 Boston, MA 02111-1307, USA. */
28 #include "gdb_string.h"
31 #include "arch-utils.h"
38 /* gdbarch target dependent data here. Currently unused for v850. */
41 /* Extra info which is saved in each frame_info. */
42 struct frame_extra_info
49 E_R2_REGNUM, E_SAVE1_START_REGNUM = E_R2_REGNUM, E_SAVE1_END_REGNUM = E_R2_REGNUM,
50 E_R3_REGNUM, E_SP_REGNUM = E_R3_REGNUM,
53 E_R6_REGNUM, E_ARG0_REGNUM = E_R6_REGNUM,
56 E_R9_REGNUM, E_ARGLAST_REGNUM = E_R9_REGNUM,
57 E_R10_REGNUM, E_V0_REGNUM = E_R10_REGNUM,
58 E_R11_REGNUM, E_V1_REGNUM = E_R11_REGNUM,
67 E_R20_REGNUM, E_SAVE2_START_REGNUM = E_R20_REGNUM,
76 E_R29_REGNUM, E_SAVE2_END_REGNUM = E_R29_REGNUM, E_FP_RAW_REGNUM = E_R29_REGNUM,
77 E_R30_REGNUM, E_EP_REGNUM = E_R30_REGNUM,
78 E_R31_REGNUM, E_SAVE3_START_REGNUM = E_R31_REGNUM, E_SAVE3_END_REGNUM = E_R31_REGNUM, E_RP_REGNUM = E_R31_REGNUM,
79 E_R32_REGNUM, E_SR0_REGNUM = E_R32_REGNUM,
84 E_R37_REGNUM, E_PS_REGNUM = E_R37_REGNUM,
99 E_R52_REGNUM, E_CTBP_REGNUM = E_R52_REGNUM,
111 E_R64_REGNUM, E_PC_REGNUM = E_R64_REGNUM,
112 E_R65_REGNUM, E_FP_REGNUM = E_R65_REGNUM,
121 /* Size of all registers as a whole. */
124 E_ALL_REGS_SIZE = (E_NUM_REGS) * v850_reg_size
127 /* Size of return datatype which fits into all return registers. */
130 E_MAX_RETTYPE_SIZE_IN_REGS = 2 * v850_reg_size
133 static LONGEST call_dummy_nil[] = {0};
135 static char *v850_generic_reg_names[] =
136 { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
137 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
138 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
139 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
140 "eipc", "eipsw", "fepc", "fepsw", "ecr", "psw", "sr6", "sr7",
141 "sr8", "sr9", "sr10", "sr11", "sr12", "sr13", "sr14", "sr15",
142 "sr16", "sr17", "sr18", "sr19", "sr20", "sr21", "sr22", "sr23",
143 "sr24", "sr25", "sr26", "sr27", "sr28", "sr29", "sr30", "sr31",
147 static char *v850e_reg_names[] =
149 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
150 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
151 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
152 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
153 "eipc", "eipsw", "fepc", "fepsw", "ecr", "psw", "sr6", "sr7",
154 "sr8", "sr9", "sr10", "sr11", "sr12", "sr13", "sr14", "sr15",
155 "ctpc", "ctpsw", "dbpc", "dbpsw", "ctbp", "sr21", "sr22", "sr23",
156 "sr24", "sr25", "sr26", "sr27", "sr28", "sr29", "sr30", "sr31",
160 char **v850_register_names = v850_generic_reg_names;
167 v850_processor_type_table[] =
170 v850_generic_reg_names, bfd_mach_v850
174 v850e_reg_names, bfd_mach_v850e
178 v850e_reg_names, bfd_mach_v850e1
186 /* Info gleaned from scanning a function's prologue. */
188 struct pifsr /* Info about one saved reg */
190 int framereg; /* Frame reg (SP or FP) */
191 int offset; /* Offset from framereg */
192 int cur_frameoffset; /* Current frameoffset */
193 int reg; /* Saved register number */
201 struct pifsr *pifsrs;
204 static CORE_ADDR v850_scan_prologue (CORE_ADDR pc, struct prologue_info *fs);
206 /* Function: v850_register_name
207 Returns the name of the v850/v850e register N. */
210 v850_register_name (int regnum)
212 if (regnum < 0 || regnum >= E_NUM_REGS)
213 internal_error (__FILE__, __LINE__,
214 "v850_register_name: illegal register number %d",
217 return v850_register_names[regnum];
221 /* Function: v850_register_byte
222 Returns the byte position in the register cache for register N. */
225 v850_register_byte (int regnum)
227 if (regnum < 0 || regnum >= E_NUM_REGS)
228 internal_error (__FILE__, __LINE__,
229 "v850_register_byte: illegal register number %d",
232 return regnum * v850_reg_size;
235 /* Function: v850_register_raw_size
236 Returns the number of bytes occupied by the register on the target. */
239 v850_register_raw_size (int regnum)
241 if (regnum < 0 || regnum >= E_NUM_REGS)
242 internal_error (__FILE__, __LINE__,
243 "v850_register_raw_size: illegal register number %d",
245 /* Only the PC has 4 Byte, all other registers 2 Byte. */
247 return v850_reg_size;
250 /* Function: v850_register_virtual_size
251 Returns the number of bytes occupied by the register as represented
252 internally by gdb. */
255 v850_register_virtual_size (int regnum)
257 return v850_register_raw_size (regnum);
260 /* Function: v850_reg_virtual_type
261 Returns the default type for register N. */
264 v850_reg_virtual_type (int regnum)
266 if (regnum < 0 || regnum >= E_NUM_REGS)
267 internal_error (__FILE__, __LINE__,
268 "v850_register_virtual_type: illegal register number %d",
270 else if (regnum == E_PC_REGNUM)
271 return builtin_type_uint32;
273 return builtin_type_int32;
277 v850_type_is_scalar (struct type *t)
279 return (TYPE_CODE (t) != TYPE_CODE_STRUCT
280 && TYPE_CODE (t) != TYPE_CODE_UNION
281 && TYPE_CODE (t) != TYPE_CODE_ARRAY);
284 /* Should call_function allocate stack space for a struct return? */
286 v850_use_struct_convention (int gcc_p, struct type *type)
289 * return TYPE_LENGTH (type) > 8);
292 /* Current implementation in gcc: */
295 struct type *fld_type, *tgt_type;
297 /* 1. The value is greater than 8 bytes -> returned by copying */
298 if (TYPE_LENGTH (type) > 8)
301 /* 2. The value is a single basic type -> returned in register */
302 if (v850_type_is_scalar (type))
305 /* The value is a structure or union with a single element
306 * and that element is either a single basic type or an array of
307 * a single basic type whoes size is greater than or equal to 4
308 * -> returned in register */
309 if ((TYPE_CODE (type) == TYPE_CODE_STRUCT
310 || TYPE_CODE (type) == TYPE_CODE_UNION)
311 && TYPE_NFIELDS (type) == 1)
313 fld_type = TYPE_FIELD_TYPE (type, 0);
314 if (v850_type_is_scalar (fld_type) && TYPE_LENGTH (fld_type) >= 4)
317 if (TYPE_CODE (fld_type) == TYPE_CODE_ARRAY)
319 tgt_type = TYPE_TARGET_TYPE (fld_type);
320 if (v850_type_is_scalar (tgt_type) && TYPE_LENGTH (tgt_type) >= 4)
325 /* The value is a structure whose first element is an integer or
326 * a float, and which contains no arrays of more than two elements
327 * -> returned in register */
328 if (TYPE_CODE (type) == TYPE_CODE_STRUCT
329 && v850_type_is_scalar (TYPE_FIELD_TYPE (type, 0))
330 && TYPE_LENGTH (TYPE_FIELD_TYPE (type, 0)) == 4)
332 for (i = 1; i < TYPE_NFIELDS (type); ++i)
334 fld_type = TYPE_FIELD_TYPE (type, 0);
335 if (TYPE_CODE (fld_type) == TYPE_CODE_ARRAY)
337 tgt_type = TYPE_TARGET_TYPE (fld_type);
338 if (TYPE_LENGTH (fld_type) >= 0 && TYPE_LENGTH (tgt_type) >= 0
339 && TYPE_LENGTH (fld_type) / TYPE_LENGTH (tgt_type) > 2)
346 /* The value is a union which contains at least one field which
347 * would be returned in registers according to these rules
348 * -> returned in register */
349 if (TYPE_CODE (type) == TYPE_CODE_UNION)
351 for (i = 0; i < TYPE_NFIELDS (type); ++i)
353 fld_type = TYPE_FIELD_TYPE (type, 0);
354 if (!v850_use_struct_convention (0, fld_type))
364 /* Structure for mapping bits in register lists to register numbers. */
371 /* Helper function for v850_scan_prologue to handle prepare instruction. */
374 handle_prepare (int insn, int insn2, CORE_ADDR * current_pc_ptr,
375 struct prologue_info *pi, struct pifsr **pifsr_ptr)
377 CORE_ADDR current_pc = *current_pc_ptr;
378 struct pifsr *pifsr = *pifsr_ptr;
379 long next = insn2 & 0xffff;
380 long list12 = ((insn & 1) << 16) + (next & 0xffe0);
381 long offset = (insn & 0x3e) << 1;
382 static struct reg_list reg_table[] =
384 {0x00800, 20}, /* r20 */
385 {0x00400, 21}, /* r21 */
386 {0x00200, 22}, /* r22 */
387 {0x00100, 23}, /* r23 */
388 {0x08000, 24}, /* r24 */
389 {0x04000, 25}, /* r25 */
390 {0x02000, 26}, /* r26 */
391 {0x01000, 27}, /* r27 */
392 {0x00080, 28}, /* r28 */
393 {0x00040, 29}, /* r29 */
394 {0x10000, 30}, /* ep */
395 {0x00020, 31}, /* lp */
396 {0, 0} /* end of table */
400 if ((next & 0x1f) == 0x0b) /* skip imm16 argument */
402 else if ((next & 0x1f) == 0x13) /* skip imm16 argument */
404 else if ((next & 0x1f) == 0x1b) /* skip imm32 argument */
407 /* Calculate the total size of the saved registers, and add it
408 it to the immediate value used to adjust SP. */
409 for (i = 0; reg_table[i].mask != 0; i++)
410 if (list12 & reg_table[i].mask)
411 offset += v850_register_raw_size (reg_table[i].regno);
412 pi->frameoffset -= offset;
414 /* Calculate the offsets of the registers relative to the value
415 the SP will have after the registers have been pushed and the
416 imm5 value has been subtracted from it. */
419 for (i = 0; reg_table[i].mask != 0; i++)
421 if (list12 & reg_table[i].mask)
423 int reg = reg_table[i].regno;
424 offset -= v850_register_raw_size (reg);
426 pifsr->offset = offset;
427 pifsr->cur_frameoffset = pi->frameoffset;
429 printf_filtered ("\tSaved register r%d, offset %d", reg, pifsr->offset);
436 printf_filtered ("\tfound ctret after regsave func");
439 /* Set result parameters. */
440 *current_pc_ptr = current_pc;
445 /* Helper function for v850_scan_prologue to handle pushm/pushl instructions.
446 FIXME: the SR bit of the register list is not supported; must check
447 that the compiler does not ever generate this bit. */
450 handle_pushm (int insn, int insn2, struct prologue_info *pi,
451 struct pifsr **pifsr_ptr)
453 struct pifsr *pifsr = *pifsr_ptr;
454 long list12 = ((insn & 0x0f) << 16) + (insn2 & 0xfff0);
456 static struct reg_list pushml_reg_table[] =
458 {0x80000, E_PS_REGNUM}, /* PSW */
459 {0x40000, 1}, /* r1 */
460 {0x20000, 2}, /* r2 */
461 {0x10000, 3}, /* r3 */
462 {0x00800, 4}, /* r4 */
463 {0x00400, 5}, /* r5 */
464 {0x00200, 6}, /* r6 */
465 {0x00100, 7}, /* r7 */
466 {0x08000, 8}, /* r8 */
467 {0x04000, 9}, /* r9 */
468 {0x02000, 10}, /* r10 */
469 {0x01000, 11}, /* r11 */
470 {0x00080, 12}, /* r12 */
471 {0x00040, 13}, /* r13 */
472 {0x00020, 14}, /* r14 */
473 {0x00010, 15}, /* r15 */
474 {0, 0} /* end of table */
476 static struct reg_list pushmh_reg_table[] =
478 {0x80000, 16}, /* r16 */
479 {0x40000, 17}, /* r17 */
480 {0x20000, 18}, /* r18 */
481 {0x10000, 19}, /* r19 */
482 {0x00800, 20}, /* r20 */
483 {0x00400, 21}, /* r21 */
484 {0x00200, 22}, /* r22 */
485 {0x00100, 23}, /* r23 */
486 {0x08000, 24}, /* r24 */
487 {0x04000, 25}, /* r25 */
488 {0x02000, 26}, /* r26 */
489 {0x01000, 27}, /* r27 */
490 {0x00080, 28}, /* r28 */
491 {0x00040, 29}, /* r29 */
492 {0x00010, 30}, /* r30 */
493 {0x00020, 31}, /* r31 */
494 {0, 0} /* end of table */
496 struct reg_list *reg_table;
499 /* Is this a pushml or a pushmh? */
500 if ((insn2 & 7) == 1)
501 reg_table = pushml_reg_table;
503 reg_table = pushmh_reg_table;
505 /* Calculate the total size of the saved registers, and add it
506 it to the immediate value used to adjust SP. */
507 for (i = 0; reg_table[i].mask != 0; i++)
508 if (list12 & reg_table[i].mask)
509 offset += v850_register_raw_size (reg_table[i].regno);
510 pi->frameoffset -= offset;
512 /* Calculate the offsets of the registers relative to the value
513 the SP will have after the registers have been pushed and the
514 imm5 value is subtracted from it. */
517 for (i = 0; reg_table[i].mask != 0; i++)
519 if (list12 & reg_table[i].mask)
521 int reg = reg_table[i].regno;
522 offset -= v850_register_raw_size (reg);
524 pifsr->offset = offset;
525 pifsr->cur_frameoffset = pi->frameoffset;
527 printf_filtered ("\tSaved register r%d, offset %d", reg, pifsr->offset);
534 printf_filtered ("\tfound ctret after regsave func");
537 /* Set result parameters. */
544 /* Function: scan_prologue
545 Scan the prologue of the function that contains PC, and record what
546 we find in PI. Returns the pc after the prologue. Note that the
547 addresses saved in frame->saved_regs are just frame relative (negative
548 offsets from the frame pointer). This is because we don't know the
549 actual value of the frame pointer yet. In some circumstances, the
550 frame pointer can't be determined till after we have scanned the
554 v850_scan_prologue (CORE_ADDR pc, struct prologue_info *pi)
556 CORE_ADDR func_addr, prologue_end, current_pc;
557 struct pifsr *pifsr, *pifsr_tmp;
561 CORE_ADDR save_pc, save_end;
565 /* First, figure out the bounds of the prologue so that we can limit the
566 search to something reasonable. */
568 if (find_pc_partial_function (pc, NULL, &func_addr, NULL))
570 struct symtab_and_line sal;
572 sal = find_pc_line (func_addr, 0);
574 if (func_addr == entry_point_address ())
575 pi->start_function = 1;
577 pi->start_function = 0;
583 prologue_end = sal.end;
589 { /* We're in the boondocks */
590 func_addr = pc - 100;
594 prologue_end = min (prologue_end, pc);
596 /* Now, search the prologue looking for instructions that setup fp, save
597 rp, adjust sp and such. We also record the frame offset of any saved
601 pi->framereg = E_SP_REGNUM;
611 printf_filtered ("Current_pc = 0x%.8lx, prologue_end = 0x%.8lx\n",
612 (long) func_addr, (long) prologue_end);
615 for (current_pc = func_addr; current_pc < prologue_end;)
618 int insn2 = -1; /* dummy value */
621 fprintf_filtered (gdb_stdlog, "0x%.8lx ", (long) current_pc);
622 gdb_print_insn (current_pc, gdb_stdlog);
625 insn = read_memory_unsigned_integer (current_pc, 2);
627 if ((insn & 0x0780) >= 0x0600) /* Four byte instruction? */
629 insn2 = read_memory_unsigned_integer (current_pc, 2);
633 if ((insn & 0xffc0) == ((10 << 11) | 0x0780) && !regsave_func_p)
634 { /* jarl <func>,10 */
635 long low_disp = insn2 & ~(long) 1;
636 long disp = (((((insn & 0x3f) << 16) + low_disp)
637 & ~(long) 1) ^ 0x00200000) - 0x00200000;
639 save_pc = current_pc;
640 save_end = prologue_end;
642 current_pc += disp - 4;
643 prologue_end = (current_pc
644 + (2 * 3) /* moves to/from ep */
645 + 4 /* addi <const>,sp,sp */
647 + (2 * 12) /* sst.w to save r2, r20-r29, r31 */
648 + 20); /* slop area */
651 printf_filtered ("\tfound jarl <func>,r10, disp = %ld, low_disp = %ld, new pc = 0x%.8lx\n",
652 disp, low_disp, (long) current_pc + 2);
656 else if ((insn & 0xffc0) == 0x0200 && !regsave_func_p)
658 long ctbp = read_register (E_CTBP_REGNUM);
659 long adr = ctbp + ((insn & 0x3f) << 1);
661 save_pc = current_pc;
662 save_end = prologue_end;
664 current_pc = ctbp + (read_memory_unsigned_integer (adr, 2) & 0xffff);
665 prologue_end = (current_pc
666 + (2 * 3) /* prepare list2,imm5,sp/imm */
668 + 20); /* slop area */
671 printf_filtered ("\tfound callt, ctbp = 0x%.8lx, adr = %.8lx, new pc = 0x%.8lx\n",
672 ctbp, adr, (long) current_pc);
676 else if ((insn & 0xffc0) == 0x0780) /* prepare list2,imm5 */
678 handle_prepare (insn, insn2, ¤t_pc, pi, &pifsr);
681 else if (insn == 0x07e0 && regsave_func_p && insn2 == 0x0144)
682 { /* ctret after processing register save function */
683 current_pc = save_pc;
684 prologue_end = save_end;
687 printf_filtered ("\tfound ctret after regsave func");
691 else if ((insn & 0xfff0) == 0x07e0 && (insn2 & 5) == 1)
692 { /* pushml, pushmh */
693 handle_pushm (insn, insn2, pi, &pifsr);
696 else if ((insn & 0xffe0) == 0x0060 && regsave_func_p)
697 { /* jmp after processing register save function */
698 current_pc = save_pc;
699 prologue_end = save_end;
702 printf_filtered ("\tfound jmp after regsave func");
706 else if ((insn & 0x07c0) == 0x0780 /* jarl or jr */
707 || (insn & 0xffe0) == 0x0060 /* jmp */
708 || (insn & 0x0780) == 0x0580) /* branch */
711 printf_filtered ("\n");
713 break; /* Ran into end of prologue */
716 else if ((insn & 0xffe0) == ((E_SP_REGNUM << 11) | 0x0240)) /* add <imm>,sp */
717 pi->frameoffset += ((insn & 0x1f) ^ 0x10) - 0x10;
718 else if (insn == ((E_SP_REGNUM << 11) | 0x0600 | E_SP_REGNUM)) /* addi <imm>,sp,sp */
719 pi->frameoffset += insn2;
720 else if (insn == ((E_FP_RAW_REGNUM << 11) | 0x0000 | E_SP_REGNUM)) /* mov sp,fp */
723 pi->framereg = E_FP_RAW_REGNUM;
726 else if (insn == ((E_R12_REGNUM << 11) | 0x0640 | E_R0_REGNUM)) /* movhi hi(const),r0,r12 */
727 r12_tmp = insn2 << 16;
728 else if (insn == ((E_R12_REGNUM << 11) | 0x0620 | E_R12_REGNUM)) /* movea lo(const),r12,r12 */
730 else if (insn == ((E_SP_REGNUM << 11) | 0x01c0 | E_R12_REGNUM) && r12_tmp) /* add r12,sp */
731 pi->frameoffset = r12_tmp;
732 else if (insn == ((E_EP_REGNUM << 11) | 0x0000 | E_SP_REGNUM)) /* mov sp,ep */
734 else if (insn == ((E_EP_REGNUM << 11) | 0x0000 | E_R1_REGNUM)) /* mov r1,ep */
736 else if (((insn & 0x07ff) == (0x0760 | E_SP_REGNUM) /* st.w <reg>,<offset>[sp] */
738 && (insn & 0x07ff) == (0x0760 | E_FP_RAW_REGNUM))) /* st.w <reg>,<offset>[fp] */
740 && (((reg = (insn >> 11) & 0x1f) >= E_SAVE1_START_REGNUM && reg <= E_SAVE1_END_REGNUM)
741 || (reg >= E_SAVE2_START_REGNUM && reg <= E_SAVE2_END_REGNUM)
742 || (reg >= E_SAVE3_START_REGNUM && reg <= E_SAVE3_END_REGNUM)))
745 pifsr->offset = insn2 & ~1;
746 pifsr->cur_frameoffset = pi->frameoffset;
748 printf_filtered ("\tSaved register r%d, offset %d", reg, pifsr->offset);
753 else if (ep_used /* sst.w <reg>,<offset>[ep] */
754 && ((insn & 0x0781) == 0x0501)
756 && (((reg = (insn >> 11) & 0x1f) >= E_SAVE1_START_REGNUM && reg <= E_SAVE1_END_REGNUM)
757 || (reg >= E_SAVE2_START_REGNUM && reg <= E_SAVE2_END_REGNUM)
758 || (reg >= E_SAVE3_START_REGNUM && reg <= E_SAVE3_END_REGNUM)))
761 pifsr->offset = (insn & 0x007e) << 1;
762 pifsr->cur_frameoffset = pi->frameoffset;
764 printf_filtered ("\tSaved register r%d, offset %d", reg, pifsr->offset);
770 printf_filtered ("\n");
775 pifsr->framereg = 0; /* Tie off last entry */
777 /* Fix up any offsets to the final offset. If a frame pointer was created, use it
778 instead of the stack pointer. */
779 for (pifsr_tmp = pi->pifsrs; pifsr_tmp && pifsr_tmp != pifsr; pifsr_tmp++)
781 pifsr_tmp->offset -= pi->frameoffset - pifsr_tmp->cur_frameoffset;
782 pifsr_tmp->framereg = pi->framereg;
785 printf_filtered ("Saved register r%d, offset = %d, framereg = r%d\n",
786 pifsr_tmp->reg, pifsr_tmp->offset, pifsr_tmp->framereg);
791 printf_filtered ("Framereg = r%d, frameoffset = %d\n", pi->framereg, pi->frameoffset);
797 /* Function: find_callers_reg
798 Find REGNUM on the stack. Otherwise, it's in an active register.
799 One thing we might want to do here is to check REGNUM against the
800 clobber mask, and somehow flag it as invalid if it isn't saved on
801 the stack somewhere. This would provide a graceful failure mode
802 when trying to get the value of caller-saves registers for an inner
806 v850_find_callers_reg (struct frame_info *fi, int regnum)
808 for (; fi; fi = get_next_frame (fi))
809 if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (fi), get_frame_base (fi),
810 get_frame_base (fi)))
811 return deprecated_read_register_dummy (get_frame_pc (fi),
812 get_frame_base (fi), regnum);
813 else if (get_frame_saved_regs (fi)[regnum] != 0)
814 return read_memory_unsigned_integer (get_frame_saved_regs (fi)[regnum],
815 v850_register_raw_size (regnum));
817 return read_register (regnum);
820 /* Function: frame_chain
821 Figure out the frame prior to FI. Unfortunately, this involves
822 scanning the prologue of the caller, which will also be done
823 shortly by v850_init_extra_frame_info. For the dummy frame, we
824 just return the stack pointer that was in use at the time the
825 function call was made. */
828 v850_frame_chain (struct frame_info *fi)
830 struct prologue_info pi;
831 CORE_ADDR callers_pc, fp;
833 /* First, find out who called us */
834 callers_pc = DEPRECATED_FRAME_SAVED_PC (fi);
835 /* If caller is a call-dummy, then our FP bears no relation to his FP! */
836 fp = v850_find_callers_reg (fi, E_FP_RAW_REGNUM);
837 if (DEPRECATED_PC_IN_CALL_DUMMY (callers_pc, fp, fp))
838 return fp; /* caller is call-dummy: return oldest value of FP */
840 /* Caller is NOT a call-dummy, so everything else should just work.
841 Even if THIS frame is a call-dummy! */
844 v850_scan_prologue (callers_pc, &pi);
846 if (pi.start_function)
847 return 0; /* Don't chain beyond the start function */
849 if (pi.framereg == E_FP_RAW_REGNUM)
850 return v850_find_callers_reg (fi, pi.framereg);
852 return get_frame_base (fi) - pi.frameoffset;
855 /* Function: skip_prologue
856 Return the address of the first code past the prologue of the function. */
859 v850_skip_prologue (CORE_ADDR pc)
861 CORE_ADDR func_addr, func_end;
863 /* See what the symbol table says */
865 if (find_pc_partial_function (pc, NULL, &func_addr, &func_end))
867 struct symtab_and_line sal;
869 sal = find_pc_line (func_addr, 0);
871 if (sal.line != 0 && sal.end < func_end)
874 /* Either there's no line info, or the line after the prologue is after
875 the end of the function. In this case, there probably isn't a
880 /* We can't find the start of this function, so there's nothing we can do. */
884 /* Function: pop_frame
885 This routine gets called when either the user uses the `return'
886 command, or the call dummy breakpoint gets hit. */
889 v850_pop_frame (void)
891 struct frame_info *frame = get_current_frame ();
894 if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (frame),
895 get_frame_base (frame),
896 get_frame_base (frame)))
897 generic_pop_dummy_frame ();
900 write_register (E_PC_REGNUM, DEPRECATED_FRAME_SAVED_PC (frame));
902 for (regnum = 0; regnum < E_NUM_REGS; regnum++)
903 if (get_frame_saved_regs (frame)[regnum] != 0)
904 write_register (regnum,
905 read_memory_unsigned_integer (get_frame_saved_regs (frame)[regnum],
906 v850_register_raw_size (regnum)));
908 write_register (E_SP_REGNUM, get_frame_base (frame));
911 flush_cached_frames ();
914 /* Function: push_arguments
915 Setup arguments and RP for a call to the target. First four args
916 go in R6->R9, subsequent args go into sp + 16 -> sp + ... Structs
917 are passed by reference. 64 bit quantities (doubles and long
918 longs) may be split between the regs and the stack. When calling a
919 function that returns a struct, a pointer to the struct is passed
920 in as a secret first argument (always in R6).
922 Stack space for the args has NOT been allocated: that job is up to us.
926 v850_push_arguments (int nargs, struct value **args, CORE_ADDR sp,
927 int struct_return, CORE_ADDR struct_addr)
934 /* First, just for safety, make sure stack is aligned */
937 /* The offset onto the stack at which we will start copying parameters
938 (after the registers are used up) begins at 16 rather than at zero.
939 I don't really know why, that's just the way it seems to work. */
942 /* Now make space on the stack for the args. */
943 for (argnum = 0; argnum < nargs; argnum++)
944 len += ((TYPE_LENGTH (VALUE_TYPE (args[argnum])) + 3) & ~3);
945 sp -= len + stack_offset; /* possibly over-allocating, but it works... */
946 /* (you might think we could allocate 16 bytes */
947 /* less, but the ABI seems to use it all! ) */
949 argreg = E_ARG0_REGNUM;
950 /* the struct_return pointer occupies the first parameter-passing reg */
954 /* Now load as many as possible of the first arguments into
955 registers, and push the rest onto the stack. There are 16 bytes
956 in four registers available. Loop thru args from first to last. */
957 for (argnum = 0; argnum < nargs; argnum++)
961 char valbuf[v850_register_raw_size (E_ARG0_REGNUM)];
963 if (!v850_type_is_scalar (VALUE_TYPE (*args))
964 && TYPE_LENGTH (VALUE_TYPE (*args)) > E_MAX_RETTYPE_SIZE_IN_REGS)
966 store_unsigned_integer (valbuf, 4, VALUE_ADDRESS (*args));
972 len = TYPE_LENGTH (VALUE_TYPE (*args));
973 val = (char *) VALUE_CONTENTS (*args);
977 if (argreg <= E_ARGLAST_REGNUM)
981 regval = extract_unsigned_integer (val, v850_register_raw_size (argreg));
982 write_register (argreg, regval);
984 len -= v850_register_raw_size (argreg);
985 val += v850_register_raw_size (argreg);
990 write_memory (sp + stack_offset, val, 4);
1001 /* Function: push_return_address (pc)
1002 Set up the return address for the inferior function call.
1003 Needed for targets where we don't actually execute a JSR/BSR instruction */
1006 v850_push_return_address (CORE_ADDR pc, CORE_ADDR sp)
1008 write_register (E_RP_REGNUM, entry_point_address ());
1012 /* Function: frame_saved_pc
1013 Find the caller of this frame. We do this by seeing if E_RP_REGNUM
1014 is saved in the stack anywhere, otherwise we get it from the
1015 registers. If the inner frame is a dummy frame, return its PC
1016 instead of RP, because that's where "caller" of the dummy-frame
1020 v850_frame_saved_pc (struct frame_info *fi)
1022 if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (fi), get_frame_base (fi),
1023 get_frame_base (fi)))
1024 return deprecated_read_register_dummy (get_frame_pc (fi),
1025 get_frame_base (fi), E_PC_REGNUM);
1027 return v850_find_callers_reg (fi, E_RP_REGNUM);
1031 /* Function: fix_call_dummy
1032 Pokes the callee function's address into the CALL_DUMMY assembly stub.
1033 Assumes that the CALL_DUMMY looks like this:
1034 jarl <offset24>, r31
1039 v850_fix_call_dummy (char *dummy, CORE_ADDR sp, CORE_ADDR fun, int nargs,
1040 struct value **args, struct type *type, int gcc_p)
1044 offset24 = (long) fun - (long) entry_point_address ();
1045 offset24 &= 0x3fffff;
1046 offset24 |= 0xff800000; /* jarl <offset24>, r31 */
1048 store_unsigned_integer ((unsigned int *) &dummy[2], 2, offset24 & 0xffff);
1049 store_unsigned_integer ((unsigned int *) &dummy[0], 2, offset24 >> 16);
1053 v850_saved_pc_after_call (struct frame_info *ignore)
1055 return read_register (E_RP_REGNUM);
1059 v850_extract_return_value (struct type *type, char *regbuf, char *valbuf)
1061 CORE_ADDR return_buffer;
1063 if (!v850_use_struct_convention (0, type))
1065 /* Scalar return values of <= 8 bytes are returned in
1066 E_V0_REGNUM to E_V1_REGNUM. */
1068 ®buf[DEPRECATED_REGISTER_BYTE (E_V0_REGNUM)],
1069 TYPE_LENGTH (type));
1073 /* Aggregates and return values > 8 bytes are returned in memory,
1074 pointed to by R6. */
1076 extract_unsigned_integer (regbuf + DEPRECATED_REGISTER_BYTE (E_V0_REGNUM),
1077 REGISTER_RAW_SIZE (E_V0_REGNUM));
1079 read_memory (return_buffer, valbuf, TYPE_LENGTH (type));
1083 const static unsigned char *
1084 v850_breakpoint_from_pc (CORE_ADDR *pcptr, int *lenptr)
1086 static unsigned char breakpoint[] = { 0x85, 0x05 };
1087 *lenptr = sizeof (breakpoint);
1092 v850_extract_struct_value_address (char *regbuf)
1094 return extract_unsigned_integer (regbuf + v850_register_byte (E_V0_REGNUM),
1095 v850_register_raw_size (E_V0_REGNUM));
1099 v850_store_return_value (struct type *type, char *valbuf)
1101 CORE_ADDR return_buffer;
1103 if (!v850_use_struct_convention (0, type))
1104 deprecated_write_register_bytes (DEPRECATED_REGISTER_BYTE (E_V0_REGNUM), valbuf,
1105 TYPE_LENGTH (type));
1108 return_buffer = read_register (E_V0_REGNUM);
1109 write_memory (return_buffer, valbuf, TYPE_LENGTH (type));
1114 v850_frame_init_saved_regs (struct frame_info *fi)
1116 struct prologue_info pi;
1117 struct pifsr pifsrs[E_NUM_REGS + 1], *pifsr;
1118 CORE_ADDR func_addr, func_end;
1120 if (!get_frame_saved_regs (fi))
1122 frame_saved_regs_zalloc (fi);
1124 /* The call dummy doesn't save any registers on the stack, so we
1126 if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (fi), get_frame_base (fi),
1127 get_frame_base (fi)))
1130 /* Find the beginning of this function, so we can analyze its
1132 if (find_pc_partial_function (get_frame_pc (fi), NULL, &func_addr, &func_end))
1136 v850_scan_prologue (get_frame_pc (fi), &pi);
1138 if (!get_next_frame (fi) && pi.framereg == E_SP_REGNUM)
1139 deprecated_update_frame_base_hack (fi, read_register (pi.framereg) - pi.frameoffset);
1141 for (pifsr = pifsrs; pifsr->framereg; pifsr++)
1143 get_frame_saved_regs (fi)[pifsr->reg] = pifsr->offset + get_frame_base (fi);
1145 if (pifsr->framereg == E_SP_REGNUM)
1146 get_frame_saved_regs (fi)[pifsr->reg] += pi.frameoffset;
1149 /* Else we're out of luck (can't debug completely stripped code).
1154 /* Function: init_extra_frame_info
1155 Setup the frame's frame pointer, pc, and frame addresses for saved
1156 registers. Most of the work is done in scan_prologue().
1158 Note that when we are called for the last frame (currently active frame),
1159 that get_frame_pc (fi) and fi->frame will already be setup. However, fi->frame will
1160 be valid only if this routine uses FP. For previous frames, fi-frame will
1161 always be correct (since that is derived from v850_frame_chain ()).
1163 We can be called with the PC in the call dummy under two
1164 circumstances. First, during normal backtracing, second, while
1165 figuring out the frame pointer just prior to calling the target
1166 function (see call_function_by_hand). */
1169 v850_init_extra_frame_info (int fromleaf, struct frame_info *fi)
1171 struct prologue_info pi;
1173 if (get_next_frame (fi))
1174 deprecated_update_frame_pc_hack (fi, DEPRECATED_FRAME_SAVED_PC (get_next_frame (fi)));
1176 v850_frame_init_saved_regs (fi);
1180 v850_store_struct_return (CORE_ADDR addr, CORE_ADDR sp)
1182 write_register (E_ARG0_REGNUM, addr);
1186 v850_target_read_fp (void)
1188 return read_register (E_FP_RAW_REGNUM);
1191 static struct gdbarch *
1192 v850_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
1194 static LONGEST call_dummy_words[1] = { 0 };
1195 struct gdbarch_tdep *tdep = NULL;
1196 struct gdbarch *gdbarch;
1199 /* find a candidate among the list of pre-declared architectures. */
1200 arches = gdbarch_list_lookup_by_info (arches, &info);
1202 return (arches->gdbarch);
1205 tdep = (struct gdbarch_tdep *) xmalloc (sizeof (struct gdbarch_tdep));
1208 /* Change the register names based on the current machine type. */
1209 if (info.bfd_arch_info->arch != bfd_arch_v850)
1212 gdbarch = gdbarch_alloc (&info, 0);
1214 /* NOTE: cagney/2002-12-06: This can be deleted when this arch is
1215 ready to unwind the PC first (see frame.c:get_prev_frame()). */
1216 set_gdbarch_deprecated_init_frame_pc (gdbarch, init_frame_pc_default);
1218 for (i = 0; v850_processor_type_table[i].regnames != NULL; i++)
1220 if (v850_processor_type_table[i].mach == info.bfd_arch_info->mach)
1222 v850_register_names = v850_processor_type_table[i].regnames;
1228 * Basic register fields and methods.
1230 set_gdbarch_num_regs (gdbarch, E_NUM_REGS);
1231 set_gdbarch_num_pseudo_regs (gdbarch, 0);
1232 set_gdbarch_sp_regnum (gdbarch, E_SP_REGNUM);
1233 set_gdbarch_deprecated_fp_regnum (gdbarch, E_FP_REGNUM);
1234 set_gdbarch_pc_regnum (gdbarch, E_PC_REGNUM);
1235 set_gdbarch_register_name (gdbarch, v850_register_name);
1236 set_gdbarch_deprecated_register_size (gdbarch, v850_reg_size);
1237 set_gdbarch_deprecated_register_bytes (gdbarch, E_ALL_REGS_SIZE);
1238 set_gdbarch_deprecated_register_byte (gdbarch, v850_register_byte);
1239 set_gdbarch_deprecated_register_raw_size (gdbarch, v850_register_raw_size);
1240 set_gdbarch_deprecated_max_register_raw_size (gdbarch, v850_reg_size);
1241 set_gdbarch_deprecated_register_virtual_size (gdbarch, v850_register_raw_size);
1242 set_gdbarch_deprecated_max_register_virtual_size (gdbarch, v850_reg_size);
1243 set_gdbarch_deprecated_register_virtual_type (gdbarch, v850_reg_virtual_type);
1245 set_gdbarch_deprecated_target_read_fp (gdbarch, v850_target_read_fp);
1250 set_gdbarch_deprecated_frame_init_saved_regs (gdbarch, v850_frame_init_saved_regs);
1251 set_gdbarch_deprecated_init_extra_frame_info (gdbarch, v850_init_extra_frame_info);
1252 set_gdbarch_deprecated_frame_chain (gdbarch, v850_frame_chain);
1253 set_gdbarch_deprecated_saved_pc_after_call (gdbarch, v850_saved_pc_after_call);
1254 set_gdbarch_deprecated_frame_saved_pc (gdbarch, v850_frame_saved_pc);
1255 set_gdbarch_skip_prologue (gdbarch, v850_skip_prologue);
1260 /* Stack grows up. */
1261 set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
1262 /* PC stops zero byte after a trap instruction
1263 (which means: exactly on trap instruction). */
1264 set_gdbarch_decr_pc_after_break (gdbarch, 0);
1265 /* This value is almost never non-zero... */
1266 set_gdbarch_function_start_offset (gdbarch, 0);
1267 /* This value is almost never non-zero... */
1268 set_gdbarch_frame_args_skip (gdbarch, 0);
1273 * These values and methods are used when gdb calls a target function. */
1274 set_gdbarch_deprecated_push_return_address (gdbarch, v850_push_return_address);
1275 set_gdbarch_deprecated_extract_return_value (gdbarch, v850_extract_return_value);
1276 set_gdbarch_deprecated_push_arguments (gdbarch, v850_push_arguments);
1277 set_gdbarch_deprecated_pop_frame (gdbarch, v850_pop_frame);
1278 set_gdbarch_deprecated_store_struct_return (gdbarch, v850_store_struct_return);
1279 set_gdbarch_deprecated_store_return_value (gdbarch, v850_store_return_value);
1280 set_gdbarch_deprecated_extract_struct_value_address (gdbarch, v850_extract_struct_value_address);
1281 set_gdbarch_use_struct_convention (gdbarch, v850_use_struct_convention);
1282 set_gdbarch_deprecated_call_dummy_words (gdbarch, call_dummy_nil);
1283 set_gdbarch_deprecated_sizeof_call_dummy_words (gdbarch, 0);
1284 set_gdbarch_deprecated_fix_call_dummy (gdbarch, v850_fix_call_dummy);
1285 set_gdbarch_breakpoint_from_pc (gdbarch, v850_breakpoint_from_pc);
1287 set_gdbarch_int_bit (gdbarch, 4 * TARGET_CHAR_BIT);
1288 set_gdbarch_ptr_bit (gdbarch, 4 * TARGET_CHAR_BIT);
1289 set_gdbarch_addr_bit (gdbarch, 4 * TARGET_CHAR_BIT);
1290 set_gdbarch_long_double_bit (gdbarch, 8 * TARGET_CHAR_BIT);
1292 /* Should be using push_dummy_call. */
1293 set_gdbarch_deprecated_dummy_write_sp (gdbarch, deprecated_write_sp);
1295 set_gdbarch_print_insn (gdbarch, print_insn_v850);
1300 extern initialize_file_ftype _initialize_v850_tdep; /* -Wmissing-prototypes */
1303 _initialize_v850_tdep (void)
1305 register_gdbarch_init (bfd_arch_v850, v850_gdbarch_init);