00001 /* 00002 * Copyright 2003, 2004, 2005, 2006 PathScale, Inc. All Rights Reserved. 00003 */ 00004 00005 /* Select disassembly routine for specified architecture. 00006 Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 00007 2004, 2005 Free Software Foundation, Inc. 00008 00009 This program is free software; you can redistribute it and/or modify 00010 it under the terms of the GNU General Public License as published by 00011 the Free Software Foundation; either version 2 of the License, or 00012 (at your option) any later version. 00013 00014 This program is distributed in the hope that it will be useful, 00015 but WITHOUT ANY WARRANTY; without even the implied warranty of 00016 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00017 GNU General Public License for more details. 00018 00019 You should have received a copy of the GNU General Public License 00020 along with this program; if not, write to the Free Software 00021 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ 00022 00023 #include "sysdep.h" 00024 #include "dis-asm.h" 00025 00026 #ifdef ARCH_all 00027 #define ARCH_a29k 00028 #define ARCH_alpha 00029 #define ARCH_arc 00030 #define ARCH_arm 00031 #define ARCH_avr 00032 #define ARCH_cris 00033 #define ARCH_crx 00034 #define ARCH_d10v 00035 #define ARCH_d30v 00036 #define ARCH_dlx 00037 #define ARCH_h8300 00038 #define ARCH_h8500 00039 #define ARCH_hppa 00040 #define ARCH_i370 00041 #define ARCH_i386 00042 #define ARCH_i860 00043 #define ARCH_i960 00044 #define ARCH_ip2k 00045 #define ARCH_ia64 00046 #define ARCH_fr30 00047 #define ARCH_m32r 00048 #define ARCH_m68k 00049 #define ARCH_m68hc11 00050 #define ARCH_m68hc12 00051 #define ARCH_m88k 00052 #define ARCH_maxq 00053 #define ARCH_mcore 00054 #define ARCH_mips 00055 #define ARCH_mmix 00056 #define ARCH_mn10200 00057 #define ARCH_mn10300 00058 #define ARCH_msp430 00059 #define ARCH_ns32k 00060 #define ARCH_openrisc 00061 #define ARCH_or32 00062 #define ARCH_pdp11 00063 #define ARCH_pj 00064 #define ARCH_powerpc 00065 #define ARCH_rs6000 00066 #define ARCH_s390 00067 #define ARCH_sh 00068 #define ARCH_sparc 00069 #define ARCH_tic30 00070 #define ARCH_tic4x 00071 #define ARCH_tic54x 00072 #define ARCH_tic80 00073 #define ARCH_v850 00074 #define ARCH_vax 00075 #define ARCH_w65 00076 #define ARCH_xstormy16 00077 #define ARCH_xtensa 00078 #define ARCH_z8k 00079 #define ARCH_frv 00080 #define ARCH_iq2000 00081 #define INCLUDE_SHMEDIA 00082 #endif 00083 00084 00085 disassembler_ftype 00086 disassembler (abfd) 00087 bfd *abfd; 00088 { 00089 enum bfd_architecture a = bfd_get_arch (abfd); 00090 disassembler_ftype disassemble; 00091 00092 switch (a) 00093 { 00094 /* If you add a case to this table, also add it to the 00095 ARCH_all definition right above this function. */ 00096 #ifdef ARCH_a29k 00097 case bfd_arch_a29k: 00098 /* As far as I know we only handle big-endian 29k objects. */ 00099 disassemble = print_insn_big_a29k; 00100 break; 00101 #endif 00102 #ifdef ARCH_alpha 00103 case bfd_arch_alpha: 00104 disassemble = print_insn_alpha; 00105 break; 00106 #endif 00107 #ifdef ARCH_arc 00108 case bfd_arch_arc: 00109 { 00110 disassemble = arc_get_disassembler (abfd); 00111 break; 00112 } 00113 #endif 00114 #ifdef ARCH_arm 00115 case bfd_arch_arm: 00116 if (bfd_big_endian (abfd)) 00117 disassemble = print_insn_big_arm; 00118 else 00119 disassemble = print_insn_little_arm; 00120 break; 00121 #endif 00122 #ifdef ARCH_avr 00123 case bfd_arch_avr: 00124 disassemble = print_insn_avr; 00125 break; 00126 #endif 00127 #ifdef ARCH_cris 00128 case bfd_arch_cris: 00129 disassemble = cris_get_disassembler (abfd); 00130 break; 00131 #endif 00132 #ifdef ARCH_crx 00133 case bfd_arch_crx: 00134 disassemble = print_insn_crx; 00135 break; 00136 #endif 00137 #ifdef ARCH_d10v 00138 case bfd_arch_d10v: 00139 disassemble = print_insn_d10v; 00140 break; 00141 #endif 00142 #ifdef ARCH_d30v 00143 case bfd_arch_d30v: 00144 disassemble = print_insn_d30v; 00145 break; 00146 #endif 00147 #ifdef ARCH_dlx 00148 case bfd_arch_dlx: 00149 /* As far as I know we only handle big-endian DLX objects. */ 00150 disassemble = print_insn_dlx; 00151 break; 00152 #endif 00153 #ifdef ARCH_h8300 00154 case bfd_arch_h8300: 00155 if (bfd_get_mach (abfd) == bfd_mach_h8300h 00156 || bfd_get_mach (abfd) == bfd_mach_h8300hn) 00157 disassemble = print_insn_h8300h; 00158 else if (bfd_get_mach (abfd) == bfd_mach_h8300s 00159 || bfd_get_mach (abfd) == bfd_mach_h8300sn 00160 || bfd_get_mach (abfd) == bfd_mach_h8300sx 00161 || bfd_get_mach (abfd) == bfd_mach_h8300sxn) 00162 disassemble = print_insn_h8300s; 00163 else 00164 disassemble = print_insn_h8300; 00165 break; 00166 #endif 00167 #ifdef ARCH_h8500 00168 case bfd_arch_h8500: 00169 disassemble = print_insn_h8500; 00170 break; 00171 #endif 00172 #ifdef ARCH_hppa 00173 case bfd_arch_hppa: 00174 disassemble = print_insn_hppa; 00175 break; 00176 #endif 00177 #ifdef ARCH_i370 00178 case bfd_arch_i370: 00179 disassemble = print_insn_i370; 00180 break; 00181 #endif 00182 #ifdef ARCH_i386 00183 case bfd_arch_i386: 00184 disassemble = print_insn_i386; 00185 break; 00186 #endif 00187 #ifdef ARCH_i860 00188 case bfd_arch_i860: 00189 disassemble = print_insn_i860; 00190 break; 00191 #endif 00192 #ifdef ARCH_i960 00193 case bfd_arch_i960: 00194 disassemble = print_insn_i960; 00195 break; 00196 #endif 00197 #ifdef ARCH_ia64 00198 case bfd_arch_ia64: 00199 disassemble = print_insn_ia64; 00200 break; 00201 #endif 00202 #ifdef ARCH_ip2k 00203 case bfd_arch_ip2k: 00204 disassemble = print_insn_ip2k; 00205 break; 00206 #endif 00207 #ifdef ARCH_fr30 00208 case bfd_arch_fr30: 00209 disassemble = print_insn_fr30; 00210 break; 00211 #endif 00212 #ifdef ARCH_m32r 00213 case bfd_arch_m32r: 00214 disassemble = print_insn_m32r; 00215 break; 00216 #endif 00217 #if defined(ARCH_m68hc11) || defined(ARCH_m68hc12) 00218 case bfd_arch_m68hc11: 00219 disassemble = print_insn_m68hc11; 00220 break; 00221 case bfd_arch_m68hc12: 00222 disassemble = print_insn_m68hc12; 00223 break; 00224 #endif 00225 #ifdef ARCH_m68k 00226 case bfd_arch_m68k: 00227 disassemble = print_insn_m68k; 00228 break; 00229 #endif 00230 #ifdef ARCH_m88k 00231 case bfd_arch_m88k: 00232 disassemble = print_insn_m88k; 00233 break; 00234 #endif 00235 #ifdef ARCH_maxq 00236 case bfd_arch_maxq: 00237 disassemble = print_insn_maxq_little; 00238 break; 00239 #endif 00240 #ifdef ARCH_msp430 00241 case bfd_arch_msp430: 00242 disassemble = print_insn_msp430; 00243 break; 00244 #endif 00245 #ifdef ARCH_ns32k 00246 case bfd_arch_ns32k: 00247 disassemble = print_insn_ns32k; 00248 break; 00249 #endif 00250 #ifdef ARCH_mcore 00251 case bfd_arch_mcore: 00252 disassemble = print_insn_mcore; 00253 break; 00254 #endif 00255 #ifdef ARCH_mips 00256 case bfd_arch_mips: 00257 if (bfd_big_endian (abfd)) 00258 disassemble = print_insn_big_mips; 00259 else 00260 disassemble = print_insn_little_mips; 00261 break; 00262 #endif 00263 #ifdef ARCH_mmix 00264 case bfd_arch_mmix: 00265 disassemble = print_insn_mmix; 00266 break; 00267 #endif 00268 #ifdef ARCH_mn10200 00269 case bfd_arch_mn10200: 00270 disassemble = print_insn_mn10200; 00271 break; 00272 #endif 00273 #ifdef ARCH_mn10300 00274 case bfd_arch_mn10300: 00275 disassemble = print_insn_mn10300; 00276 break; 00277 #endif 00278 #ifdef ARCH_openrisc 00279 case bfd_arch_openrisc: 00280 disassemble = print_insn_openrisc; 00281 break; 00282 #endif 00283 #ifdef ARCH_or32 00284 case bfd_arch_or32: 00285 if (bfd_big_endian (abfd)) 00286 disassemble = print_insn_big_or32; 00287 else 00288 disassemble = print_insn_little_or32; 00289 break; 00290 #endif 00291 #ifdef ARCH_pdp11 00292 case bfd_arch_pdp11: 00293 disassemble = print_insn_pdp11; 00294 break; 00295 #endif 00296 #ifdef ARCH_pj 00297 case bfd_arch_pj: 00298 disassemble = print_insn_pj; 00299 break; 00300 #endif 00301 #ifdef ARCH_powerpc 00302 case bfd_arch_powerpc: 00303 if (bfd_big_endian (abfd)) 00304 disassemble = print_insn_big_powerpc; 00305 else 00306 disassemble = print_insn_little_powerpc; 00307 break; 00308 #endif 00309 #ifdef ARCH_rs6000 00310 case bfd_arch_rs6000: 00311 if (bfd_get_mach (abfd) == bfd_mach_ppc_620) 00312 disassemble = print_insn_big_powerpc; 00313 else 00314 disassemble = print_insn_rs6000; 00315 break; 00316 #endif 00317 #ifdef ARCH_s390 00318 case bfd_arch_s390: 00319 disassemble = print_insn_s390; 00320 break; 00321 #endif 00322 #ifdef ARCH_sh 00323 case bfd_arch_sh: 00324 disassemble = print_insn_sh; 00325 break; 00326 #endif 00327 #ifdef ARCH_sparc 00328 case bfd_arch_sparc: 00329 disassemble = print_insn_sparc; 00330 break; 00331 #endif 00332 #ifdef ARCH_tic30 00333 case bfd_arch_tic30: 00334 disassemble = print_insn_tic30; 00335 break; 00336 #endif 00337 #ifdef ARCH_tic4x 00338 case bfd_arch_tic4x: 00339 disassemble = print_insn_tic4x; 00340 break; 00341 #endif 00342 #ifdef ARCH_tic54x 00343 case bfd_arch_tic54x: 00344 disassemble = print_insn_tic54x; 00345 break; 00346 #endif 00347 #ifdef ARCH_tic80 00348 case bfd_arch_tic80: 00349 disassemble = print_insn_tic80; 00350 break; 00351 #endif 00352 #ifdef ARCH_v850 00353 case bfd_arch_v850: 00354 disassemble = print_insn_v850; 00355 break; 00356 #endif 00357 #ifdef ARCH_w65 00358 case bfd_arch_w65: 00359 disassemble = print_insn_w65; 00360 break; 00361 #endif 00362 #ifdef ARCH_xstormy16 00363 case bfd_arch_xstormy16: 00364 disassemble = print_insn_xstormy16; 00365 break; 00366 #endif 00367 #ifdef ARCH_xtensa 00368 case bfd_arch_xtensa: 00369 disassemble = print_insn_xtensa; 00370 break; 00371 #endif 00372 #ifdef ARCH_z8k 00373 case bfd_arch_z8k: 00374 if (bfd_get_mach(abfd) == bfd_mach_z8001) 00375 disassemble = print_insn_z8001; 00376 else 00377 disassemble = print_insn_z8002; 00378 break; 00379 #endif 00380 #ifdef ARCH_vax 00381 case bfd_arch_vax: 00382 disassemble = print_insn_vax; 00383 break; 00384 #endif 00385 #ifdef ARCH_frv 00386 case bfd_arch_frv: 00387 disassemble = print_insn_frv; 00388 break; 00389 #endif 00390 #ifdef ARCH_iq2000 00391 case bfd_arch_iq2000: 00392 disassemble = print_insn_iq2000; 00393 break; 00394 #endif 00395 default: 00396 return 0; 00397 } 00398 return disassemble; 00399 } 00400 00401 void 00402 disassembler_usage (stream) 00403 FILE * stream ATTRIBUTE_UNUSED; 00404 { 00405 #ifdef ARCH_arm 00406 print_arm_disassembler_options (stream); 00407 #endif 00408 #ifdef ARCH_mips 00409 print_mips_disassembler_options (stream); 00410 #endif 00411 #ifdef ARCH_powerpc 00412 print_ppc_disassembler_options (stream); 00413 #endif 00414 00415 return; 00416 } 00417 00418 void 00419 disassemble_init_for_target (struct disassemble_info * info) 00420 { 00421 if (info == NULL) 00422 return; 00423 00424 switch (info->arch) 00425 { 00426 #ifdef ARCH_arm 00427 case bfd_arch_arm: 00428 info->symbol_is_valid = arm_symbol_is_valid; 00429 break; 00430 #endif 00431 #ifdef ARCH_ia64 00432 case bfd_arch_ia64: 00433 info->skip_zeroes = 16; 00434 break; 00435 #endif 00436 #ifdef ARCH_tic4x 00437 case bfd_arch_tic4x: 00438 info->skip_zeroes = 32; 00439 #endif 00440 default: 00441 break; 00442 } 00443 }
1.5.6