diff options
Diffstat (limited to 'opcodes/ppc-dis.c')
-rw-r--r-- | opcodes/ppc-dis.c | 79 |
1 files changed, 45 insertions, 34 deletions
diff --git a/opcodes/ppc-dis.c b/opcodes/ppc-dis.c index 3e21034..1ded17f 100644 --- a/opcodes/ppc-dis.c +++ b/opcodes/ppc-dis.c @@ -72,7 +72,7 @@ struct ppc_mopt { ppc_cpu_t sticky; }; -struct ppc_mopt ppc_opts[] = { +static const struct ppc_mopt ppc_opts[] = { { "403", PPC_OPCODE_PPC | PPC_OPCODE_403, 0 }, { "405", PPC_OPCODE_PPC | PPC_OPCODE_403 | PPC_OPCODE_405, @@ -325,7 +325,7 @@ ppc_parse_cpu (ppc_cpu_t ppc_cpu, ppc_cpu_t *sticky, const char *arg) unsigned int i; for (i = 0; i < ARRAY_SIZE (ppc_opts); i++) - if (disassembler_options_cmp (ppc_opts[i].opt, arg) == 0) + if (strcmp (ppc_opts[i].opt, arg) == 0) { if (ppc_opts[i].sticky) { @@ -351,13 +351,36 @@ ppc_parse_cpu (ppc_cpu_t ppc_cpu, ppc_cpu_t *sticky, const char *arg) return ppc_cpu; } +struct ppc_parse_data +{ + ppc_cpu_t dialect; + ppc_cpu_t sticky; +}; + +static bool +ppc_parse_option (const char *opt, void *data) +{ + struct ppc_parse_data *res = data; + ppc_cpu_t new_cpu; + + if (strcmp (opt, "32") == 0) + res->dialect &= ~(ppc_cpu_t) PPC_OPCODE_64; + else if (strcmp (opt, "64") == 0) + res->dialect |= PPC_OPCODE_64; + else if ((new_cpu = ppc_parse_cpu (res->dialect, &res->sticky, opt)) != 0) + res->dialect = new_cpu; + else + /* xgettext: c-format */ + opcodes_error_handler (_("warning: ignoring unknown -M%s option"), opt); + return true; +} + /* Determine which set of machines to disassemble for. */ static void powerpc_init_dialect (struct disassemble_info *info) { - ppc_cpu_t dialect = 0; - ppc_cpu_t sticky = 0; + struct ppc_parse_data out = { 0, 0 }; struct dis_private *priv = calloc (1, sizeof (*priv)); if (priv == NULL) @@ -367,69 +390,57 @@ powerpc_init_dialect (struct disassemble_info *info) { case bfd_mach_ppc_403: case bfd_mach_ppc_403gc: - dialect = ppc_parse_cpu (dialect, &sticky, "403"); + out.dialect = ppc_parse_cpu (out.dialect, &out.sticky, "403"); break; case bfd_mach_ppc_405: - dialect = ppc_parse_cpu (dialect, &sticky, "405"); + out.dialect = ppc_parse_cpu (out.dialect, &out.sticky, "405"); break; case bfd_mach_ppc_601: - dialect = ppc_parse_cpu (dialect, &sticky, "601"); + out.dialect = ppc_parse_cpu (out.dialect, &out.sticky, "601"); break; case bfd_mach_ppc_750: - dialect = ppc_parse_cpu (dialect, &sticky, "750cl"); + out.dialect = ppc_parse_cpu (out.dialect, &out.sticky, "750cl"); break; case bfd_mach_ppc_a35: case bfd_mach_ppc_rs64ii: case bfd_mach_ppc_rs64iii: - dialect = ppc_parse_cpu (dialect, &sticky, "pwr2") | PPC_OPCODE_64; + out.dialect = (ppc_parse_cpu (out.dialect, &out.sticky, "pwr2") + | PPC_OPCODE_64); break; case bfd_mach_ppc_e500: - dialect = ppc_parse_cpu (dialect, &sticky, "e500"); + out.dialect = ppc_parse_cpu (out.dialect, &out.sticky, "e500"); break; case bfd_mach_ppc_e500mc: - dialect = ppc_parse_cpu (dialect, &sticky, "e500mc"); + out.dialect = ppc_parse_cpu (out.dialect, &out.sticky, "e500mc"); break; case bfd_mach_ppc_e500mc64: - dialect = ppc_parse_cpu (dialect, &sticky, "e500mc64"); + out.dialect = ppc_parse_cpu (out.dialect, &out.sticky, "e500mc64"); break; case bfd_mach_ppc_e5500: - dialect = ppc_parse_cpu (dialect, &sticky, "e5500"); + out.dialect = ppc_parse_cpu (out.dialect, &out.sticky, "e5500"); break; case bfd_mach_ppc_e6500: - dialect = ppc_parse_cpu (dialect, &sticky, "e6500"); + out.dialect = ppc_parse_cpu (out.dialect, &out.sticky, "e6500"); break; case bfd_mach_ppc_titan: - dialect = ppc_parse_cpu (dialect, &sticky, "titan"); + out.dialect = ppc_parse_cpu (out.dialect, &out.sticky, "titan"); break; case bfd_mach_ppc_vle: - dialect = ppc_parse_cpu (dialect, &sticky, "vle"); + out.dialect = ppc_parse_cpu (out.dialect, &out.sticky, "vle"); break; default: if (info->arch == bfd_arch_powerpc) - dialect = ppc_parse_cpu (dialect, &sticky, "power11") | PPC_OPCODE_ANY; + out.dialect = (ppc_parse_cpu (out.dialect, &out.sticky, "power11") + | PPC_OPCODE_ANY); else - dialect = ppc_parse_cpu (dialect, &sticky, "pwr"); + out.dialect = ppc_parse_cpu (out.dialect, &out.sticky, "pwr"); break; } - const char *opt; - FOR_EACH_DISASSEMBLER_OPTION (opt, info->disassembler_options) - { - ppc_cpu_t new_cpu = 0; - - if (disassembler_options_cmp (opt, "32") == 0) - dialect &= ~(ppc_cpu_t) PPC_OPCODE_64; - else if (disassembler_options_cmp (opt, "64") == 0) - dialect |= PPC_OPCODE_64; - else if ((new_cpu = ppc_parse_cpu (dialect, &sticky, opt)) != 0) - dialect = new_cpu; - else - /* xgettext: c-format */ - opcodes_error_handler (_("warning: ignoring unknown -M%s option"), opt); - } + for_each_disassembler_option (info, ppc_parse_option, &out); info->private_data = priv; - private_data (info)->dialect = dialect; + private_data (info)->dialect = out.dialect; } #define PPC_OPCD_SEGS (1 + PPC_OP (-1)) |