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