diff options
Diffstat (limited to 'opcodes')
-rw-r--r-- | opcodes/ChangeLog | 19 | ||||
-rw-r--r-- | opcodes/arm-dis.c | 72 | ||||
-rw-r--r-- | opcodes/disassemble.c | 1 |
3 files changed, 88 insertions, 4 deletions
diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index 777ddea..09a76dc 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,22 @@ +1999-06-14 Nick Clifton <nickc@cygnus.com> & Drew Mosley <dmoseley@cygnus.com> + + * arm-dis.c (arm_regnames): Turn into a pointer to a register + name set. + (arm_regnames_standard): New variable: Array of ARM register + names according to ARM instruction set nomenclature. + (arm_regnames_apcs): New variable: Array of ARM register names + according to ARM Procedure Call Standard. + (arm_regnames_raw): New variable: Array of ARM register names + using just 'r' and the register number. + (arm_toggle_regnames): New function: Toggle the chosen register set + naming scheme. + (parse_disassembler_options): New function: Parse any target + disassembler command line options. + (print_insn_big_arm): Call parse_disassembler_options if any + are defined. + (print_insn_little_arm): Call parse_disassembler_options if any + are defined. + 1999-06-13 Ian Lance Taylor <ian@zembu.com> * i386-dis.c (FWAIT_OPCODE): Define. diff --git a/opcodes/arm-dis.c b/opcodes/arm-dis.c index 5bc1350..ba03b9b 100644 --- a/opcodes/arm-dis.c +++ b/opcodes/arm-dis.c @@ -1,5 +1,5 @@ /* Instruction printing code for the ARM - Copyright (C) 1994, 95, 96, 97, 1998 Free Software Foundation, Inc. + Copyright (C) 1994, 95, 96, 97, 98, 1999 Free Software Foundation, Inc. Contributed by Richard Earnshaw (rwe@pegasus.esprit.ec.org) Modification by James G. Smith (jsmith@cygnus.co.uk) @@ -35,9 +35,20 @@ static char *arm_conditional[] = {"eq", "ne", "cs", "cc", "mi", "pl", "vs", "vc", "hi", "ls", "ge", "lt", "gt", "le", "", "nv"}; -static char *arm_regnames[] = +static char *arm_regnames_raw[] = {"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", - "r8", "r9", "sl", "fp", "ip", "sp", "lr", "pc"}; + "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"}; + +static char *arm_regnames_standard[] = +{"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", + "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc"}; + +static char *arm_regnames_apcs[] = +{"a1", "a2", "a3", "a4", "v1", "v2", "v3", "v4", + "v5", "v6", "sl", "fp", "ip", "sp", "lr", "pc"}; + +/* Choose which register name set to use. */ +static char **arm_regnames = arm_regnames_standard; static char *arm_fp_const[] = {"0.0", "1.0", "2.0", "3.0", "4.0", "5.0", "0.5", "10.0"}; @@ -742,6 +753,45 @@ print_insn_thumb (pc, info, given) abort (); } +/* Select a different register name set. + Returns true if the name set selected is the APCS name set. */ +int +arm_toggle_regnames () +{ + if (arm_regnames == arm_regnames_standard) + arm_regnames = arm_regnames_apcs; + else + arm_regnames = arm_regnames_standard; + + return arm_regnames == arm_regnames_apcs; +} + +static void +parse_disassembler_options (options) + char * options; +{ + if (options == NULL) + return; + + if (strncmp (options, "reg-names-", 10) == 0) + { + options += 10; + + if (strcmp (options, "std") == 0) + arm_regnames = arm_regnames_standard; + else if (strcmp (options, "apcs") == 0) + arm_regnames = arm_regnames_apcs; + else if (strcmp (options, "raw") == 0) + arm_regnames = arm_regnames_raw; + else + fprintf (stderr, "Unrecognised register name set: %s\n", options); + } + else + fprintf (stderr, "Unrecognised disassembler option: %s\n", options); + + return; +} + /* NOTE: There are no checks in these routines that the relevant number of data bytes exist */ int @@ -756,6 +806,14 @@ print_insn_big_arm (pc, info) elf_symbol_type *es; int is_thumb; + if (info->disassembler_options) + { + parse_disassembler_options (info->disassembler_options); + + /* To avoid repeated parsing of this option, we remove it here. */ + info->disassembler_options = NULL; + } + is_thumb = false; if (info->symbols != NULL) { @@ -838,6 +896,14 @@ print_insn_little_arm (pc, info) elf_symbol_type *es; int is_thumb; + if (info->disassembler_options) + { + parse_disassembler_options (info->disassembler_options); + + /* To avoid repeated parsing of this option, we remove it here. */ + info->disassembler_options = NULL; + } + is_thumb = false; if (info->symbols != NULL) { diff --git a/opcodes/disassemble.c b/opcodes/disassemble.c index 4898b42..da6d5d5 100644 --- a/opcodes/disassemble.c +++ b/opcodes/disassemble.c @@ -245,4 +245,3 @@ disassembler (abfd) } return disassemble; } - |