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