Home | History | Annotate | Download | only in opcodes
      1 /* Select disassembly routine for specified architecture.
      2    Copyright (C) 1994-2016 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 
    108 disassembler_ftype
    109 disassembler (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_rs6000
    379     case bfd_arch_rs6000:
    380       if (bfd_get_mach (abfd) == bfd_mach_ppc_620)
    381 	disassemble = print_insn_big_powerpc;
    382       else
    383 	disassemble = print_insn_rs6000;
    384       break;
    385 #endif
    386 #ifdef ARCH_rl78
    387     case bfd_arch_rl78:
    388       disassemble = rl78_get_disassembler (abfd);
    389       break;
    390 #endif
    391 #ifdef ARCH_rx
    392     case bfd_arch_rx:
    393       disassemble = print_insn_rx;
    394       break;
    395 #endif
    396 #ifdef ARCH_s390
    397     case bfd_arch_s390:
    398       disassemble = print_insn_s390;
    399       break;
    400 #endif
    401 #ifdef ARCH_score
    402     case bfd_arch_score:
    403       if (bfd_big_endian (abfd))
    404 	disassemble = print_insn_big_score;
    405       else
    406 	disassemble = print_insn_little_score;
    407      break;
    408 #endif
    409 #ifdef ARCH_sh
    410     case bfd_arch_sh:
    411       disassemble = print_insn_sh;
    412       break;
    413 #endif
    414 #ifdef ARCH_sparc
    415     case bfd_arch_sparc:
    416       disassemble = print_insn_sparc;
    417       break;
    418 #endif
    419 #ifdef ARCH_spu
    420     case bfd_arch_spu:
    421       disassemble = print_insn_spu;
    422       break;
    423 #endif
    424 #ifdef ARCH_tic30
    425     case bfd_arch_tic30:
    426       disassemble = print_insn_tic30;
    427       break;
    428 #endif
    429 #ifdef ARCH_tic4x
    430     case bfd_arch_tic4x:
    431       disassemble = print_insn_tic4x;
    432       break;
    433 #endif
    434 #ifdef ARCH_tic54x
    435     case bfd_arch_tic54x:
    436       disassemble = print_insn_tic54x;
    437       break;
    438 #endif
    439 #ifdef ARCH_tic6x
    440     case bfd_arch_tic6x:
    441       disassemble = print_insn_tic6x;
    442       break;
    443 #endif
    444 #ifdef ARCH_tic80
    445     case bfd_arch_tic80:
    446       disassemble = print_insn_tic80;
    447       break;
    448 #endif
    449 #ifdef ARCH_ft32
    450     case bfd_arch_ft32:
    451       disassemble = print_insn_ft32;
    452       break;
    453 #endif
    454 #ifdef ARCH_v850
    455     case bfd_arch_v850:
    456     case bfd_arch_v850_rh850:
    457       disassemble = print_insn_v850;
    458       break;
    459 #endif
    460 #ifdef ARCH_w65
    461     case bfd_arch_w65:
    462       disassemble = print_insn_w65;
    463       break;
    464 #endif
    465 #ifdef ARCH_xgate
    466     case bfd_arch_xgate:
    467       disassemble = print_insn_xgate;
    468       break;
    469 #endif
    470 #ifdef ARCH_xstormy16
    471     case bfd_arch_xstormy16:
    472       disassemble = print_insn_xstormy16;
    473       break;
    474 #endif
    475 #ifdef ARCH_xc16x
    476     case bfd_arch_xc16x:
    477       disassemble = print_insn_xc16x;
    478       break;
    479 #endif
    480 #ifdef ARCH_xtensa
    481     case bfd_arch_xtensa:
    482       disassemble = print_insn_xtensa;
    483       break;
    484 #endif
    485 #ifdef ARCH_z80
    486     case bfd_arch_z80:
    487       disassemble = print_insn_z80;
    488       break;
    489 #endif
    490 #ifdef ARCH_z8k
    491     case bfd_arch_z8k:
    492       if (bfd_get_mach(abfd) == bfd_mach_z8001)
    493 	disassemble = print_insn_z8001;
    494       else
    495 	disassemble = print_insn_z8002;
    496       break;
    497 #endif
    498 #ifdef ARCH_vax
    499     case bfd_arch_vax:
    500       disassemble = print_insn_vax;
    501       break;
    502 #endif
    503 #ifdef ARCH_visium
    504      case bfd_arch_visium:
    505        disassemble = print_insn_visium;
    506        break;
    507 #endif
    508 #ifdef ARCH_frv
    509     case bfd_arch_frv:
    510       disassemble = print_insn_frv;
    511       break;
    512 #endif
    513 #ifdef ARCH_moxie
    514     case bfd_arch_moxie:
    515       disassemble = print_insn_moxie;
    516       break;
    517 #endif
    518 #ifdef ARCH_iq2000
    519     case bfd_arch_iq2000:
    520       disassemble = print_insn_iq2000;
    521       break;
    522 #endif
    523 #ifdef ARCH_m32c
    524     case bfd_arch_m32c:
    525       disassemble = print_insn_m32c;
    526       break;
    527 #endif
    528 #ifdef ARCH_tilegx
    529     case bfd_arch_tilegx:
    530       disassemble = print_insn_tilegx;
    531       break;
    532 #endif
    533 #ifdef ARCH_tilepro
    534     case bfd_arch_tilepro:
    535       disassemble = print_insn_tilepro;
    536       break;
    537 #endif
    538     default:
    539       return 0;
    540     }
    541   return disassemble;
    542 }
    543 
    544 void
    545 disassembler_usage (FILE *stream ATTRIBUTE_UNUSED)
    546 {
    547 #ifdef ARCH_aarch64
    548   print_aarch64_disassembler_options (stream);
    549 #endif
    550 #ifdef ARCH_arm
    551   print_arm_disassembler_options (stream);
    552 #endif
    553 #ifdef ARCH_mips
    554   print_mips_disassembler_options (stream);
    555 #endif
    556 #ifdef ARCH_powerpc
    557   print_ppc_disassembler_options (stream);
    558 #endif
    559 #ifdef ARCH_i386
    560   print_i386_disassembler_options (stream);
    561 #endif
    562 #ifdef ARCH_s390
    563   print_s390_disassembler_options (stream);
    564 #endif
    565 
    566   return;
    567 }
    568 
    569 void
    570 disassemble_init_for_target (struct disassemble_info * info)
    571 {
    572   if (info == NULL)
    573     return;
    574 
    575   switch (info->arch)
    576     {
    577 #ifdef ARCH_aarch64
    578     case bfd_arch_aarch64:
    579       info->symbol_is_valid = aarch64_symbol_is_valid;
    580       info->disassembler_needs_relocs = TRUE;
    581       break;
    582 #endif
    583 #ifdef ARCH_arm
    584     case bfd_arch_arm:
    585       info->symbol_is_valid = arm_symbol_is_valid;
    586       info->disassembler_needs_relocs = TRUE;
    587       break;
    588 #endif
    589 #ifdef ARCH_ia64
    590     case bfd_arch_ia64:
    591       info->skip_zeroes = 16;
    592       break;
    593 #endif
    594 #ifdef ARCH_tic4x
    595     case bfd_arch_tic4x:
    596       info->skip_zeroes = 32;
    597       break;
    598 #endif
    599 #ifdef ARCH_mep
    600     case bfd_arch_mep:
    601       info->skip_zeroes = 256;
    602       info->skip_zeroes_at_end = 0;
    603       break;
    604 #endif
    605 #ifdef ARCH_metag
    606     case bfd_arch_metag:
    607       info->disassembler_needs_relocs = TRUE;
    608       break;
    609 #endif
    610 #ifdef ARCH_m32c
    611     case bfd_arch_m32c:
    612       /* This processor in fact is little endian.  The value set here
    613 	 reflects the way opcodes are written in the cgen description.  */
    614       info->endian = BFD_ENDIAN_BIG;
    615       if (! info->insn_sets)
    616 	{
    617 	  info->insn_sets = cgen_bitset_create (ISA_MAX);
    618 	  if (info->mach == bfd_mach_m16c)
    619 	    cgen_bitset_set (info->insn_sets, ISA_M16C);
    620 	  else
    621 	    cgen_bitset_set (info->insn_sets, ISA_M32C);
    622 	}
    623       break;
    624 #endif
    625 #ifdef ARCH_powerpc
    626     case bfd_arch_powerpc:
    627 #endif
    628 #ifdef ARCH_rs6000
    629     case bfd_arch_rs6000:
    630 #endif
    631 #if defined (ARCH_powerpc) || defined (ARCH_rs6000)
    632       disassemble_init_powerpc (info);
    633       break;
    634 #endif
    635     default:
    636       break;
    637     }
    638 }
    639