1/* Select disassembly routine for specified architecture. 2 Copyright (C) 1994-2017 Free Software Foundation, Inc. 3 4 This file is part of the GNU opcodes library. 5 6 This library is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 3 of the License, or 9 (at your option) any later version. 10 11 This program is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with this program; if not, write to the Free Software 18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 19 MA 02110-1301, USA. */ 20 21#include "sysdep.h" 22#include "dis-asm.h" 23 24#ifdef ARCH_all 25#define ARCH_aarch64 26#define ARCH_alpha 27#define ARCH_arc 28#define ARCH_arm 29#define ARCH_avr 30#define ARCH_bfin 31#define ARCH_cr16 32#define ARCH_cris 33#define ARCH_crx 34#define ARCH_d10v 35#define ARCH_d30v 36#define ARCH_dlx 37#define ARCH_epiphany 38#define ARCH_fr30 39#define ARCH_frv 40#define ARCH_ft32 41#define ARCH_h8300 42#define ARCH_h8500 43#define ARCH_hppa 44#define ARCH_i370 45#define ARCH_i386 46#define ARCH_i860 47#define ARCH_i960 48#define ARCH_ia64 49#define ARCH_ip2k 50#define ARCH_iq2000 51#define ARCH_lm32 52#define ARCH_m32c 53#define ARCH_m32r 54#define ARCH_m68hc11 55#define ARCH_m68hc12 56#define ARCH_m68k 57#define ARCH_m88k 58#define ARCH_mcore 59#define ARCH_mep 60#define ARCH_metag 61#define ARCH_microblaze 62#define ARCH_mips 63#define ARCH_mmix 64#define ARCH_mn10200 65#define ARCH_mn10300 66#define ARCH_moxie 67#define ARCH_mt 68#define ARCH_msp430 69#define ARCH_nds32 70#define ARCH_nios2 71#define ARCH_ns32k 72#define ARCH_or1k 73#define ARCH_pdp11 74#define ARCH_pj 75#define ARCH_powerpc 76#define ARCH_rs6000 77#define ARCH_rl78 78#define ARCH_rx 79#define ARCH_s390 80#define ARCH_score 81#define ARCH_sh 82#define ARCH_sparc 83#define ARCH_spu 84#define ARCH_tic30 85#define ARCH_tic4x 86#define ARCH_tic54x 87#define ARCH_tic6x 88#define ARCH_tic80 89#define ARCH_tilegx 90#define ARCH_tilepro 91#define ARCH_v850 92#define ARCH_vax 93#define ARCH_visium 94#define ARCH_w65 95#define ARCH_xstormy16 96#define ARCH_xc16x 97#define ARCH_xgate 98#define ARCH_xtensa 99#define ARCH_z80 100#define ARCH_z8k 101#define INCLUDE_SHMEDIA 102#endif 103 104#ifdef ARCH_m32c 105#include "m32c-desc.h" 106#endif 107 108disassembler_ftype 109disassembler (bfd *abfd) 110{ 111 enum bfd_architecture a = bfd_get_arch (abfd); 112 disassembler_ftype disassemble; 113 114 switch (a) 115 { 116 /* If you add a case to this table, also add it to the 117 ARCH_all definition right above this function. */ 118#ifdef ARCH_aarch64 119 case bfd_arch_aarch64: 120 disassemble = print_insn_aarch64; 121 break; 122#endif 123#ifdef ARCH_alpha 124 case bfd_arch_alpha: 125 disassemble = print_insn_alpha; 126 break; 127#endif 128#ifdef ARCH_arc 129 case bfd_arch_arc: 130 disassemble = arc_get_disassembler (abfd); 131 break; 132#endif 133#ifdef ARCH_arm 134 case bfd_arch_arm: 135 if (bfd_big_endian (abfd)) 136 disassemble = print_insn_big_arm; 137 else 138 disassemble = print_insn_little_arm; 139 break; 140#endif 141#ifdef ARCH_avr 142 case bfd_arch_avr: 143 disassemble = print_insn_avr; 144 break; 145#endif 146#ifdef ARCH_bfin 147 case bfd_arch_bfin: 148 disassemble = print_insn_bfin; 149 break; 150#endif 151#ifdef ARCH_cr16 152 case bfd_arch_cr16: 153 disassemble = print_insn_cr16; 154 break; 155#endif 156#ifdef ARCH_cris 157 case bfd_arch_cris: 158 disassemble = cris_get_disassembler (abfd); 159 break; 160#endif 161#ifdef ARCH_crx 162 case bfd_arch_crx: 163 disassemble = print_insn_crx; 164 break; 165#endif 166#ifdef ARCH_d10v 167 case bfd_arch_d10v: 168 disassemble = print_insn_d10v; 169 break; 170#endif 171#ifdef ARCH_d30v 172 case bfd_arch_d30v: 173 disassemble = print_insn_d30v; 174 break; 175#endif 176#ifdef ARCH_dlx 177 case bfd_arch_dlx: 178 /* As far as I know we only handle big-endian DLX objects. */ 179 disassemble = print_insn_dlx; 180 break; 181#endif 182#ifdef ARCH_h8300 183 case bfd_arch_h8300: 184 if (bfd_get_mach (abfd) == bfd_mach_h8300h 185 || bfd_get_mach (abfd) == bfd_mach_h8300hn) 186 disassemble = print_insn_h8300h; 187 else if (bfd_get_mach (abfd) == bfd_mach_h8300s 188 || bfd_get_mach (abfd) == bfd_mach_h8300sn 189 || bfd_get_mach (abfd) == bfd_mach_h8300sx 190 || bfd_get_mach (abfd) == bfd_mach_h8300sxn) 191 disassemble = print_insn_h8300s; 192 else 193 disassemble = print_insn_h8300; 194 break; 195#endif 196#ifdef ARCH_h8500 197 case bfd_arch_h8500: 198 disassemble = print_insn_h8500; 199 break; 200#endif 201#ifdef ARCH_hppa 202 case bfd_arch_hppa: 203 disassemble = print_insn_hppa; 204 break; 205#endif 206#ifdef ARCH_i370 207 case bfd_arch_i370: 208 disassemble = print_insn_i370; 209 break; 210#endif 211#ifdef ARCH_i386 212 case bfd_arch_i386: 213 case bfd_arch_iamcu: 214 case bfd_arch_l1om: 215 case bfd_arch_k1om: 216 disassemble = print_insn_i386; 217 break; 218#endif 219#ifdef ARCH_i860 220 case bfd_arch_i860: 221 disassemble = print_insn_i860; 222 break; 223#endif 224#ifdef ARCH_i960 225 case bfd_arch_i960: 226 disassemble = print_insn_i960; 227 break; 228#endif 229#ifdef ARCH_ia64 230 case bfd_arch_ia64: 231 disassemble = print_insn_ia64; 232 break; 233#endif 234#ifdef ARCH_ip2k 235 case bfd_arch_ip2k: 236 disassemble = print_insn_ip2k; 237 break; 238#endif 239#ifdef ARCH_epiphany 240 case bfd_arch_epiphany: 241 disassemble = print_insn_epiphany; 242 break; 243#endif 244#ifdef ARCH_fr30 245 case bfd_arch_fr30: 246 disassemble = print_insn_fr30; 247 break; 248#endif 249#ifdef ARCH_lm32 250 case bfd_arch_lm32: 251 disassemble = print_insn_lm32; 252 break; 253#endif 254#ifdef ARCH_m32r 255 case bfd_arch_m32r: 256 disassemble = print_insn_m32r; 257 break; 258#endif 259#if defined(ARCH_m68hc11) || defined(ARCH_m68hc12) \ 260 || defined(ARCH_9s12x) || defined(ARCH_m9s12xg) 261 case bfd_arch_m68hc11: 262 disassemble = print_insn_m68hc11; 263 break; 264 case bfd_arch_m68hc12: 265 disassemble = print_insn_m68hc12; 266 break; 267 case bfd_arch_m9s12x: 268 disassemble = print_insn_m9s12x; 269 break; 270 case bfd_arch_m9s12xg: 271 disassemble = print_insn_m9s12xg; 272 break; 273#endif 274#ifdef ARCH_m68k 275 case bfd_arch_m68k: 276 disassemble = print_insn_m68k; 277 break; 278#endif 279#ifdef ARCH_m88k 280 case bfd_arch_m88k: 281 disassemble = print_insn_m88k; 282 break; 283#endif 284#ifdef ARCH_mt 285 case bfd_arch_mt: 286 disassemble = print_insn_mt; 287 break; 288#endif 289#ifdef ARCH_microblaze 290 case bfd_arch_microblaze: 291 disassemble = print_insn_microblaze; 292 break; 293#endif 294#ifdef ARCH_msp430 295 case bfd_arch_msp430: 296 disassemble = print_insn_msp430; 297 break; 298#endif 299#ifdef ARCH_nds32 300 case bfd_arch_nds32: 301 disassemble = print_insn_nds32; 302 break; 303#endif 304#ifdef ARCH_ns32k 305 case bfd_arch_ns32k: 306 disassemble = print_insn_ns32k; 307 break; 308#endif 309#ifdef ARCH_mcore 310 case bfd_arch_mcore: 311 disassemble = print_insn_mcore; 312 break; 313#endif 314#ifdef ARCH_mep 315 case bfd_arch_mep: 316 disassemble = print_insn_mep; 317 break; 318#endif 319#ifdef ARCH_metag 320 case bfd_arch_metag: 321 disassemble = print_insn_metag; 322 break; 323#endif 324#ifdef ARCH_mips 325 case bfd_arch_mips: 326 if (bfd_big_endian (abfd)) 327 disassemble = print_insn_big_mips; 328 else 329 disassemble = print_insn_little_mips; 330 break; 331#endif 332#ifdef ARCH_mmix 333 case bfd_arch_mmix: 334 disassemble = print_insn_mmix; 335 break; 336#endif 337#ifdef ARCH_mn10200 338 case bfd_arch_mn10200: 339 disassemble = print_insn_mn10200; 340 break; 341#endif 342#ifdef ARCH_mn10300 343 case bfd_arch_mn10300: 344 disassemble = print_insn_mn10300; 345 break; 346#endif 347#ifdef ARCH_nios2 348 case bfd_arch_nios2: 349 if (bfd_big_endian (abfd)) 350 disassemble = print_insn_big_nios2; 351 else 352 disassemble = print_insn_little_nios2; 353 break; 354#endif 355#ifdef ARCH_or1k 356 case bfd_arch_or1k: 357 disassemble = print_insn_or1k; 358 break; 359#endif 360#ifdef ARCH_pdp11 361 case bfd_arch_pdp11: 362 disassemble = print_insn_pdp11; 363 break; 364#endif 365#ifdef ARCH_pj 366 case bfd_arch_pj: 367 disassemble = print_insn_pj; 368 break; 369#endif 370#ifdef ARCH_powerpc 371 case bfd_arch_powerpc: 372 if (bfd_big_endian (abfd)) 373 disassemble = print_insn_big_powerpc; 374 else 375 disassemble = print_insn_little_powerpc; 376 break; 377#endif 378#ifdef ARCH_riscv 379 case bfd_arch_riscv: 380 disassemble = print_insn_riscv; 381 break; 382#endif 383#ifdef ARCH_rs6000 384 case bfd_arch_rs6000: 385 if (bfd_get_mach (abfd) == bfd_mach_ppc_620) 386 disassemble = print_insn_big_powerpc; 387 else 388 disassemble = print_insn_rs6000; 389 break; 390#endif 391#ifdef ARCH_rl78 392 case bfd_arch_rl78: 393 disassemble = rl78_get_disassembler (abfd); 394 break; 395#endif 396#ifdef ARCH_rx 397 case bfd_arch_rx: 398 disassemble = print_insn_rx; 399 break; 400#endif 401#ifdef ARCH_s390 402 case bfd_arch_s390: 403 disassemble = print_insn_s390; 404 break; 405#endif 406#ifdef ARCH_score 407 case bfd_arch_score: 408 if (bfd_big_endian (abfd)) 409 disassemble = print_insn_big_score; 410 else 411 disassemble = print_insn_little_score; 412 break; 413#endif 414#ifdef ARCH_sh 415 case bfd_arch_sh: 416 disassemble = print_insn_sh; 417 break; 418#endif 419#ifdef ARCH_sparc 420 case bfd_arch_sparc: 421 disassemble = print_insn_sparc; 422 break; 423#endif 424#ifdef ARCH_spu 425 case bfd_arch_spu: 426 disassemble = print_insn_spu; 427 break; 428#endif 429#ifdef ARCH_tic30 430 case bfd_arch_tic30: 431 disassemble = print_insn_tic30; 432 break; 433#endif 434#ifdef ARCH_tic4x 435 case bfd_arch_tic4x: 436 disassemble = print_insn_tic4x; 437 break; 438#endif 439#ifdef ARCH_tic54x 440 case bfd_arch_tic54x: 441 disassemble = print_insn_tic54x; 442 break; 443#endif 444#ifdef ARCH_tic6x 445 case bfd_arch_tic6x: 446 disassemble = print_insn_tic6x; 447 break; 448#endif 449#ifdef ARCH_tic80 450 case bfd_arch_tic80: 451 disassemble = print_insn_tic80; 452 break; 453#endif 454#ifdef ARCH_ft32 455 case bfd_arch_ft32: 456 disassemble = print_insn_ft32; 457 break; 458#endif 459#ifdef ARCH_v850 460 case bfd_arch_v850: 461 case bfd_arch_v850_rh850: 462 disassemble = print_insn_v850; 463 break; 464#endif 465#ifdef ARCH_w65 466 case bfd_arch_w65: 467 disassemble = print_insn_w65; 468 break; 469#endif 470#ifdef ARCH_xgate 471 case bfd_arch_xgate: 472 disassemble = print_insn_xgate; 473 break; 474#endif 475#ifdef ARCH_xstormy16 476 case bfd_arch_xstormy16: 477 disassemble = print_insn_xstormy16; 478 break; 479#endif 480#ifdef ARCH_xc16x 481 case bfd_arch_xc16x: 482 disassemble = print_insn_xc16x; 483 break; 484#endif 485#ifdef ARCH_xtensa 486 case bfd_arch_xtensa: 487 disassemble = print_insn_xtensa; 488 break; 489#endif 490#ifdef ARCH_z80 491 case bfd_arch_z80: 492 disassemble = print_insn_z80; 493 break; 494#endif 495#ifdef ARCH_z8k 496 case bfd_arch_z8k: 497 if (bfd_get_mach(abfd) == bfd_mach_z8001) 498 disassemble = print_insn_z8001; 499 else 500 disassemble = print_insn_z8002; 501 break; 502#endif 503#ifdef ARCH_vax 504 case bfd_arch_vax: 505 disassemble = print_insn_vax; 506 break; 507#endif 508#ifdef ARCH_visium 509 case bfd_arch_visium: 510 disassemble = print_insn_visium; 511 break; 512#endif 513#ifdef ARCH_frv 514 case bfd_arch_frv: 515 disassemble = print_insn_frv; 516 break; 517#endif 518#ifdef ARCH_moxie 519 case bfd_arch_moxie: 520 disassemble = print_insn_moxie; 521 break; 522#endif 523#ifdef ARCH_iq2000 524 case bfd_arch_iq2000: 525 disassemble = print_insn_iq2000; 526 break; 527#endif 528#ifdef ARCH_m32c 529 case bfd_arch_m32c: 530 disassemble = print_insn_m32c; 531 break; 532#endif 533#ifdef ARCH_tilegx 534 case bfd_arch_tilegx: 535 disassemble = print_insn_tilegx; 536 break; 537#endif 538#ifdef ARCH_tilepro 539 case bfd_arch_tilepro: 540 disassemble = print_insn_tilepro; 541 break; 542#endif 543 default: 544 return 0; 545 } 546 return disassemble; 547} 548 549void 550disassembler_usage (FILE *stream ATTRIBUTE_UNUSED) 551{ 552#ifdef ARCH_aarch64 553 print_aarch64_disassembler_options (stream); 554#endif 555#ifdef ARCH_arc 556 print_arc_disassembler_options (stream); 557#endif 558#ifdef ARCH_arm 559 print_arm_disassembler_options (stream); 560#endif 561#ifdef ARCH_mips 562 print_mips_disassembler_options (stream); 563#endif 564#ifdef ARCH_powerpc 565 print_ppc_disassembler_options (stream); 566#endif 567#ifdef ARCH_riscv 568 print_riscv_disassembler_options (stream); 569#endif 570#ifdef ARCH_i386 571 print_i386_disassembler_options (stream); 572#endif 573#ifdef ARCH_s390 574 print_s390_disassembler_options (stream); 575#endif 576 577 return; 578} 579 580void 581disassemble_init_for_target (struct disassemble_info * info) 582{ 583 if (info == NULL) 584 return; 585 586 switch (info->arch) 587 { 588#ifdef ARCH_aarch64 589 case bfd_arch_aarch64: 590 info->symbol_is_valid = aarch64_symbol_is_valid; 591 info->disassembler_needs_relocs = TRUE; 592 break; 593#endif 594#ifdef ARCH_arm 595 case bfd_arch_arm: 596 info->symbol_is_valid = arm_symbol_is_valid; 597 info->disassembler_needs_relocs = TRUE; 598 break; 599#endif 600#ifdef ARCH_ia64 601 case bfd_arch_ia64: 602 info->skip_zeroes = 16; 603 break; 604#endif 605#ifdef ARCH_tic4x 606 case bfd_arch_tic4x: 607 info->skip_zeroes = 32; 608 break; 609#endif 610#ifdef ARCH_mep 611 case bfd_arch_mep: 612 info->skip_zeroes = 256; 613 info->skip_zeroes_at_end = 0; 614 break; 615#endif 616#ifdef ARCH_metag 617 case bfd_arch_metag: 618 info->disassembler_needs_relocs = TRUE; 619 break; 620#endif 621#ifdef ARCH_m32c 622 case bfd_arch_m32c: 623 /* This processor in fact is little endian. The value set here 624 reflects the way opcodes are written in the cgen description. */ 625 info->endian = BFD_ENDIAN_BIG; 626 if (! info->insn_sets) 627 { 628 info->insn_sets = cgen_bitset_create (ISA_MAX); 629 if (info->mach == bfd_mach_m16c) 630 cgen_bitset_set (info->insn_sets, ISA_M16C); 631 else 632 cgen_bitset_set (info->insn_sets, ISA_M32C); 633 } 634 break; 635#endif 636#ifdef ARCH_powerpc 637 case bfd_arch_powerpc: 638#endif 639#ifdef ARCH_rs6000 640 case bfd_arch_rs6000: 641#endif 642#if defined (ARCH_powerpc) || defined (ARCH_rs6000) 643 disassemble_init_powerpc (info); 644 break; 645#endif 646 default: 647 break; 648 } 649} 650