|  | /* Select disassembly routine for specified architecture. | 
|  | Copyright (C) 1994-2022 Free Software Foundation, Inc. | 
|  |  | 
|  | This file is part of the GNU opcodes library. | 
|  |  | 
|  | This library is free software; you can redistribute it and/or modify | 
|  | it under the terms of the GNU General Public License as published by | 
|  | the Free Software Foundation; either version 3 of the License, or | 
|  | (at your option) any later version. | 
|  |  | 
|  | This program is distributed in the hope that it will be useful, | 
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|  | GNU General Public License for more details. | 
|  |  | 
|  | You should have received a copy of the GNU General Public License | 
|  | along with this program; if not, write to the Free Software | 
|  | Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, | 
|  | MA 02110-1301, USA.  */ | 
|  |  | 
|  | #include "sysdep.h" | 
|  | #include "disassemble.h" | 
|  | #include "safe-ctype.h" | 
|  | #include "opintl.h" | 
|  |  | 
|  | #ifdef ARCH_all | 
|  | #ifdef BFD64 | 
|  | #define ARCH_aarch64 | 
|  | #define ARCH_alpha | 
|  | #define ARCH_bpf | 
|  | #define ARCH_ia64 | 
|  | #define ARCH_loongarch | 
|  | #define ARCH_mips | 
|  | #define ARCH_mmix | 
|  | #define ARCH_nfp | 
|  | #define ARCH_riscv | 
|  | #define ARCH_score | 
|  | #define ARCH_tilegx | 
|  | #endif | 
|  | #define ARCH_arc | 
|  | #define ARCH_arm | 
|  | #define ARCH_avr | 
|  | #define ARCH_bfin | 
|  | #define ARCH_cr16 | 
|  | #define ARCH_cris | 
|  | #define ARCH_crx | 
|  | #define ARCH_csky | 
|  | #define ARCH_d10v | 
|  | #define ARCH_d30v | 
|  | #define ARCH_dlx | 
|  | #define ARCH_epiphany | 
|  | #define ARCH_fr30 | 
|  | #define ARCH_frv | 
|  | #define ARCH_ft32 | 
|  | #define ARCH_h8300 | 
|  | #define ARCH_hppa | 
|  | #define ARCH_i386 | 
|  | #define ARCH_ip2k | 
|  | #define ARCH_iq2000 | 
|  | #define ARCH_lm32 | 
|  | #define ARCH_m32c | 
|  | #define ARCH_m32r | 
|  | #define ARCH_m68hc11 | 
|  | #define ARCH_m68hc12 | 
|  | #define ARCH_m68k | 
|  | #define ARCH_mcore | 
|  | #define ARCH_mep | 
|  | #define ARCH_metag | 
|  | #define ARCH_microblaze | 
|  | #define ARCH_mn10200 | 
|  | #define ARCH_mn10300 | 
|  | #define ARCH_moxie | 
|  | #define ARCH_mt | 
|  | #define ARCH_msp430 | 
|  | #define ARCH_nds32 | 
|  | #define ARCH_nios2 | 
|  | #define ARCH_ns32k | 
|  | #define ARCH_or1k | 
|  | #define ARCH_pdp11 | 
|  | #define ARCH_pj | 
|  | #define ARCH_powerpc | 
|  | #define ARCH_pru | 
|  | #define ARCH_rs6000 | 
|  | #define ARCH_rl78 | 
|  | #define ARCH_rx | 
|  | #define ARCH_s12z | 
|  | #define ARCH_s390 | 
|  | #define ARCH_sh | 
|  | #define ARCH_sparc | 
|  | #define ARCH_spu | 
|  | #define ARCH_tic30 | 
|  | #define ARCH_tic4x | 
|  | #define ARCH_tic54x | 
|  | #define ARCH_tic6x | 
|  | #define ARCH_tilepro | 
|  | #define ARCH_v850 | 
|  | #define ARCH_vax | 
|  | #define ARCH_visium | 
|  | #define ARCH_wasm32 | 
|  | #define ARCH_xstormy16 | 
|  | #define ARCH_xgate | 
|  | #define ARCH_xtensa | 
|  | #define ARCH_z80 | 
|  | #define ARCH_z8k | 
|  | #endif | 
|  |  | 
|  | #ifdef ARCH_m32c | 
|  | #include "m32c-desc.h" | 
|  | #endif | 
|  |  | 
|  | #ifdef ARCH_bpf | 
|  | /* XXX this should be including bpf-desc.h instead of this hackery, | 
|  | but at the moment it is not possible to include several CGEN | 
|  | generated *-desc.h files simultaneously.  To be fixed in | 
|  | CGEN...  */ | 
|  |  | 
|  | # ifdef ARCH_m32c | 
|  | enum epbf_isa_attr | 
|  | { | 
|  | ISA_EBPFLE, ISA_EBPFBE, ISA_XBPFLE, ISA_XBPFBE, ISA_EBPFMAX | 
|  | }; | 
|  | # else | 
|  | #  include "bpf-desc.h" | 
|  | #  define ISA_EBPFMAX ISA_MAX | 
|  | # endif | 
|  | #endif /* ARCH_bpf */ | 
|  |  | 
|  | disassembler_ftype | 
|  | disassembler (enum bfd_architecture a, | 
|  | bool big ATTRIBUTE_UNUSED, | 
|  | unsigned long mach ATTRIBUTE_UNUSED, | 
|  | bfd *abfd ATTRIBUTE_UNUSED) | 
|  | { | 
|  | disassembler_ftype disassemble; | 
|  |  | 
|  | switch (a) | 
|  | { | 
|  | /* If you add a case to this table, also add it to the | 
|  | ARCH_all definition right above this function.  */ | 
|  | #ifdef ARCH_aarch64 | 
|  | case bfd_arch_aarch64: | 
|  | disassemble = print_insn_aarch64; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_alpha | 
|  | case bfd_arch_alpha: | 
|  | disassemble = print_insn_alpha; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_arc | 
|  | case bfd_arch_arc: | 
|  | disassemble = arc_get_disassembler (abfd); | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_arm | 
|  | case bfd_arch_arm: | 
|  | if (big) | 
|  | disassemble = print_insn_big_arm; | 
|  | else | 
|  | disassemble = print_insn_little_arm; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_avr | 
|  | case bfd_arch_avr: | 
|  | disassemble = print_insn_avr; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_bfin | 
|  | case bfd_arch_bfin: | 
|  | disassemble = print_insn_bfin; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_cr16 | 
|  | case bfd_arch_cr16: | 
|  | disassemble = print_insn_cr16; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_cris | 
|  | case bfd_arch_cris: | 
|  | disassemble = cris_get_disassembler (abfd); | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_crx | 
|  | case bfd_arch_crx: | 
|  | disassemble = print_insn_crx; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_csky | 
|  | case bfd_arch_csky: | 
|  | disassemble = csky_get_disassembler (abfd); | 
|  | break; | 
|  | #endif | 
|  |  | 
|  | #ifdef ARCH_d10v | 
|  | case bfd_arch_d10v: | 
|  | disassemble = print_insn_d10v; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_d30v | 
|  | case bfd_arch_d30v: | 
|  | disassemble = print_insn_d30v; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_dlx | 
|  | case bfd_arch_dlx: | 
|  | /* As far as I know we only handle big-endian DLX objects.  */ | 
|  | disassemble = print_insn_dlx; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_h8300 | 
|  | case bfd_arch_h8300: | 
|  | if (mach == bfd_mach_h8300h || mach == bfd_mach_h8300hn) | 
|  | disassemble = print_insn_h8300h; | 
|  | else if (mach == bfd_mach_h8300s | 
|  | || mach == bfd_mach_h8300sn | 
|  | || mach == bfd_mach_h8300sx | 
|  | || mach == bfd_mach_h8300sxn) | 
|  | disassemble = print_insn_h8300s; | 
|  | else | 
|  | disassemble = print_insn_h8300; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_hppa | 
|  | case bfd_arch_hppa: | 
|  | disassemble = print_insn_hppa; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_i386 | 
|  | case bfd_arch_i386: | 
|  | case bfd_arch_iamcu: | 
|  | disassemble = print_insn_i386; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_ia64 | 
|  | case bfd_arch_ia64: | 
|  | disassemble = print_insn_ia64; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_ip2k | 
|  | case bfd_arch_ip2k: | 
|  | disassemble = print_insn_ip2k; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_bpf | 
|  | case bfd_arch_bpf: | 
|  | disassemble = print_insn_bpf; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_epiphany | 
|  | case bfd_arch_epiphany: | 
|  | disassemble = print_insn_epiphany; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_fr30 | 
|  | case bfd_arch_fr30: | 
|  | disassemble = print_insn_fr30; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_lm32 | 
|  | case bfd_arch_lm32: | 
|  | disassemble = print_insn_lm32; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_m32r | 
|  | case bfd_arch_m32r: | 
|  | disassemble = print_insn_m32r; | 
|  | break; | 
|  | #endif | 
|  | #if defined(ARCH_m68hc11) || defined(ARCH_m68hc12) \ | 
|  | || defined(ARCH_9s12x) || defined(ARCH_m9s12xg) | 
|  | case bfd_arch_m68hc11: | 
|  | disassemble = print_insn_m68hc11; | 
|  | break; | 
|  | case bfd_arch_m68hc12: | 
|  | disassemble = print_insn_m68hc12; | 
|  | break; | 
|  | case bfd_arch_m9s12x: | 
|  | disassemble = print_insn_m9s12x; | 
|  | break; | 
|  | case bfd_arch_m9s12xg: | 
|  | disassemble = print_insn_m9s12xg; | 
|  | break; | 
|  | #endif | 
|  | #if defined(ARCH_s12z) | 
|  | case bfd_arch_s12z: | 
|  | disassemble = print_insn_s12z; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_m68k | 
|  | case bfd_arch_m68k: | 
|  | disassemble = print_insn_m68k; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_mt | 
|  | case bfd_arch_mt: | 
|  | disassemble = print_insn_mt; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_microblaze | 
|  | case bfd_arch_microblaze: | 
|  | disassemble = print_insn_microblaze; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_msp430 | 
|  | case bfd_arch_msp430: | 
|  | disassemble = print_insn_msp430; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_nds32 | 
|  | case bfd_arch_nds32: | 
|  | disassemble = print_insn_nds32; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_nfp | 
|  | case bfd_arch_nfp: | 
|  | disassemble = print_insn_nfp; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_ns32k | 
|  | case bfd_arch_ns32k: | 
|  | disassemble = print_insn_ns32k; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_mcore | 
|  | case bfd_arch_mcore: | 
|  | disassemble = print_insn_mcore; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_mep | 
|  | case bfd_arch_mep: | 
|  | disassemble = print_insn_mep; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_metag | 
|  | case bfd_arch_metag: | 
|  | disassemble = print_insn_metag; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_mips | 
|  | case bfd_arch_mips: | 
|  | if (big) | 
|  | disassemble = print_insn_big_mips; | 
|  | else | 
|  | disassemble = print_insn_little_mips; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_mmix | 
|  | case bfd_arch_mmix: | 
|  | disassemble = print_insn_mmix; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_mn10200 | 
|  | case bfd_arch_mn10200: | 
|  | disassemble = print_insn_mn10200; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_mn10300 | 
|  | case bfd_arch_mn10300: | 
|  | disassemble = print_insn_mn10300; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_nios2 | 
|  | case bfd_arch_nios2: | 
|  | if (big) | 
|  | disassemble = print_insn_big_nios2; | 
|  | else | 
|  | disassemble = print_insn_little_nios2; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_or1k | 
|  | case bfd_arch_or1k: | 
|  | disassemble = print_insn_or1k; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_pdp11 | 
|  | case bfd_arch_pdp11: | 
|  | disassemble = print_insn_pdp11; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_pj | 
|  | case bfd_arch_pj: | 
|  | disassemble = print_insn_pj; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_powerpc | 
|  | case bfd_arch_powerpc: | 
|  | #endif | 
|  | #ifdef ARCH_rs6000 | 
|  | case bfd_arch_rs6000: | 
|  | #endif | 
|  | #if defined ARCH_powerpc || defined ARCH_rs6000 | 
|  | if (big) | 
|  | disassemble = print_insn_big_powerpc; | 
|  | else | 
|  | disassemble = print_insn_little_powerpc; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_pru | 
|  | case bfd_arch_pru: | 
|  | disassemble = print_insn_pru; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_riscv | 
|  | case bfd_arch_riscv: | 
|  | disassemble = riscv_get_disassembler (abfd); | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_rl78 | 
|  | case bfd_arch_rl78: | 
|  | disassemble = rl78_get_disassembler (abfd); | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_rx | 
|  | case bfd_arch_rx: | 
|  | disassemble = print_insn_rx; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_s390 | 
|  | case bfd_arch_s390: | 
|  | disassemble = print_insn_s390; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_score | 
|  | case bfd_arch_score: | 
|  | if (big) | 
|  | disassemble = print_insn_big_score; | 
|  | else | 
|  | disassemble = print_insn_little_score; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_sh | 
|  | case bfd_arch_sh: | 
|  | disassemble = print_insn_sh; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_sparc | 
|  | case bfd_arch_sparc: | 
|  | disassemble = print_insn_sparc; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_spu | 
|  | case bfd_arch_spu: | 
|  | disassemble = print_insn_spu; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_tic30 | 
|  | case bfd_arch_tic30: | 
|  | disassemble = print_insn_tic30; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_tic4x | 
|  | case bfd_arch_tic4x: | 
|  | disassemble = print_insn_tic4x; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_tic54x | 
|  | case bfd_arch_tic54x: | 
|  | disassemble = print_insn_tic54x; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_tic6x | 
|  | case bfd_arch_tic6x: | 
|  | disassemble = print_insn_tic6x; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_ft32 | 
|  | case bfd_arch_ft32: | 
|  | disassemble = print_insn_ft32; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_v850 | 
|  | case bfd_arch_v850: | 
|  | case bfd_arch_v850_rh850: | 
|  | disassemble = print_insn_v850; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_wasm32 | 
|  | case bfd_arch_wasm32: | 
|  | disassemble = print_insn_wasm32; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_xgate | 
|  | case bfd_arch_xgate: | 
|  | disassemble = print_insn_xgate; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_xstormy16 | 
|  | case bfd_arch_xstormy16: | 
|  | disassemble = print_insn_xstormy16; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_xtensa | 
|  | case bfd_arch_xtensa: | 
|  | disassemble = print_insn_xtensa; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_z80 | 
|  | case bfd_arch_z80: | 
|  | disassemble = print_insn_z80; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_z8k | 
|  | case bfd_arch_z8k: | 
|  | if (mach == bfd_mach_z8001) | 
|  | disassemble = print_insn_z8001; | 
|  | else | 
|  | disassemble = print_insn_z8002; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_vax | 
|  | case bfd_arch_vax: | 
|  | disassemble = print_insn_vax; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_visium | 
|  | case bfd_arch_visium: | 
|  | disassemble = print_insn_visium; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_frv | 
|  | case bfd_arch_frv: | 
|  | disassemble = print_insn_frv; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_moxie | 
|  | case bfd_arch_moxie: | 
|  | disassemble = print_insn_moxie; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_iq2000 | 
|  | case bfd_arch_iq2000: | 
|  | disassemble = print_insn_iq2000; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_m32c | 
|  | case bfd_arch_m32c: | 
|  | disassemble = print_insn_m32c; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_tilegx | 
|  | case bfd_arch_tilegx: | 
|  | disassemble = print_insn_tilegx; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_tilepro | 
|  | case bfd_arch_tilepro: | 
|  | disassemble = print_insn_tilepro; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_loongarch | 
|  | case bfd_arch_loongarch: | 
|  | disassemble = print_insn_loongarch; | 
|  | break; | 
|  | #endif | 
|  | default: | 
|  | return 0; | 
|  | } | 
|  | return disassemble; | 
|  | } | 
|  |  | 
|  | void | 
|  | disassembler_usage (FILE *stream ATTRIBUTE_UNUSED) | 
|  | { | 
|  | #ifdef ARCH_aarch64 | 
|  | print_aarch64_disassembler_options (stream); | 
|  | #endif | 
|  | #ifdef ARCH_arc | 
|  | print_arc_disassembler_options (stream); | 
|  | #endif | 
|  | #ifdef ARCH_arm | 
|  | print_arm_disassembler_options (stream); | 
|  | #endif | 
|  | #ifdef ARCH_mips | 
|  | print_mips_disassembler_options (stream); | 
|  | #endif | 
|  | #ifdef ARCH_nfp | 
|  | print_nfp_disassembler_options (stream); | 
|  | #endif | 
|  | #ifdef ARCH_powerpc | 
|  | print_ppc_disassembler_options (stream); | 
|  | #endif | 
|  | #ifdef ARCH_riscv | 
|  | print_riscv_disassembler_options (stream); | 
|  | #endif | 
|  | #ifdef ARCH_i386 | 
|  | print_i386_disassembler_options (stream); | 
|  | #endif | 
|  | #ifdef ARCH_s390 | 
|  | print_s390_disassembler_options (stream); | 
|  | #endif | 
|  | #ifdef ARCH_wasm32 | 
|  | print_wasm32_disassembler_options (stream); | 
|  | #endif | 
|  | #ifdef ARCH_loongarch | 
|  | print_loongarch_disassembler_options (stream); | 
|  | #endif | 
|  |  | 
|  | return; | 
|  | } | 
|  |  | 
|  | void | 
|  | disassemble_init_for_target (struct disassemble_info * info) | 
|  | { | 
|  | if (info == NULL) | 
|  | return; | 
|  |  | 
|  | switch (info->arch) | 
|  | { | 
|  | #ifdef ARCH_aarch64 | 
|  | case bfd_arch_aarch64: | 
|  | info->symbol_is_valid = aarch64_symbol_is_valid; | 
|  | info->disassembler_needs_relocs = true; | 
|  | info->created_styled_output = true; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_arc | 
|  | case bfd_arch_arc: | 
|  | info->created_styled_output = true; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_arm | 
|  | case bfd_arch_arm: | 
|  | info->symbol_is_valid = arm_symbol_is_valid; | 
|  | info->disassembler_needs_relocs = true; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_avr | 
|  | case bfd_arch_avr: | 
|  | info->created_styled_output = true; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_csky | 
|  | case bfd_arch_csky: | 
|  | info->symbol_is_valid = csky_symbol_is_valid; | 
|  | info->disassembler_needs_relocs = true; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_i386 | 
|  | case bfd_arch_i386: | 
|  | case bfd_arch_iamcu: | 
|  | info->created_styled_output = true; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_ia64 | 
|  | case bfd_arch_ia64: | 
|  | info->skip_zeroes = 16; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_tic4x | 
|  | case bfd_arch_tic4x: | 
|  | info->skip_zeroes = 32; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_mep | 
|  | case bfd_arch_mep: | 
|  | info->skip_zeroes = 256; | 
|  | info->skip_zeroes_at_end = 0; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_metag | 
|  | case bfd_arch_metag: | 
|  | info->disassembler_needs_relocs = true; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_m32c | 
|  | case bfd_arch_m32c: | 
|  | /* This processor in fact is little endian.  The value set here | 
|  | reflects the way opcodes are written in the cgen description.  */ | 
|  | info->endian = BFD_ENDIAN_BIG; | 
|  | if (!info->private_data) | 
|  | { | 
|  | info->private_data = cgen_bitset_create (ISA_MAX); | 
|  | if (info->mach == bfd_mach_m16c) | 
|  | cgen_bitset_set (info->private_data, ISA_M16C); | 
|  | else | 
|  | cgen_bitset_set (info->private_data, ISA_M32C); | 
|  | } | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_bpf | 
|  | case bfd_arch_bpf: | 
|  | info->endian_code = BFD_ENDIAN_LITTLE; | 
|  | if (!info->private_data) | 
|  | { | 
|  | info->private_data = cgen_bitset_create (ISA_MAX); | 
|  | if (info->endian == BFD_ENDIAN_BIG) | 
|  | { | 
|  | cgen_bitset_set (info->private_data, ISA_EBPFBE); | 
|  | if (info->mach == bfd_mach_xbpf) | 
|  | cgen_bitset_set (info->private_data, ISA_XBPFBE); | 
|  | } | 
|  | else | 
|  | { | 
|  | cgen_bitset_set (info->private_data, ISA_EBPFLE); | 
|  | if (info->mach == bfd_mach_xbpf) | 
|  | cgen_bitset_set (info->private_data, ISA_XBPFLE); | 
|  | } | 
|  | } | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_pru | 
|  | case bfd_arch_pru: | 
|  | info->disassembler_needs_relocs = true; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_powerpc | 
|  | case bfd_arch_powerpc: | 
|  | #endif | 
|  | #ifdef ARCH_rs6000 | 
|  | case bfd_arch_rs6000: | 
|  | #endif | 
|  | #if defined (ARCH_powerpc) || defined (ARCH_rs6000) | 
|  | disassemble_init_powerpc (info); | 
|  | info->created_styled_output = true; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_riscv | 
|  | case bfd_arch_riscv: | 
|  | info->symbol_is_valid = riscv_symbol_is_valid; | 
|  | info->created_styled_output = true; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_wasm32 | 
|  | case bfd_arch_wasm32: | 
|  | disassemble_init_wasm32 (info); | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_s390 | 
|  | case bfd_arch_s390: | 
|  | disassemble_init_s390 (info); | 
|  | info->created_styled_output = true; | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_nds32 | 
|  | case bfd_arch_nds32: | 
|  | disassemble_init_nds32 (info); | 
|  | break; | 
|  | #endif | 
|  | default: | 
|  | break; | 
|  | } | 
|  | } | 
|  |  | 
|  | void | 
|  | disassemble_free_target (struct disassemble_info *info) | 
|  | { | 
|  | if (info == NULL) | 
|  | return; | 
|  |  | 
|  | switch (info->arch) | 
|  | { | 
|  | default: | 
|  | return; | 
|  |  | 
|  | #ifdef ARCH_bpf | 
|  | case bfd_arch_bpf: | 
|  | #endif | 
|  | #ifdef ARCH_m32c | 
|  | case bfd_arch_m32c: | 
|  | #endif | 
|  | #if defined ARCH_bpf || defined ARCH_m32c | 
|  | if (info->private_data) | 
|  | { | 
|  | CGEN_BITSET *mask = info->private_data; | 
|  | free (mask->bits); | 
|  | } | 
|  | break; | 
|  | #endif | 
|  |  | 
|  | #ifdef ARCH_arc | 
|  | case bfd_arch_arc: | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_cris | 
|  | case bfd_arch_cris: | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_mmix | 
|  | case bfd_arch_mmix: | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_nfp | 
|  | case bfd_arch_nfp: | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_powerpc | 
|  | case bfd_arch_powerpc: | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_riscv | 
|  | case bfd_arch_riscv: | 
|  | break; | 
|  | #endif | 
|  | #ifdef ARCH_rs6000 | 
|  | case bfd_arch_rs6000: | 
|  | break; | 
|  | #endif | 
|  | } | 
|  |  | 
|  | free (info->private_data); | 
|  | } | 
|  |  | 
|  | /* Remove whitespace and consecutive commas from OPTIONS.  */ | 
|  |  | 
|  | char * | 
|  | remove_whitespace_and_extra_commas (char *options) | 
|  | { | 
|  | char *str; | 
|  | size_t i, len; | 
|  |  | 
|  | if (options == NULL) | 
|  | return NULL; | 
|  |  | 
|  | /* Strip off all trailing whitespace and commas.  */ | 
|  | for (len = strlen (options); len > 0; len--) | 
|  | { | 
|  | if (!ISSPACE (options[len - 1]) && options[len - 1] != ',') | 
|  | break; | 
|  | options[len - 1] = '\0'; | 
|  | } | 
|  |  | 
|  | /* Convert all remaining whitespace to commas.  */ | 
|  | for (i = 0; options[i] != '\0'; i++) | 
|  | if (ISSPACE (options[i])) | 
|  | options[i] = ','; | 
|  |  | 
|  | /* Remove consecutive commas.  */ | 
|  | for (str = options; *str != '\0'; str++) | 
|  | if (*str == ',' && (*(str + 1) == ',' || str == options)) | 
|  | { | 
|  | char *next = str + 1; | 
|  | while (*next == ',') | 
|  | next++; | 
|  | len = strlen (next); | 
|  | if (str != options) | 
|  | str++; | 
|  | memmove (str, next, len); | 
|  | next[len - (size_t)(next - str)] = '\0'; | 
|  | } | 
|  | return (strlen (options) != 0) ? options : NULL; | 
|  | } | 
|  |  | 
|  | /* Like STRCMP, but treat ',' the same as '\0' so that we match | 
|  | strings like "foobar" against "foobar,xxyyzz,...".  */ | 
|  |  | 
|  | int | 
|  | disassembler_options_cmp (const char *s1, const char *s2) | 
|  | { | 
|  | unsigned char c1, c2; | 
|  |  | 
|  | do | 
|  | { | 
|  | c1 = (unsigned char) *s1++; | 
|  | if (c1 == ',') | 
|  | c1 = '\0'; | 
|  | c2 = (unsigned char) *s2++; | 
|  | if (c2 == ',') | 
|  | c2 = '\0'; | 
|  | if (c1 == '\0') | 
|  | return c1 - c2; | 
|  | } | 
|  | while (c1 == c2); | 
|  |  | 
|  | return c1 - c2; | 
|  | } | 
|  |  | 
|  | void | 
|  | opcodes_assert (const char *file, int line) | 
|  | { | 
|  | opcodes_error_handler (_("assertion fail %s:%d"), file, line); | 
|  | opcodes_error_handler (_("Please report this bug")); | 
|  | abort (); | 
|  | } | 
|  |  | 
|  | /* Set the stream, and the styled and unstyled printf functions within | 
|  | INFO.  */ | 
|  |  | 
|  | void | 
|  | disassemble_set_printf (struct disassemble_info *info, void *stream, | 
|  | fprintf_ftype unstyled_printf, | 
|  | fprintf_styled_ftype styled_printf) | 
|  | { | 
|  | info->stream = stream; | 
|  | info->fprintf_func = unstyled_printf; | 
|  | info->fprintf_styled_func = styled_printf; | 
|  | } |