1 /* Select disassembly routine for specified architecture. 2 Copyright (C) 1994-2015 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_h8300 41 #define ARCH_h8500 42 #define ARCH_hppa 43 #define ARCH_i370 44 #define ARCH_i386 45 #define ARCH_i860 46 #define ARCH_i960 47 #define ARCH_ia64 48 #define ARCH_ip2k 49 #define ARCH_iq2000 50 #define ARCH_lm32 51 #define ARCH_m32c 52 #define ARCH_m32r 53 #define ARCH_m68hc11 54 #define ARCH_m68hc12 55 #define ARCH_m68k 56 #define ARCH_m88k 57 #define ARCH_mcore 58 #define ARCH_mep 59 #define ARCH_metag 60 #define ARCH_microblaze 61 #define ARCH_mips 62 #define ARCH_mmix 63 #define ARCH_mn10200 64 #define ARCH_mn10300 65 #define ARCH_moxie 66 #define ARCH_mt 67 #define ARCH_msp430 68 #define ARCH_nds32 69 #define ARCH_nios2 70 #define ARCH_ns32k 71 #define ARCH_or1k 72 #define ARCH_pdp11 73 #define ARCH_pj 74 #define ARCH_powerpc 75 #define ARCH_rs6000 76 #define ARCH_rl78 77 #define ARCH_rx 78 #define ARCH_s390 79 #define ARCH_score 80 #define ARCH_sh 81 #define ARCH_sparc 82 #define ARCH_spu 83 #define ARCH_tic30 84 #define ARCH_tic4x 85 #define ARCH_tic54x 86 #define ARCH_tic6x 87 #define ARCH_tic80 88 #define ARCH_tilegx 89 #define ARCH_tilepro 90 #define ARCH_v850 91 #define ARCH_vax 92 #define ARCH_visium 93 #define ARCH_w65 94 #define ARCH_xstormy16 95 #define ARCH_xc16x 96 #define ARCH_xgate 97 #define ARCH_xtensa 98 #define ARCH_z80 99 #define ARCH_z8k 100 #define INCLUDE_SHMEDIA 101 #endif 102 103 #ifdef ARCH_m32c 104 #include "m32c-desc.h" 105 #endif 106 107 disassembler_ftype 108 disassembler (abfd) 109 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_l1om: 214 case bfd_arch_k1om: 215 disassemble = print_insn_i386; 216 break; 217 #endif 218 #ifdef ARCH_i860 219 case bfd_arch_i860: 220 disassemble = print_insn_i860; 221 break; 222 #endif 223 #ifdef ARCH_i960 224 case bfd_arch_i960: 225 disassemble = print_insn_i960; 226 break; 227 #endif 228 #ifdef ARCH_ia64 229 case bfd_arch_ia64: 230 disassemble = print_insn_ia64; 231 break; 232 #endif 233 #ifdef ARCH_ip2k 234 case bfd_arch_ip2k: 235 disassemble = print_insn_ip2k; 236 break; 237 #endif 238 #ifdef ARCH_epiphany 239 case bfd_arch_epiphany: 240 disassemble = print_insn_epiphany; 241 break; 242 #endif 243 #ifdef ARCH_fr30 244 case bfd_arch_fr30: 245 disassemble = print_insn_fr30; 246 break; 247 #endif 248 #ifdef ARCH_lm32 249 case bfd_arch_lm32: 250 disassemble = print_insn_lm32; 251 break; 252 #endif 253 #ifdef ARCH_m32r 254 case bfd_arch_m32r: 255 disassemble = print_insn_m32r; 256 break; 257 #endif 258 #if defined(ARCH_m68hc11) || defined(ARCH_m68hc12) \ 259 || defined(ARCH_9s12x) || defined(ARCH_m9s12xg) 260 case bfd_arch_m68hc11: 261 disassemble = print_insn_m68hc11; 262 break; 263 case bfd_arch_m68hc12: 264 disassemble = print_insn_m68hc12; 265 break; 266 case bfd_arch_m9s12x: 267 disassemble = print_insn_m9s12x; 268 break; 269 case bfd_arch_m9s12xg: 270 disassemble = print_insn_m9s12xg; 271 break; 272 #endif 273 #ifdef ARCH_m68k 274 case bfd_arch_m68k: 275 disassemble = print_insn_m68k; 276 break; 277 #endif 278 #ifdef ARCH_m88k 279 case bfd_arch_m88k: 280 disassemble = print_insn_m88k; 281 break; 282 #endif 283 #ifdef ARCH_mt 284 case bfd_arch_mt: 285 disassemble = print_insn_mt; 286 break; 287 #endif 288 #ifdef ARCH_microblaze 289 case bfd_arch_microblaze: 290 disassemble = print_insn_microblaze; 291 break; 292 #endif 293 #ifdef ARCH_msp430 294 case bfd_arch_msp430: 295 disassemble = print_insn_msp430; 296 break; 297 #endif 298 #ifdef ARCH_nds32 299 case bfd_arch_nds32: 300 disassemble = print_insn_nds32; 301 break; 302 #endif 303 #ifdef ARCH_ns32k 304 case bfd_arch_ns32k: 305 disassemble = print_insn_ns32k; 306 break; 307 #endif 308 #ifdef ARCH_mcore 309 case bfd_arch_mcore: 310 disassemble = print_insn_mcore; 311 break; 312 #endif 313 #ifdef ARCH_mep 314 case bfd_arch_mep: 315 disassemble = print_insn_mep; 316 break; 317 #endif 318 #ifdef ARCH_metag 319 case bfd_arch_metag: 320 disassemble = print_insn_metag; 321 break; 322 #endif 323 #ifdef ARCH_mips 324 case bfd_arch_mips: 325 if (bfd_big_endian (abfd)) 326 disassemble = print_insn_big_mips; 327 else 328 disassemble = print_insn_little_mips; 329 break; 330 #endif 331 #ifdef ARCH_mmix 332 case bfd_arch_mmix: 333 disassemble = print_insn_mmix; 334 break; 335 #endif 336 #ifdef ARCH_mn10200 337 case bfd_arch_mn10200: 338 disassemble = print_insn_mn10200; 339 break; 340 #endif 341 #ifdef ARCH_mn10300 342 case bfd_arch_mn10300: 343 disassemble = print_insn_mn10300; 344 break; 345 #endif 346 #ifdef ARCH_nios2 347 case bfd_arch_nios2: 348 if (bfd_big_endian (abfd)) 349 disassemble = print_insn_big_nios2; 350 else 351 disassemble = print_insn_little_nios2; 352 break; 353 #endif 354 #ifdef ARCH_or1k 355 case bfd_arch_or1k: 356 disassemble = print_insn_or1k; 357 break; 358 #endif 359 #ifdef ARCH_pdp11 360 case bfd_arch_pdp11: 361 disassemble = print_insn_pdp11; 362 break; 363 #endif 364 #ifdef ARCH_pj 365 case bfd_arch_pj: 366 disassemble = print_insn_pj; 367 break; 368 #endif 369 #ifdef ARCH_powerpc 370 case bfd_arch_powerpc: 371 if (bfd_big_endian (abfd)) 372 disassemble = print_insn_big_powerpc; 373 else 374 disassemble = print_insn_little_powerpc; 375 break; 376 #endif 377 #ifdef ARCH_rs6000 378 case bfd_arch_rs6000: 379 if (bfd_get_mach (abfd) == bfd_mach_ppc_620) 380 disassemble = print_insn_big_powerpc; 381 else 382 disassemble = print_insn_rs6000; 383 break; 384 #endif 385 #ifdef ARCH_rl78 386 case bfd_arch_rl78: 387 disassemble = print_insn_rl78; 388 break; 389 #endif 390 #ifdef ARCH_rx 391 case bfd_arch_rx: 392 disassemble = print_insn_rx; 393 break; 394 #endif 395 #ifdef ARCH_s390 396 case bfd_arch_s390: 397 disassemble = print_insn_s390; 398 break; 399 #endif 400 #ifdef ARCH_score 401 case bfd_arch_score: 402 if (bfd_big_endian (abfd)) 403 disassemble = print_insn_big_score; 404 else 405 disassemble = print_insn_little_score; 406 break; 407 #endif 408 #ifdef ARCH_sh 409 case bfd_arch_sh: 410 disassemble = print_insn_sh; 411 break; 412 #endif 413 #ifdef ARCH_sparc 414 case bfd_arch_sparc: 415 disassemble = print_insn_sparc; 416 break; 417 #endif 418 #ifdef ARCH_spu 419 case bfd_arch_spu: 420 disassemble = print_insn_spu; 421 break; 422 #endif 423 #ifdef ARCH_tic30 424 case bfd_arch_tic30: 425 disassemble = print_insn_tic30; 426 break; 427 #endif 428 #ifdef ARCH_tic4x 429 case bfd_arch_tic4x: 430 disassemble = print_insn_tic4x; 431 break; 432 #endif 433 #ifdef ARCH_tic54x 434 case bfd_arch_tic54x: 435 disassemble = print_insn_tic54x; 436 break; 437 #endif 438 #ifdef ARCH_tic6x 439 case bfd_arch_tic6x: 440 disassemble = print_insn_tic6x; 441 break; 442 #endif 443 #ifdef ARCH_tic80 444 case bfd_arch_tic80: 445 disassemble = print_insn_tic80; 446 break; 447 #endif 448 #ifdef ARCH_v850 449 case bfd_arch_v850: 450 case bfd_arch_v850_rh850: 451 disassemble = print_insn_v850; 452 break; 453 #endif 454 #ifdef ARCH_w65 455 case bfd_arch_w65: 456 disassemble = print_insn_w65; 457 break; 458 #endif 459 #ifdef ARCH_xgate 460 case bfd_arch_xgate: 461 disassemble = print_insn_xgate; 462 break; 463 #endif 464 #ifdef ARCH_xstormy16 465 case bfd_arch_xstormy16: 466 disassemble = print_insn_xstormy16; 467 break; 468 #endif 469 #ifdef ARCH_xc16x 470 case bfd_arch_xc16x: 471 disassemble = print_insn_xc16x; 472 break; 473 #endif 474 #ifdef ARCH_xtensa 475 case bfd_arch_xtensa: 476 disassemble = print_insn_xtensa; 477 break; 478 #endif 479 #ifdef ARCH_z80 480 case bfd_arch_z80: 481 disassemble = print_insn_z80; 482 break; 483 #endif 484 #ifdef ARCH_z8k 485 case bfd_arch_z8k: 486 if (bfd_get_mach(abfd) == bfd_mach_z8001) 487 disassemble = print_insn_z8001; 488 else 489 disassemble = print_insn_z8002; 490 break; 491 #endif 492 #ifdef ARCH_vax 493 case bfd_arch_vax: 494 disassemble = print_insn_vax; 495 break; 496 #endif 497 #ifdef ARCH_visium 498 case bfd_arch_visium: 499 disassemble = print_insn_visium; 500 break; 501 #endif 502 #ifdef ARCH_frv 503 case bfd_arch_frv: 504 disassemble = print_insn_frv; 505 break; 506 #endif 507 #ifdef ARCH_moxie 508 case bfd_arch_moxie: 509 disassemble = print_insn_moxie; 510 break; 511 #endif 512 #ifdef ARCH_iq2000 513 case bfd_arch_iq2000: 514 disassemble = print_insn_iq2000; 515 break; 516 #endif 517 #ifdef ARCH_m32c 518 case bfd_arch_m32c: 519 disassemble = print_insn_m32c; 520 break; 521 #endif 522 #ifdef ARCH_tilegx 523 case bfd_arch_tilegx: 524 disassemble = print_insn_tilegx; 525 break; 526 #endif 527 #ifdef ARCH_tilepro 528 case bfd_arch_tilepro: 529 disassemble = print_insn_tilepro; 530 break; 531 #endif 532 default: 533 return 0; 534 } 535 return disassemble; 536 } 537 538 void 539 disassembler_usage (stream) 540 FILE * stream ATTRIBUTE_UNUSED; 541 { 542 #ifdef ARCH_aarch64 543 print_aarch64_disassembler_options (stream); 544 #endif 545 #ifdef ARCH_arm 546 print_arm_disassembler_options (stream); 547 #endif 548 #ifdef ARCH_mips 549 print_mips_disassembler_options (stream); 550 #endif 551 #ifdef ARCH_powerpc 552 print_ppc_disassembler_options (stream); 553 #endif 554 #ifdef ARCH_i386 555 print_i386_disassembler_options (stream); 556 #endif 557 #ifdef ARCH_s390 558 print_s390_disassembler_options (stream); 559 #endif 560 561 return; 562 } 563 564 void 565 disassemble_init_for_target (struct disassemble_info * info) 566 { 567 if (info == NULL) 568 return; 569 570 switch (info->arch) 571 { 572 #ifdef ARCH_aarch64 573 case bfd_arch_aarch64: 574 info->symbol_is_valid = aarch64_symbol_is_valid; 575 info->disassembler_needs_relocs = TRUE; 576 break; 577 #endif 578 #ifdef ARCH_arm 579 case bfd_arch_arm: 580 info->symbol_is_valid = arm_symbol_is_valid; 581 info->disassembler_needs_relocs = TRUE; 582 break; 583 #endif 584 #ifdef ARCH_ia64 585 case bfd_arch_ia64: 586 info->skip_zeroes = 16; 587 break; 588 #endif 589 #ifdef ARCH_tic4x 590 case bfd_arch_tic4x: 591 info->skip_zeroes = 32; 592 break; 593 #endif 594 #ifdef ARCH_mep 595 case bfd_arch_mep: 596 info->skip_zeroes = 256; 597 info->skip_zeroes_at_end = 0; 598 break; 599 #endif 600 #ifdef ARCH_metag 601 case bfd_arch_metag: 602 info->disassembler_needs_relocs = TRUE; 603 break; 604 #endif 605 #ifdef ARCH_m32c 606 case bfd_arch_m32c: 607 /* This processor in fact is little endian. The value set here 608 reflects the way opcodes are written in the cgen description. */ 609 info->endian = BFD_ENDIAN_BIG; 610 if (! info->insn_sets) 611 { 612 info->insn_sets = cgen_bitset_create (ISA_MAX); 613 if (info->mach == bfd_mach_m16c) 614 cgen_bitset_set (info->insn_sets, ISA_M16C); 615 else 616 cgen_bitset_set (info->insn_sets, ISA_M32C); 617 } 618 break; 619 #endif 620 #ifdef ARCH_powerpc 621 case bfd_arch_powerpc: 622 #endif 623 #ifdef ARCH_rs6000 624 case bfd_arch_rs6000: 625 #endif 626 #if defined (ARCH_powerpc) || defined (ARCH_rs6000) 627 disassemble_init_powerpc (info); 628 break; 629 #endif 630 default: 631 break; 632 } 633 } 634