1/* Select disassembly routine for specified architecture. 2 Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 3 2004, 2005 Free Software Foundation, Inc. 4 5 This program is free software; you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation; either version 2 of the License, or 8 (at your option) any later version. 9 10 This program is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this program; if not, write to the Free Software 17 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ 18 19#include "sysdep.h" 20#include "dis-asm.h" 21 22#ifdef ARCH_all 23#define ARCH_alpha 24#define ARCH_arc 25#define ARCH_arm 26#define ARCH_avr 27#define ARCH_bfin 28#define ARCH_cris 29#define ARCH_crx 30#define ARCH_d10v 31#define ARCH_d30v 32#define ARCH_dlx 33#define ARCH_fr30 34#define ARCH_frv 35#define ARCH_h8300 36#define ARCH_h8500 37#define ARCH_hppa 38#define ARCH_i370 39#define ARCH_i386 40#define ARCH_i860 41#define ARCH_i960 42#define ARCH_ia64 43#define ARCH_ip2k 44#define ARCH_iq2000 45#define ARCH_m32c 46#define ARCH_m32r 47#define ARCH_m68hc11 48#define ARCH_m68hc12 49#define ARCH_m68k 50#define ARCH_m88k 51#define ARCH_maxq 52#define ARCH_mcore 53#define ARCH_mips 54#define ARCH_mmix 55#define ARCH_mn10200 56#define ARCH_mn10300 57#define ARCH_mt 58#define ARCH_msp430 59#define ARCH_ns32k 60#define ARCH_openrisc 61#define ARCH_or32 62#define ARCH_pdp11 63#define ARCH_pj 64#define ARCH_powerpc 65#define ARCH_rs6000 66#define ARCH_s390 67#define ARCH_sh 68#define ARCH_sparc 69#define ARCH_tic30 70#define ARCH_tic4x 71#define ARCH_tic54x 72#define ARCH_tic80 73#define ARCH_v850 74#define ARCH_vax 75#define ARCH_w65 76#define ARCH_xstormy16 77#define ARCH_xc16x 78#define ARCH_xtensa 79#define ARCH_z80 80#define ARCH_z8k 81#define INCLUDE_SHMEDIA 82#endif 83 84#ifdef ARCH_m32c 85#include "m32c-desc.h" 86#endif 87 88disassembler_ftype 89disassembler (abfd) 90 bfd *abfd; 91{ 92 enum bfd_architecture a = bfd_get_arch (abfd); 93 disassembler_ftype disassemble; 94 95 switch (a) 96 { 97 /* If you add a case to this table, also add it to the 98 ARCH_all definition right above this function. */ 99#ifdef ARCH_alpha 100 case bfd_arch_alpha: 101 disassemble = print_insn_alpha; 102 break; 103#endif 104#ifdef ARCH_arc 105 case bfd_arch_arc: 106 { 107 disassemble = arc_get_disassembler (abfd); 108 break; 109 } 110#endif 111#ifdef ARCH_arm 112 case bfd_arch_arm: 113 if (bfd_big_endian (abfd)) 114 disassemble = print_insn_big_arm; 115 else 116 disassemble = print_insn_little_arm; 117 break; 118#endif 119#ifdef ARCH_avr 120 case bfd_arch_avr: 121 disassemble = print_insn_avr; 122 break; 123#endif 124#ifdef ARCH_bfin 125 case bfd_arch_bfin: 126 disassemble = print_insn_bfin; 127 break; 128#endif 129#ifdef ARCH_cris 130 case bfd_arch_cris: 131 disassemble = cris_get_disassembler (abfd); 132 break; 133#endif 134#ifdef ARCH_crx 135 case bfd_arch_crx: 136 disassemble = print_insn_crx; 137 break; 138#endif 139#ifdef ARCH_d10v 140 case bfd_arch_d10v: 141 disassemble = print_insn_d10v; 142 break; 143#endif 144#ifdef ARCH_d30v 145 case bfd_arch_d30v: 146 disassemble = print_insn_d30v; 147 break; 148#endif 149#ifdef ARCH_dlx 150 case bfd_arch_dlx: 151 /* As far as I know we only handle big-endian DLX objects. */ 152 disassemble = print_insn_dlx; 153 break; 154#endif 155#ifdef ARCH_h8300 156 case bfd_arch_h8300: 157 if (bfd_get_mach (abfd) == bfd_mach_h8300h 158 || bfd_get_mach (abfd) == bfd_mach_h8300hn) 159 disassemble = print_insn_h8300h; 160 else if (bfd_get_mach (abfd) == bfd_mach_h8300s 161 || bfd_get_mach (abfd) == bfd_mach_h8300sn 162 || bfd_get_mach (abfd) == bfd_mach_h8300sx 163 || bfd_get_mach (abfd) == bfd_mach_h8300sxn) 164 disassemble = print_insn_h8300s; 165 else 166 disassemble = print_insn_h8300; 167 break; 168#endif 169#ifdef ARCH_h8500 170 case bfd_arch_h8500: 171 disassemble = print_insn_h8500; 172 break; 173#endif 174#ifdef ARCH_hppa 175 case bfd_arch_hppa: 176 disassemble = print_insn_hppa; 177 break; 178#endif 179#ifdef ARCH_i370 180 case bfd_arch_i370: 181 disassemble = print_insn_i370; 182 break; 183#endif 184#ifdef ARCH_i386 185 case bfd_arch_i386: 186 disassemble = print_insn_i386; 187 break; 188#endif 189#ifdef ARCH_i860 190 case bfd_arch_i860: 191 disassemble = print_insn_i860; 192 break; 193#endif 194#ifdef ARCH_i960 195 case bfd_arch_i960: 196 disassemble = print_insn_i960; 197 break; 198#endif 199#ifdef ARCH_ia64 200 case bfd_arch_ia64: 201 disassemble = print_insn_ia64; 202 break; 203#endif 204#ifdef ARCH_ip2k 205 case bfd_arch_ip2k: 206 disassemble = print_insn_ip2k; 207 break; 208#endif 209#ifdef ARCH_fr30 210 case bfd_arch_fr30: 211 disassemble = print_insn_fr30; 212 break; 213#endif 214#ifdef ARCH_m32r 215 case bfd_arch_m32r: 216 disassemble = print_insn_m32r; 217 break; 218#endif 219#if defined(ARCH_m68hc11) || defined(ARCH_m68hc12) 220 case bfd_arch_m68hc11: 221 disassemble = print_insn_m68hc11; 222 break; 223 case bfd_arch_m68hc12: 224 disassemble = print_insn_m68hc12; 225 break; 226#endif 227#ifdef ARCH_m68k 228 case bfd_arch_m68k: 229 disassemble = print_insn_m68k; 230 break; 231#endif 232#ifdef ARCH_m88k 233 case bfd_arch_m88k: 234 disassemble = print_insn_m88k; 235 break; 236#endif 237#ifdef ARCH_maxq 238 case bfd_arch_maxq: 239 disassemble = print_insn_maxq_little; 240 break; 241#endif 242#ifdef ARCH_mt 243 case bfd_arch_mt: 244 disassemble = print_insn_mt; 245 break; 246#endif 247#ifdef ARCH_msp430 248 case bfd_arch_msp430: 249 disassemble = print_insn_msp430; 250 break; 251#endif 252#ifdef ARCH_ns32k 253 case bfd_arch_ns32k: 254 disassemble = print_insn_ns32k; 255 break; 256#endif 257#ifdef ARCH_mcore 258 case bfd_arch_mcore: 259 disassemble = print_insn_mcore; 260 break; 261#endif 262#ifdef ARCH_mips 263 case bfd_arch_mips: 264 if (bfd_big_endian (abfd)) 265 disassemble = print_insn_big_mips; 266 else 267 disassemble = print_insn_little_mips; 268 break; 269#endif 270#ifdef ARCH_mmix 271 case bfd_arch_mmix: 272 disassemble = print_insn_mmix; 273 break; 274#endif 275#ifdef ARCH_mn10200 276 case bfd_arch_mn10200: 277 disassemble = print_insn_mn10200; 278 break; 279#endif 280#ifdef ARCH_mn10300 281 case bfd_arch_mn10300: 282 disassemble = print_insn_mn10300; 283 break; 284#endif 285#ifdef ARCH_openrisc 286 case bfd_arch_openrisc: 287 disassemble = print_insn_openrisc; 288 break; 289#endif 290#ifdef ARCH_or32 291 case bfd_arch_or32: 292 if (bfd_big_endian (abfd)) 293 disassemble = print_insn_big_or32; 294 else 295 disassemble = print_insn_little_or32; 296 break; 297#endif 298#ifdef ARCH_pdp11 299 case bfd_arch_pdp11: 300 disassemble = print_insn_pdp11; 301 break; 302#endif 303#ifdef ARCH_pj 304 case bfd_arch_pj: 305 disassemble = print_insn_pj; 306 break; 307#endif 308#ifdef ARCH_powerpc 309 case bfd_arch_powerpc: 310 if (bfd_big_endian (abfd)) 311 disassemble = print_insn_big_powerpc; 312 else 313 disassemble = print_insn_little_powerpc; 314 break; 315#endif 316#ifdef ARCH_rs6000 317 case bfd_arch_rs6000: 318 if (bfd_get_mach (abfd) == bfd_mach_ppc_620) 319 disassemble = print_insn_big_powerpc; 320 else 321 disassemble = print_insn_rs6000; 322 break; 323#endif 324#ifdef ARCH_s390 325 case bfd_arch_s390: 326 disassemble = print_insn_s390; 327 break; 328#endif 329#ifdef ARCH_sh 330 case bfd_arch_sh: 331 disassemble = print_insn_sh; 332 break; 333#endif 334#ifdef ARCH_sparc 335 case bfd_arch_sparc: 336 disassemble = print_insn_sparc; 337 break; 338#endif 339#ifdef ARCH_tic30 340 case bfd_arch_tic30: 341 disassemble = print_insn_tic30; 342 break; 343#endif 344#ifdef ARCH_tic4x 345 case bfd_arch_tic4x: 346 disassemble = print_insn_tic4x; 347 break; 348#endif 349#ifdef ARCH_tic54x 350 case bfd_arch_tic54x: 351 disassemble = print_insn_tic54x; 352 break; 353#endif 354#ifdef ARCH_tic80 355 case bfd_arch_tic80: 356 disassemble = print_insn_tic80; 357 break; 358#endif 359#ifdef ARCH_v850 360 case bfd_arch_v850: 361 disassemble = print_insn_v850; 362 break; 363#endif 364#ifdef ARCH_w65 365 case bfd_arch_w65: 366 disassemble = print_insn_w65; 367 break; 368#endif 369#ifdef ARCH_xstormy16 370 case bfd_arch_xstormy16: 371 disassemble = print_insn_xstormy16; 372 break; 373#endif 374#ifdef ARCH_xc16x 375 case bfd_arch_xc16x: 376 disassemble = print_insn_xc16x; 377 break; 378#endif 379#ifdef ARCH_xtensa 380 case bfd_arch_xtensa: 381 disassemble = print_insn_xtensa; 382 break; 383#endif 384#ifdef ARCH_z80 385 case bfd_arch_z80: 386 disassemble = print_insn_z80; 387 break; 388#endif 389#ifdef ARCH_z8k 390 case bfd_arch_z8k: 391 if (bfd_get_mach(abfd) == bfd_mach_z8001) 392 disassemble = print_insn_z8001; 393 else 394 disassemble = print_insn_z8002; 395 break; 396#endif 397#ifdef ARCH_vax 398 case bfd_arch_vax: 399 disassemble = print_insn_vax; 400 break; 401#endif 402#ifdef ARCH_frv 403 case bfd_arch_frv: 404 disassemble = print_insn_frv; 405 break; 406#endif 407#ifdef ARCH_iq2000 408 case bfd_arch_iq2000: 409 disassemble = print_insn_iq2000; 410 break; 411#endif 412#ifdef ARCH_m32c 413 case bfd_arch_m32c: 414 disassemble = print_insn_m32c; 415 break; 416#endif 417 default: 418 return 0; 419 } 420 return disassemble; 421} 422 423void 424disassembler_usage (stream) 425 FILE * stream ATTRIBUTE_UNUSED; 426{ 427#ifdef ARCH_arm 428 print_arm_disassembler_options (stream); 429#endif 430#ifdef ARCH_mips 431 print_mips_disassembler_options (stream); 432#endif 433#ifdef ARCH_powerpc 434 print_ppc_disassembler_options (stream); 435#endif 436 437 return; 438} 439 440void 441disassemble_init_for_target (struct disassemble_info * info) 442{ 443 if (info == NULL) 444 return; 445 446 switch (info->arch) 447 { 448#ifdef ARCH_arm 449 case bfd_arch_arm: 450 info->symbol_is_valid = arm_symbol_is_valid; 451 info->disassembler_needs_relocs = TRUE; 452 break; 453#endif 454#ifdef ARCH_ia64 455 case bfd_arch_ia64: 456 info->skip_zeroes = 16; 457 break; 458#endif 459#ifdef ARCH_tic4x 460 case bfd_arch_tic4x: 461 info->skip_zeroes = 32; 462 break; 463#endif 464#ifdef ARCH_m32c 465 case bfd_arch_m32c: 466 info->endian = BFD_ENDIAN_BIG; 467 if (! info->insn_sets) 468 { 469 info->insn_sets = cgen_bitset_create (ISA_MAX); 470 if (info->mach == bfd_mach_m16c) 471 cgen_bitset_set (info->insn_sets, ISA_M16C); 472 else 473 cgen_bitset_set (info->insn_sets, ISA_M32C); 474 } 475 break; 476#endif 477 default: 478 break; 479 } 480} 481