2002-08-15 Andrew Cagney <ac131313@redhat.com>
[deliverable/binutils-gdb.git] / gdb / v850-tdep.c
CommitLineData
c906108c 1/* Target-dependent code for the NEC V850 for GDB, the GNU debugger.
435e042a 2 Copyright 1996, 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
c906108c 3
c5aa993b 4 This file is part of GDB.
c906108c 5
c5aa993b
JM
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
c906108c 10
c5aa993b
JM
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
c906108c 15
c5aa993b
JM
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
c906108c
SS
20
21#include "defs.h"
22#include "frame.h"
23#include "inferior.h"
c906108c
SS
24#include "target.h"
25#include "value.h"
26#include "bfd.h"
27#include "gdb_string.h"
28#include "gdbcore.h"
29#include "symfile.h"
b4a20239 30#include "arch-utils.h"
4e052eda 31#include "regcache.h"
435e042a 32#include "symtab.h"
c906108c 33
435e042a
CV
34struct gdbarch_tdep
35{
36 /* gdbarch target dependent data here. Currently unused for v850. */
37};
38
39/* Extra info which is saved in each frame_info. */
40struct frame_extra_info
41{
42};
c906108c 43
435e042a
CV
44enum {
45 E_R0_REGNUM,
46 E_R1_REGNUM,
47 E_R2_REGNUM, E_SAVE1_START_REGNUM = E_R2_REGNUM, E_SAVE1_END_REGNUM = E_R2_REGNUM,
48 E_R3_REGNUM, E_SP_REGNUM = E_R3_REGNUM,
49 E_R4_REGNUM,
50 E_R5_REGNUM,
51 E_R6_REGNUM, E_ARG0_REGNUM = E_R6_REGNUM,
52 E_R7_REGNUM,
53 E_R8_REGNUM,
54 E_R9_REGNUM, E_ARGLAST_REGNUM = E_R9_REGNUM,
55 E_R10_REGNUM, E_V0_REGNUM = E_R10_REGNUM,
56 E_R11_REGNUM, E_V1_REGNUM = E_R11_REGNUM,
57 E_R12_REGNUM,
58 E_R13_REGNUM,
59 E_R14_REGNUM,
60 E_R15_REGNUM,
61 E_R16_REGNUM,
62 E_R17_REGNUM,
63 E_R18_REGNUM,
64 E_R19_REGNUM,
65 E_R20_REGNUM, E_SAVE2_START_REGNUM = E_R20_REGNUM,
66 E_R21_REGNUM,
67 E_R22_REGNUM,
68 E_R23_REGNUM,
69 E_R24_REGNUM,
70 E_R25_REGNUM,
71 E_R26_REGNUM,
72 E_R27_REGNUM,
73 E_R28_REGNUM,
74 E_R29_REGNUM, E_SAVE2_END_REGNUM = E_R29_REGNUM, E_FP_RAW_REGNUM = E_R29_REGNUM,
75 E_R30_REGNUM, E_EP_REGNUM = E_R30_REGNUM,
76 E_R31_REGNUM, E_SAVE3_START_REGNUM = E_R31_REGNUM, E_SAVE3_END_REGNUM = E_R31_REGNUM, E_RP_REGNUM = E_R31_REGNUM,
77 E_R32_REGNUM, E_SR0_REGNUM = E_R32_REGNUM,
78 E_R33_REGNUM,
79 E_R34_REGNUM,
80 E_R35_REGNUM,
81 E_R36_REGNUM,
82 E_R37_REGNUM, E_PS_REGNUM = E_R37_REGNUM,
83 E_R38_REGNUM,
84 E_R39_REGNUM,
85 E_R40_REGNUM,
86 E_R41_REGNUM,
87 E_R42_REGNUM,
88 E_R43_REGNUM,
89 E_R44_REGNUM,
90 E_R45_REGNUM,
91 E_R46_REGNUM,
92 E_R47_REGNUM,
93 E_R48_REGNUM,
94 E_R49_REGNUM,
95 E_R50_REGNUM,
96 E_R51_REGNUM,
97 E_R52_REGNUM, E_CTBP_REGNUM = E_R52_REGNUM,
98 E_R53_REGNUM,
99 E_R54_REGNUM,
100 E_R55_REGNUM,
101 E_R56_REGNUM,
102 E_R57_REGNUM,
103 E_R58_REGNUM,
104 E_R59_REGNUM,
105 E_R60_REGNUM,
106 E_R61_REGNUM,
107 E_R62_REGNUM,
108 E_R63_REGNUM,
109 E_R64_REGNUM, E_PC_REGNUM = E_R64_REGNUM,
110 E_R65_REGNUM, E_FP_REGNUM = E_R65_REGNUM,
111 E_NUM_REGS
112};
113
114enum
115{
116 v850_reg_size = 4
117};
118
119/* Size of all registers as a whole. */
120enum
121{
122 E_ALL_REGS_SIZE = (E_NUM_REGS) * v850_reg_size
123};
124
70eb15a4
CV
125/* Size of return datatype which fits into all return registers. */
126enum
127{
128 E_MAX_RETTYPE_SIZE_IN_REGS = 2 * v850_reg_size
129};
130
435e042a
CV
131static LONGEST call_dummy_nil[] = {0};
132
133static char *v850_generic_reg_names[] =
134{ "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
135 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
136 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
137 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
138 "eipc", "eipsw", "fepc", "fepsw", "ecr", "psw", "sr6", "sr7",
139 "sr8", "sr9", "sr10", "sr11", "sr12", "sr13", "sr14", "sr15",
140 "sr16", "sr17", "sr18", "sr19", "sr20", "sr21", "sr22", "sr23",
141 "sr24", "sr25", "sr26", "sr27", "sr28", "sr29", "sr30", "sr31",
142 "pc", "fp"
143};
c906108c
SS
144
145static char *v850e_reg_names[] =
146{
147 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
148 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
149 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
150 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
151 "eipc", "eipsw", "fepc", "fepsw", "ecr", "psw", "sr6", "sr7",
152 "sr8", "sr9", "sr10", "sr11", "sr12", "sr13", "sr14", "sr15",
153 "ctpc", "ctpsw", "dbpc", "dbpsw", "ctbp", "sr21", "sr22", "sr23",
154 "sr24", "sr25", "sr26", "sr27", "sr28", "sr29", "sr30", "sr31",
155 "pc", "fp"
156};
157
158char **v850_register_names = v850_generic_reg_names;
159
160struct
c5aa993b
JM
161 {
162 char **regnames;
163 int mach;
164 }
165v850_processor_type_table[] =
c906108c 166{
c5aa993b
JM
167 {
168 v850_generic_reg_names, bfd_mach_v850
169 }
170 ,
171 {
172 v850e_reg_names, bfd_mach_v850e
173 }
174 ,
175 {
176 v850e_reg_names, bfd_mach_v850ea
177 }
178 ,
179 {
180 NULL, 0
181 }
c906108c
SS
182};
183
184/* Info gleaned from scanning a function's prologue. */
185
186struct pifsr /* Info about one saved reg */
c5aa993b
JM
187 {
188 int framereg; /* Frame reg (SP or FP) */
189 int offset; /* Offset from framereg */
190 int cur_frameoffset; /* Current frameoffset */
191 int reg; /* Saved register number */
192 };
c906108c
SS
193
194struct prologue_info
c5aa993b
JM
195 {
196 int framereg;
197 int frameoffset;
198 int start_function;
199 struct pifsr *pifsrs;
200 };
c906108c 201
a14ed312 202static CORE_ADDR v850_scan_prologue (CORE_ADDR pc, struct prologue_info *fs);
c906108c 203
435e042a
CV
204/* Function: v850_register_name
205 Returns the name of the v850/v850e register N. */
206
fa88f677 207static const char *
435e042a
CV
208v850_register_name (int regnum)
209{
210 if (regnum < 0 || regnum >= E_NUM_REGS)
211 internal_error (__FILE__, __LINE__,
212 "v850_register_name: illegal register number %d",
213 regnum);
214 else
215 return v850_register_names[regnum];
216
217}
218
219/* Function: v850_register_byte
220 Returns the byte position in the register cache for register N. */
221
222static int
223v850_register_byte (int regnum)
224{
225 if (regnum < 0 || regnum >= E_NUM_REGS)
226 internal_error (__FILE__, __LINE__,
227 "v850_register_byte: illegal register number %d",
228 regnum);
229 else
230 return regnum * v850_reg_size;
231}
232
233/* Function: v850_register_raw_size
234 Returns the number of bytes occupied by the register on the target. */
235
236static int
237v850_register_raw_size (int regnum)
238{
239 if (regnum < 0 || regnum >= E_NUM_REGS)
240 internal_error (__FILE__, __LINE__,
241 "v850_register_raw_size: illegal register number %d",
242 regnum);
243 /* Only the PC has 4 Byte, all other registers 2 Byte. */
244 else
245 return v850_reg_size;
246}
247
248/* Function: v850_register_virtual_size
249 Returns the number of bytes occupied by the register as represented
250 internally by gdb. */
251
252static int
253v850_register_virtual_size (int regnum)
254{
255 return v850_register_raw_size (regnum);
256}
257
258/* Function: v850_reg_virtual_type
259 Returns the default type for register N. */
260
261static struct type *
262v850_reg_virtual_type (int regnum)
263{
264 if (regnum < 0 || regnum >= E_NUM_REGS)
265 internal_error (__FILE__, __LINE__,
266 "v850_register_virtual_type: illegal register number %d",
267 regnum);
268 else if (regnum == E_PC_REGNUM)
269 return builtin_type_uint32;
270 else
271 return builtin_type_int32;
272}
c906108c 273
70eb15a4
CV
274static int
275v850_type_is_scalar (struct type *t)
276{
277 return (TYPE_CODE (t) != TYPE_CODE_STRUCT
278 && TYPE_CODE (t) != TYPE_CODE_UNION
279 && TYPE_CODE (t) != TYPE_CODE_ARRAY);
280}
281
c906108c 282/* Should call_function allocate stack space for a struct return? */
70eb15a4 283static int
fba45db2 284v850_use_struct_convention (int gcc_p, struct type *type)
c906108c 285{
70eb15a4
CV
286 /* According to ABI:
287 * return TYPE_LENGTH (type) > 8);
288 */
289
290 /* Current implementation in gcc: */
291
292 int i;
293 struct type *fld_type, *tgt_type;
294
295 /* 1. The value is greater than 8 bytes -> returned by copying */
296 if (TYPE_LENGTH (type) > 8)
297 return 1;
298
299 /* 2. The value is a single basic type -> returned in register */
300 if (v850_type_is_scalar (type))
301 return 0;
302
303 /* The value is a structure or union with a single element
304 * and that element is either a single basic type or an array of
305 * a single basic type whoes size is greater than or equal to 4
306 * -> returned in register */
307 if ((TYPE_CODE (type) == TYPE_CODE_STRUCT
308 || TYPE_CODE (type) == TYPE_CODE_UNION)
309 && TYPE_NFIELDS (type) == 1)
310 {
311 fld_type = TYPE_FIELD_TYPE (type, 0);
312 if (v850_type_is_scalar (fld_type) && TYPE_LENGTH (fld_type) >= 4)
313 return 0;
314
315 if (TYPE_CODE (fld_type) == TYPE_CODE_ARRAY)
316 {
317 tgt_type = TYPE_TARGET_TYPE (fld_type);
318 if (v850_type_is_scalar (tgt_type) && TYPE_LENGTH (tgt_type) >= 4)
319 return 0;
320 }
321 }
322
323 /* The value is a structure whose first element is an integer or
324 * a float, and which contains no arrays of more than two elements
325 * -> returned in register */
326 if (TYPE_CODE (type) == TYPE_CODE_STRUCT
327 && v850_type_is_scalar (TYPE_FIELD_TYPE (type, 0))
328 && TYPE_LENGTH (TYPE_FIELD_TYPE (type, 0)) == 4)
329 {
330 for (i = 1; i < TYPE_NFIELDS (type); ++i)
331 {
332 fld_type = TYPE_FIELD_TYPE (type, 0);
333 if (TYPE_CODE (fld_type) == TYPE_CODE_ARRAY)
334 {
335 tgt_type = TYPE_TARGET_TYPE (fld_type);
336 if (TYPE_LENGTH (fld_type) >= 0 && TYPE_LENGTH (tgt_type) >= 0
337 && TYPE_LENGTH (fld_type) / TYPE_LENGTH (tgt_type) > 2)
338 return 1;
339 }
340 }
341 return 0;
342 }
343
344 /* The value is a union which contains at least one field which
345 * would be returned in registers according to these rules
346 * -> returned in register */
347 if (TYPE_CODE (type) == TYPE_CODE_UNION)
348 {
349 for (i = 0; i < TYPE_NFIELDS (type); ++i)
350 {
351 fld_type = TYPE_FIELD_TYPE (type, 0);
352 if (!v850_use_struct_convention (0, fld_type))
353 return 0;
354 }
355 }
356
357 return 1;
c906108c 358}
c906108c
SS
359\f
360
c5aa993b 361
c906108c 362/* Structure for mapping bits in register lists to register numbers. */
c5aa993b 363struct reg_list
c906108c
SS
364{
365 long mask;
366 int regno;
367};
368
369/* Helper function for v850_scan_prologue to handle prepare instruction. */
370
371static void
c5aa993b 372handle_prepare (int insn, int insn2, CORE_ADDR * current_pc_ptr,
c906108c 373 struct prologue_info *pi, struct pifsr **pifsr_ptr)
c906108c
SS
374{
375 CORE_ADDR current_pc = *current_pc_ptr;
376 struct pifsr *pifsr = *pifsr_ptr;
377 long next = insn2 & 0xffff;
378 long list12 = ((insn & 1) << 16) + (next & 0xffe0);
379 long offset = (insn & 0x3e) << 1;
c5aa993b 380 static struct reg_list reg_table[] =
c906108c 381 {
c5aa993b
JM
382 {0x00800, 20}, /* r20 */
383 {0x00400, 21}, /* r21 */
384 {0x00200, 22}, /* r22 */
385 {0x00100, 23}, /* r23 */
386 {0x08000, 24}, /* r24 */
387 {0x04000, 25}, /* r25 */
388 {0x02000, 26}, /* r26 */
389 {0x01000, 27}, /* r27 */
390 {0x00080, 28}, /* r28 */
391 {0x00040, 29}, /* r29 */
392 {0x10000, 30}, /* ep */
393 {0x00020, 31}, /* lp */
394 {0, 0} /* end of table */
c906108c
SS
395 };
396 int i;
397
c5aa993b 398 if ((next & 0x1f) == 0x0b) /* skip imm16 argument */
c906108c
SS
399 current_pc += 2;
400 else if ((next & 0x1f) == 0x13) /* skip imm16 argument */
401 current_pc += 2;
402 else if ((next & 0x1f) == 0x1b) /* skip imm32 argument */
403 current_pc += 4;
404
405 /* Calculate the total size of the saved registers, and add it
406 it to the immediate value used to adjust SP. */
407 for (i = 0; reg_table[i].mask != 0; i++)
408 if (list12 & reg_table[i].mask)
435e042a 409 offset += v850_register_raw_size (reg_table[i].regno);
c906108c
SS
410 pi->frameoffset -= offset;
411
412 /* Calculate the offsets of the registers relative to the value
413 the SP will have after the registers have been pushed and the
414 imm5 value has been subtracted from it. */
415 if (pifsr)
416 {
417 for (i = 0; reg_table[i].mask != 0; i++)
418 {
419 if (list12 & reg_table[i].mask)
420 {
421 int reg = reg_table[i].regno;
435e042a 422 offset -= v850_register_raw_size (reg);
c906108c
SS
423 pifsr->reg = reg;
424 pifsr->offset = offset;
425 pifsr->cur_frameoffset = pi->frameoffset;
c5aa993b 426#ifdef DEBUG
c906108c 427 printf_filtered ("\tSaved register r%d, offset %d", reg, pifsr->offset);
c5aa993b 428#endif
c906108c
SS
429 pifsr++;
430 }
431 }
432 }
433#ifdef DEBUG
434 printf_filtered ("\tfound ctret after regsave func");
435#endif
436
437 /* Set result parameters. */
438 *current_pc_ptr = current_pc;
439 *pifsr_ptr = pifsr;
440}
441
442
443/* Helper function for v850_scan_prologue to handle pushm/pushl instructions.
444 FIXME: the SR bit of the register list is not supported; must check
445 that the compiler does not ever generate this bit. */
446
447static void
448handle_pushm (int insn, int insn2, struct prologue_info *pi,
c5aa993b 449 struct pifsr **pifsr_ptr)
c906108c
SS
450{
451 struct pifsr *pifsr = *pifsr_ptr;
452 long list12 = ((insn & 0x0f) << 16) + (insn2 & 0xfff0);
453 long offset = 0;
c5aa993b 454 static struct reg_list pushml_reg_table[] =
c906108c 455 {
435e042a 456 {0x80000, E_PS_REGNUM}, /* PSW */
c5aa993b
JM
457 {0x40000, 1}, /* r1 */
458 {0x20000, 2}, /* r2 */
459 {0x10000, 3}, /* r3 */
460 {0x00800, 4}, /* r4 */
461 {0x00400, 5}, /* r5 */
462 {0x00200, 6}, /* r6 */
463 {0x00100, 7}, /* r7 */
464 {0x08000, 8}, /* r8 */
465 {0x04000, 9}, /* r9 */
466 {0x02000, 10}, /* r10 */
467 {0x01000, 11}, /* r11 */
468 {0x00080, 12}, /* r12 */
469 {0x00040, 13}, /* r13 */
470 {0x00020, 14}, /* r14 */
471 {0x00010, 15}, /* r15 */
472 {0, 0} /* end of table */
c906108c 473 };
c5aa993b 474 static struct reg_list pushmh_reg_table[] =
c906108c 475 {
c5aa993b
JM
476 {0x80000, 16}, /* r16 */
477 {0x40000, 17}, /* r17 */
478 {0x20000, 18}, /* r18 */
479 {0x10000, 19}, /* r19 */
480 {0x00800, 20}, /* r20 */
481 {0x00400, 21}, /* r21 */
482 {0x00200, 22}, /* r22 */
483 {0x00100, 23}, /* r23 */
484 {0x08000, 24}, /* r24 */
485 {0x04000, 25}, /* r25 */
486 {0x02000, 26}, /* r26 */
487 {0x01000, 27}, /* r27 */
488 {0x00080, 28}, /* r28 */
489 {0x00040, 29}, /* r29 */
490 {0x00010, 30}, /* r30 */
491 {0x00020, 31}, /* r31 */
492 {0, 0} /* end of table */
c906108c
SS
493 };
494 struct reg_list *reg_table;
495 int i;
496
497 /* Is this a pushml or a pushmh? */
498 if ((insn2 & 7) == 1)
499 reg_table = pushml_reg_table;
500 else
501 reg_table = pushmh_reg_table;
502
503 /* Calculate the total size of the saved registers, and add it
504 it to the immediate value used to adjust SP. */
505 for (i = 0; reg_table[i].mask != 0; i++)
506 if (list12 & reg_table[i].mask)
435e042a 507 offset += v850_register_raw_size (reg_table[i].regno);
c906108c
SS
508 pi->frameoffset -= offset;
509
510 /* Calculate the offsets of the registers relative to the value
511 the SP will have after the registers have been pushed and the
512 imm5 value is subtracted from it. */
513 if (pifsr)
514 {
515 for (i = 0; reg_table[i].mask != 0; i++)
516 {
517 if (list12 & reg_table[i].mask)
518 {
519 int reg = reg_table[i].regno;
435e042a 520 offset -= v850_register_raw_size (reg);
c906108c
SS
521 pifsr->reg = reg;
522 pifsr->offset = offset;
523 pifsr->cur_frameoffset = pi->frameoffset;
c5aa993b 524#ifdef DEBUG
c906108c 525 printf_filtered ("\tSaved register r%d, offset %d", reg, pifsr->offset);
c5aa993b 526#endif
c906108c
SS
527 pifsr++;
528 }
529 }
530 }
531#ifdef DEBUG
532 printf_filtered ("\tfound ctret after regsave func");
533#endif
534
535 /* Set result parameters. */
536 *pifsr_ptr = pifsr;
537}
c5aa993b 538\f
c906108c
SS
539
540
541
c906108c
SS
542/* Function: scan_prologue
543 Scan the prologue of the function that contains PC, and record what
3a06899a
CV
544 we find in PI. Returns the pc after the prologue. Note that the
545 addresses saved in frame->saved_regs are just frame relative (negative
546 offsets from the frame pointer). This is because we don't know the
547 actual value of the frame pointer yet. In some circumstances, the
548 frame pointer can't be determined till after we have scanned the
549 prologue. */
c906108c
SS
550
551static CORE_ADDR
fba45db2 552v850_scan_prologue (CORE_ADDR pc, struct prologue_info *pi)
c906108c
SS
553{
554 CORE_ADDR func_addr, prologue_end, current_pc;
555 struct pifsr *pifsr, *pifsr_tmp;
556 int fp_used;
557 int ep_used;
558 int reg;
559 CORE_ADDR save_pc, save_end;
560 int regsave_func_p;
561 int r12_tmp;
562
563 /* First, figure out the bounds of the prologue so that we can limit the
564 search to something reasonable. */
565
566 if (find_pc_partial_function (pc, NULL, &func_addr, NULL))
567 {
568 struct symtab_and_line sal;
569
570 sal = find_pc_line (func_addr, 0);
571
572 if (func_addr == entry_point_address ())
573 pi->start_function = 1;
574 else
575 pi->start_function = 0;
576
577#if 0
578 if (sal.line == 0)
579 prologue_end = pc;
580 else
581 prologue_end = sal.end;
582#else
583 prologue_end = pc;
584#endif
585 }
586 else
587 { /* We're in the boondocks */
588 func_addr = pc - 100;
589 prologue_end = pc;
590 }
591
592 prologue_end = min (prologue_end, pc);
593
594 /* Now, search the prologue looking for instructions that setup fp, save
595 rp, adjust sp and such. We also record the frame offset of any saved
c5aa993b 596 registers. */
c906108c
SS
597
598 pi->frameoffset = 0;
435e042a 599 pi->framereg = E_SP_REGNUM;
c906108c
SS
600 fp_used = 0;
601 ep_used = 0;
602 pifsr = pi->pifsrs;
603 regsave_func_p = 0;
604 save_pc = 0;
605 save_end = 0;
606 r12_tmp = 0;
607
608#ifdef DEBUG
609 printf_filtered ("Current_pc = 0x%.8lx, prologue_end = 0x%.8lx\n",
c5aa993b 610 (long) func_addr, (long) prologue_end);
c906108c
SS
611#endif
612
c5aa993b 613 for (current_pc = func_addr; current_pc < prologue_end;)
c906108c 614 {
93d56215
AC
615 int insn;
616 int insn2 = -1; /* dummy value */
c906108c
SS
617
618#ifdef DEBUG
c5aa993b 619 printf_filtered ("0x%.8lx ", (long) current_pc);
2bf0cb65 620 TARGET_PRINT_INSN (current_pc, &tm_print_insn_info);
c906108c
SS
621#endif
622
623 insn = read_memory_unsigned_integer (current_pc, 2);
624 current_pc += 2;
c5aa993b 625 if ((insn & 0x0780) >= 0x0600) /* Four byte instruction? */
c906108c
SS
626 {
627 insn2 = read_memory_unsigned_integer (current_pc, 2);
628 current_pc += 2;
629 }
630
631 if ((insn & 0xffc0) == ((10 << 11) | 0x0780) && !regsave_func_p)
632 { /* jarl <func>,10 */
c5aa993b 633 long low_disp = insn2 & ~(long) 1;
c906108c 634 long disp = (((((insn & 0x3f) << 16) + low_disp)
c5aa993b 635 & ~(long) 1) ^ 0x00200000) - 0x00200000;
c906108c
SS
636
637 save_pc = current_pc;
638 save_end = prologue_end;
639 regsave_func_p = 1;
640 current_pc += disp - 4;
641 prologue_end = (current_pc
642 + (2 * 3) /* moves to/from ep */
c5aa993b
JM
643 + 4 /* addi <const>,sp,sp */
644 + 2 /* jmp [r10] */
c906108c
SS
645 + (2 * 12) /* sst.w to save r2, r20-r29, r31 */
646 + 20); /* slop area */
647
648#ifdef DEBUG
649 printf_filtered ("\tfound jarl <func>,r10, disp = %ld, low_disp = %ld, new pc = 0x%.8lx\n",
c5aa993b 650 disp, low_disp, (long) current_pc + 2);
c906108c
SS
651#endif
652 continue;
653 }
654 else if ((insn & 0xffc0) == 0x0200 && !regsave_func_p)
655 { /* callt <imm6> */
435e042a 656 long ctbp = read_register (E_CTBP_REGNUM);
c906108c
SS
657 long adr = ctbp + ((insn & 0x3f) << 1);
658
659 save_pc = current_pc;
660 save_end = prologue_end;
661 regsave_func_p = 1;
662 current_pc = ctbp + (read_memory_unsigned_integer (adr, 2) & 0xffff);
663 prologue_end = (current_pc
664 + (2 * 3) /* prepare list2,imm5,sp/imm */
c5aa993b 665 + 4 /* ctret */
c906108c
SS
666 + 20); /* slop area */
667
668#ifdef DEBUG
669 printf_filtered ("\tfound callt, ctbp = 0x%.8lx, adr = %.8lx, new pc = 0x%.8lx\n",
c5aa993b 670 ctbp, adr, (long) current_pc);
c906108c
SS
671#endif
672 continue;
673 }
674 else if ((insn & 0xffc0) == 0x0780) /* prepare list2,imm5 */
675 {
676 handle_prepare (insn, insn2, &current_pc, pi, &pifsr);
677 continue;
678 }
679 else if (insn == 0x07e0 && regsave_func_p && insn2 == 0x0144)
680 { /* ctret after processing register save function */
681 current_pc = save_pc;
682 prologue_end = save_end;
683 regsave_func_p = 0;
684#ifdef DEBUG
685 printf_filtered ("\tfound ctret after regsave func");
686#endif
687 continue;
688 }
689 else if ((insn & 0xfff0) == 0x07e0 && (insn2 & 5) == 1)
690 { /* pushml, pushmh */
691 handle_pushm (insn, insn2, pi, &pifsr);
692 continue;
693 }
694 else if ((insn & 0xffe0) == 0x0060 && regsave_func_p)
695 { /* jmp after processing register save function */
696 current_pc = save_pc;
697 prologue_end = save_end;
698 regsave_func_p = 0;
699#ifdef DEBUG
700 printf_filtered ("\tfound jmp after regsave func");
701#endif
702 continue;
703 }
704 else if ((insn & 0x07c0) == 0x0780 /* jarl or jr */
705 || (insn & 0xffe0) == 0x0060 /* jmp */
706 || (insn & 0x0780) == 0x0580) /* branch */
707 {
708#ifdef DEBUG
709 printf_filtered ("\n");
710#endif
c5aa993b 711 break; /* Ran into end of prologue */
c906108c
SS
712 }
713
435e042a 714 else if ((insn & 0xffe0) == ((E_SP_REGNUM << 11) | 0x0240)) /* add <imm>,sp */
c906108c 715 pi->frameoffset += ((insn & 0x1f) ^ 0x10) - 0x10;
435e042a 716 else if (insn == ((E_SP_REGNUM << 11) | 0x0600 | E_SP_REGNUM)) /* addi <imm>,sp,sp */
c906108c 717 pi->frameoffset += insn2;
435e042a 718 else if (insn == ((E_FP_RAW_REGNUM << 11) | 0x0000 | E_SP_REGNUM)) /* mov sp,fp */
c906108c
SS
719 {
720 fp_used = 1;
435e042a 721 pi->framereg = E_FP_RAW_REGNUM;
c906108c
SS
722 }
723
435e042a 724 else if (insn == ((E_R12_REGNUM << 11) | 0x0640 | E_R0_REGNUM)) /* movhi hi(const),r0,r12 */
c906108c 725 r12_tmp = insn2 << 16;
435e042a 726 else if (insn == ((E_R12_REGNUM << 11) | 0x0620 | E_R12_REGNUM)) /* movea lo(const),r12,r12 */
c906108c 727 r12_tmp += insn2;
435e042a 728 else if (insn == ((E_SP_REGNUM << 11) | 0x01c0 | E_R12_REGNUM) && r12_tmp) /* add r12,sp */
c906108c 729 pi->frameoffset = r12_tmp;
435e042a 730 else if (insn == ((E_EP_REGNUM << 11) | 0x0000 | E_SP_REGNUM)) /* mov sp,ep */
c906108c 731 ep_used = 1;
435e042a 732 else if (insn == ((E_EP_REGNUM << 11) | 0x0000 | E_R1_REGNUM)) /* mov r1,ep */
c906108c 733 ep_used = 0;
435e042a 734 else if (((insn & 0x07ff) == (0x0760 | E_SP_REGNUM) /* st.w <reg>,<offset>[sp] */
c906108c 735 || (fp_used
435e042a 736 && (insn & 0x07ff) == (0x0760 | E_FP_RAW_REGNUM))) /* st.w <reg>,<offset>[fp] */
c906108c 737 && pifsr
435e042a
CV
738 && (((reg = (insn >> 11) & 0x1f) >= E_SAVE1_START_REGNUM && reg <= E_SAVE1_END_REGNUM)
739 || (reg >= E_SAVE2_START_REGNUM && reg <= E_SAVE2_END_REGNUM)
740 || (reg >= E_SAVE3_START_REGNUM && reg <= E_SAVE3_END_REGNUM)))
c906108c
SS
741 {
742 pifsr->reg = reg;
743 pifsr->offset = insn2 & ~1;
744 pifsr->cur_frameoffset = pi->frameoffset;
745#ifdef DEBUG
746 printf_filtered ("\tSaved register r%d, offset %d", reg, pifsr->offset);
747#endif
748 pifsr++;
749 }
750
c5aa993b 751 else if (ep_used /* sst.w <reg>,<offset>[ep] */
c906108c
SS
752 && ((insn & 0x0781) == 0x0501)
753 && pifsr
435e042a
CV
754 && (((reg = (insn >> 11) & 0x1f) >= E_SAVE1_START_REGNUM && reg <= E_SAVE1_END_REGNUM)
755 || (reg >= E_SAVE2_START_REGNUM && reg <= E_SAVE2_END_REGNUM)
756 || (reg >= E_SAVE3_START_REGNUM && reg <= E_SAVE3_END_REGNUM)))
c906108c
SS
757 {
758 pifsr->reg = reg;
759 pifsr->offset = (insn & 0x007e) << 1;
760 pifsr->cur_frameoffset = pi->frameoffset;
761#ifdef DEBUG
762 printf_filtered ("\tSaved register r%d, offset %d", reg, pifsr->offset);
763#endif
764 pifsr++;
765 }
766
767#ifdef DEBUG
768 printf_filtered ("\n");
769#endif
770 }
771
772 if (pifsr)
773 pifsr->framereg = 0; /* Tie off last entry */
774
775 /* Fix up any offsets to the final offset. If a frame pointer was created, use it
776 instead of the stack pointer. */
777 for (pifsr_tmp = pi->pifsrs; pifsr_tmp && pifsr_tmp != pifsr; pifsr_tmp++)
778 {
779 pifsr_tmp->offset -= pi->frameoffset - pifsr_tmp->cur_frameoffset;
780 pifsr_tmp->framereg = pi->framereg;
781
782#ifdef DEBUG
783 printf_filtered ("Saved register r%d, offset = %d, framereg = r%d\n",
c5aa993b 784 pifsr_tmp->reg, pifsr_tmp->offset, pifsr_tmp->framereg);
c906108c
SS
785#endif
786 }
787
788#ifdef DEBUG
789 printf_filtered ("Framereg = r%d, frameoffset = %d\n", pi->framereg, pi->frameoffset);
790#endif
791
792 return current_pc;
793}
794
435e042a
CV
795/* Function: find_callers_reg
796 Find REGNUM on the stack. Otherwise, it's in an active register.
797 One thing we might want to do here is to check REGNUM against the
798 clobber mask, and somehow flag it as invalid if it isn't saved on
799 the stack somewhere. This would provide a graceful failure mode
800 when trying to get the value of caller-saves registers for an inner
801 frame. */
c906108c 802
435e042a
CV
803CORE_ADDR
804v850_find_callers_reg (struct frame_info *fi, int regnum)
c906108c 805{
435e042a
CV
806 for (; fi; fi = fi->next)
807 if (PC_IN_CALL_DUMMY (fi->pc, fi->frame, fi->frame))
808 return generic_read_register_dummy (fi->pc, fi->frame, regnum);
809 else if (fi->saved_regs[regnum] != 0)
810 return read_memory_unsigned_integer (fi->saved_regs[regnum],
811 v850_register_raw_size (regnum));
c906108c 812
435e042a 813 return read_register (regnum);
c906108c
SS
814}
815
816/* Function: frame_chain
817 Figure out the frame prior to FI. Unfortunately, this involves
818 scanning the prologue of the caller, which will also be done
819 shortly by v850_init_extra_frame_info. For the dummy frame, we
820 just return the stack pointer that was in use at the time the
821 function call was made. */
822
823CORE_ADDR
fba45db2 824v850_frame_chain (struct frame_info *fi)
c906108c
SS
825{
826 struct prologue_info pi;
827 CORE_ADDR callers_pc, fp;
828
829 /* First, find out who called us */
830 callers_pc = FRAME_SAVED_PC (fi);
831 /* If caller is a call-dummy, then our FP bears no relation to his FP! */
435e042a 832 fp = v850_find_callers_reg (fi, E_FP_RAW_REGNUM);
c5aa993b
JM
833 if (PC_IN_CALL_DUMMY (callers_pc, fp, fp))
834 return fp; /* caller is call-dummy: return oldest value of FP */
c906108c
SS
835
836 /* Caller is NOT a call-dummy, so everything else should just work.
837 Even if THIS frame is a call-dummy! */
838 pi.pifsrs = NULL;
839
840 v850_scan_prologue (callers_pc, &pi);
841
842 if (pi.start_function)
843 return 0; /* Don't chain beyond the start function */
844
435e042a 845 if (pi.framereg == E_FP_RAW_REGNUM)
c906108c
SS
846 return v850_find_callers_reg (fi, pi.framereg);
847
848 return fi->frame - pi.frameoffset;
849}
850
c906108c
SS
851/* Function: skip_prologue
852 Return the address of the first code past the prologue of the function. */
853
854CORE_ADDR
fba45db2 855v850_skip_prologue (CORE_ADDR pc)
c906108c
SS
856{
857 CORE_ADDR func_addr, func_end;
858
859 /* See what the symbol table says */
860
861 if (find_pc_partial_function (pc, NULL, &func_addr, &func_end))
862 {
863 struct symtab_and_line sal;
864
865 sal = find_pc_line (func_addr, 0);
866
867 if (sal.line != 0 && sal.end < func_end)
868 return sal.end;
869 else
870 /* Either there's no line info, or the line after the prologue is after
871 the end of the function. In this case, there probably isn't a
872 prologue. */
873 return pc;
874 }
875
876/* We can't find the start of this function, so there's nothing we can do. */
877 return pc;
878}
879
880/* Function: pop_frame
881 This routine gets called when either the user uses the `return'
882 command, or the call dummy breakpoint gets hit. */
883
884void
435e042a 885v850_pop_frame (void)
c906108c 886{
435e042a 887 struct frame_info *frame = get_current_frame ();
c906108c
SS
888 int regnum;
889
c5aa993b 890 if (PC_IN_CALL_DUMMY (frame->pc, frame->frame, frame->frame))
c906108c
SS
891 generic_pop_dummy_frame ();
892 else
893 {
435e042a 894 write_register (E_PC_REGNUM, FRAME_SAVED_PC (frame));
c906108c 895
435e042a 896 for (regnum = 0; regnum < E_NUM_REGS; regnum++)
3a06899a 897 if (frame->saved_regs[regnum] != 0)
c906108c 898 write_register (regnum,
3a06899a 899 read_memory_unsigned_integer (frame->saved_regs[regnum],
435e042a 900 v850_register_raw_size (regnum)));
c906108c 901
435e042a 902 write_register (E_SP_REGNUM, FRAME_FP (frame));
c906108c
SS
903 }
904
905 flush_cached_frames ();
906}
907
908/* Function: push_arguments
909 Setup arguments and RP for a call to the target. First four args
910 go in R6->R9, subsequent args go into sp + 16 -> sp + ... Structs
911 are passed by reference. 64 bit quantities (doubles and long
912 longs) may be split between the regs and the stack. When calling a
913 function that returns a struct, a pointer to the struct is passed
914 in as a secret first argument (always in R6).
915
916 Stack space for the args has NOT been allocated: that job is up to us.
c5aa993b 917 */
c906108c
SS
918
919CORE_ADDR
ea7c478f 920v850_push_arguments (int nargs, struct value **args, CORE_ADDR sp,
435e042a 921 int struct_return, CORE_ADDR struct_addr)
c906108c
SS
922{
923 int argreg;
924 int argnum;
925 int len = 0;
926 int stack_offset;
927
928 /* First, just for safety, make sure stack is aligned */
929 sp &= ~3;
930
70eb15a4
CV
931 /* The offset onto the stack at which we will start copying parameters
932 (after the registers are used up) begins at 16 rather than at zero.
933 I don't really know why, that's just the way it seems to work. */
934 stack_offset = 16;
935
c906108c
SS
936 /* Now make space on the stack for the args. */
937 for (argnum = 0; argnum < nargs; argnum++)
c5aa993b 938 len += ((TYPE_LENGTH (VALUE_TYPE (args[argnum])) + 3) & ~3);
70eb15a4 939 sp -= len + stack_offset; /* possibly over-allocating, but it works... */
c5aa993b
JM
940 /* (you might think we could allocate 16 bytes */
941 /* less, but the ABI seems to use it all! ) */
c906108c 942
70eb15a4 943 argreg = E_ARG0_REGNUM;
c906108c
SS
944 /* the struct_return pointer occupies the first parameter-passing reg */
945 if (struct_return)
70eb15a4 946 argreg++;
c906108c
SS
947
948 /* Now load as many as possible of the first arguments into
949 registers, and push the rest onto the stack. There are 16 bytes
950 in four registers available. Loop thru args from first to last. */
951 for (argnum = 0; argnum < nargs; argnum++)
952 {
953 int len;
954 char *val;
435e042a 955 char valbuf[v850_register_raw_size (E_ARG0_REGNUM)];
c906108c 956
70eb15a4
CV
957 if (!v850_type_is_scalar (VALUE_TYPE (*args))
958 && TYPE_LENGTH (VALUE_TYPE (*args)) > E_MAX_RETTYPE_SIZE_IN_REGS)
c906108c
SS
959 {
960 store_address (valbuf, 4, VALUE_ADDRESS (*args));
961 len = 4;
962 val = valbuf;
963 }
964 else
965 {
966 len = TYPE_LENGTH (VALUE_TYPE (*args));
c5aa993b 967 val = (char *) VALUE_CONTENTS (*args);
c906108c
SS
968 }
969
970 while (len > 0)
435e042a 971 if (argreg <= E_ARGLAST_REGNUM)
c906108c
SS
972 {
973 CORE_ADDR regval;
974
435e042a 975 regval = extract_address (val, v850_register_raw_size (argreg));
c906108c
SS
976 write_register (argreg, regval);
977
435e042a
CV
978 len -= v850_register_raw_size (argreg);
979 val += v850_register_raw_size (argreg);
c906108c
SS
980 argreg++;
981 }
982 else
983 {
984 write_memory (sp + stack_offset, val, 4);
985
986 len -= 4;
987 val += 4;
988 stack_offset += 4;
989 }
990 args++;
991 }
992 return sp;
993}
994
995/* Function: push_return_address (pc)
996 Set up the return address for the inferior function call.
997 Needed for targets where we don't actually execute a JSR/BSR instruction */
c5aa993b 998
c906108c 999CORE_ADDR
fba45db2 1000v850_push_return_address (CORE_ADDR pc, CORE_ADDR sp)
c906108c 1001{
435e042a 1002 write_register (E_RP_REGNUM, CALL_DUMMY_ADDRESS ());
c906108c
SS
1003 return sp;
1004}
c5aa993b 1005
c906108c 1006/* Function: frame_saved_pc
435e042a 1007 Find the caller of this frame. We do this by seeing if E_RP_REGNUM
c906108c
SS
1008 is saved in the stack anywhere, otherwise we get it from the
1009 registers. If the inner frame is a dummy frame, return its PC
1010 instead of RP, because that's where "caller" of the dummy-frame
1011 will be found. */
1012
1013CORE_ADDR
fba45db2 1014v850_frame_saved_pc (struct frame_info *fi)
c906108c 1015{
c5aa993b 1016 if (PC_IN_CALL_DUMMY (fi->pc, fi->frame, fi->frame))
435e042a 1017 return generic_read_register_dummy (fi->pc, fi->frame, E_PC_REGNUM);
c906108c 1018 else
435e042a 1019 return v850_find_callers_reg (fi, E_RP_REGNUM);
c906108c
SS
1020}
1021
c906108c
SS
1022
1023/* Function: fix_call_dummy
1024 Pokes the callee function's address into the CALL_DUMMY assembly stub.
1025 Assumes that the CALL_DUMMY looks like this:
c5aa993b
JM
1026 jarl <offset24>, r31
1027 trap
1028 */
c906108c 1029
435e042a 1030void
fba45db2 1031v850_fix_call_dummy (char *dummy, CORE_ADDR sp, CORE_ADDR fun, int nargs,
ea7c478f 1032 struct value **args, struct type *type, int gcc_p)
c906108c
SS
1033{
1034 long offset24;
1035
1036 offset24 = (long) fun - (long) entry_point_address ();
1037 offset24 &= 0x3fffff;
1038 offset24 |= 0xff800000; /* jarl <offset24>, r31 */
1039
c5aa993b
JM
1040 store_unsigned_integer ((unsigned int *) &dummy[2], 2, offset24 & 0xffff);
1041 store_unsigned_integer ((unsigned int *) &dummy[0], 2, offset24 >> 16);
435e042a
CV
1042}
1043
1044static CORE_ADDR
1045v850_saved_pc_after_call (struct frame_info *ignore)
1046{
1047 return read_register (E_RP_REGNUM);
1048}
1049
1050static void
1051v850_extract_return_value (struct type *type, char *regbuf, char *valbuf)
1052{
70eb15a4
CV
1053 CORE_ADDR return_buffer;
1054
1055 if (!v850_use_struct_convention (0, type))
1056 {
1057 /* Scalar return values of <= 8 bytes are returned in
1058 E_V0_REGNUM to E_V1_REGNUM. */
1059 memcpy (valbuf,
1060 &regbuf[REGISTER_BYTE (E_V0_REGNUM)],
1061 TYPE_LENGTH (type));
1062 }
1063 else
1064 {
1065 /* Aggregates and return values > 8 bytes are returned in memory,
1066 pointed to by R6. */
1067 return_buffer =
1068 extract_address (regbuf + REGISTER_BYTE (E_V0_REGNUM),
1069 REGISTER_RAW_SIZE (E_V0_REGNUM));
1070
1071 read_memory (return_buffer, valbuf, TYPE_LENGTH (type));
1072 }
435e042a
CV
1073}
1074
1075const static unsigned char *
1076v850_breakpoint_from_pc (CORE_ADDR *pcptr, int *lenptr)
1077{
1078 static unsigned char breakpoint[] = { 0x85, 0x05 };
1079 *lenptr = sizeof (breakpoint);
1080 return breakpoint;
1081}
1082
1083static CORE_ADDR
1084v850_extract_struct_value_address (char *regbuf)
1085{
1086 return extract_address (regbuf + v850_register_byte (E_V0_REGNUM),
1087 v850_register_raw_size (E_V0_REGNUM));
1088}
1089
1090static void
1091v850_store_return_value (struct type *type, char *valbuf)
1092{
70eb15a4
CV
1093 CORE_ADDR return_buffer;
1094
1095 if (!v850_use_struct_convention (0, type))
1096 write_register_bytes (REGISTER_BYTE (E_V0_REGNUM), valbuf,
1097 TYPE_LENGTH (type));
1098 else
1099 {
1100 return_buffer = read_register (E_V0_REGNUM);
1101 write_memory (return_buffer, valbuf, TYPE_LENGTH (type));
1102 }
435e042a
CV
1103}
1104
1105static void
1106v850_frame_init_saved_regs (struct frame_info *fi)
1107{
1108 struct prologue_info pi;
1109 struct pifsr pifsrs[E_NUM_REGS + 1], *pifsr;
1110 CORE_ADDR func_addr, func_end;
1111
1112 if (!fi->saved_regs)
1113 {
1114 frame_saved_regs_zalloc (fi);
1115
1116 /* The call dummy doesn't save any registers on the stack, so we
1117 can return now. */
1118 if (PC_IN_CALL_DUMMY (fi->pc, fi->frame, fi->frame))
1119 return;
1120
1121 /* Find the beginning of this function, so we can analyze its
1122 prologue. */
1123 if (find_pc_partial_function (fi->pc, NULL, &func_addr, &func_end))
1124 {
1125 pi.pifsrs = pifsrs;
1126
1127 v850_scan_prologue (fi->pc, &pi);
1128
1129 if (!fi->next && pi.framereg == E_SP_REGNUM)
1130 fi->frame = read_register (pi.framereg) - pi.frameoffset;
1131
1132 for (pifsr = pifsrs; pifsr->framereg; pifsr++)
1133 {
1134 fi->saved_regs[pifsr->reg] = pifsr->offset + fi->frame;
1135
1136 if (pifsr->framereg == E_SP_REGNUM)
1137 fi->saved_regs[pifsr->reg] += pi.frameoffset;
1138 }
1139 }
1140 /* Else we're out of luck (can't debug completely stripped code).
1141 FIXME. */
1142 }
1143}
1144
1145/* Function: init_extra_frame_info
1146 Setup the frame's frame pointer, pc, and frame addresses for saved
1147 registers. Most of the work is done in scan_prologue().
1148
1149 Note that when we are called for the last frame (currently active frame),
1150 that fi->pc and fi->frame will already be setup. However, fi->frame will
1151 be valid only if this routine uses FP. For previous frames, fi-frame will
1152 always be correct (since that is derived from v850_frame_chain ()).
1153
1154 We can be called with the PC in the call dummy under two circumstances.
1155 First, during normal backtracing, second, while figuring out the frame
1156 pointer just prior to calling the target function (see run_stack_dummy). */
1157
1158static void
1159v850_init_extra_frame_info (int fromleaf, struct frame_info *fi)
1160{
1161 struct prologue_info pi;
1162
1163 if (fi->next)
1164 fi->pc = FRAME_SAVED_PC (fi->next);
1165
1166 v850_frame_init_saved_regs (fi);
1167}
1168
1169static void
70eb15a4 1170v850_store_struct_return (CORE_ADDR addr, CORE_ADDR sp)
435e042a 1171{
70eb15a4 1172 write_register (E_ARG0_REGNUM, addr);
435e042a
CV
1173}
1174
1175static CORE_ADDR
1176v850_target_read_fp (void)
1177{
1178 return read_register (E_FP_RAW_REGNUM);
c906108c
SS
1179}
1180
6ed14b0e
CV
1181static struct gdbarch *
1182v850_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
c906108c 1183{
435e042a 1184 static LONGEST call_dummy_words[1] = { 0 };
6ed14b0e
CV
1185 struct gdbarch_tdep *tdep = NULL;
1186 struct gdbarch *gdbarch;
1187 int i;
1188
1189 /* find a candidate among the list of pre-declared architectures. */
1190 arches = gdbarch_list_lookup_by_info (arches, &info);
1191 if (arches != NULL)
1192 return (arches->gdbarch);
c906108c 1193
6ed14b0e
CV
1194#if 0
1195 tdep = (struct gdbarch_tdep *) xmalloc (sizeof (struct gdbarch_tdep));
1196#endif
1197
435e042a 1198 /* Change the register names based on the current machine type. */
6ed14b0e 1199 if (info.bfd_arch_info->arch != bfd_arch_v850)
c906108c
SS
1200 return 0;
1201
6ed14b0e
CV
1202 gdbarch = gdbarch_alloc (&info, 0);
1203
c906108c
SS
1204 for (i = 0; v850_processor_type_table[i].regnames != NULL; i++)
1205 {
6ed14b0e 1206 if (v850_processor_type_table[i].mach == info.bfd_arch_info->mach)
435e042a
CV
1207 {
1208 v850_register_names = v850_processor_type_table[i].regnames;
1209 tm_print_insn_info.mach = info.bfd_arch_info->mach;
1210 break;
1211 }
c906108c
SS
1212 }
1213
435e042a
CV
1214 /*
1215 * Basic register fields and methods.
1216 */
1217 set_gdbarch_num_regs (gdbarch, E_NUM_REGS);
1218 set_gdbarch_num_pseudo_regs (gdbarch, 0);
1219 set_gdbarch_sp_regnum (gdbarch, E_SP_REGNUM);
1220 set_gdbarch_fp_regnum (gdbarch, E_FP_REGNUM);
1221 set_gdbarch_pc_regnum (gdbarch, E_PC_REGNUM);
1222 set_gdbarch_register_name (gdbarch, v850_register_name);
1223 set_gdbarch_register_size (gdbarch, v850_reg_size);
1224 set_gdbarch_register_bytes (gdbarch, E_ALL_REGS_SIZE);
1225 set_gdbarch_register_byte (gdbarch, v850_register_byte);
1226 set_gdbarch_register_raw_size (gdbarch, v850_register_raw_size);
1227 set_gdbarch_max_register_raw_size (gdbarch, v850_reg_size);
1228 set_gdbarch_register_virtual_size (gdbarch, v850_register_raw_size);
1229 set_gdbarch_max_register_virtual_size (gdbarch, v850_reg_size);
1230 set_gdbarch_register_virtual_type (gdbarch, v850_reg_virtual_type);
1231
1232 set_gdbarch_read_fp (gdbarch, v850_target_read_fp);
1233
1234 /*
1235 * Frame Info
1236 */
1237 set_gdbarch_init_extra_frame_info (gdbarch, v850_init_extra_frame_info);
1238 set_gdbarch_frame_init_saved_regs (gdbarch, v850_frame_init_saved_regs);
1239 set_gdbarch_frame_chain (gdbarch, v850_frame_chain);
b4743822 1240 set_gdbarch_get_saved_register (gdbarch, generic_unwind_get_saved_register);
435e042a
CV
1241 set_gdbarch_saved_pc_after_call (gdbarch, v850_saved_pc_after_call);
1242 set_gdbarch_frame_saved_pc (gdbarch, v850_frame_saved_pc);
1243 set_gdbarch_skip_prologue (gdbarch, v850_skip_prologue);
1244 set_gdbarch_frame_chain_valid (gdbarch, generic_file_frame_chain_valid);
1245 set_gdbarch_frame_args_address (gdbarch, default_frame_address);
1246 set_gdbarch_frame_locals_address (gdbarch, default_frame_address);
1247
1248 /*
1249 * Miscelany
1250 */
1251 /* Stack grows up. */
1252 set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
1253 /* PC stops zero byte after a trap instruction
1254 (which means: exactly on trap instruction). */
1255 set_gdbarch_decr_pc_after_break (gdbarch, 0);
1256 /* This value is almost never non-zero... */
1257 set_gdbarch_function_start_offset (gdbarch, 0);
1258 /* This value is almost never non-zero... */
1259 set_gdbarch_frame_args_skip (gdbarch, 0);
1260 /* OK to default this value to 'unknown'. */
1261 set_gdbarch_frame_num_args (gdbarch, frame_num_args_unknown);
1262 /* W/o prototype, coerce float args to double. */
1263 set_gdbarch_coerce_float_to_double (gdbarch, standard_coerce_float_to_double);
1264
1265 /*
1266 * Call Dummies
1267 *
1268 * These values and methods are used when gdb calls a target function. */
1269 set_gdbarch_use_generic_dummy_frames (gdbarch, 1);
1270 set_gdbarch_push_dummy_frame (gdbarch, generic_push_dummy_frame);
1271 set_gdbarch_push_return_address (gdbarch, v850_push_return_address);
26e9b323 1272 set_gdbarch_deprecated_extract_return_value (gdbarch, v850_extract_return_value);
435e042a
CV
1273 set_gdbarch_push_arguments (gdbarch, v850_push_arguments);
1274 set_gdbarch_pop_frame (gdbarch, v850_pop_frame);
1275 set_gdbarch_store_struct_return (gdbarch, v850_store_struct_return);
1276 set_gdbarch_store_return_value (gdbarch, v850_store_return_value);
26e9b323 1277 set_gdbarch_deprecated_extract_struct_value_address (gdbarch, v850_extract_struct_value_address);
435e042a
CV
1278 set_gdbarch_use_struct_convention (gdbarch, v850_use_struct_convention);
1279 set_gdbarch_call_dummy_location (gdbarch, AT_ENTRY_POINT);
1280 set_gdbarch_call_dummy_address (gdbarch, entry_point_address);
1281 set_gdbarch_call_dummy_start_offset (gdbarch, 0);
1282 set_gdbarch_call_dummy_breakpoint_offset (gdbarch, 0);
1283 set_gdbarch_call_dummy_breakpoint_offset_p (gdbarch, 1);
1284 set_gdbarch_call_dummy_length (gdbarch, 0);
1285 set_gdbarch_pc_in_call_dummy (gdbarch, generic_pc_in_call_dummy);
1286 set_gdbarch_call_dummy_p (gdbarch, 1);
1287 set_gdbarch_call_dummy_words (gdbarch, call_dummy_nil);
1288 set_gdbarch_sizeof_call_dummy_words (gdbarch, 0);
1289 set_gdbarch_call_dummy_stack_adjust_p (gdbarch, 0);
1290 /* set_gdbarch_call_dummy_stack_adjust */
1291 set_gdbarch_fix_call_dummy (gdbarch, v850_fix_call_dummy);
1292 set_gdbarch_breakpoint_from_pc (gdbarch, v850_breakpoint_from_pc);
1293
1294 set_gdbarch_int_bit (gdbarch, 4 * TARGET_CHAR_BIT);
1295 set_gdbarch_ptr_bit (gdbarch, 4 * TARGET_CHAR_BIT);
1296 set_gdbarch_addr_bit (gdbarch, 4 * TARGET_CHAR_BIT);
1297 set_gdbarch_long_double_bit (gdbarch, 8 * TARGET_CHAR_BIT);
1298
1299 set_gdbarch_extra_stack_alignment_needed (gdbarch, 0);
1300
6ed14b0e 1301 return gdbarch;
c906108c
SS
1302}
1303
1304void
fba45db2 1305_initialize_v850_tdep (void)
c906108c
SS
1306{
1307 tm_print_insn = print_insn_v850;
6ed14b0e 1308 register_gdbarch_init (bfd_arch_v850, v850_gdbarch_init);
c906108c 1309}
This page took 0.30339 seconds and 4 git commands to generate.