import gdb-2000-02-04 snapshot
[deliverable/binutils-gdb.git] / gdb / arm-tdep.c
1 /* Common target dependent code for GDB on ARM systems.
2 Copyright 1988, 1989, 1991, 1992, 1993, 1995, 1996, 1997, 1998, 1999, 2000
3 Free Software Foundation, Inc.
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
21
22 #include "defs.h"
23 #include "frame.h"
24 #include "inferior.h"
25 #include "gdbcmd.h"
26 #include "gdbcore.h"
27 #include "symfile.h"
28 #include "gdb_string.h"
29 #include "coff/internal.h" /* Internal format of COFF symbols in BFD */
30
31 extern void _initialize_arm_tdep (void);
32
33 /*
34 The following macros are actually wrong. Neither arm nor thumb can
35 or should set the lsb on addr.
36 The thumb addresses are mod 2, so (addr & 2) would be a good heuristic
37 to use when checking for thumb (see arm_pc_is_thumb() below).
38 Unfortunately, something else depends on these (incorrect) macros, so
39 fixing them actually breaks gdb. I didn't have time to investigate. Z.R.
40 */
41 /* Thumb function addresses are odd (bit 0 is set). Here are some
42 macros to test, set, or clear bit 0 of addresses. */
43 #define IS_THUMB_ADDR(addr) ((addr) & 1)
44 #define MAKE_THUMB_ADDR(addr) ((addr) | 1)
45 #define UNMAKE_THUMB_ADDR(addr) ((addr) & ~1)
46
47 /* Default register names as specified by APCS. */
48 static char * atpcs_register_names[] =
49 {"a1", "a2", "a3", "a4", /* 0 1 2 3 */
50 "v1", "v2", "v3", "v4", /* 4 5 6 7 */
51 "v5", "v6", "v7", "v8", /* 8 9 10 11 */
52 "IP", "SP", "LR", "PC", /* 12 13 14 15 */
53 "f0", "f1", "f2", "f3", /* 16 17 18 19 */
54 "f4", "f5", "f6", "f7", /* 20 21 22 23 */
55 "FPS", "PS" }; /* 24 25 */
56
57 /* Alternate set of registers names used by GCC. */
58 static char * additional_register_names[] =
59 {"r0", "r1", "r2", "r3", /* 0 1 2 3 */
60 "r4", "r5", "r6", "r7", /* 4 5 6 7 */
61 "r8", "r9", "r10", "r11", /* 8 9 10 11 */
62 "r12", "sp", "lr", "pc", /* 12 13 14 15 */
63 "f0", "f1", "f2", "f3", /* 16 17 18 19 */
64 "f4", "f5", "f6", "f7", /* 20 21 22 23 */
65 "fps", "ps" }; /* 24 25 */
66
67 /* This is the variable that is set with "set disassembly-flavor".
68 By default use the APCS registers names. */
69 char ** arm_register_names = atpcs_register_names;
70
71 /* Valid register name flavours. */
72 static char apcs_flavor[] = "apcs";
73 static char r_prefix_flavor[] = "r-prefix";
74 static char * valid_flavors[] =
75 {
76 apcs_flavor,
77 r_prefix_flavor,
78 NULL
79 };
80
81 /* Disassembly flavor to use. */
82 static char *disassembly_flavor = apcs_flavor;
83
84 /* This is used to keep the bfd arch_info in sync with the disassembly
85 flavor. */
86 static void set_disassembly_flavor_sfunc(char *, int,
87 struct cmd_list_element *);
88 static void set_disassembly_flavor (void);
89
90 static void convert_from_extended (void *ptr, void *dbl);
91
92 /* Define other aspects of the stack frame. We keep the offsets of
93 all saved registers, 'cause we need 'em a lot! We also keep the
94 current size of the stack frame, and the offset of the frame
95 pointer from the stack pointer (for frameless functions, and when
96 we're still in the prologue of a function with a frame) */
97
98 struct frame_extra_info
99 {
100 struct frame_saved_regs fsr;
101 int framesize;
102 int frameoffset;
103 int framereg;
104 };
105
106 #define SWAP_TARGET_AND_HOST(buffer,len) \
107 do \
108 { \
109 if (TARGET_BYTE_ORDER != HOST_BYTE_ORDER) \
110 { \
111 char tmp; \
112 char *p = (char *)(buffer); \
113 char *q = ((char *)(buffer)) + len - 1; \
114 for (; p < q; p++, q--) \
115 { \
116 tmp = *q; \
117 *q = *p; \
118 *p = tmp; \
119 } \
120 } \
121 } \
122 while (0)
123
124 /* Will a function return an aggregate type in memory or in a
125 register? Return 0 if an aggregate type can be returned in a
126 register, 1 if it must be returned in memory. */
127
128 int
129 arm_use_struct_convention (int gcc_p, struct type *type)
130 {
131 int nRc;
132 register enum type_code code;
133
134 /* In the ARM ABI, "integer" like aggregate types are returned in
135 registers. For an aggregate type to be integer like, its size
136 must be less than or equal to REGISTER_SIZE and the offset of
137 each addressable subfield must be zero. Note that bit fields are
138 not addressable, and all addressable subfields of unions always
139 start at offset zero.
140
141 This function is based on the behaviour of GCC 2.95.1.
142 See: gcc/arm.c: arm_return_in_memory() for details.
143
144 Note: All versions of GCC before GCC 2.95.2 do not set up the
145 parameters correctly for a function returning the following
146 structure: struct { float f;}; This should be returned in memory,
147 not a register. Richard Earnshaw sent me a patch, but I do not
148 know of any way to detect if a function like the above has been
149 compiled with the correct calling convention. */
150
151 /* All aggregate types that won't fit in a register must be returned
152 in memory. */
153 if (TYPE_LENGTH (type) > REGISTER_SIZE)
154 {
155 return 1;
156 }
157
158 /* The only aggregate types that can be returned in a register are
159 structs and unions. Arrays must be returned in memory. */
160 code = TYPE_CODE (type);
161 if ((TYPE_CODE_STRUCT != code) && (TYPE_CODE_UNION != code))
162 {
163 return 1;
164 }
165
166 /* Assume all other aggregate types can be returned in a register.
167 Run a check for structures, unions and arrays. */
168 nRc = 0;
169
170 if ((TYPE_CODE_STRUCT == code) || (TYPE_CODE_UNION == code))
171 {
172 int i;
173 /* Need to check if this struct/union is "integer" like. For
174 this to be true, its size must be less than or equal to
175 REGISTER_SIZE and the offset of each addressable subfield
176 must be zero. Note that bit fields are not addressable, and
177 unions always start at offset zero. If any of the subfields
178 is a floating point type, the struct/union cannot be an
179 integer type. */
180
181 /* For each field in the object, check:
182 1) Is it FP? --> yes, nRc = 1;
183 2) Is it addressable (bitpos != 0) and
184 not packed (bitsize == 0)?
185 --> yes, nRc = 1
186 */
187
188 for (i = 0; i < TYPE_NFIELDS (type); i++)
189 {
190 enum type_code field_type_code;
191 field_type_code = TYPE_CODE (TYPE_FIELD_TYPE (type, i));
192
193 /* Is it a floating point type field? */
194 if (field_type_code == TYPE_CODE_FLT)
195 {
196 nRc = 1;
197 break;
198 }
199
200 /* If bitpos != 0, then we have to care about it. */
201 if (TYPE_FIELD_BITPOS (type, i) != 0)
202 {
203 /* Bitfields are not addressable. If the field bitsize is
204 zero, then the field is not packed. Hence it cannot be
205 a bitfield or any other packed type. */
206 if (TYPE_FIELD_BITSIZE (type, i) == 0)
207 {
208 nRc = 1;
209 break;
210 }
211 }
212 }
213 }
214
215 return nRc;
216 }
217
218 int
219 arm_frame_chain_valid (CORE_ADDR chain, struct frame_info *thisframe)
220 {
221 return (chain != 0 && (FRAME_SAVED_PC (thisframe) >= LOWEST_PC));
222 }
223
224 /* Set to true if the 32-bit mode is in use. */
225
226 int arm_apcs_32 = 1;
227
228 /* Flag set by arm_fix_call_dummy that tells whether the target
229 function is a Thumb function. This flag is checked by
230 arm_push_arguments. FIXME: Change the PUSH_ARGUMENTS macro (and
231 its use in valops.c) to pass the function address as an additional
232 parameter. */
233
234 static int target_is_thumb;
235
236 /* Flag set by arm_fix_call_dummy that tells whether the calling
237 function is a Thumb function. This flag is checked by
238 arm_pc_is_thumb and arm_call_dummy_breakpoint_offset. */
239
240 static int caller_is_thumb;
241
242 /* Determine if the program counter specified in MEMADDR is in a Thumb
243 function. */
244
245 int
246 arm_pc_is_thumb (bfd_vma memaddr)
247 {
248 struct minimal_symbol *sym;
249
250 /* If bit 0 of the address is set, assume this is a Thumb address. */
251 if (IS_THUMB_ADDR (memaddr))
252 return 1;
253
254 /* Thumb functions have a "special" bit set in minimal symbols. */
255 sym = lookup_minimal_symbol_by_pc (memaddr);
256 if (sym)
257 {
258 return (MSYMBOL_IS_SPECIAL (sym));
259 }
260 else
261 {
262 return 0;
263 }
264 }
265
266 /* Determine if the program counter specified in MEMADDR is in a call
267 dummy being called from a Thumb function. */
268
269 int
270 arm_pc_is_thumb_dummy (bfd_vma memaddr)
271 {
272 CORE_ADDR sp = read_sp ();
273
274 /* FIXME: Until we switch for the new call dummy macros, this heuristic
275 is the best we can do. We are trying to determine if the pc is on
276 the stack, which (hopefully) will only happen in a call dummy.
277 We hope the current stack pointer is not so far alway from the dummy
278 frame location (true if we have not pushed large data structures or
279 gone too many levels deep) and that our 1024 is not enough to consider
280 code regions as part of the stack (true for most practical purposes) */
281 if (PC_IN_CALL_DUMMY (memaddr, sp, sp + 1024))
282 return caller_is_thumb;
283 else
284 return 0;
285 }
286
287 CORE_ADDR
288 arm_addr_bits_remove (CORE_ADDR val)
289 {
290 if (arm_pc_is_thumb (val))
291 return (val & (arm_apcs_32 ? 0xfffffffe : 0x03fffffe));
292 else
293 return (val & (arm_apcs_32 ? 0xfffffffc : 0x03fffffc));
294 }
295
296 CORE_ADDR
297 arm_saved_pc_after_call (struct frame_info *frame)
298 {
299 return ADDR_BITS_REMOVE (read_register (LR_REGNUM));
300 }
301
302 int
303 arm_frameless_function_invocation (struct frame_info *fi)
304 {
305 CORE_ADDR func_start, after_prologue;
306 int frameless;
307
308 func_start = (get_pc_function_start ((fi)->pc) + FUNCTION_START_OFFSET);
309 after_prologue = SKIP_PROLOGUE (func_start);
310
311 /* There are some frameless functions whose first two instructions
312 follow the standard APCS form, in which case after_prologue will
313 be func_start + 8. */
314
315 frameless = (after_prologue < func_start + 12);
316 return frameless;
317 }
318
319 /* A typical Thumb prologue looks like this:
320 push {r7, lr}
321 add sp, sp, #-28
322 add r7, sp, #12
323 Sometimes the latter instruction may be replaced by:
324 mov r7, sp
325
326 or like this:
327 push {r7, lr}
328 mov r7, sp
329 sub sp, #12
330
331 or, on tpcs, like this:
332 sub sp,#16
333 push {r7, lr}
334 (many instructions)
335 mov r7, sp
336 sub sp, #12
337
338 There is always one instruction of three classes:
339 1 - push
340 2 - setting of r7
341 3 - adjusting of sp
342
343 When we have found at least one of each class we are done with the prolog.
344 Note that the "sub sp, #NN" before the push does not count.
345 */
346
347 static CORE_ADDR
348 thumb_skip_prologue (CORE_ADDR pc)
349 {
350 CORE_ADDR current_pc;
351 int findmask = 0; /* findmask:
352 bit 0 - push { rlist }
353 bit 1 - mov r7, sp OR add r7, sp, #imm (setting of r7)
354 bit 2 - sub sp, #simm OR add sp, #simm (adjusting of sp)
355 */
356
357 for (current_pc = pc; current_pc < pc + 40; current_pc += 2)
358 {
359 unsigned short insn = read_memory_unsigned_integer (current_pc, 2);
360
361 if ((insn & 0xfe00) == 0xb400) /* push { rlist } */
362 {
363 findmask |= 1; /* push found */
364 }
365 else if ((insn & 0xff00) == 0xb000) /* add sp, #simm OR sub sp, #simm */
366 {
367 if ((findmask & 1) == 0) /* before push ? */
368 continue;
369 else
370 findmask |= 4; /* add/sub sp found */
371 }
372 else if ((insn & 0xff00) == 0xaf00) /* add r7, sp, #imm */
373 {
374 findmask |= 2; /* setting of r7 found */
375 }
376 else if (insn == 0x466f) /* mov r7, sp */
377 {
378 findmask |= 2; /* setting of r7 found */
379 }
380 else
381 continue; /* something in the prolog that we don't care about or some
382 instruction from outside the prolog scheduled here for optimization */
383 }
384
385 return current_pc;
386 }
387
388 /* The APCS (ARM Procedure Call Standard) defines the following
389 prologue:
390
391 mov ip, sp
392 [stmfd sp!, {a1,a2,a3,a4}]
393 stmfd sp!, {...,fp,ip,lr,pc}
394 [stfe f7, [sp, #-12]!]
395 [stfe f6, [sp, #-12]!]
396 [stfe f5, [sp, #-12]!]
397 [stfe f4, [sp, #-12]!]
398 sub fp, ip, #nn @@ nn == 20 or 4 depending on second insn */
399
400 CORE_ADDR
401 arm_skip_prologue (CORE_ADDR pc)
402 {
403 unsigned long inst;
404 CORE_ADDR skip_pc;
405 CORE_ADDR func_addr, func_end;
406 struct symtab_and_line sal;
407
408 /* See what the symbol table says. */
409
410 if (find_pc_partial_function (pc, NULL, &func_addr, &func_end))
411 {
412 sal = find_pc_line (func_addr, 0);
413 if ((sal.line != 0) && (sal.end < func_end))
414 return sal.end;
415 }
416
417 /* Check if this is Thumb code. */
418 if (arm_pc_is_thumb (pc))
419 return thumb_skip_prologue (pc);
420
421 /* Can't find the prologue end in the symbol table, try it the hard way
422 by disassembling the instructions. */
423 skip_pc = pc;
424 inst = read_memory_integer (skip_pc, 4);
425 if (inst != 0xe1a0c00d) /* mov ip, sp */
426 return pc;
427
428 skip_pc += 4;
429 inst = read_memory_integer (skip_pc, 4);
430 if ((inst & 0xfffffff0) == 0xe92d0000) /* stmfd sp!,{a1,a2,a3,a4} */
431 {
432 skip_pc += 4;
433 inst = read_memory_integer (skip_pc, 4);
434 }
435
436 if ((inst & 0xfffff800) != 0xe92dd800) /* stmfd sp!,{...,fp,ip,lr,pc} */
437 return pc;
438
439 skip_pc += 4;
440 inst = read_memory_integer (skip_pc, 4);
441
442 /* Any insns after this point may float into the code, if it makes
443 for better instruction scheduling, so we skip them only if we
444 find them, but still consdier the function to be frame-ful. */
445
446 /* We may have either one sfmfd instruction here, or several stfe
447 insns, depending on the version of floating point code we
448 support. */
449 if ((inst & 0xffbf0fff) == 0xec2d0200) /* sfmfd fn, <cnt>, [sp]! */
450 {
451 skip_pc += 4;
452 inst = read_memory_integer (skip_pc, 4);
453 }
454 else
455 {
456 while ((inst & 0xffff8fff) == 0xed6d0103) /* stfe fn, [sp, #-12]! */
457 {
458 skip_pc += 4;
459 inst = read_memory_integer (skip_pc, 4);
460 }
461 }
462
463 if ((inst & 0xfffff000) == 0xe24cb000) /* sub fp, ip, #nn */
464 skip_pc += 4;
465
466 return skip_pc;
467 }
468 /* *INDENT-OFF* */
469 /* Function: thumb_scan_prologue (helper function for arm_scan_prologue)
470 This function decodes a Thumb function prologue to determine:
471 1) the size of the stack frame
472 2) which registers are saved on it
473 3) the offsets of saved regs
474 4) the offset from the stack pointer to the frame pointer
475 This information is stored in the "extra" fields of the frame_info.
476
477 A typical Thumb function prologue would create this stack frame
478 (offsets relative to FP)
479 old SP -> 24 stack parameters
480 20 LR
481 16 R7
482 R7 -> 0 local variables (16 bytes)
483 SP -> -12 additional stack space (12 bytes)
484 The frame size would thus be 36 bytes, and the frame offset would be
485 12 bytes. The frame register is R7.
486
487 The comments for thumb_skip_prolog() describe the algorithm we use to detect
488 the end of the prolog */
489 /* *INDENT-ON* */
490
491 static void
492 thumb_scan_prologue (struct frame_info *fi)
493 {
494 CORE_ADDR prologue_start;
495 CORE_ADDR prologue_end;
496 CORE_ADDR current_pc;
497 int saved_reg[16]; /* which register has been copied to register n? */
498 int findmask = 0; /* findmask:
499 bit 0 - push { rlist }
500 bit 1 - mov r7, sp OR add r7, sp, #imm (setting of r7)
501 bit 2 - sub sp, #simm OR add sp, #simm (adjusting of sp)
502 */
503 int i;
504
505 if (find_pc_partial_function (fi->pc, NULL, &prologue_start, &prologue_end))
506 {
507 struct symtab_and_line sal = find_pc_line (prologue_start, 0);
508
509 if (sal.line == 0) /* no line info, use current PC */
510 prologue_end = fi->pc;
511 else if (sal.end < prologue_end) /* next line begins after fn end */
512 prologue_end = sal.end; /* (probably means no prologue) */
513 }
514 else
515 prologue_end = prologue_start + 40; /* We're in the boondocks: allow for */
516 /* 16 pushes, an add, and "mv fp,sp" */
517
518 prologue_end = min (prologue_end, fi->pc);
519
520 /* Initialize the saved register map. When register H is copied to
521 register L, we will put H in saved_reg[L]. */
522 for (i = 0; i < 16; i++)
523 saved_reg[i] = i;
524
525 /* Search the prologue looking for instructions that set up the
526 frame pointer, adjust the stack pointer, and save registers.
527 Do this until all basic prolog instructions are found. */
528
529 fi->framesize = 0;
530 for (current_pc = prologue_start;
531 (current_pc < prologue_end) && ((findmask & 7) != 7);
532 current_pc += 2)
533 {
534 unsigned short insn;
535 int regno;
536 int offset;
537
538 insn = read_memory_unsigned_integer (current_pc, 2);
539
540 if ((insn & 0xfe00) == 0xb400) /* push { rlist } */
541 {
542 int mask;
543 findmask |= 1; /* push found */
544 /* Bits 0-7 contain a mask for registers R0-R7. Bit 8 says
545 whether to save LR (R14). */
546 mask = (insn & 0xff) | ((insn & 0x100) << 6);
547
548 /* Calculate offsets of saved R0-R7 and LR. */
549 for (regno = LR_REGNUM; regno >= 0; regno--)
550 if (mask & (1 << regno))
551 {
552 fi->framesize += 4;
553 fi->fsr.regs[saved_reg[regno]] = -(fi->framesize);
554 saved_reg[regno] = regno; /* reset saved register map */
555 }
556 }
557 else if ((insn & 0xff00) == 0xb000) /* add sp, #simm OR sub sp, #simm */
558 {
559 if ((findmask & 1) == 0) /* before push ? */
560 continue;
561 else
562 findmask |= 4; /* add/sub sp found */
563
564 offset = (insn & 0x7f) << 2; /* get scaled offset */
565 if (insn & 0x80) /* is it signed? (==subtracting) */
566 {
567 fi->frameoffset += offset;
568 offset = -offset;
569 }
570 fi->framesize -= offset;
571 }
572 else if ((insn & 0xff00) == 0xaf00) /* add r7, sp, #imm */
573 {
574 findmask |= 2; /* setting of r7 found */
575 fi->framereg = THUMB_FP_REGNUM;
576 fi->frameoffset = (insn & 0xff) << 2; /* get scaled offset */
577 }
578 else if (insn == 0x466f) /* mov r7, sp */
579 {
580 findmask |= 2; /* setting of r7 found */
581 fi->framereg = THUMB_FP_REGNUM;
582 fi->frameoffset = 0;
583 saved_reg[THUMB_FP_REGNUM] = SP_REGNUM;
584 }
585 else if ((insn & 0xffc0) == 0x4640) /* mov r0-r7, r8-r15 */
586 {
587 int lo_reg = insn & 7; /* dest. register (r0-r7) */
588 int hi_reg = ((insn >> 3) & 7) + 8; /* source register (r8-15) */
589 saved_reg[lo_reg] = hi_reg; /* remember hi reg was saved */
590 }
591 else
592 continue; /* something in the prolog that we don't care about or some
593 instruction from outside the prolog scheduled here for optimization */
594 }
595 }
596
597 /* Check if prologue for this frame's PC has already been scanned. If
598 it has, copy the relevant information about that prologue and
599 return non-zero. Otherwise do not copy anything and return zero.
600
601 The information saved in the cache includes:
602 * the frame register number;
603 * the size of the stack frame;
604 * the offsets of saved regs (relative to the old SP); and
605 * the offset from the stack pointer to the frame pointer
606
607 The cache contains only one entry, since this is adequate for the
608 typical sequence of prologue scan requests we get. When performing
609 a backtrace, GDB will usually ask to scan the same function twice
610 in a row (once to get the frame chain, and once to fill in the
611 extra frame information). */
612
613 static struct frame_info prologue_cache;
614
615 static int
616 check_prologue_cache (struct frame_info *fi)
617 {
618 int i;
619
620 if (fi->pc == prologue_cache.pc)
621 {
622 fi->framereg = prologue_cache.framereg;
623 fi->framesize = prologue_cache.framesize;
624 fi->frameoffset = prologue_cache.frameoffset;
625 for (i = 0; i <= NUM_REGS; i++)
626 fi->fsr.regs[i] = prologue_cache.fsr.regs[i];
627 return 1;
628 }
629 else
630 return 0;
631 }
632
633
634 /* Copy the prologue information from fi to the prologue cache. */
635
636 static void
637 save_prologue_cache (struct frame_info *fi)
638 {
639 int i;
640
641 prologue_cache.pc = fi->pc;
642 prologue_cache.framereg = fi->framereg;
643 prologue_cache.framesize = fi->framesize;
644 prologue_cache.frameoffset = fi->frameoffset;
645
646 for (i = 0; i <= NUM_REGS; i++)
647 prologue_cache.fsr.regs[i] = fi->fsr.regs[i];
648 }
649
650
651 /* This function decodes an ARM function prologue to determine:
652 1) the size of the stack frame
653 2) which registers are saved on it
654 3) the offsets of saved regs
655 4) the offset from the stack pointer to the frame pointer
656 This information is stored in the "extra" fields of the frame_info.
657
658 There are two basic forms for the ARM prologue. The fixed argument
659 function call will look like:
660
661 mov ip, sp
662 stmfd sp!, {fp, ip, lr, pc}
663 sub fp, ip, #4
664 [sub sp, sp, #4]
665
666 Which would create this stack frame (offsets relative to FP):
667 IP -> 4 (caller's stack)
668 FP -> 0 PC (points to address of stmfd instruction + 8 in callee)
669 -4 LR (return address in caller)
670 -8 IP (copy of caller's SP)
671 -12 FP (caller's FP)
672 SP -> -28 Local variables
673
674 The frame size would thus be 32 bytes, and the frame offset would be
675 28 bytes. The stmfd call can also save any of the vN registers it
676 plans to use, which increases the frame size accordingly.
677
678 Note: The stored PC is 8 off of the STMFD instruction that stored it
679 because the ARM Store instructions always store PC + 8 when you read
680 the PC register.
681
682 A variable argument function call will look like:
683
684 mov ip, sp
685 stmfd sp!, {a1, a2, a3, a4}
686 stmfd sp!, {fp, ip, lr, pc}
687 sub fp, ip, #20
688
689 Which would create this stack frame (offsets relative to FP):
690 IP -> 20 (caller's stack)
691 16 A4
692 12 A3
693 8 A2
694 4 A1
695 FP -> 0 PC (points to address of stmfd instruction + 8 in callee)
696 -4 LR (return address in caller)
697 -8 IP (copy of caller's SP)
698 -12 FP (caller's FP)
699 SP -> -28 Local variables
700
701 The frame size would thus be 48 bytes, and the frame offset would be
702 28 bytes.
703
704 There is another potential complication, which is that the optimizer
705 will try to separate the store of fp in the "stmfd" instruction from
706 the "sub fp, ip, #NN" instruction. Almost anything can be there, so
707 we just key on the stmfd, and then scan for the "sub fp, ip, #NN"...
708
709 Also, note, the original version of the ARM toolchain claimed that there
710 should be an
711
712 instruction at the end of the prologue. I have never seen GCC produce
713 this, and the ARM docs don't mention it. We still test for it below in
714 case it happens...
715
716 */
717
718 static void
719 arm_scan_prologue (struct frame_info *fi)
720 {
721 int regno, sp_offset, fp_offset;
722 CORE_ADDR prologue_start, prologue_end, current_pc;
723
724 /* Check if this function is already in the cache of frame information. */
725 if (check_prologue_cache (fi))
726 return;
727
728 /* Assume there is no frame until proven otherwise. */
729 fi->framereg = SP_REGNUM;
730 fi->framesize = 0;
731 fi->frameoffset = 0;
732
733 /* Check for Thumb prologue. */
734 if (arm_pc_is_thumb (fi->pc))
735 {
736 thumb_scan_prologue (fi);
737 save_prologue_cache (fi);
738 return;
739 }
740
741 /* Find the function prologue. If we can't find the function in
742 the symbol table, peek in the stack frame to find the PC. */
743 if (find_pc_partial_function (fi->pc, NULL, &prologue_start, &prologue_end))
744 {
745 /* Assume the prologue is everything between the first instruction
746 in the function and the first source line. */
747 struct symtab_and_line sal = find_pc_line (prologue_start, 0);
748
749 if (sal.line == 0) /* no line info, use current PC */
750 prologue_end = fi->pc;
751 else if (sal.end < prologue_end) /* next line begins after fn end */
752 prologue_end = sal.end; /* (probably means no prologue) */
753 }
754 else
755 {
756 /* Get address of the stmfd in the prologue of the callee; the saved
757 PC is the address of the stmfd + 8. */
758 prologue_start = ADDR_BITS_REMOVE (read_memory_integer (fi->frame, 4))
759 - 8;
760 prologue_end = prologue_start + 64; /* This is all the insn's
761 that could be in the prologue,
762 plus room for 5 insn's inserted
763 by the scheduler. */
764 }
765
766 /* Now search the prologue looking for instructions that set up the
767 frame pointer, adjust the stack pointer, and save registers.
768
769 Be careful, however, and if it doesn't look like a prologue,
770 don't try to scan it. If, for instance, a frameless function
771 begins with stmfd sp!, then we will tell ourselves there is
772 a frame, which will confuse stack traceback, as well ad"finish"
773 and other operations that rely on a knowledge of the stack
774 traceback.
775
776 In the APCS, the prologue should start with "mov ip, sp" so
777 if we don't see this as the first insn, we will stop. */
778
779 sp_offset = fp_offset = 0;
780
781 if (read_memory_unsigned_integer (prologue_start, 4)
782 == 0xe1a0c00d) /* mov ip, sp */
783 {
784 for (current_pc = prologue_start + 4; current_pc < prologue_end;
785 current_pc += 4)
786 {
787 unsigned int insn = read_memory_unsigned_integer (current_pc, 4);
788
789 if ((insn & 0xffff0000) == 0xe92d0000)
790 /* stmfd sp!, {..., fp, ip, lr, pc}
791 or
792 stmfd sp!, {a1, a2, a3, a4} */
793 {
794 int mask = insn & 0xffff;
795
796 /* Calculate offsets of saved registers. */
797 for (regno = PC_REGNUM; regno >= 0; regno--)
798 if (mask & (1 << regno))
799 {
800 sp_offset -= 4;
801 fi->fsr.regs[regno] = sp_offset;
802 }
803 }
804 else if ((insn & 0xfffff000) == 0xe24cb000) /* sub fp, ip #n */
805 {
806 unsigned imm = insn & 0xff; /* immediate value */
807 unsigned rot = (insn & 0xf00) >> 7; /* rotate amount */
808 imm = (imm >> rot) | (imm << (32 - rot));
809 fp_offset = -imm;
810 fi->framereg = FP_REGNUM;
811 }
812 else if ((insn & 0xfffff000) == 0xe24dd000) /* sub sp, sp #n */
813 {
814 unsigned imm = insn & 0xff; /* immediate value */
815 unsigned rot = (insn & 0xf00) >> 7; /* rotate amount */
816 imm = (imm >> rot) | (imm << (32 - rot));
817 sp_offset -= imm;
818 }
819 else if ((insn & 0xffff7fff) == 0xed6d0103) /* stfe f?, [sp, -#c]! */
820 {
821 sp_offset -= 12;
822 regno = F0_REGNUM + ((insn >> 12) & 0x07);
823 fi->fsr.regs[regno] = sp_offset;
824 }
825 else if ((insn & 0xffbf0fff) == 0xec2d0200) /* sfmfd f0, 4, [sp!] */
826 {
827 int n_saved_fp_regs;
828 unsigned int fp_start_reg, fp_bound_reg;
829
830 if ((insn & 0x800) == 0x800) /* N0 is set */
831 {
832 if ((insn & 0x40000) == 0x40000) /* N1 is set */
833 n_saved_fp_regs = 3;
834 else
835 n_saved_fp_regs = 1;
836 }
837 else
838 {
839 if ((insn & 0x40000) == 0x40000) /* N1 is set */
840 n_saved_fp_regs = 2;
841 else
842 n_saved_fp_regs = 4;
843 }
844
845 fp_start_reg = F0_REGNUM + ((insn >> 12) & 0x7);
846 fp_bound_reg = fp_start_reg + n_saved_fp_regs;
847 for (; fp_start_reg < fp_bound_reg; fp_start_reg++)
848 {
849 sp_offset -= 12;
850 fi->fsr.regs[fp_start_reg++] = sp_offset;
851 }
852 }
853 else
854 /* The optimizer might shove anything into the prologue,
855 so we just skip what we don't recognize. */
856 continue;
857 }
858 }
859
860 /* The frame size is just the negative of the offset (from the original SP)
861 of the last thing thing we pushed on the stack. The frame offset is
862 [new FP] - [new SP]. */
863 fi->framesize = -sp_offset;
864 fi->frameoffset = fp_offset - sp_offset;
865
866 save_prologue_cache (fi);
867 }
868
869 /* Find REGNUM on the stack. Otherwise, it's in an active register.
870 One thing we might want to do here is to check REGNUM against the
871 clobber mask, and somehow flag it as invalid if it isn't saved on
872 the stack somewhere. This would provide a graceful failure mode
873 when trying to get the value of caller-saves registers for an inner
874 frame. */
875
876 static CORE_ADDR
877 arm_find_callers_reg (struct frame_info *fi, int regnum)
878 {
879 for (; fi; fi = fi->next)
880
881 #if 0 /* FIXME: enable this code if we convert to new call dummy scheme. */
882 if (PC_IN_CALL_DUMMY (fi->pc, fi->frame, fi->frame))
883 return generic_read_register_dummy (fi->pc, fi->frame, regnum);
884 else
885 #endif
886 if (fi->fsr.regs[regnum] != 0)
887 return read_memory_integer (fi->fsr.regs[regnum],
888 REGISTER_RAW_SIZE (regnum));
889 return read_register (regnum);
890 }
891 /* *INDENT-OFF* */
892 /* Function: frame_chain
893 Given a GDB frame, determine the address of the calling function's frame.
894 This will be used to create a new GDB frame struct, and then
895 INIT_EXTRA_FRAME_INFO and INIT_FRAME_PC will be called for the new frame.
896 For ARM, we save the frame size when we initialize the frame_info.
897
898 The original definition of this function was a macro in tm-arm.h:
899 { In the case of the ARM, the frame's nominal address is the FP value,
900 and 12 bytes before comes the saved previous FP value as a 4-byte word. }
901
902 #define FRAME_CHAIN(thisframe) \
903 ((thisframe)->pc >= LOWEST_PC ? \
904 read_memory_integer ((thisframe)->frame - 12, 4) :\
905 0)
906 */
907 /* *INDENT-ON* */
908
909 CORE_ADDR
910 arm_frame_chain (struct frame_info *fi)
911 {
912 #if 0 /* FIXME: enable this code if we convert to new call dummy scheme. */
913 CORE_ADDR fn_start, callers_pc, fp;
914
915 /* is this a dummy frame? */
916 if (PC_IN_CALL_DUMMY (fi->pc, fi->frame, fi->frame))
917 return fi->frame; /* dummy frame same as caller's frame */
918
919 /* is caller-of-this a dummy frame? */
920 callers_pc = FRAME_SAVED_PC (fi); /* find out who called us: */
921 fp = arm_find_callers_reg (fi, FP_REGNUM);
922 if (PC_IN_CALL_DUMMY (callers_pc, fp, fp))
923 return fp; /* dummy frame's frame may bear no relation to ours */
924
925 if (find_pc_partial_function (fi->pc, 0, &fn_start, 0))
926 if (fn_start == entry_point_address ())
927 return 0; /* in _start fn, don't chain further */
928 #endif
929 CORE_ADDR caller_pc, fn_start;
930 struct frame_info caller_fi;
931 int framereg = fi->framereg;
932
933 if (fi->pc < LOWEST_PC)
934 return 0;
935
936 /* If the caller is the startup code, we're at the end of the chain. */
937 caller_pc = FRAME_SAVED_PC (fi);
938 if (find_pc_partial_function (caller_pc, 0, &fn_start, 0))
939 if (fn_start == entry_point_address ())
940 return 0;
941
942 /* If the caller is Thumb and the caller is ARM, or vice versa,
943 the frame register of the caller is different from ours.
944 So we must scan the prologue of the caller to determine its
945 frame register number. */
946 if (arm_pc_is_thumb (caller_pc) != arm_pc_is_thumb (fi->pc))
947 {
948 memset (&caller_fi, 0, sizeof (caller_fi));
949 caller_fi.pc = caller_pc;
950 arm_scan_prologue (&caller_fi);
951 framereg = caller_fi.framereg;
952 }
953
954 /* If the caller used a frame register, return its value.
955 Otherwise, return the caller's stack pointer. */
956 if (framereg == FP_REGNUM || framereg == THUMB_FP_REGNUM)
957 return arm_find_callers_reg (fi, framereg);
958 else
959 return fi->frame + fi->framesize;
960 }
961
962 /* This function actually figures out the frame address for a given pc
963 and sp. This is tricky because we sometimes don't use an explicit
964 frame pointer, and the previous stack pointer isn't necessarily
965 recorded on the stack. The only reliable way to get this info is
966 to examine the prologue. FROMLEAF is a little confusing, it means
967 this is the next frame up the chain AFTER a frameless function. If
968 this is true, then the frame value for this frame is still in the
969 fp register. */
970
971 void
972 arm_init_extra_frame_info (int fromleaf, struct frame_info *fi)
973 {
974 int reg;
975
976 if (fi->next)
977 fi->pc = FRAME_SAVED_PC (fi->next);
978
979 memset (fi->fsr.regs, '\000', sizeof fi->fsr.regs);
980
981 #if 0 /* FIXME: enable this code if we convert to new call dummy scheme. */
982 if (PC_IN_CALL_DUMMY (fi->pc, fi->frame, fi->frame))
983 {
984 /* We need to setup fi->frame here because run_stack_dummy gets it wrong
985 by assuming it's always FP. */
986 fi->frame = generic_read_register_dummy (fi->pc, fi->frame, SP_REGNUM);
987 fi->framesize = 0;
988 fi->frameoffset = 0;
989 return;
990 }
991 else
992 #endif
993 {
994 arm_scan_prologue (fi);
995
996 if (!fi->next)
997 /* this is the innermost frame? */
998 fi->frame = read_register (fi->framereg);
999 else if (fi->framereg == FP_REGNUM || fi->framereg == THUMB_FP_REGNUM)
1000 {
1001 /* not the innermost frame */
1002 /* If we have an FP, the callee saved it. */
1003 if (fi->next->fsr.regs[fi->framereg] != 0)
1004 fi->frame =
1005 read_memory_integer (fi->next->fsr.regs[fi->framereg], 4);
1006 else if (fromleaf)
1007 /* If we were called by a frameless fn. then our frame is
1008 still in the frame pointer register on the board... */
1009 fi->frame = read_fp ();
1010 }
1011
1012 /* Calculate actual addresses of saved registers using offsets
1013 determined by arm_scan_prologue. */
1014 for (reg = 0; reg < NUM_REGS; reg++)
1015 if (fi->fsr.regs[reg] != 0)
1016 fi->fsr.regs[reg] += fi->frame + fi->framesize - fi->frameoffset;
1017 }
1018 }
1019
1020
1021 /* Find the caller of this frame. We do this by seeing if LR_REGNUM
1022 is saved in the stack anywhere, otherwise we get it from the
1023 registers.
1024
1025 The old definition of this function was a macro:
1026 #define FRAME_SAVED_PC(FRAME) \
1027 ADDR_BITS_REMOVE (read_memory_integer ((FRAME)->frame - 4, 4)) */
1028
1029 CORE_ADDR
1030 arm_frame_saved_pc (struct frame_info *fi)
1031 {
1032 #if 0 /* FIXME: enable this code if we convert to new call dummy scheme. */
1033 if (PC_IN_CALL_DUMMY (fi->pc, fi->frame, fi->frame))
1034 return generic_read_register_dummy (fi->pc, fi->frame, PC_REGNUM);
1035 else
1036 #endif
1037 {
1038 CORE_ADDR pc = arm_find_callers_reg (fi, LR_REGNUM);
1039 return IS_THUMB_ADDR (pc) ? UNMAKE_THUMB_ADDR (pc) : pc;
1040 }
1041 }
1042
1043 /* Return the frame address. On ARM, it is R11; on Thumb it is R7.
1044 Examine the Program Status Register to decide which state we're in. */
1045
1046 CORE_ADDR
1047 arm_target_read_fp (void)
1048 {
1049 if (read_register (PS_REGNUM) & 0x20) /* Bit 5 is Thumb state bit */
1050 return read_register (THUMB_FP_REGNUM); /* R7 if Thumb */
1051 else
1052 return read_register (FP_REGNUM); /* R11 if ARM */
1053 }
1054
1055 /* Calculate the frame offsets of the saved registers (ARM version). */
1056
1057 void
1058 arm_frame_find_saved_regs (struct frame_info *fi,
1059 struct frame_saved_regs *regaddr)
1060 {
1061 memcpy (regaddr, &fi->fsr, sizeof (struct frame_saved_regs));
1062 }
1063
1064 void
1065 arm_push_dummy_frame (void)
1066 {
1067 CORE_ADDR old_sp = read_register (SP_REGNUM);
1068 CORE_ADDR sp = old_sp;
1069 CORE_ADDR fp, prologue_start;
1070 int regnum;
1071
1072 /* Push the two dummy prologue instructions in reverse order,
1073 so that they'll be in the correct low-to-high order in memory. */
1074 /* sub fp, ip, #4 */
1075 sp = push_word (sp, 0xe24cb004);
1076 /* stmdb sp!, {r0-r10, fp, ip, lr, pc} */
1077 prologue_start = sp = push_word (sp, 0xe92ddfff);
1078
1079 /* Push a pointer to the dummy prologue + 12, because when stm
1080 instruction stores the PC, it stores the address of the stm
1081 instruction itself plus 12. */
1082 fp = sp = push_word (sp, prologue_start + 12);
1083 sp = push_word (sp, read_register (PC_REGNUM)); /* FIXME: was PS_REGNUM */
1084 sp = push_word (sp, old_sp);
1085 sp = push_word (sp, read_register (FP_REGNUM));
1086
1087 for (regnum = 10; regnum >= 0; regnum--)
1088 sp = push_word (sp, read_register (regnum));
1089
1090 write_register (FP_REGNUM, fp);
1091 write_register (THUMB_FP_REGNUM, fp);
1092 write_register (SP_REGNUM, sp);
1093 }
1094
1095 /* Fix up the call dummy, based on whether the processor is currently
1096 in Thumb or ARM mode, and whether the target function is Thumb or
1097 ARM. There are three different situations requiring three
1098 different dummies:
1099
1100 * ARM calling ARM: uses the call dummy in tm-arm.h, which has already
1101 been copied into the dummy parameter to this function.
1102 * ARM calling Thumb: uses the call dummy in tm-arm.h, but with the
1103 "mov pc,r4" instruction patched to be a "bx r4" instead.
1104 * Thumb calling anything: uses the Thumb dummy defined below, which
1105 works for calling both ARM and Thumb functions.
1106
1107 All three call dummies expect to receive the target function
1108 address in R4, with the low bit set if it's a Thumb function. */
1109
1110 void
1111 arm_fix_call_dummy (char *dummy, CORE_ADDR pc, CORE_ADDR fun, int nargs,
1112 value_ptr *args, struct type *type, int gcc_p)
1113 {
1114 static short thumb_dummy[4] =
1115 {
1116 0xf000, 0xf801, /* bl label */
1117 0xdf18, /* swi 24 */
1118 0x4720, /* label: bx r4 */
1119 };
1120 static unsigned long arm_bx_r4 = 0xe12fff14; /* bx r4 instruction */
1121
1122 /* Set flag indicating whether the current PC is in a Thumb function. */
1123 caller_is_thumb = arm_pc_is_thumb (read_pc ());
1124
1125 /* If the target function is Thumb, set the low bit of the function
1126 address. And if the CPU is currently in ARM mode, patch the
1127 second instruction of call dummy to use a BX instruction to
1128 switch to Thumb mode. */
1129 target_is_thumb = arm_pc_is_thumb (fun);
1130 if (target_is_thumb)
1131 {
1132 fun |= 1;
1133 if (!caller_is_thumb)
1134 store_unsigned_integer (dummy + 4, sizeof (arm_bx_r4), arm_bx_r4);
1135 }
1136
1137 /* If the CPU is currently in Thumb mode, use the Thumb call dummy
1138 instead of the ARM one that's already been copied. This will
1139 work for both Thumb and ARM target functions. */
1140 if (caller_is_thumb)
1141 {
1142 int i;
1143 char *p = dummy;
1144 int len = sizeof (thumb_dummy) / sizeof (thumb_dummy[0]);
1145
1146 for (i = 0; i < len; i++)
1147 {
1148 store_unsigned_integer (p, sizeof (thumb_dummy[0]), thumb_dummy[i]);
1149 p += sizeof (thumb_dummy[0]);
1150 }
1151 }
1152
1153 /* Put the target address in r4; the call dummy will copy this to
1154 the PC. */
1155 write_register (4, fun);
1156 }
1157
1158 /* Return the offset in the call dummy of the instruction that needs
1159 to have a breakpoint placed on it. This is the offset of the 'swi
1160 24' instruction, which is no longer actually used, but simply acts
1161 as a place-holder now.
1162
1163 This implements the CALL_DUMMY_BREAK_OFFSET macro. */
1164
1165 int
1166 arm_call_dummy_breakpoint_offset (void)
1167 {
1168 if (caller_is_thumb)
1169 return 4;
1170 else
1171 return 8;
1172 }
1173
1174 /* Note: ScottB
1175
1176 This function does not support passing parameters using the FPA
1177 variant of the APCS. It passes any floating point arguments in the
1178 general registers and/or on the stack. */
1179
1180 CORE_ADDR
1181 arm_push_arguments (int nargs, value_ptr * args, CORE_ADDR sp,
1182 int struct_return, CORE_ADDR struct_addr)
1183 {
1184 char *fp;
1185 int argnum, argreg, nstack_size;
1186
1187 /* Walk through the list of args and determine how large a temporary
1188 stack is required. Need to take care here as structs may be
1189 passed on the stack, and we have to to push them. */
1190 nstack_size = -4 * REGISTER_SIZE; /* Some arguments go into A1-A4. */
1191 if (struct_return) /* The struct address goes in A1. */
1192 nstack_size += REGISTER_SIZE;
1193
1194 /* Walk through the arguments and add their size to nstack_size. */
1195 for (argnum = 0; argnum < nargs; argnum++)
1196 {
1197 int len;
1198 struct type *arg_type;
1199
1200 arg_type = check_typedef (VALUE_TYPE (args[argnum]));
1201 len = TYPE_LENGTH (arg_type);
1202
1203 /* ANSI C code passes float arguments as integers, K&R code
1204 passes float arguments as doubles. Correct for this here. */
1205 if (TYPE_CODE_FLT == TYPE_CODE (arg_type) && REGISTER_SIZE == len)
1206 nstack_size += FP_REGISTER_VIRTUAL_SIZE;
1207 else
1208 nstack_size += len;
1209 }
1210
1211 /* Allocate room on the stack, and initialize our stack frame
1212 pointer. */
1213 fp = NULL;
1214 if (nstack_size > 0)
1215 {
1216 sp -= nstack_size;
1217 fp = (char *) sp;
1218 }
1219
1220 /* Initialize the integer argument register pointer. */
1221 argreg = A1_REGNUM;
1222
1223 /* The struct_return pointer occupies the first parameter passing
1224 register. */
1225 if (struct_return)
1226 write_register (argreg++, struct_addr);
1227
1228 /* Process arguments from left to right. Store as many as allowed
1229 in the parameter passing registers (A1-A4), and save the rest on
1230 the temporary stack. */
1231 for (argnum = 0; argnum < nargs; argnum++)
1232 {
1233 int len;
1234 char *val;
1235 double dbl_arg;
1236 CORE_ADDR regval;
1237 enum type_code typecode;
1238 struct type *arg_type, *target_type;
1239
1240 arg_type = check_typedef (VALUE_TYPE (args[argnum]));
1241 target_type = TYPE_TARGET_TYPE (arg_type);
1242 len = TYPE_LENGTH (arg_type);
1243 typecode = TYPE_CODE (arg_type);
1244 val = (char *) VALUE_CONTENTS (args[argnum]);
1245
1246 /* ANSI C code passes float arguments as integers, K&R code
1247 passes float arguments as doubles. The .stabs record for
1248 for ANSI prototype floating point arguments records the
1249 type as FP_INTEGER, while a K&R style (no prototype)
1250 .stabs records the type as FP_FLOAT. In this latter case
1251 the compiler converts the float arguments to double before
1252 calling the function. */
1253 if (TYPE_CODE_FLT == typecode && REGISTER_SIZE == len)
1254 {
1255 float f;
1256 double d;
1257 char * bufo = (char *) &d;
1258 char * bufd = (char *) &dbl_arg;
1259
1260 len = sizeof (double);
1261 f = *(float *) val;
1262 SWAP_TARGET_AND_HOST (&f, sizeof (float)); /* adjust endianess */
1263 d = f;
1264 /* We must revert the longwords so they get loaded into the
1265 the right registers. */
1266 memcpy (bufd, bufo + len / 2, len / 2);
1267 SWAP_TARGET_AND_HOST (bufd, len / 2); /* adjust endianess */
1268 memcpy (bufd + len / 2, bufo, len / 2);
1269 SWAP_TARGET_AND_HOST (bufd + len / 2, len / 2); /* adjust endianess */
1270 val = (char *) &dbl_arg;
1271 }
1272 #if 1
1273 /* I don't know why this code was disable. The only logical use
1274 for a function pointer is to call that function, so setting
1275 the mode bit is perfectly fine. FN */
1276 /* If the argument is a pointer to a function, and it is a Thumb
1277 function, set the low bit of the pointer. */
1278 if (TYPE_CODE_PTR == typecode
1279 && NULL != target_type
1280 && TYPE_CODE_FUNC == TYPE_CODE (target_type))
1281 {
1282 CORE_ADDR regval = extract_address (val, len);
1283 if (arm_pc_is_thumb (regval))
1284 store_address (val, len, MAKE_THUMB_ADDR (regval));
1285 }
1286 #endif
1287 /* Copy the argument to general registers or the stack in
1288 register-sized pieces. Large arguments are split between
1289 registers and stack. */
1290 while (len > 0)
1291 {
1292 int partial_len = len < REGISTER_SIZE ? len : REGISTER_SIZE;
1293
1294 if (argreg <= ARM_LAST_ARG_REGNUM)
1295 {
1296 /* It's an argument being passed in a general register. */
1297 regval = extract_address (val, partial_len);
1298 write_register (argreg++, regval);
1299 }
1300 else
1301 {
1302 /* Push the arguments onto the stack. */
1303 write_memory ((CORE_ADDR) fp, val, REGISTER_SIZE);
1304 fp += REGISTER_SIZE;
1305 }
1306
1307 len -= partial_len;
1308 val += partial_len;
1309 }
1310 }
1311
1312 /* Return adjusted stack pointer. */
1313 return sp;
1314 }
1315
1316 void
1317 arm_pop_frame (void)
1318 {
1319 int regnum;
1320 struct frame_info *frame = get_current_frame ();
1321
1322 if (!PC_IN_CALL_DUMMY(frame->pc, frame->frame, read_fp()))
1323 {
1324 CORE_ADDR old_SP;
1325
1326 old_SP = read_register (frame->framereg);
1327 for (regnum = 0; regnum < NUM_REGS; regnum++)
1328 if (frame->fsr.regs[regnum] != 0)
1329 write_register (regnum,
1330 read_memory_integer (frame->fsr.regs[regnum], 4));
1331
1332 write_register (PC_REGNUM, FRAME_SAVED_PC (frame));
1333 write_register (SP_REGNUM, old_SP);
1334 }
1335 else
1336 {
1337 CORE_ADDR sp;
1338
1339 sp = read_register (FP_REGNUM);
1340 sp -= sizeof(CORE_ADDR); /* we don't care about this first word */
1341
1342 write_register (PC_REGNUM, read_memory_integer (sp, 4));
1343 sp -= sizeof(CORE_ADDR);
1344 write_register (SP_REGNUM, read_memory_integer (sp, 4));
1345 sp -= sizeof(CORE_ADDR);
1346 write_register (FP_REGNUM, read_memory_integer (sp, 4));
1347 sp -= sizeof(CORE_ADDR);
1348
1349 for (regnum = 10; regnum >= 0; regnum--)
1350 {
1351 write_register (regnum, read_memory_integer (sp, 4));
1352 sp -= sizeof(CORE_ADDR);
1353 }
1354 }
1355
1356 flush_cached_frames ();
1357 }
1358
1359 static void
1360 print_fpu_flags (int flags)
1361 {
1362 if (flags & (1 << 0))
1363 fputs ("IVO ", stdout);
1364 if (flags & (1 << 1))
1365 fputs ("DVZ ", stdout);
1366 if (flags & (1 << 2))
1367 fputs ("OFL ", stdout);
1368 if (flags & (1 << 3))
1369 fputs ("UFL ", stdout);
1370 if (flags & (1 << 4))
1371 fputs ("INX ", stdout);
1372 putchar ('\n');
1373 }
1374
1375 void
1376 arm_float_info (void)
1377 {
1378 register unsigned long status = read_register (FPS_REGNUM);
1379 int type;
1380
1381 type = (status >> 24) & 127;
1382 printf ("%s FPU type %d\n",
1383 (status & (1 << 31)) ? "Hardware" : "Software",
1384 type);
1385 fputs ("mask: ", stdout);
1386 print_fpu_flags (status >> 16);
1387 fputs ("flags: ", stdout);
1388 print_fpu_flags (status);
1389 }
1390
1391 /* If the disassembly mode is APCS, we have to also switch the
1392 bfd mach_type. This function is run in the set disassembly_flavor
1393 command, and does that. */
1394
1395 static void
1396 set_disassembly_flavor_sfunc (char *args, int from_tty,
1397 struct cmd_list_element *c)
1398 {
1399 set_disassembly_flavor ();
1400 }
1401
1402 static void
1403 set_disassembly_flavor (void)
1404 {
1405 if (disassembly_flavor == apcs_flavor)
1406 {
1407 parse_arm_disassembler_option ("reg-names-atpcs");
1408 arm_register_names = atpcs_register_names;
1409 }
1410 else if (disassembly_flavor == r_prefix_flavor)
1411 {
1412 parse_arm_disassembler_option ("reg-names-std");
1413 arm_register_names = additional_register_names;
1414 }
1415 }
1416
1417 /* arm_othernames implements the "othernames" command. This is kind
1418 of hacky, and I prefer the set-show disassembly-flavor which is
1419 also used for the x86 gdb. I will keep this around, however, in
1420 case anyone is actually using it. */
1421
1422 static void
1423 arm_othernames (char *names, int n)
1424 {
1425 if (disassembly_flavor == r_prefix_flavor)
1426 {
1427 disassembly_flavor = apcs_flavor;
1428 set_disassembly_flavor ();
1429 }
1430 else
1431 {
1432 disassembly_flavor = r_prefix_flavor;
1433 set_disassembly_flavor ();
1434 }
1435 }
1436
1437 #if 0
1438 /* FIXME: The generated assembler works but sucks. Instead of using
1439 r0, r1 it pushes them on the stack, then loads them into r3, r4 and
1440 uses those registers. I must be missing something. ScottB */
1441
1442 void
1443 convert_from_extended (void *ptr, void *dbl)
1444 {
1445 __asm__ ("
1446 ldfe f0,[%0]
1447 stfd f0,[%1] "
1448 : /* no output */
1449 : "r" (ptr), "r" (dbl));
1450 }
1451
1452 void
1453 convert_to_extended (void *dbl, void *ptr)
1454 {
1455 __asm__ ("
1456 ldfd f0,[%0]
1457 stfe f0,[%1] "
1458 : /* no output */
1459 : "r" (dbl), "r" (ptr));
1460 }
1461 #else
1462 static void
1463 convert_from_extended (void *ptr, void *dbl)
1464 {
1465 *(double *) dbl = *(double *) ptr;
1466 }
1467
1468 void
1469 convert_to_extended (void *dbl, void *ptr)
1470 {
1471 *(double *) ptr = *(double *) dbl;
1472 }
1473 #endif
1474
1475 /* Nonzero if register N requires conversion from raw format to
1476 virtual format. */
1477
1478 int
1479 arm_register_convertible (unsigned int regnum)
1480 {
1481 return ((regnum - F0_REGNUM) < 8);
1482 }
1483
1484 /* Convert data from raw format for register REGNUM in buffer FROM to
1485 virtual format with type TYPE in buffer TO. */
1486
1487 void
1488 arm_register_convert_to_virtual (unsigned int regnum, struct type *type,
1489 void *from, void *to)
1490 {
1491 double val;
1492
1493 convert_from_extended (from, &val);
1494 store_floating (to, TYPE_LENGTH (type), val);
1495 }
1496
1497 /* Convert data from virtual format with type TYPE in buffer FROM to
1498 raw format for register REGNUM in buffer TO. */
1499
1500 void
1501 arm_register_convert_to_raw (unsigned int regnum, struct type *type,
1502 void *from, void *to)
1503 {
1504 double val = extract_floating (from, TYPE_LENGTH (type));
1505
1506 convert_to_extended (&val, to);
1507 }
1508
1509 static int
1510 condition_true (unsigned long cond, unsigned long status_reg)
1511 {
1512 if (cond == INST_AL || cond == INST_NV)
1513 return 1;
1514
1515 switch (cond)
1516 {
1517 case INST_EQ:
1518 return ((status_reg & FLAG_Z) != 0);
1519 case INST_NE:
1520 return ((status_reg & FLAG_Z) == 0);
1521 case INST_CS:
1522 return ((status_reg & FLAG_C) != 0);
1523 case INST_CC:
1524 return ((status_reg & FLAG_C) == 0);
1525 case INST_MI:
1526 return ((status_reg & FLAG_N) != 0);
1527 case INST_PL:
1528 return ((status_reg & FLAG_N) == 0);
1529 case INST_VS:
1530 return ((status_reg & FLAG_V) != 0);
1531 case INST_VC:
1532 return ((status_reg & FLAG_V) == 0);
1533 case INST_HI:
1534 return ((status_reg & (FLAG_C | FLAG_Z)) == FLAG_C);
1535 case INST_LS:
1536 return ((status_reg & (FLAG_C | FLAG_Z)) != FLAG_C);
1537 case INST_GE:
1538 return (((status_reg & FLAG_N) == 0) == ((status_reg & FLAG_V) == 0));
1539 case INST_LT:
1540 return (((status_reg & FLAG_N) == 0) != ((status_reg & FLAG_V) == 0));
1541 case INST_GT:
1542 return (((status_reg & FLAG_Z) == 0) &&
1543 (((status_reg & FLAG_N) == 0) == ((status_reg & FLAG_V) == 0)));
1544 case INST_LE:
1545 return (((status_reg & FLAG_Z) != 0) ||
1546 (((status_reg & FLAG_N) == 0) != ((status_reg & FLAG_V) == 0)));
1547 }
1548 return 1;
1549 }
1550
1551 #define submask(x) ((1L << ((x) + 1)) - 1)
1552 #define bit(obj,st) (((obj) >> (st)) & 1)
1553 #define bits(obj,st,fn) (((obj) >> (st)) & submask ((fn) - (st)))
1554 #define sbits(obj,st,fn) \
1555 ((long) (bits(obj,st,fn) | ((long) bit(obj,fn) * ~ submask (fn - st))))
1556 #define BranchDest(addr,instr) \
1557 ((CORE_ADDR) (((long) (addr)) + 8 + (sbits (instr, 0, 23) << 2)))
1558 #define ARM_PC_32 1
1559
1560 static unsigned long
1561 shifted_reg_val (unsigned long inst, int carry, unsigned long pc_val,
1562 unsigned long status_reg)
1563 {
1564 unsigned long res, shift;
1565 int rm = bits (inst, 0, 3);
1566 unsigned long shifttype = bits (inst, 5, 6);
1567
1568 if (bit (inst, 4))
1569 {
1570 int rs = bits (inst, 8, 11);
1571 shift = (rs == 15 ? pc_val + 8 : read_register (rs)) & 0xFF;
1572 }
1573 else
1574 shift = bits (inst, 7, 11);
1575
1576 res = (rm == 15
1577 ? ((pc_val | (ARM_PC_32 ? 0 : status_reg))
1578 + (bit (inst, 4) ? 12 : 8))
1579 : read_register (rm));
1580
1581 switch (shifttype)
1582 {
1583 case 0: /* LSL */
1584 res = shift >= 32 ? 0 : res << shift;
1585 break;
1586
1587 case 1: /* LSR */
1588 res = shift >= 32 ? 0 : res >> shift;
1589 break;
1590
1591 case 2: /* ASR */
1592 if (shift >= 32)
1593 shift = 31;
1594 res = ((res & 0x80000000L)
1595 ? ~((~res) >> shift) : res >> shift);
1596 break;
1597
1598 case 3: /* ROR/RRX */
1599 shift &= 31;
1600 if (shift == 0)
1601 res = (res >> 1) | (carry ? 0x80000000L : 0);
1602 else
1603 res = (res >> shift) | (res << (32 - shift));
1604 break;
1605 }
1606
1607 return res & 0xffffffff;
1608 }
1609
1610 /* Return number of 1-bits in VAL. */
1611
1612 static int
1613 bitcount (unsigned long val)
1614 {
1615 int nbits;
1616 for (nbits = 0; val != 0; nbits++)
1617 val &= val - 1; /* delete rightmost 1-bit in val */
1618 return nbits;
1619 }
1620
1621 static CORE_ADDR
1622 thumb_get_next_pc (CORE_ADDR pc)
1623 {
1624 unsigned long pc_val = ((unsigned long) pc) + 4; /* PC after prefetch */
1625 unsigned short inst1 = read_memory_integer (pc, 2);
1626 CORE_ADDR nextpc = pc + 2; /* default is next instruction */
1627 unsigned long offset;
1628
1629 if ((inst1 & 0xff00) == 0xbd00) /* pop {rlist, pc} */
1630 {
1631 CORE_ADDR sp;
1632
1633 /* Fetch the saved PC from the stack. It's stored above
1634 all of the other registers. */
1635 offset = bitcount (bits (inst1, 0, 7)) * REGISTER_SIZE;
1636 sp = read_register (SP_REGNUM);
1637 nextpc = (CORE_ADDR) read_memory_integer (sp + offset, 4);
1638 nextpc = ADDR_BITS_REMOVE (nextpc);
1639 if (nextpc == pc)
1640 error ("Infinite loop detected");
1641 }
1642 else if ((inst1 & 0xf000) == 0xd000) /* conditional branch */
1643 {
1644 unsigned long status = read_register (PS_REGNUM);
1645 unsigned long cond = bits (inst1, 8, 11);
1646 if (cond != 0x0f && condition_true (cond, status)) /* 0x0f = SWI */
1647 nextpc = pc_val + (sbits (inst1, 0, 7) << 1);
1648 }
1649 else if ((inst1 & 0xf800) == 0xe000) /* unconditional branch */
1650 {
1651 nextpc = pc_val + (sbits (inst1, 0, 10) << 1);
1652 }
1653 else if ((inst1 & 0xf800) == 0xf000) /* long branch with link */
1654 {
1655 unsigned short inst2 = read_memory_integer (pc + 2, 2);
1656 offset = (sbits (inst1, 0, 10) << 12) + (bits (inst2, 0, 10) << 1);
1657 nextpc = pc_val + offset;
1658 }
1659
1660 return nextpc;
1661 }
1662
1663 CORE_ADDR
1664 arm_get_next_pc (CORE_ADDR pc)
1665 {
1666 unsigned long pc_val;
1667 unsigned long this_instr;
1668 unsigned long status;
1669 CORE_ADDR nextpc;
1670
1671 if (arm_pc_is_thumb (pc))
1672 return thumb_get_next_pc (pc);
1673
1674 pc_val = (unsigned long) pc;
1675 this_instr = read_memory_integer (pc, 4);
1676 status = read_register (PS_REGNUM);
1677 nextpc = (CORE_ADDR) (pc_val + 4); /* Default case */
1678
1679 if (condition_true (bits (this_instr, 28, 31), status))
1680 {
1681 switch (bits (this_instr, 24, 27))
1682 {
1683 case 0x0:
1684 case 0x1: /* data processing */
1685 case 0x2:
1686 case 0x3:
1687 {
1688 unsigned long operand1, operand2, result = 0;
1689 unsigned long rn;
1690 int c;
1691
1692 if (bits (this_instr, 12, 15) != 15)
1693 break;
1694
1695 if (bits (this_instr, 22, 25) == 0
1696 && bits (this_instr, 4, 7) == 9) /* multiply */
1697 error ("Illegal update to pc in instruction");
1698
1699 /* Multiply into PC */
1700 c = (status & FLAG_C) ? 1 : 0;
1701 rn = bits (this_instr, 16, 19);
1702 operand1 = (rn == 15) ? pc_val + 8 : read_register (rn);
1703
1704 if (bit (this_instr, 25))
1705 {
1706 unsigned long immval = bits (this_instr, 0, 7);
1707 unsigned long rotate = 2 * bits (this_instr, 8, 11);
1708 operand2 = ((immval >> rotate) | (immval << (32 - rotate)))
1709 & 0xffffffff;
1710 }
1711 else /* operand 2 is a shifted register */
1712 operand2 = shifted_reg_val (this_instr, c, pc_val, status);
1713
1714 switch (bits (this_instr, 21, 24))
1715 {
1716 case 0x0: /*and */
1717 result = operand1 & operand2;
1718 break;
1719
1720 case 0x1: /*eor */
1721 result = operand1 ^ operand2;
1722 break;
1723
1724 case 0x2: /*sub */
1725 result = operand1 - operand2;
1726 break;
1727
1728 case 0x3: /*rsb */
1729 result = operand2 - operand1;
1730 break;
1731
1732 case 0x4: /*add */
1733 result = operand1 + operand2;
1734 break;
1735
1736 case 0x5: /*adc */
1737 result = operand1 + operand2 + c;
1738 break;
1739
1740 case 0x6: /*sbc */
1741 result = operand1 - operand2 + c;
1742 break;
1743
1744 case 0x7: /*rsc */
1745 result = operand2 - operand1 + c;
1746 break;
1747
1748 case 0x8:
1749 case 0x9:
1750 case 0xa:
1751 case 0xb: /* tst, teq, cmp, cmn */
1752 result = (unsigned long) nextpc;
1753 break;
1754
1755 case 0xc: /*orr */
1756 result = operand1 | operand2;
1757 break;
1758
1759 case 0xd: /*mov */
1760 /* Always step into a function. */
1761 result = operand2;
1762 break;
1763
1764 case 0xe: /*bic */
1765 result = operand1 & ~operand2;
1766 break;
1767
1768 case 0xf: /*mvn */
1769 result = ~operand2;
1770 break;
1771 }
1772 nextpc = (CORE_ADDR) ADDR_BITS_REMOVE (result);
1773
1774 if (nextpc == pc)
1775 error ("Infinite loop detected");
1776 break;
1777 }
1778
1779 case 0x4:
1780 case 0x5: /* data transfer */
1781 case 0x6:
1782 case 0x7:
1783 if (bit (this_instr, 20))
1784 {
1785 /* load */
1786 if (bits (this_instr, 12, 15) == 15)
1787 {
1788 /* rd == pc */
1789 unsigned long rn;
1790 unsigned long base;
1791
1792 if (bit (this_instr, 22))
1793 error ("Illegal update to pc in instruction");
1794
1795 /* byte write to PC */
1796 rn = bits (this_instr, 16, 19);
1797 base = (rn == 15) ? pc_val + 8 : read_register (rn);
1798 if (bit (this_instr, 24))
1799 {
1800 /* pre-indexed */
1801 int c = (status & FLAG_C) ? 1 : 0;
1802 unsigned long offset =
1803 (bit (this_instr, 25)
1804 ? shifted_reg_val (this_instr, c, pc_val, status)
1805 : bits (this_instr, 0, 11));
1806
1807 if (bit (this_instr, 23))
1808 base += offset;
1809 else
1810 base -= offset;
1811 }
1812 nextpc = (CORE_ADDR) read_memory_integer ((CORE_ADDR) base,
1813 4);
1814
1815 nextpc = ADDR_BITS_REMOVE (nextpc);
1816
1817 if (nextpc == pc)
1818 error ("Infinite loop detected");
1819 }
1820 }
1821 break;
1822
1823 case 0x8:
1824 case 0x9: /* block transfer */
1825 if (bit (this_instr, 20))
1826 {
1827 /* LDM */
1828 if (bit (this_instr, 15))
1829 {
1830 /* loading pc */
1831 int offset = 0;
1832
1833 if (bit (this_instr, 23))
1834 {
1835 /* up */
1836 unsigned long reglist = bits (this_instr, 0, 14);
1837 offset = bitcount (reglist) * 4;
1838 if (bit (this_instr, 24)) /* pre */
1839 offset += 4;
1840 }
1841 else if (bit (this_instr, 24))
1842 offset = -4;
1843
1844 {
1845 unsigned long rn_val =
1846 read_register (bits (this_instr, 16, 19));
1847 nextpc =
1848 (CORE_ADDR) read_memory_integer ((CORE_ADDR) (rn_val
1849 + offset),
1850 4);
1851 }
1852 nextpc = ADDR_BITS_REMOVE (nextpc);
1853 if (nextpc == pc)
1854 error ("Infinite loop detected");
1855 }
1856 }
1857 break;
1858
1859 case 0xb: /* branch & link */
1860 case 0xa: /* branch */
1861 {
1862 nextpc = BranchDest (pc, this_instr);
1863
1864 nextpc = ADDR_BITS_REMOVE (nextpc);
1865 if (nextpc == pc)
1866 error ("Infinite loop detected");
1867 break;
1868 }
1869
1870 case 0xc:
1871 case 0xd:
1872 case 0xe: /* coproc ops */
1873 case 0xf: /* SWI */
1874 break;
1875
1876 default:
1877 fprintf (stderr, "Bad bit-field extraction\n");
1878 return (pc);
1879 }
1880 }
1881
1882 return nextpc;
1883 }
1884
1885 #include "bfd-in2.h"
1886 #include "libcoff.h"
1887
1888 static int
1889 gdb_print_insn_arm (bfd_vma memaddr, disassemble_info *info)
1890 {
1891 if (arm_pc_is_thumb (memaddr))
1892 {
1893 static asymbol *asym;
1894 static combined_entry_type ce;
1895 static struct coff_symbol_struct csym;
1896 static struct _bfd fake_bfd;
1897 static bfd_target fake_target;
1898
1899 if (csym.native == NULL)
1900 {
1901 /* Create a fake symbol vector containing a Thumb symbol. This is
1902 solely so that the code in print_insn_little_arm() and
1903 print_insn_big_arm() in opcodes/arm-dis.c will detect the presence
1904 of a Thumb symbol and switch to decoding Thumb instructions. */
1905
1906 fake_target.flavour = bfd_target_coff_flavour;
1907 fake_bfd.xvec = &fake_target;
1908 ce.u.syment.n_sclass = C_THUMBEXTFUNC;
1909 csym.native = &ce;
1910 csym.symbol.the_bfd = &fake_bfd;
1911 csym.symbol.name = "fake";
1912 asym = (asymbol *) & csym;
1913 }
1914
1915 memaddr = UNMAKE_THUMB_ADDR (memaddr);
1916 info->symbols = &asym;
1917 }
1918 else
1919 info->symbols = NULL;
1920
1921 if (TARGET_BYTE_ORDER == BIG_ENDIAN)
1922 return print_insn_big_arm (memaddr, info);
1923 else
1924 return print_insn_little_arm (memaddr, info);
1925 }
1926
1927 /* This function implements the BREAKPOINT_FROM_PC macro. It uses the
1928 program counter value to determine whether a 16-bit or 32-bit
1929 breakpoint should be used. It returns a pointer to a string of
1930 bytes that encode a breakpoint instruction, stores the length of
1931 the string to *lenptr, and adjusts the program counter (if
1932 necessary) to point to the actual memory location where the
1933 breakpoint should be inserted. */
1934
1935 unsigned char *
1936 arm_breakpoint_from_pc (CORE_ADDR *pcptr, int *lenptr)
1937 {
1938 if (arm_pc_is_thumb (*pcptr) || arm_pc_is_thumb_dummy (*pcptr))
1939 {
1940 if (TARGET_BYTE_ORDER == BIG_ENDIAN)
1941 {
1942 static char thumb_breakpoint[] = THUMB_BE_BREAKPOINT;
1943 *pcptr = UNMAKE_THUMB_ADDR (*pcptr);
1944 *lenptr = sizeof (thumb_breakpoint);
1945 return thumb_breakpoint;
1946 }
1947 else
1948 {
1949 static char thumb_breakpoint[] = THUMB_LE_BREAKPOINT;
1950 *pcptr = UNMAKE_THUMB_ADDR (*pcptr);
1951 *lenptr = sizeof (thumb_breakpoint);
1952 return thumb_breakpoint;
1953 }
1954 }
1955 else
1956 {
1957 if (TARGET_BYTE_ORDER == BIG_ENDIAN)
1958 {
1959 static char arm_breakpoint[] = ARM_BE_BREAKPOINT;
1960 *lenptr = sizeof (arm_breakpoint);
1961 return arm_breakpoint;
1962 }
1963 else
1964 {
1965 static char arm_breakpoint[] = ARM_LE_BREAKPOINT;
1966 *lenptr = sizeof (arm_breakpoint);
1967 return arm_breakpoint;
1968 }
1969 }
1970 }
1971
1972 /* Extract from an array REGBUF containing the (raw) register state a
1973 function return value of type TYPE, and copy that, in virtual
1974 format, into VALBUF. */
1975
1976 void
1977 arm_extract_return_value (struct type *type,
1978 char regbuf[REGISTER_BYTES],
1979 char *valbuf)
1980 {
1981 if (TYPE_CODE_FLT == TYPE_CODE (type))
1982 convert_from_extended (&regbuf[REGISTER_BYTE (F0_REGNUM)], valbuf);
1983 else
1984 memcpy (valbuf, &regbuf[REGISTER_BYTE (A1_REGNUM)], TYPE_LENGTH (type));
1985 }
1986
1987 /* Return non-zero if the PC is inside a thumb call thunk. */
1988
1989 int
1990 arm_in_call_stub (CORE_ADDR pc, char *name)
1991 {
1992 CORE_ADDR start_addr;
1993
1994 /* Find the starting address of the function containing the PC. If
1995 the caller didn't give us a name, look it up at the same time. */
1996 if (find_pc_partial_function (pc, name ? NULL : &name, &start_addr, NULL) == 0)
1997 return 0;
1998
1999 return strncmp (name, "_call_via_r", 11) == 0;
2000 }
2001
2002 /* If PC is in a Thumb call or return stub, return the address of the
2003 target PC, which is in a register. The thunk functions are called
2004 _called_via_xx, where x is the register name. The possible names
2005 are r0-r9, sl, fp, ip, sp, and lr. */
2006
2007 CORE_ADDR
2008 arm_skip_stub (CORE_ADDR pc)
2009 {
2010 char *name;
2011 CORE_ADDR start_addr;
2012
2013 /* Find the starting address and name of the function containing the PC. */
2014 if (find_pc_partial_function (pc, &name, &start_addr, NULL) == 0)
2015 return 0;
2016
2017 /* Call thunks always start with "_call_via_". */
2018 if (strncmp (name, "_call_via_", 10) == 0)
2019 {
2020 /* Use the name suffix to determine which register contains the
2021 target PC. */
2022 static char *table[15] =
2023 {"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2024 "r8", "r9", "sl", "fp", "ip", "sp", "lr"
2025 };
2026 int regno;
2027
2028 for (regno = 0; regno <= 14; regno++)
2029 if (strcmp (&name[10], table[regno]) == 0)
2030 return read_register (regno);
2031 }
2032
2033 return 0; /* not a stub */
2034 }
2035
2036 void
2037 _initialize_arm_tdep (void)
2038 {
2039 struct cmd_list_element *new_cmd;
2040
2041 tm_print_insn = gdb_print_insn_arm;
2042
2043 /* Sync the opcode insn printer with our register viewer: */
2044 parse_arm_disassembler_option ("reg-names-atpcs");
2045
2046 /* Add the deprecated "othernames" command */
2047
2048 add_com ("othernames", class_obscure, arm_othernames,
2049 "Switch to the other set of register names.");
2050
2051 /* Add the disassembly-flavor command */
2052
2053 new_cmd = add_set_enum_cmd ("disassembly-flavor", no_class,
2054 valid_flavors,
2055 (char *) &disassembly_flavor,
2056 "Set the disassembly flavor, \
2057 the valid values are \"apcs\" and \"r-prefix\", \
2058 and the default value is \"apcs\".",
2059 &setlist);
2060 new_cmd->function.sfunc = set_disassembly_flavor_sfunc;
2061 add_show_from_set (new_cmd, &showlist);
2062
2063 /* ??? Maybe this should be a boolean. */
2064 add_show_from_set (add_set_cmd ("apcs32", no_class,
2065 var_zinteger, (char *) &arm_apcs_32,
2066 "Set usage of ARM 32-bit mode.\n", &setlist),
2067 &showlist);
2068
2069 }
2070
2071 /* Test whether the coff symbol specific value corresponds to a Thumb
2072 function. */
2073
2074 int
2075 coff_sym_is_thumb (int val)
2076 {
2077 return (val == C_THUMBEXT ||
2078 val == C_THUMBSTAT ||
2079 val == C_THUMBEXTFUNC ||
2080 val == C_THUMBSTATFUNC ||
2081 val == C_THUMBLABEL);
2082 }
This page took 0.079193 seconds and 5 git commands to generate.