* binutils-all/readelf.exp (-wi test): Add cris-*-* to xfails.
[deliverable/binutils-gdb.git] / gdb / v850-tdep.c
1 /* Target-dependent code for the NEC V850 for GDB, the GNU debugger.
2 Copyright 1996, 2000 Free Software Foundation, Inc.
3
4 This file is part of GDB.
5
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.
10
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.
15
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. */
20
21 #include "defs.h"
22 #include "frame.h"
23 #include "inferior.h"
24 #include "obstack.h"
25 #include "target.h"
26 #include "value.h"
27 #include "bfd.h"
28 #include "gdb_string.h"
29 #include "gdbcore.h"
30 #include "symfile.h"
31 #include "arch-utils.h"
32
33
34 static char *v850_generic_reg_names[] = REGISTER_NAMES;
35
36 static char *v850e_reg_names[] =
37 {
38 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
39 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
40 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
41 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
42 "eipc", "eipsw", "fepc", "fepsw", "ecr", "psw", "sr6", "sr7",
43 "sr8", "sr9", "sr10", "sr11", "sr12", "sr13", "sr14", "sr15",
44 "ctpc", "ctpsw", "dbpc", "dbpsw", "ctbp", "sr21", "sr22", "sr23",
45 "sr24", "sr25", "sr26", "sr27", "sr28", "sr29", "sr30", "sr31",
46 "pc", "fp"
47 };
48
49 char **v850_register_names = v850_generic_reg_names;
50
51 struct
52 {
53 char **regnames;
54 int mach;
55 }
56 v850_processor_type_table[] =
57 {
58 {
59 v850_generic_reg_names, bfd_mach_v850
60 }
61 ,
62 {
63 v850e_reg_names, bfd_mach_v850e
64 }
65 ,
66 {
67 v850e_reg_names, bfd_mach_v850ea
68 }
69 ,
70 {
71 NULL, 0
72 }
73 };
74
75 /* Info gleaned from scanning a function's prologue. */
76
77 struct pifsr /* Info about one saved reg */
78 {
79 int framereg; /* Frame reg (SP or FP) */
80 int offset; /* Offset from framereg */
81 int cur_frameoffset; /* Current frameoffset */
82 int reg; /* Saved register number */
83 };
84
85 struct prologue_info
86 {
87 int framereg;
88 int frameoffset;
89 int start_function;
90 struct pifsr *pifsrs;
91 };
92
93 static CORE_ADDR v850_scan_prologue (CORE_ADDR pc, struct prologue_info *fs);
94
95
96 /* Should call_function allocate stack space for a struct return? */
97 int
98 v850_use_struct_convention (int gcc_p, struct type *type)
99 {
100 return (TYPE_NFIELDS (type) > 1 || TYPE_LENGTH (type) > 4);
101 }
102 \f
103
104
105 /* Structure for mapping bits in register lists to register numbers. */
106 struct reg_list
107 {
108 long mask;
109 int regno;
110 };
111
112 /* Helper function for v850_scan_prologue to handle prepare instruction. */
113
114 static void
115 handle_prepare (int insn, int insn2, CORE_ADDR * current_pc_ptr,
116 struct prologue_info *pi, struct pifsr **pifsr_ptr)
117
118 {
119 CORE_ADDR current_pc = *current_pc_ptr;
120 struct pifsr *pifsr = *pifsr_ptr;
121 long next = insn2 & 0xffff;
122 long list12 = ((insn & 1) << 16) + (next & 0xffe0);
123 long offset = (insn & 0x3e) << 1;
124 static struct reg_list reg_table[] =
125 {
126 {0x00800, 20}, /* r20 */
127 {0x00400, 21}, /* r21 */
128 {0x00200, 22}, /* r22 */
129 {0x00100, 23}, /* r23 */
130 {0x08000, 24}, /* r24 */
131 {0x04000, 25}, /* r25 */
132 {0x02000, 26}, /* r26 */
133 {0x01000, 27}, /* r27 */
134 {0x00080, 28}, /* r28 */
135 {0x00040, 29}, /* r29 */
136 {0x10000, 30}, /* ep */
137 {0x00020, 31}, /* lp */
138 {0, 0} /* end of table */
139 };
140 int i;
141
142 if ((next & 0x1f) == 0x0b) /* skip imm16 argument */
143 current_pc += 2;
144 else if ((next & 0x1f) == 0x13) /* skip imm16 argument */
145 current_pc += 2;
146 else if ((next & 0x1f) == 0x1b) /* skip imm32 argument */
147 current_pc += 4;
148
149 /* Calculate the total size of the saved registers, and add it
150 it to the immediate value used to adjust SP. */
151 for (i = 0; reg_table[i].mask != 0; i++)
152 if (list12 & reg_table[i].mask)
153 offset += REGISTER_RAW_SIZE (regtable[i].regno);
154 pi->frameoffset -= offset;
155
156 /* Calculate the offsets of the registers relative to the value
157 the SP will have after the registers have been pushed and the
158 imm5 value has been subtracted from it. */
159 if (pifsr)
160 {
161 for (i = 0; reg_table[i].mask != 0; i++)
162 {
163 if (list12 & reg_table[i].mask)
164 {
165 int reg = reg_table[i].regno;
166 offset -= REGISTER_RAW_SIZE (reg);
167 pifsr->reg = reg;
168 pifsr->offset = offset;
169 pifsr->cur_frameoffset = pi->frameoffset;
170 #ifdef DEBUG
171 printf_filtered ("\tSaved register r%d, offset %d", reg, pifsr->offset);
172 #endif
173 pifsr++;
174 }
175 }
176 }
177 #ifdef DEBUG
178 printf_filtered ("\tfound ctret after regsave func");
179 #endif
180
181 /* Set result parameters. */
182 *current_pc_ptr = current_pc;
183 *pifsr_ptr = pifsr;
184 }
185
186
187 /* Helper function for v850_scan_prologue to handle pushm/pushl instructions.
188 FIXME: the SR bit of the register list is not supported; must check
189 that the compiler does not ever generate this bit. */
190
191 static void
192 handle_pushm (int insn, int insn2, struct prologue_info *pi,
193 struct pifsr **pifsr_ptr)
194
195 {
196 struct pifsr *pifsr = *pifsr_ptr;
197 long list12 = ((insn & 0x0f) << 16) + (insn2 & 0xfff0);
198 long offset = 0;
199 static struct reg_list pushml_reg_table[] =
200 {
201 {0x80000, PS_REGNUM}, /* PSW */
202 {0x40000, 1}, /* r1 */
203 {0x20000, 2}, /* r2 */
204 {0x10000, 3}, /* r3 */
205 {0x00800, 4}, /* r4 */
206 {0x00400, 5}, /* r5 */
207 {0x00200, 6}, /* r6 */
208 {0x00100, 7}, /* r7 */
209 {0x08000, 8}, /* r8 */
210 {0x04000, 9}, /* r9 */
211 {0x02000, 10}, /* r10 */
212 {0x01000, 11}, /* r11 */
213 {0x00080, 12}, /* r12 */
214 {0x00040, 13}, /* r13 */
215 {0x00020, 14}, /* r14 */
216 {0x00010, 15}, /* r15 */
217 {0, 0} /* end of table */
218 };
219 static struct reg_list pushmh_reg_table[] =
220 {
221 {0x80000, 16}, /* r16 */
222 {0x40000, 17}, /* r17 */
223 {0x20000, 18}, /* r18 */
224 {0x10000, 19}, /* r19 */
225 {0x00800, 20}, /* r20 */
226 {0x00400, 21}, /* r21 */
227 {0x00200, 22}, /* r22 */
228 {0x00100, 23}, /* r23 */
229 {0x08000, 24}, /* r24 */
230 {0x04000, 25}, /* r25 */
231 {0x02000, 26}, /* r26 */
232 {0x01000, 27}, /* r27 */
233 {0x00080, 28}, /* r28 */
234 {0x00040, 29}, /* r29 */
235 {0x00010, 30}, /* r30 */
236 {0x00020, 31}, /* r31 */
237 {0, 0} /* end of table */
238 };
239 struct reg_list *reg_table;
240 int i;
241
242 /* Is this a pushml or a pushmh? */
243 if ((insn2 & 7) == 1)
244 reg_table = pushml_reg_table;
245 else
246 reg_table = pushmh_reg_table;
247
248 /* Calculate the total size of the saved registers, and add it
249 it to the immediate value used to adjust SP. */
250 for (i = 0; reg_table[i].mask != 0; i++)
251 if (list12 & reg_table[i].mask)
252 offset += REGISTER_RAW_SIZE (regtable[i].regno);
253 pi->frameoffset -= offset;
254
255 /* Calculate the offsets of the registers relative to the value
256 the SP will have after the registers have been pushed and the
257 imm5 value is subtracted from it. */
258 if (pifsr)
259 {
260 for (i = 0; reg_table[i].mask != 0; i++)
261 {
262 if (list12 & reg_table[i].mask)
263 {
264 int reg = reg_table[i].regno;
265 offset -= REGISTER_RAW_SIZE (reg);
266 pifsr->reg = reg;
267 pifsr->offset = offset;
268 pifsr->cur_frameoffset = pi->frameoffset;
269 #ifdef DEBUG
270 printf_filtered ("\tSaved register r%d, offset %d", reg, pifsr->offset);
271 #endif
272 pifsr++;
273 }
274 }
275 }
276 #ifdef DEBUG
277 printf_filtered ("\tfound ctret after regsave func");
278 #endif
279
280 /* Set result parameters. */
281 *pifsr_ptr = pifsr;
282 }
283 \f
284
285
286
287 /* Function: scan_prologue
288 Scan the prologue of the function that contains PC, and record what
289 we find in PI. PI->fsr must be zeroed by the called. Returns the
290 pc after the prologue. Note that the addresses saved in pi->fsr
291 are actually just frame relative (negative offsets from the frame
292 pointer). This is because we don't know the actual value of the
293 frame pointer yet. In some circumstances, the frame pointer can't
294 be determined till after we have scanned the prologue. */
295
296 static CORE_ADDR
297 v850_scan_prologue (CORE_ADDR pc, struct prologue_info *pi)
298 {
299 CORE_ADDR func_addr, prologue_end, current_pc;
300 struct pifsr *pifsr, *pifsr_tmp;
301 int fp_used;
302 int ep_used;
303 int reg;
304 CORE_ADDR save_pc, save_end;
305 int regsave_func_p;
306 int r12_tmp;
307
308 /* First, figure out the bounds of the prologue so that we can limit the
309 search to something reasonable. */
310
311 if (find_pc_partial_function (pc, NULL, &func_addr, NULL))
312 {
313 struct symtab_and_line sal;
314
315 sal = find_pc_line (func_addr, 0);
316
317 if (func_addr == entry_point_address ())
318 pi->start_function = 1;
319 else
320 pi->start_function = 0;
321
322 #if 0
323 if (sal.line == 0)
324 prologue_end = pc;
325 else
326 prologue_end = sal.end;
327 #else
328 prologue_end = pc;
329 #endif
330 }
331 else
332 { /* We're in the boondocks */
333 func_addr = pc - 100;
334 prologue_end = pc;
335 }
336
337 prologue_end = min (prologue_end, pc);
338
339 /* Now, search the prologue looking for instructions that setup fp, save
340 rp, adjust sp and such. We also record the frame offset of any saved
341 registers. */
342
343 pi->frameoffset = 0;
344 pi->framereg = SP_REGNUM;
345 fp_used = 0;
346 ep_used = 0;
347 pifsr = pi->pifsrs;
348 regsave_func_p = 0;
349 save_pc = 0;
350 save_end = 0;
351 r12_tmp = 0;
352
353 #ifdef DEBUG
354 printf_filtered ("Current_pc = 0x%.8lx, prologue_end = 0x%.8lx\n",
355 (long) func_addr, (long) prologue_end);
356 #endif
357
358 for (current_pc = func_addr; current_pc < prologue_end;)
359 {
360 int insn, insn2;
361
362 #ifdef DEBUG
363 printf_filtered ("0x%.8lx ", (long) current_pc);
364 (*tm_print_insn) (current_pc, &tm_print_insn_info);
365 #endif
366
367 insn = read_memory_unsigned_integer (current_pc, 2);
368 current_pc += 2;
369 if ((insn & 0x0780) >= 0x0600) /* Four byte instruction? */
370 {
371 insn2 = read_memory_unsigned_integer (current_pc, 2);
372 current_pc += 2;
373 }
374
375 if ((insn & 0xffc0) == ((10 << 11) | 0x0780) && !regsave_func_p)
376 { /* jarl <func>,10 */
377 long low_disp = insn2 & ~(long) 1;
378 long disp = (((((insn & 0x3f) << 16) + low_disp)
379 & ~(long) 1) ^ 0x00200000) - 0x00200000;
380
381 save_pc = current_pc;
382 save_end = prologue_end;
383 regsave_func_p = 1;
384 current_pc += disp - 4;
385 prologue_end = (current_pc
386 + (2 * 3) /* moves to/from ep */
387 + 4 /* addi <const>,sp,sp */
388 + 2 /* jmp [r10] */
389 + (2 * 12) /* sst.w to save r2, r20-r29, r31 */
390 + 20); /* slop area */
391
392 #ifdef DEBUG
393 printf_filtered ("\tfound jarl <func>,r10, disp = %ld, low_disp = %ld, new pc = 0x%.8lx\n",
394 disp, low_disp, (long) current_pc + 2);
395 #endif
396 continue;
397 }
398 else if ((insn & 0xffc0) == 0x0200 && !regsave_func_p)
399 { /* callt <imm6> */
400 long ctbp = read_register (CTBP_REGNUM);
401 long adr = ctbp + ((insn & 0x3f) << 1);
402
403 save_pc = current_pc;
404 save_end = prologue_end;
405 regsave_func_p = 1;
406 current_pc = ctbp + (read_memory_unsigned_integer (adr, 2) & 0xffff);
407 prologue_end = (current_pc
408 + (2 * 3) /* prepare list2,imm5,sp/imm */
409 + 4 /* ctret */
410 + 20); /* slop area */
411
412 #ifdef DEBUG
413 printf_filtered ("\tfound callt, ctbp = 0x%.8lx, adr = %.8lx, new pc = 0x%.8lx\n",
414 ctbp, adr, (long) current_pc);
415 #endif
416 continue;
417 }
418 else if ((insn & 0xffc0) == 0x0780) /* prepare list2,imm5 */
419 {
420 handle_prepare (insn, insn2, &current_pc, pi, &pifsr);
421 continue;
422 }
423 else if (insn == 0x07e0 && regsave_func_p && insn2 == 0x0144)
424 { /* ctret after processing register save function */
425 current_pc = save_pc;
426 prologue_end = save_end;
427 regsave_func_p = 0;
428 #ifdef DEBUG
429 printf_filtered ("\tfound ctret after regsave func");
430 #endif
431 continue;
432 }
433 else if ((insn & 0xfff0) == 0x07e0 && (insn2 & 5) == 1)
434 { /* pushml, pushmh */
435 handle_pushm (insn, insn2, pi, &pifsr);
436 continue;
437 }
438 else if ((insn & 0xffe0) == 0x0060 && regsave_func_p)
439 { /* jmp after processing register save function */
440 current_pc = save_pc;
441 prologue_end = save_end;
442 regsave_func_p = 0;
443 #ifdef DEBUG
444 printf_filtered ("\tfound jmp after regsave func");
445 #endif
446 continue;
447 }
448 else if ((insn & 0x07c0) == 0x0780 /* jarl or jr */
449 || (insn & 0xffe0) == 0x0060 /* jmp */
450 || (insn & 0x0780) == 0x0580) /* branch */
451 {
452 #ifdef DEBUG
453 printf_filtered ("\n");
454 #endif
455 break; /* Ran into end of prologue */
456 }
457
458 else if ((insn & 0xffe0) == ((SP_REGNUM << 11) | 0x0240)) /* add <imm>,sp */
459 pi->frameoffset += ((insn & 0x1f) ^ 0x10) - 0x10;
460 else if (insn == ((SP_REGNUM << 11) | 0x0600 | SP_REGNUM)) /* addi <imm>,sp,sp */
461 pi->frameoffset += insn2;
462 else if (insn == ((FP_RAW_REGNUM << 11) | 0x0000 | SP_REGNUM)) /* mov sp,fp */
463 {
464 fp_used = 1;
465 pi->framereg = FP_RAW_REGNUM;
466 }
467
468 else if (insn == ((R12_REGNUM << 11) | 0x0640 | R0_REGNUM)) /* movhi hi(const),r0,r12 */
469 r12_tmp = insn2 << 16;
470 else if (insn == ((R12_REGNUM << 11) | 0x0620 | R12_REGNUM)) /* movea lo(const),r12,r12 */
471 r12_tmp += insn2;
472 else if (insn == ((SP_REGNUM << 11) | 0x01c0 | R12_REGNUM) && r12_tmp) /* add r12,sp */
473 pi->frameoffset = r12_tmp;
474 else if (insn == ((EP_REGNUM << 11) | 0x0000 | SP_REGNUM)) /* mov sp,ep */
475 ep_used = 1;
476 else if (insn == ((EP_REGNUM << 11) | 0x0000 | R1_REGNUM)) /* mov r1,ep */
477 ep_used = 0;
478 else if (((insn & 0x07ff) == (0x0760 | SP_REGNUM) /* st.w <reg>,<offset>[sp] */
479 || (fp_used
480 && (insn & 0x07ff) == (0x0760 | FP_RAW_REGNUM))) /* st.w <reg>,<offset>[fp] */
481 && pifsr
482 && (((reg = (insn >> 11) & 0x1f) >= SAVE1_START_REGNUM && reg <= SAVE1_END_REGNUM)
483 || (reg >= SAVE2_START_REGNUM && reg <= SAVE2_END_REGNUM)
484 || (reg >= SAVE3_START_REGNUM && reg <= SAVE3_END_REGNUM)))
485 {
486 pifsr->reg = reg;
487 pifsr->offset = insn2 & ~1;
488 pifsr->cur_frameoffset = pi->frameoffset;
489 #ifdef DEBUG
490 printf_filtered ("\tSaved register r%d, offset %d", reg, pifsr->offset);
491 #endif
492 pifsr++;
493 }
494
495 else if (ep_used /* sst.w <reg>,<offset>[ep] */
496 && ((insn & 0x0781) == 0x0501)
497 && pifsr
498 && (((reg = (insn >> 11) & 0x1f) >= SAVE1_START_REGNUM && reg <= SAVE1_END_REGNUM)
499 || (reg >= SAVE2_START_REGNUM && reg <= SAVE2_END_REGNUM)
500 || (reg >= SAVE3_START_REGNUM && reg <= SAVE3_END_REGNUM)))
501 {
502 pifsr->reg = reg;
503 pifsr->offset = (insn & 0x007e) << 1;
504 pifsr->cur_frameoffset = pi->frameoffset;
505 #ifdef DEBUG
506 printf_filtered ("\tSaved register r%d, offset %d", reg, pifsr->offset);
507 #endif
508 pifsr++;
509 }
510
511 #ifdef DEBUG
512 printf_filtered ("\n");
513 #endif
514 }
515
516 if (pifsr)
517 pifsr->framereg = 0; /* Tie off last entry */
518
519 /* Fix up any offsets to the final offset. If a frame pointer was created, use it
520 instead of the stack pointer. */
521 for (pifsr_tmp = pi->pifsrs; pifsr_tmp && pifsr_tmp != pifsr; pifsr_tmp++)
522 {
523 pifsr_tmp->offset -= pi->frameoffset - pifsr_tmp->cur_frameoffset;
524 pifsr_tmp->framereg = pi->framereg;
525
526 #ifdef DEBUG
527 printf_filtered ("Saved register r%d, offset = %d, framereg = r%d\n",
528 pifsr_tmp->reg, pifsr_tmp->offset, pifsr_tmp->framereg);
529 #endif
530 }
531
532 #ifdef DEBUG
533 printf_filtered ("Framereg = r%d, frameoffset = %d\n", pi->framereg, pi->frameoffset);
534 #endif
535
536 return current_pc;
537 }
538
539 /* Function: init_extra_frame_info
540 Setup the frame's frame pointer, pc, and frame addresses for saved
541 registers. Most of the work is done in scan_prologue().
542
543 Note that when we are called for the last frame (currently active frame),
544 that fi->pc and fi->frame will already be setup. However, fi->frame will
545 be valid only if this routine uses FP. For previous frames, fi-frame will
546 always be correct (since that is derived from v850_frame_chain ()).
547
548 We can be called with the PC in the call dummy under two circumstances.
549 First, during normal backtracing, second, while figuring out the frame
550 pointer just prior to calling the target function (see run_stack_dummy). */
551
552 void
553 v850_init_extra_frame_info (struct frame_info *fi)
554 {
555 struct prologue_info pi;
556 struct pifsr pifsrs[NUM_REGS + 1], *pifsr;
557
558 if (fi->next)
559 fi->pc = FRAME_SAVED_PC (fi->next);
560
561 memset (fi->fsr.regs, '\000', sizeof fi->fsr.regs);
562
563 /* The call dummy doesn't save any registers on the stack, so we can return
564 now. */
565 if (PC_IN_CALL_DUMMY (fi->pc, fi->frame, fi->frame))
566 return;
567
568 pi.pifsrs = pifsrs;
569
570 v850_scan_prologue (fi->pc, &pi);
571
572 if (!fi->next && pi.framereg == SP_REGNUM)
573 fi->frame = read_register (pi.framereg) - pi.frameoffset;
574
575 for (pifsr = pifsrs; pifsr->framereg; pifsr++)
576 {
577 fi->fsr.regs[pifsr->reg] = pifsr->offset + fi->frame;
578
579 if (pifsr->framereg == SP_REGNUM)
580 fi->fsr.regs[pifsr->reg] += pi.frameoffset;
581 }
582 }
583
584 /* Function: frame_chain
585 Figure out the frame prior to FI. Unfortunately, this involves
586 scanning the prologue of the caller, which will also be done
587 shortly by v850_init_extra_frame_info. For the dummy frame, we
588 just return the stack pointer that was in use at the time the
589 function call was made. */
590
591 CORE_ADDR
592 v850_frame_chain (struct frame_info *fi)
593 {
594 struct prologue_info pi;
595 CORE_ADDR callers_pc, fp;
596
597 /* First, find out who called us */
598 callers_pc = FRAME_SAVED_PC (fi);
599 /* If caller is a call-dummy, then our FP bears no relation to his FP! */
600 fp = v850_find_callers_reg (fi, FP_RAW_REGNUM);
601 if (PC_IN_CALL_DUMMY (callers_pc, fp, fp))
602 return fp; /* caller is call-dummy: return oldest value of FP */
603
604 /* Caller is NOT a call-dummy, so everything else should just work.
605 Even if THIS frame is a call-dummy! */
606 pi.pifsrs = NULL;
607
608 v850_scan_prologue (callers_pc, &pi);
609
610 if (pi.start_function)
611 return 0; /* Don't chain beyond the start function */
612
613 if (pi.framereg == FP_RAW_REGNUM)
614 return v850_find_callers_reg (fi, pi.framereg);
615
616 return fi->frame - pi.frameoffset;
617 }
618
619 /* Function: find_callers_reg
620 Find REGNUM on the stack. Otherwise, it's in an active register.
621 One thing we might want to do here is to check REGNUM against the
622 clobber mask, and somehow flag it as invalid if it isn't saved on
623 the stack somewhere. This would provide a graceful failure mode
624 when trying to get the value of caller-saves registers for an inner
625 frame. */
626
627 CORE_ADDR
628 v850_find_callers_reg (struct frame_info *fi, int regnum)
629 {
630 for (; fi; fi = fi->next)
631 if (PC_IN_CALL_DUMMY (fi->pc, fi->frame, fi->frame))
632 return generic_read_register_dummy (fi->pc, fi->frame, regnum);
633 else if (fi->fsr.regs[regnum] != 0)
634 return read_memory_unsigned_integer (fi->fsr.regs[regnum],
635 REGISTER_RAW_SIZE (regnum));
636
637 return read_register (regnum);
638 }
639
640 /* Function: skip_prologue
641 Return the address of the first code past the prologue of the function. */
642
643 CORE_ADDR
644 v850_skip_prologue (CORE_ADDR pc)
645 {
646 CORE_ADDR func_addr, func_end;
647
648 /* See what the symbol table says */
649
650 if (find_pc_partial_function (pc, NULL, &func_addr, &func_end))
651 {
652 struct symtab_and_line sal;
653
654 sal = find_pc_line (func_addr, 0);
655
656 if (sal.line != 0 && sal.end < func_end)
657 return sal.end;
658 else
659 /* Either there's no line info, or the line after the prologue is after
660 the end of the function. In this case, there probably isn't a
661 prologue. */
662 return pc;
663 }
664
665 /* We can't find the start of this function, so there's nothing we can do. */
666 return pc;
667 }
668
669 /* Function: pop_frame
670 This routine gets called when either the user uses the `return'
671 command, or the call dummy breakpoint gets hit. */
672
673 void
674 v850_pop_frame (struct frame_info *frame)
675 {
676 int regnum;
677
678 if (PC_IN_CALL_DUMMY (frame->pc, frame->frame, frame->frame))
679 generic_pop_dummy_frame ();
680 else
681 {
682 write_register (PC_REGNUM, FRAME_SAVED_PC (frame));
683
684 for (regnum = 0; regnum < NUM_REGS; regnum++)
685 if (frame->fsr.regs[regnum] != 0)
686 write_register (regnum,
687 read_memory_unsigned_integer (frame->fsr.regs[regnum],
688 REGISTER_RAW_SIZE (regnum)));
689
690 write_register (SP_REGNUM, FRAME_FP (frame));
691 }
692
693 flush_cached_frames ();
694 }
695
696 /* Function: push_arguments
697 Setup arguments and RP for a call to the target. First four args
698 go in R6->R9, subsequent args go into sp + 16 -> sp + ... Structs
699 are passed by reference. 64 bit quantities (doubles and long
700 longs) may be split between the regs and the stack. When calling a
701 function that returns a struct, a pointer to the struct is passed
702 in as a secret first argument (always in R6).
703
704 Stack space for the args has NOT been allocated: that job is up to us.
705 */
706
707 CORE_ADDR
708 v850_push_arguments (int nargs, value_ptr *args, CORE_ADDR sp,
709 unsigned char struct_return, CORE_ADDR struct_addr)
710 {
711 int argreg;
712 int argnum;
713 int len = 0;
714 int stack_offset;
715
716 /* First, just for safety, make sure stack is aligned */
717 sp &= ~3;
718
719 /* Now make space on the stack for the args. */
720 for (argnum = 0; argnum < nargs; argnum++)
721 len += ((TYPE_LENGTH (VALUE_TYPE (args[argnum])) + 3) & ~3);
722 sp -= len; /* possibly over-allocating, but it works... */
723 /* (you might think we could allocate 16 bytes */
724 /* less, but the ABI seems to use it all! ) */
725 argreg = ARG0_REGNUM;
726
727 /* the struct_return pointer occupies the first parameter-passing reg */
728 if (struct_return)
729 write_register (argreg++, struct_addr);
730
731 stack_offset = 16;
732 /* The offset onto the stack at which we will start copying parameters
733 (after the registers are used up) begins at 16 rather than at zero.
734 I don't really know why, that's just the way it seems to work. */
735
736 /* Now load as many as possible of the first arguments into
737 registers, and push the rest onto the stack. There are 16 bytes
738 in four registers available. Loop thru args from first to last. */
739 for (argnum = 0; argnum < nargs; argnum++)
740 {
741 int len;
742 char *val;
743 char valbuf[REGISTER_RAW_SIZE (ARG0_REGNUM)];
744
745 if (TYPE_CODE (VALUE_TYPE (*args)) == TYPE_CODE_STRUCT
746 && TYPE_LENGTH (VALUE_TYPE (*args)) > 8)
747 {
748 store_address (valbuf, 4, VALUE_ADDRESS (*args));
749 len = 4;
750 val = valbuf;
751 }
752 else
753 {
754 len = TYPE_LENGTH (VALUE_TYPE (*args));
755 val = (char *) VALUE_CONTENTS (*args);
756 }
757
758 while (len > 0)
759 if (argreg <= ARGLAST_REGNUM)
760 {
761 CORE_ADDR regval;
762
763 regval = extract_address (val, REGISTER_RAW_SIZE (argreg));
764 write_register (argreg, regval);
765
766 len -= REGISTER_RAW_SIZE (argreg);
767 val += REGISTER_RAW_SIZE (argreg);
768 argreg++;
769 }
770 else
771 {
772 write_memory (sp + stack_offset, val, 4);
773
774 len -= 4;
775 val += 4;
776 stack_offset += 4;
777 }
778 args++;
779 }
780 return sp;
781 }
782
783 /* Function: push_return_address (pc)
784 Set up the return address for the inferior function call.
785 Needed for targets where we don't actually execute a JSR/BSR instruction */
786
787 CORE_ADDR
788 v850_push_return_address (CORE_ADDR pc, CORE_ADDR sp)
789 {
790 write_register (RP_REGNUM, CALL_DUMMY_ADDRESS ());
791 return sp;
792 }
793
794 /* Function: frame_saved_pc
795 Find the caller of this frame. We do this by seeing if RP_REGNUM
796 is saved in the stack anywhere, otherwise we get it from the
797 registers. If the inner frame is a dummy frame, return its PC
798 instead of RP, because that's where "caller" of the dummy-frame
799 will be found. */
800
801 CORE_ADDR
802 v850_frame_saved_pc (struct frame_info *fi)
803 {
804 if (PC_IN_CALL_DUMMY (fi->pc, fi->frame, fi->frame))
805 return generic_read_register_dummy (fi->pc, fi->frame, PC_REGNUM);
806 else
807 return v850_find_callers_reg (fi, RP_REGNUM);
808 }
809
810
811 /* Function: fix_call_dummy
812 Pokes the callee function's address into the CALL_DUMMY assembly stub.
813 Assumes that the CALL_DUMMY looks like this:
814 jarl <offset24>, r31
815 trap
816 */
817
818 int
819 v850_fix_call_dummy (char *dummy, CORE_ADDR sp, CORE_ADDR fun, int nargs,
820 value_ptr *args, struct type *type, int gcc_p)
821 {
822 long offset24;
823
824 offset24 = (long) fun - (long) entry_point_address ();
825 offset24 &= 0x3fffff;
826 offset24 |= 0xff800000; /* jarl <offset24>, r31 */
827
828 store_unsigned_integer ((unsigned int *) &dummy[2], 2, offset24 & 0xffff);
829 store_unsigned_integer ((unsigned int *) &dummy[0], 2, offset24 >> 16);
830 return 0;
831 }
832
833 /* Change the register names based on the current machine type. */
834
835 static int
836 v850_target_architecture_hook (const bfd_arch_info_type *ap)
837 {
838 int i, j;
839
840 if (ap->arch != bfd_arch_v850)
841 return 0;
842
843 for (i = 0; v850_processor_type_table[i].regnames != NULL; i++)
844 {
845 if (v850_processor_type_table[i].mach == ap->mach)
846 {
847 v850_register_names = v850_processor_type_table[i].regnames;
848 tm_print_insn_info.mach = ap->mach;
849 return 1;
850 }
851 }
852
853 internal_error ("Architecture `%s' unreconized", ap->printable_name);
854 }
855
856 void
857 _initialize_v850_tdep (void)
858 {
859 tm_print_insn = print_insn_v850;
860 target_architecture_hook = v850_target_architecture_hook;
861 }
This page took 0.047224 seconds and 4 git commands to generate.