Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

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