Opdis 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env ruby
2
+ # Copyright 2010 Thoughtgang <http://www.thoughtgang.org>
3
+ # Print supported architectures to STDOUT
4
+
5
+ require 'Opdis'
6
+
7
+ if __FILE__ == $0
8
+
9
+ Opdis::Disassembler.architectures.each { |arch| puts arch }
10
+
11
+ end
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/env ruby
2
+ # Opdis Example: Visited Address Tracker
3
+ # Custom Visited Address Tracker used in control-flow disassembly of
4
+ # BFD entry point
5
+ # Copyright 2010 Thoughtgang <http://www.thoughtgang.org>
6
+
7
+ require 'BFD'
8
+ require 'Opdis'
9
+
10
+ # ----------------------------------------------------------------------
11
+ class CustomTracker < Opdis::VisitedAddressTracker
12
+
13
+ attr_reader :visited_addresses
14
+
15
+ def initialize()
16
+ @visited_addresses = {}
17
+ end
18
+
19
+ def visited?( insn )
20
+ return @visited_addresses.fetch(insn.vma, false)
21
+ end
22
+
23
+ def visit( insn )
24
+ @visited_addresses[insn.vma] = true
25
+ end
26
+
27
+ end
28
+
29
+ # ----------------------------------------------------------------------
30
+ # print an instruction in the standard disasm listing format:
31
+ # VMA 8_hex_bytes instruction
32
+ def print_insn(insn)
33
+ hex_str = insn.bytes.bytes.collect { |b| "%02X" % b }.join(' ')
34
+ puts "%08X %-23.23s %s" % [ insn.vma, hex_str, insn.ascii ]
35
+ end
36
+
37
+ # ----------------------------------------------------------------------
38
+ def disasm_entry( tgt )
39
+ # custom resolver to use in disassembler
40
+ tracker = CustomTracker.new
41
+
42
+ Opdis::Disassembler.new( :addr_tracker => tracker ) do |dis|
43
+
44
+ dis.disasm_entry( tgt ) do |insn|
45
+ # Store instruction as having been visited
46
+ tracker.visit(insn)
47
+
48
+ # Print instructions in order of VMA
49
+ end.values.sort_by{ |i| i.vma }.each { |i| print_insn(i) }
50
+ end
51
+ end
52
+
53
+ # ----------------------------------------------------------------------
54
+ if __FILE__ == $0
55
+ raise "Usage: #{$0} FILE [FILE...]" if ARGV.length == 0
56
+
57
+ ARGV.each do |filename|
58
+ Bfd::Target.new(filename) { |f| disasm_entry( f ) }
59
+ end
60
+
61
+ end
@@ -0,0 +1,46 @@
1
+ #!/usr/bin/env ruby
2
+ # Opdis Example: X86Decoder
3
+ # Custom X86 Decoder used in linear disassembly of array of bytes
4
+ # Copyright 2010 Thoughtgang <http://www.thoughtgang.org>
5
+
6
+ require 'BFD'
7
+ require 'Opdis'
8
+
9
+ # ----------------------------------------------------------------------
10
+ # Decoder that wraps X86AttDecoder.
11
+ class CustomX86Decoder < Opdis::X86Decoder
12
+
13
+ def decode(insn, hash)
14
+ # Invoke built-in X86 AT&T instruction decoder
15
+ super(insn, hash)
16
+ # TODO: something interesting
17
+ end
18
+
19
+ end
20
+
21
+ # ----------------------------------------------------------------------
22
+ # print an instruction in the standard disasm listing format:
23
+ # VMA 8_hex_bytes instruction
24
+ def print_insn(insn)
25
+ hex_str = insn.bytes.bytes.collect { |b| "%02X" % b }.join(' ')
26
+ puts "%08X %-23.23s %s" % [ insn.vma, hex_str, insn.ascii ]
27
+ end
28
+
29
+ # ----------------------------------------------------------------------
30
+ def disasm_bytes( bytes )
31
+ # custom decoder to use in disassembler
32
+ decoder = CustomX86Decoder.new
33
+
34
+ Opdis::Disassembler.new( :arch => 'x86', :insn_decoder => decoder ) do |dis|
35
+
36
+ dis.disassemble( bytes ) { |i| print_insn(i) }
37
+
38
+ end
39
+ end
40
+
41
+ # ----------------------------------------------------------------------
42
+ if __FILE__ == $0
43
+ raise "Usage: #{$0} BYTE [BYTE...]" if ARGV.length < 2
44
+
45
+ disasm_bytes( ARGV.collect { |b| b.hex } )
46
+ end
data/lib/Opdis.rb ADDED
@@ -0,0 +1,123 @@
1
+ #!/usr/bin/env/ruby1.0
2
+ # Copyright 2010 Thoughtgang <http://www.thoughtgang.org>
3
+ # Ruby additions to the Opdis module
4
+
5
+ require 'OpdisExt'
6
+ require 'tempfile' # for Disassembler#options
7
+
8
+ module Opdis
9
+
10
+ class Disassembler
11
+
12
+ =begin rdoc
13
+
14
+ The args parameter is a Hash which can contain any of the following members:
15
+
16
+ resolver:: AddressResolver object to use instead of the builtin
17
+ address resolver.
18
+
19
+ addr_tracker:: VisitedAddressTracker object to use instead of the built-in
20
+ address tracker.
21
+
22
+ insn_decoder:: InstructionDecoder object to use instead of the built-in
23
+ instruction decoder.
24
+
25
+ syntax:: Assembly language syntax to use; either SYNTAX_ATT (default) or
26
+ SYNTAX_INTEL.
27
+
28
+ debug:: Enable or disable libopdis debug mode.
29
+
30
+ options:: Options command-line string for libopcodes. See disassembler_usage()
31
+ in dis-asm.h for details.
32
+
33
+ arch:: The architecture to disassemble for. Use <i>arhcitectures</i> to
34
+ determine supported architectures.
35
+ =end
36
+
37
+ def self.new(args={})
38
+ dis = ext_new(args)
39
+ yield dis if (dis and block_given?)
40
+ return dis
41
+ end
42
+
43
+ =begin rdoc
44
+ Disassemble all bytes in a buffer. This is simply a wrapper for ext_disasm
45
+ that provides a default value for <i>args</i>.
46
+ See ext_disasm.
47
+ =end
48
+ def disassemble( target, args={}, &block ) # :yields: instruction
49
+ # Wrapper provides a default option
50
+ ext_disassemble(target, args, &block)
51
+ end
52
+
53
+ =begin rdoc
54
+ Convenience method for invoking disassemble() with STRATEGY_SINGLE.
55
+ =end
56
+ def disasm_single( target, args={}, &block )
57
+ args[:strategy] = STRATEGY_SINGLE
58
+ disassemble(target, args, &block)
59
+ end
60
+
61
+ =begin rdoc
62
+ Convenience method for invoking disassemble() with STRATEGY_LINEAR.
63
+ =end
64
+ def disasm_linear( target, args={}, &block )
65
+ args[:strategy] = STRATEGY_LINEAR
66
+ disassemble(target, args, &block)
67
+ end
68
+
69
+ =begin rdoc
70
+ Convenience method for invoking disassemble() with STRATEGY_CFLOW.
71
+ =end
72
+ def disasm_cflow( target, args={}, &block )
73
+ args[:strategy] = STRATEGY_CFLOW
74
+ disassemble(target, args, &block)
75
+ end
76
+
77
+ =begin rdoc
78
+ Convenience method for invoking disassemble() with STRATEGY_SECTION.
79
+ =end
80
+ def disasm_section( target, args={}, &block )
81
+ args[:strategy] = STRATEGY_SECTION
82
+ disassemble(target, args, &block)
83
+ end
84
+
85
+ =begin rdoc
86
+ Convenience method for invoking disassemble() with STRATEGY_SYMBOL.
87
+ =end
88
+ def disasm_symbol( target, args={}, &block )
89
+ args[:strategy] = STRATEGY_SYMBOL
90
+ disassemble(target, args, &block)
91
+ end
92
+
93
+ =begin rdoc
94
+ Convenience method for invoking disassemble() with STRATEGY_ENTRY.
95
+ =end
96
+ def disasm_entry( target, args={}, &block )
97
+ args[:strategy] = STRATEGY_ENTRY
98
+ disassemble(target, args, &block)
99
+ end
100
+
101
+ =begin rdoc
102
+ Convenience alias for disassemble().
103
+ =end
104
+ alias :disasm :disassemble
105
+
106
+ =begin rdoc
107
+ Return array of available disassembler options, as printed by libopcodes.
108
+ =end
109
+ def self.options()
110
+ opts = []
111
+ Tempfile.open("opcodes-options") do |tmp|
112
+ tmp.close
113
+ ext_usage(tmp)
114
+ tmp.open
115
+ opts.concat tmp.readlines
116
+ end
117
+
118
+ opts
119
+ end
120
+
121
+ end
122
+
123
+ end
data/module/Arch.c ADDED
@@ -0,0 +1,364 @@
1
+ /* Arch.c
2
+ * Disassembler definitions for architectures supported by libopcodes
3
+ * Copyright 2010 Thoughtgang <http://www.thoughtgang.org>
4
+ * Written by TG Community Developers <community@thoughtgang.org>
5
+ * Released under the GNU Public License, version 3.
6
+ * See http://www.gnu.org/licenses/gpl.txt for details.
7
+ */
8
+ #include <string.h>
9
+
10
+ #include "Arch.h"
11
+
12
+ static int generic_print_address_wrapper(bfd_vma vma, disassemble_info *info ) {
13
+ generic_print_address(vma, info);
14
+ return 1;
15
+ }
16
+
17
+ static const Opdis_disasm_def disasm_definitions[] = {
18
+ /* Goddamn GNU. They make it near-impossible to get a list of supported
19
+ * architectures at build OR run time. */
20
+ #ifdef ARCH_ALPHA
21
+ {"alpha", bfd_arch_alpha, bfd_mach_alpha_ev4, print_insn_alpha},
22
+ {"alphaev4", bfd_arch_alpha, bfd_mach_alpha_ev4,
23
+ print_insn_alpha},
24
+ {"alphaev5", bfd_arch_alpha, bfd_mach_alpha_ev5,
25
+ print_insn_alpha},
26
+ {"alphaev6", bfd_arch_alpha, bfd_mach_alpha_ev6,
27
+ print_insn_alpha},
28
+ #endif
29
+ #ifdef ARCH_ARM
30
+ {"big_arm", bfd_arch_arm, bfd_mach_arm_umknown,
31
+ print_insn_big_arm},
32
+ {"little_arm", bfd_arch_arm, bfd_mach_arm_unknown,
33
+ print_insn_little_arm},
34
+ // TODO: the other ARMs have to be big & little?
35
+ #endif
36
+ #ifdef ARCH_AVR
37
+ {"avr", bfd_arch_avr, bfd_mach_avr1, print_insn_avr},
38
+ {"avr1", bfd_arch_avr, bfd_mach_avr1, print_insn_avr},
39
+ {"avr2", bfd_arch_avr, bfd_mach_avr2, print_insn_avr},
40
+ {"avr25", bfd_arch_avr, bfd_mach_avr25, print_insn_avr},
41
+ {"avr3", bfd_arch_avr, bfd_mach_avr3, print_insn_avr},
42
+ {"avr31", bfd_arch_avr, bfd_mach_avr31, print_insn_avr},
43
+ {"avr35", bfd_arch_avr, bfd_mach_avr35, print_insn_avr},
44
+ {"avr4", bfd_arch_avr, bfd_mach_avr4, print_insn_avr},
45
+ {"avr5", bfd_arch_avr, bfd_mach_avr5, print_insn_avr},
46
+ {"avr51", bfd_arch_avr, bfd_mach_avr51, print_insn_avr},
47
+ {"avr6", bfd_arch_avr, bfd_mach_avr6, print_insn_avr},
48
+ #endif
49
+ #ifdef ARCH_BFIN
50
+ {"bfin", bfd_arch_bfin, bfd_mach_bfin, print_insn_bfin},
51
+ #endif
52
+
53
+ #ifdef ARCH_CR16
54
+ {"cr16", bfd_arch_cr16, bfd_mach_cr16, print_insn_cr16},
55
+ {"cr16c", bfd_arch_cr16c, bfd_mach_cr16c, print_insn_cr16},
56
+ #endif
57
+ #ifdef ARCH_CRX
58
+ {"crx", bfd_arch_crx, bfd_mach_crx, print_insn_crx},
59
+ #endif
60
+ #ifdef ARCH_D10V
61
+ {"d10v", bfd_arch_d10v, bfd_mach_d10v, print_insn_d10v},
62
+ {"d10v2", bfd_arch_d10v, bfd_mach_d10v_ts2, print_insn_d10v},
63
+ {"d10v3", bfd_arch_d10v, bfd_mach_d10v_ts3, print_insn_d10v},
64
+ #endif
65
+ #ifdef ARCH_D30V
66
+ {"d30v", bfd_arch_d30v, 0, print_insn_d30v},
67
+ #endif
68
+ #ifdef ARCH_DLX
69
+ {"dlx", bfd_arch_dlx, 0, print_insn_dlx},
70
+ #endif
71
+ #ifdef ARCH_FR30
72
+ {"fr30", bfd_arch_fr30, bfd_mach_fr30, print_insn_fr30},
73
+ #endif
74
+ #ifdef ARCH_FRV
75
+ {"frv", bfd_arch_frv, bfd_mach_frv, print_insn_frv},
76
+ {"frvsimple", bfd_arch_frv, bfd_mach_frvsimple, print_insn_frv},
77
+ {"fr300", bfd_arch_frv, bfd_mach_fr300, print_insn_frv},
78
+ {"fr400", bfd_arch_frv, bfd_mach_fr400, print_insn_frv},
79
+ {"fr450", bfd_arch_frv, bfd_mach_fr450, print_insn_frv},
80
+ {"frvtomcat", bfd_arch_frv, bfd_mach_frvtomcat, print_insn_frv},
81
+ {"fr500", bfd_arch_frv, bfd_mach_fr500, print_insn_frv},
82
+ {"fr550", bfd_arch_frv, bfd_mach_fr550, print_insn_frv},
83
+ #endif
84
+ #ifdef ARCH_H8300
85
+ {"h8300", bfd_arch_8300, bfd_mach_h8300, print_insn_h8300},
86
+ {"h8300h", bfd_arch_8300, bfd_mach_h8300h, print_insn_h8300h},
87
+ {"h8300hn", bfd_arch_8300, bfd_mach_h8300hn, print_insn_h8300h},
88
+ {"h8300s", bfd_arch_8300, bfd_mach_h8300s, print_insn_h8300s},
89
+ {"h8300sn", bfd_arch_8300, bfd_mach_h8300sn, print_insn_h8300s},
90
+ {"h8300sx", bfd_arch_8300, bfd_mach_h8300sx, print_insn_h8300s},
91
+ {"h8300sxn", bfd_arch_8300, bfd_mach_h8300sxn,
92
+ print_insn_h8300s},
93
+ #endif
94
+ #ifdef ARCH_H8500
95
+ {"h8500", bfd_arch_h8500, 0, print_insn_h8500},
96
+ #endif
97
+ #ifdef ARCH_HPPA
98
+ {"hppa", bfd_arch_hppa, bfd_mach_hppa10, print_insn_hppa},
99
+ {"hppa11", bfd_arch_hppa, bfd_mach_hppa11, print_insn_hppa},
100
+ {"hppa20", bfd_arch_hppa, bfd_mach_hppa20, print_insn_hppa},
101
+ {"hppa20w", bfd_arch_hppa, bfd_mach_hppa20w, print_insn_hppa},
102
+ #endif
103
+ #ifdef ARCH_I370
104
+ {"i370", bfd_arch_i370, 0, print_insn_i370},
105
+ #endif
106
+ #ifdef ARCH_I386
107
+ {"8086", bfd_arch_i386, bfd_mach_i386_i8086, print_insn_i386},
108
+ {"x86", bfd_arch_i386, bfd_mach_i386_i386, print_insn_i386},
109
+ {"x86_att", bfd_arch_i386, bfd_mach_i386_i386,
110
+ print_insn_i386_att},
111
+ {"x86_intel", bfd_arch_i386, bfd_mach_i386_i386_intel_syntax,
112
+ print_insn_i386_intel},
113
+ {"x86_64", bfd_arch_i386, bfd_mach_x86_64, print_insn_i386},
114
+ {"x86_64_att", bfd_arch_i386, bfd_mach_x86_64, print_insn_i386},
115
+ {"x86_64_intel", bfd_arch_i386, bfd_mach_x86_64_intel_syntax,
116
+ print_insn_i386},
117
+ #endif
118
+ #ifdef ARCH_i860
119
+ {"i860", bfd_arch_i860, 0, print_insn_i860},
120
+ #endif
121
+ #ifdef ARCH_i960
122
+ {"i960", bfd_arch_i960, bfd_mach_i960_core, print_insn_i960},
123
+ {"i960_hx", bfd_arch_i960, bfd_mach_i960_hx, print_insn_i960},
124
+ #endif
125
+ #ifdef ARCH_ia64
126
+ {"ia64", bfd_arch_ia64, bfd_mach_ia64_elf64, print_insn_ia64},
127
+ {"ia64_32", bfd_arch_ia64, bfd_mach_ia64_elf32,
128
+ print_insn_ia64},
129
+ #endif
130
+ #ifdef ARCH_IP2K
131
+ {"ip2k", bfd_arch_ip2k, bfd_mach_ip2022, print_insn_ip2k},
132
+ {"ip2kext", bfd_arch_ip2k, bfd_mach_ip2022ext, print_insn_ip2k},
133
+ #endif
134
+ #ifdef ARCH_IQ2000
135
+ {"iq2000", bfd_arch_iq2000, bfd_mach_iq2000, print_insn_iq2000},
136
+ {"iq10", bfd_arch_iq2000, bfd_mach_iq10, print_insn_iq2000},
137
+ #endif
138
+ #ifdef ARCH_LM32
139
+ {"lm32", bfd_arch_lm32, bfd_mach_lm32, print_insn_lm32},
140
+ #endif
141
+ #ifdef ARCH_M32C
142
+ {"m32c", bfd_arch_m32c, bfd_mach_m32c, print_insn_m32c},
143
+ {"m16c", bfd_arch_m32c, bfd_mach_m16c, print_insn_m32c},
144
+ #endif
145
+ #ifdef ARCH_M32R
146
+ {"m32r", bfd_arch_m32r, bfd_mach_m32r, print_insn_m32r},
147
+ {"m32rx", bfd_arch_m32r, bfd_mach_m32rx, print_insn_m32r},
148
+ {"m32r2", bfd_arch_m32r, bfd_mach_m32r2, print_insn_m32r},
149
+ #endif
150
+ #ifdef ARCH_M68HC11
151
+ {"m68hc11", bfd_arch_m68hc11, 0, print_insn_m68hc11},
152
+ #endif
153
+ #ifdef ARCH_M68HC12
154
+ {"m68hc12", bfd_arch_m68hc12, bfd_mach_m6812_default,
155
+ print_insn_m68hc12},
156
+ {"m68hc12s", bfd_arch_m68hc12, bfd_mach_m6812s,
157
+ print_insn_m68hc12},
158
+ #endif
159
+ #ifdef ARCH_M68K
160
+ {"m68k", bfd_arch_m68k, bfd_mach_m68000, print_insn_m68k},
161
+ {"m68008", bfd_arch_m68k, bfd_mach_m68008, print_insn_m68k},
162
+ {"m68010", bfd_arch_m68k, bfd_mach_m68010, print_insn_m68k},
163
+ {"m68020", bfd_arch_m68k, bfd_mach_m68020, print_insn_m68k},
164
+ {"m68030", bfd_arch_m68k, bfd_mach_m68030, print_insn_m68k},
165
+ {"m68040", bfd_arch_m68k, bfd_mach_m68040, print_insn_m68k},
166
+ {"m68060", bfd_arch_m68k, bfd_mach_m68060, print_insn_m68k},
167
+ {"m68060", bfd_arch_m68k, bfd_mach_m68060, print_insn_m68k},
168
+ {"m68k_cpu32", bfd_arch_m68k, bfd_mach_cpu32, print_insn_m68k},
169
+ {"m68k_fido", bfd_arch_m68k, bfd_mach_fido, print_insn_m68k},
170
+ #endif
171
+ #ifdef ARCH_M88K
172
+ {"m88k", bfd_arch_m88k, 0, print_insn_m88k},
173
+ #endif
174
+ #ifdef ARCH_MAXQ
175
+ {"maxq_big", bfd_arch_maxq, 0, print_insn_maxq_big},
176
+ {"maxq_little", bfd_arch_maxq, 0, print_insn_maxq_little},
177
+ {"maxq10_big", bfd_arch_maxq, bfd_mach_maxq10,
178
+ print_insn_maxq_big},
179
+ {"maxq10_little", bfd_arch_maxq, bfd_mach_maxq10,
180
+ print_insn_maxq_little},
181
+ {"maxq20_big", bfd_arch_maxq, bfd_mach_maxq20,
182
+ print_insn_maxq_big},
183
+ {"maxq20_little", bfd_arch_maxq, bfd_mach_maxq20,
184
+ print_insn_maxq_little},
185
+ #endif
186
+ #ifdef ARCH_MCORE
187
+ {"mcore", bfd_arch_mcore, 0, print_insn_mcore},
188
+ #endif
189
+ #ifdef ARCH_MEP
190
+ {"mep", bfd_arch_mep, 0, print_insn_mep},
191
+ #endif
192
+ #ifdef ARCH_MICROBLAZE
193
+ {"microblaze", bfd_arch_microblaze, print_insn_microblaze},
194
+ #endif
195
+ #ifdef ARCH_MIPS
196
+ {"big_mips", bfd_arch_mips, 0, print_insn_big_mips},
197
+ {"little_mips", bfd_arch_mips, 0, print_insn_little_mips},
198
+ #endif
199
+ #ifdef ARCH_MMIX
200
+ {"mmix", bfd_arch_mmix, 0, print_insn_mmix},
201
+ #endif
202
+ #ifdef ARCH_MN10200
203
+ {"mn10200", bfd_arch_mn10200, 0, print_insn_mn10200},
204
+ #endif
205
+ #ifdef ARCH_MN10300
206
+ {"mn10300", bfd_arch_mn10300, bfd_mach_mn10300,
207
+ print_insn_mn10300},
208
+ #endif
209
+ #ifdef ARCH_MOXIE
210
+ {"moxie", bfd_arch_moxie, bfd_mach_moxie, print_insn_moxie},
211
+ #endif
212
+ #ifdef ARCH_MSP430
213
+ {"msp430", bfd_arch_msp430, 0, print_insn_msp430},
214
+ #endif
215
+ #ifdef ARCH_MT
216
+ {"mt", bfd_arch_mt, 0, print_insn_mt},
217
+ #endif
218
+ #ifdef ARCH_NS32K
219
+ {"ns32k", bfd_arch_ns32k, 0, print_insn_ns32k},
220
+ #endif
221
+ #ifdef ARCH_OPENRISC
222
+ {"openrisc", bfd_arch_openrisc, 0, print_insn_openrisc},
223
+ #endif
224
+ #ifdef ARCH_OR32
225
+ {"big_or32", bfd_arch_or32, 0, print_insn_big_or32},
226
+ {"little_or32", bfd_arch_or32, 0, print_insn_little_or32},
227
+ #endif
228
+ #ifdef ARCH_PDP11
229
+ {"pdp11", bfd_arch_pdp11, 0, print_insn_pdp11},
230
+ #endif
231
+ #ifdef ARCH_PJ
232
+ {"pj", bfd_arch_pj, 0, print_insn_pj},
233
+ #endif
234
+ #ifdef ARCH_POWERPC
235
+ {"big_powerpc", bfd_arch_powerpc, 0, print_insn_big_powerpc},
236
+ {"little_powerpc", bfd_arch_powerpc, 0,
237
+ print_insn_little_powerpc},
238
+ {"big_powerpc32", bfd_arch_powerpc, bfd_mach_ppc,
239
+ print_insn_big_powerpc},
240
+ {"little_powerpc32", bfd_arch_powerpc, bfd_mach_ppc,
241
+ print_insn_little_powerpc},
242
+ {"big_powerpc64", bfd_arch_powerpc, bfd_mach_ppc64,
243
+ print_insn_big_powerpc},
244
+ {"little_powerpc64", bfd_arch_powerpc, bfd_mach_ppc64,
245
+ print_insn_little_powerpc},
246
+ #endif
247
+ #ifdef ARCH_RS6000
248
+ {"rs6000", bfd_arch_rs6000, bfd_mach_rs6k, print_insn_rs6000},
249
+ #endif
250
+ #ifdef ARCH_S390
251
+ {"s390", bfd_arch_s390, 0, print_insn_s390},
252
+ #endif
253
+ #ifdef ARCH_SCORE
254
+ {"big_score", bfd_arch_score, 0, print_insn_big_score},
255
+ {"little_score", bfd_arch_score, 0, print_insn_little_score},
256
+ #endif
257
+ #ifdef ARCH_SH
258
+ {"sh", bfd_arch_sh, bfd_mach_sh, print_insn_sh},
259
+ {"sh2", bfd_arch_sh, bfd_mach_sh2, print_insn_sh},
260
+ {"sh3", bfd_arch_sh, bfd_mach_sh3, print_insn_sh},
261
+ {"sh4", bfd_arch_sh, bfd_mach_sh4, print_insn_sh},
262
+ {"sh5", bfd_arch_sh, bfd_mach_sh5, print_insn_sh},
263
+ {"sh_dsp", bfd_arch_sh, bfd_mach_sh_dsp, print_insn_sh},
264
+ {"sh64", bfd_arch_sh, bfd_mach_sh, print_insn_sh64},
265
+ {"sh64x_media", bfd_mach_sh, bfd_mach_sh,
266
+ print_insn_sh64x_media},
267
+ #endif
268
+ #ifdef ARCH_SPARC
269
+ {"sparc", bfd_arch_sparc, bfd_mach_sparc, print_insn_sparc},
270
+ {"sparclite", bfd_arch_sparc, bfd_mach_sparc_sparclite,
271
+ print_insn_sparc},
272
+ {"sparclitev9", bfd_arch_sparc, bfd_mach_sparc_v9,
273
+ print_insn_sparc},
274
+ #endif
275
+ #ifdef ARCH_SPU
276
+ {"spu", bfd_arch_spu, bfd_mach_spu, print_insn_spu},
277
+ #endif
278
+ #ifdef ARCH_TIC30
279
+ {"tic30", bfd_arch_tic30, 0, print_insn_tic30},
280
+ #endif
281
+ #ifdef ARCH_TIC4X
282
+ {"tic3x", bfd_arch_tic4x, bfd_mach_tic3x, print_insn_tic4x},
283
+ {"tic4x", bfd_arch_tic4x, bfd_mach_tic4x, print_insn_tic4x},
284
+ #endif
285
+ #ifdef ARCH_TIC54X
286
+ {"tic54x", bfd_arch_tic54x, 0, print_insn_tic54x},
287
+ #endif
288
+ #ifdef ARCH_TIC80
289
+ {"tic80", bfd_arch_tic80, 0, print_insn_tic80},
290
+ #endif
291
+ #ifdef ARCH_V850
292
+ {"v850", bfd_arch_v850, bfd_mach_v850, print_insn_v850},
293
+ #endif
294
+ #ifdef ARCH_VAX
295
+ {"vax", bfd_arch_vax, 0, print_insn_vax},
296
+ #endif
297
+ #ifdef ARCH_W65
298
+ {"w65", bfd_arch_w65, 0, print_insn_w65},
299
+ #endif
300
+ #ifdef ARCH_XC16X
301
+ {"xc16x", bfd_arch_xc16x, bfd_mach_xc16x, print_insn_xc16x},
302
+ #endif
303
+ #ifdef ARCH_XSTORMY16
304
+ {"xstormy16", bfd_arch_xstormy16, bfd_mach_xstormy16,
305
+ print_insn_xstormy16},
306
+ #endif
307
+ #ifdef ARCH_XTENSA
308
+ {"xtensa", bfd_arch_xtensa, bfd_mach_xtensa, print_insn_xtensa},
309
+ #endif
310
+ #ifdef ARCH_Z80
311
+ {"z80", bfd_arch_z80, bfd_mach_z80full, print_insn_z80},
312
+ {"z80strict", bfd_arch_z80, bfd_mach_z80strict, print_insn_z80},
313
+ {"r800", bfd_arch_z80, bfd_mach_r800, print_insn_z80},
314
+ #endif
315
+ #ifdef ARCH_Z8K
316
+ {"z8001", bfd_arch_z8k, bfd_mach_z8001, print_insn_z8001},
317
+ {"z8002", bfd_arch_z8k, bfd_mach_z8002, print_insn_z8002},
318
+ #endif
319
+ /* NULL entry to ensure table ends up ok */
320
+ {"INVALID", bfd_arch_unknown, 0, generic_print_address_wrapper}
321
+ };
322
+
323
+ void Opdis_disasm_iter( OPDIS_DISASM_ITER_FN fn, void * arg ) {
324
+ int i;
325
+ int num_defs = sizeof(disasm_definitions) / sizeof(Opdis_disasm_def);
326
+
327
+ if (! fn ) {
328
+ return;
329
+ }
330
+
331
+ for ( i = 0; i < num_defs; i++ ) {
332
+ const Opdis_disasm_def *def = &disasm_definitions[i];
333
+ if (! fn( def, arg ) ) {
334
+ break;
335
+ }
336
+ }
337
+ }
338
+
339
+ struct disasm_find_name_arg {
340
+ const char * name;
341
+ const Opdis_disasm_def * def;
342
+ };
343
+
344
+ static int is_named_def( const Opdis_disasm_def * def, void * arg ) {
345
+ struct disasm_find_name_arg * out = (struct disasm_find_name_arg *) arg;
346
+ if (! strcmp( out->name, def->name ) ) {
347
+ out->def = def;
348
+ return 0;
349
+ }
350
+
351
+ return 1;
352
+ }
353
+
354
+ const Opdis_disasm_def * Opdis_disasm_for_name( const char * name ) {
355
+ struct disasm_find_name_arg arg = { name, Opdis_disasm_invalid() };
356
+ Opdis_disasm_iter( is_named_def, &arg );
357
+ return arg.def;
358
+ }
359
+
360
+ const Opdis_disasm_def * Opdis_disasm_invalid( void ) {
361
+ int num_defs = sizeof(disasm_definitions) / sizeof(Opdis_disasm_def);
362
+ return &disasm_definitions[num_defs-1];
363
+ }
364
+