evoasm 0.0.2.pre7 → 0.1.0.pre2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (168) hide show
  1. checksums.yaml +4 -4
  2. data/.gdbinit +41 -0
  3. data/.gitignore +1 -2
  4. data/.gitmodules +3 -0
  5. data/.rubocop.yml +8 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE.md +660 -0
  8. data/Makefile +1 -1
  9. data/README.md +17 -9
  10. data/Rakefile +39 -107
  11. data/bin/gdb +1 -1
  12. data/bin/gdb_loop +4 -0
  13. data/docs/FindingInstructions.md +17 -0
  14. data/docs/JIT.md +14 -0
  15. data/docs/SymbolicRegression.md +102 -0
  16. data/docs/Visualization.md +29 -0
  17. data/docs/examples/bit_insts.rb +44 -0
  18. data/docs/examples/jit.rb +26 -0
  19. data/docs/examples/loss.gif +0 -0
  20. data/docs/examples/program.png +0 -0
  21. data/docs/examples/sym_reg.rb +64 -0
  22. data/docs/examples/vis.rb +38 -0
  23. data/evoasm.gemspec +21 -15
  24. data/ext/evoasm_ext/Rakefile +3 -0
  25. data/ext/evoasm_ext/compile.rake +35 -0
  26. data/ext/evoasm_ext/libevoasm/src/evoasm-alloc.c +226 -0
  27. data/ext/evoasm_ext/libevoasm/src/evoasm-alloc.h +84 -0
  28. data/ext/evoasm_ext/libevoasm/src/evoasm-arch.c +52 -0
  29. data/ext/evoasm_ext/libevoasm/src/evoasm-arch.h +101 -0
  30. data/ext/evoasm_ext/libevoasm/src/evoasm-bitmap.h +158 -0
  31. data/ext/evoasm_ext/libevoasm/src/evoasm-buf.c +204 -0
  32. data/ext/evoasm_ext/libevoasm/src/evoasm-buf.h +109 -0
  33. data/ext/evoasm_ext/libevoasm/src/evoasm-domain.c +124 -0
  34. data/ext/evoasm_ext/libevoasm/src/evoasm-domain.h +279 -0
  35. data/ext/evoasm_ext/libevoasm/src/evoasm-error.c +65 -0
  36. data/ext/evoasm_ext/libevoasm/src/evoasm-error.h +108 -0
  37. data/ext/evoasm_ext/{evoasm-log.c → libevoasm/src/evoasm-log.c} +36 -18
  38. data/ext/evoasm_ext/libevoasm/src/evoasm-log.h +93 -0
  39. data/ext/evoasm_ext/libevoasm/src/evoasm-param.c +22 -0
  40. data/ext/evoasm_ext/libevoasm/src/evoasm-param.h +33 -0
  41. data/ext/evoasm_ext/libevoasm/src/evoasm-pop-params.c +192 -0
  42. data/ext/evoasm_ext/libevoasm/src/evoasm-pop-params.h +60 -0
  43. data/ext/evoasm_ext/libevoasm/src/evoasm-pop.c +1323 -0
  44. data/ext/evoasm_ext/libevoasm/src/evoasm-pop.h +107 -0
  45. data/ext/evoasm_ext/libevoasm/src/evoasm-program-io.c +116 -0
  46. data/ext/evoasm_ext/libevoasm/src/evoasm-program-io.h +60 -0
  47. data/ext/evoasm_ext/libevoasm/src/evoasm-program.c +1827 -0
  48. data/ext/evoasm_ext/libevoasm/src/evoasm-program.h +167 -0
  49. data/ext/evoasm_ext/libevoasm/src/evoasm-rand.c +65 -0
  50. data/ext/evoasm_ext/libevoasm/src/evoasm-rand.h +76 -0
  51. data/ext/evoasm_ext/libevoasm/src/evoasm-signal.c +106 -0
  52. data/ext/evoasm_ext/libevoasm/src/evoasm-signal.h +58 -0
  53. data/ext/evoasm_ext/libevoasm/src/evoasm-util.h +112 -0
  54. data/ext/evoasm_ext/libevoasm/src/evoasm-x64.c +925 -0
  55. data/ext/evoasm_ext/libevoasm/src/evoasm-x64.h +277 -0
  56. data/ext/evoasm_ext/libevoasm/src/evoasm.c +28 -0
  57. data/ext/evoasm_ext/libevoasm/src/evoasm.h +35 -0
  58. data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-enums.h +2077 -0
  59. data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-insts.c +191203 -0
  60. data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-insts.h +1713 -0
  61. data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-misc.c +348 -0
  62. data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-misc.h +93 -0
  63. data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-params.c +51 -0
  64. data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-params.h +509 -0
  65. data/lib/evoasm.rb +28 -11
  66. data/lib/evoasm/buffer.rb +105 -0
  67. data/lib/evoasm/capstone.rb +100 -0
  68. data/lib/evoasm/domain.rb +116 -0
  69. data/lib/evoasm/error.rb +37 -16
  70. data/lib/evoasm/exception_error.rb +19 -0
  71. data/lib/evoasm/ffi_ext.rb +53 -0
  72. data/lib/evoasm/libevoasm.rb +286 -0
  73. data/lib/evoasm/libevoasm/x64_enums.rb +1967 -0
  74. data/lib/evoasm/parameter.rb +20 -0
  75. data/lib/evoasm/population.rb +145 -0
  76. data/lib/evoasm/population/parameters.rb +227 -0
  77. data/lib/evoasm/population/plotter.rb +89 -0
  78. data/lib/evoasm/prng.rb +64 -0
  79. data/lib/evoasm/program.rb +195 -12
  80. data/lib/evoasm/program/io.rb +144 -0
  81. data/lib/evoasm/test.rb +8 -0
  82. data/lib/evoasm/version.rb +1 -1
  83. data/lib/evoasm/x64.rb +115 -0
  84. data/lib/evoasm/x64/cpu_state.rb +95 -0
  85. data/lib/evoasm/x64/instruction.rb +109 -0
  86. data/lib/evoasm/x64/operand.rb +156 -0
  87. data/lib/evoasm/x64/parameters.rb +211 -0
  88. data/test/helpers/population_helper.rb +128 -0
  89. data/test/helpers/test_helper.rb +1 -0
  90. data/test/helpers/x64_helper.rb +24 -0
  91. data/test/integration/bitwise_reverse_test.rb +41 -0
  92. data/test/integration/gcd_test.rb +52 -0
  93. data/test/integration/popcnt_test.rb +46 -0
  94. data/test/integration/sym_reg_test.rb +68 -0
  95. data/test/unit/evoasm/buffer_test.rb +48 -0
  96. data/test/unit/evoasm/capstone_test.rb +18 -0
  97. data/test/unit/evoasm/domain_test.rb +55 -0
  98. data/test/unit/evoasm/population/parameters_test.rb +106 -0
  99. data/test/unit/evoasm/population_test.rb +96 -0
  100. data/test/unit/evoasm/prng_test.rb +47 -0
  101. data/test/unit/evoasm/x64/cpu_state_test.rb +73 -0
  102. data/test/unit/evoasm/x64/encoding_test.rb +320 -0
  103. data/test/unit/evoasm/x64/instruction_access_test.rb +177 -0
  104. data/test/unit/evoasm/x64/instruction_encoding_test.rb +780 -0
  105. data/test/unit/evoasm/x64/instruction_test.rb +62 -0
  106. data/test/unit/evoasm/x64/parameters_test.rb +65 -0
  107. data/test/unit/evoasm/x64_test.rb +52 -0
  108. metadata +195 -89
  109. data/Gemfile.rake +0 -8
  110. data/Gemfile.rake.lock +0 -51
  111. data/LICENSE.txt +0 -373
  112. data/data/tables/README.md +0 -19
  113. data/data/tables/x64.csv +0 -1684
  114. data/data/templates/evoasm-x64.c.erb +0 -319
  115. data/data/templates/evoasm-x64.h.erb +0 -126
  116. data/examples/abs.yml +0 -20
  117. data/examples/popcnt.yml +0 -17
  118. data/examples/sym_reg.yml +0 -26
  119. data/exe/evoasm-search +0 -13
  120. data/ext/evoasm_ext/evoasm-alloc.c +0 -145
  121. data/ext/evoasm_ext/evoasm-alloc.h +0 -59
  122. data/ext/evoasm_ext/evoasm-arch.c +0 -44
  123. data/ext/evoasm_ext/evoasm-arch.h +0 -161
  124. data/ext/evoasm_ext/evoasm-bitmap.h +0 -114
  125. data/ext/evoasm_ext/evoasm-buf.c +0 -130
  126. data/ext/evoasm_ext/evoasm-buf.h +0 -47
  127. data/ext/evoasm_ext/evoasm-error.c +0 -31
  128. data/ext/evoasm_ext/evoasm-error.h +0 -75
  129. data/ext/evoasm_ext/evoasm-free-list.c.tmpl +0 -121
  130. data/ext/evoasm_ext/evoasm-free-list.h.tmpl +0 -86
  131. data/ext/evoasm_ext/evoasm-log.h +0 -69
  132. data/ext/evoasm_ext/evoasm-misc.c +0 -23
  133. data/ext/evoasm_ext/evoasm-misc.h +0 -282
  134. data/ext/evoasm_ext/evoasm-param.h +0 -37
  135. data/ext/evoasm_ext/evoasm-search.c +0 -2145
  136. data/ext/evoasm_ext/evoasm-search.h +0 -214
  137. data/ext/evoasm_ext/evoasm-util.h +0 -40
  138. data/ext/evoasm_ext/evoasm-x64.c +0 -275624
  139. data/ext/evoasm_ext/evoasm-x64.h +0 -5436
  140. data/ext/evoasm_ext/evoasm.c +0 -7
  141. data/ext/evoasm_ext/evoasm.h +0 -23
  142. data/ext/evoasm_ext/evoasm_ext.c +0 -1757
  143. data/ext/evoasm_ext/extconf.rb +0 -31
  144. data/lib/evoasm/cli.rb +0 -6
  145. data/lib/evoasm/cli/search.rb +0 -127
  146. data/lib/evoasm/core_ext.rb +0 -1
  147. data/lib/evoasm/core_ext/array.rb +0 -9
  148. data/lib/evoasm/core_ext/integer.rb +0 -10
  149. data/lib/evoasm/core_ext/kwstruct.rb +0 -13
  150. data/lib/evoasm/core_ext/range.rb +0 -5
  151. data/lib/evoasm/examples.rb +0 -27
  152. data/lib/evoasm/gen.rb +0 -8
  153. data/lib/evoasm/gen/enum.rb +0 -169
  154. data/lib/evoasm/gen/name_util.rb +0 -80
  155. data/lib/evoasm/gen/state.rb +0 -176
  156. data/lib/evoasm/gen/state_dsl.rb +0 -152
  157. data/lib/evoasm/gen/strio.rb +0 -27
  158. data/lib/evoasm/gen/translator.rb +0 -1102
  159. data/lib/evoasm/gen/version.rb +0 -5
  160. data/lib/evoasm/gen/x64.rb +0 -237
  161. data/lib/evoasm/gen/x64/funcs.rb +0 -495
  162. data/lib/evoasm/gen/x64/inst.rb +0 -781
  163. data/lib/evoasm/search.rb +0 -40
  164. data/lib/evoasm/tasks/gen_task.rb +0 -86
  165. data/lib/evoasm/tasks/template_task.rb +0 -52
  166. data/test/test_helper.rb +0 -1
  167. data/test/x64/test_helper.rb +0 -19
  168. data/test/x64/x64_test.rb +0 -87
@@ -1,31 +0,0 @@
1
- require 'mkmf'
2
-
3
- RbConfig::MAKEFILE_CONFIG['CC'] = ENV['CC'] if ENV['CC']
4
-
5
- if have_header('capstone/capstone.h')
6
- $LDFLAGS << ' -lcapstone'
7
- end
8
-
9
- $warnflags.gsub! '-Wdeclaration-after-statement', ''
10
-
11
- $CFLAGS << ' -std=c11 -pedantic -fstrict-aliasing'
12
- $warnflags << ' -Wextra -Wall -Wno-unused-label -Wuninitialized'\
13
- ' -Wswitch-default -Wstrict-aliasing=3 -Wunreachable-code'\
14
- ' -Wundef -Wpointer-arith -Wwrite-strings -Wconversion -Winit-self -Wno-unused-parameter'
15
-
16
- $LDFLAGS << ''
17
-
18
- if RbConfig::MAKEFILE_CONFIG['CC'] =~ /clang/
19
- $warnflags << ' -Wno-unknown-warning-option -Wno-parentheses-equality -Wno-error=ignored-attributes'\
20
- ' -Wno-missing-field-initializers -Wno-missing-braces'
21
- end
22
-
23
- if enable_config('debug')
24
- $warnflags << ' -Werror -Wno-error=unused-function -Wno-error=pedantic'\
25
- ' -Wno-error=implicit-function-declaration'
26
- $defs.push('-DEVOASM_MIN_LOG_LEVEL=EVOASM_LOG_LEVEL_DEBUG')
27
- $CFLAGS.gsub!(/-O\d/, '')
28
- $CFLAGS << ' -O0 -g3 -fno-omit-frame-pointer'
29
- end
30
-
31
- create_makefile('evoasm_ext')
data/lib/evoasm/cli.rb DELETED
@@ -1,6 +0,0 @@
1
- module Evoasm
2
- module Cli
3
- end
4
- end
5
-
6
- require 'evoasm/cli/search'
@@ -1,127 +0,0 @@
1
- require 'yaml'
2
- require 'pastel'
3
- require 'pry'
4
-
5
- module Evoasm
6
- module Cli
7
- class Search
8
- attr_reader :filename
9
-
10
- def initialize(filename, options)
11
- @filename = filename
12
- raise ArgumentError, 'filename is nil' if filename.nil?
13
-
14
- if options.any?{|o| o =~ /\--log-level=(\d)/}
15
- Evoasm.log_level = $1.to_i
16
- end
17
- end
18
-
19
- def start!
20
- x64 = X64.new
21
- params = YAML.load(File.read filename)
22
- insts = filter_insts x64.instructions, params['instructions']
23
-
24
- p insts.map(&:name)
25
- pastel = Pastel.new
26
-
27
- program_size = parse_range params['program_size']
28
- kernel_size = parse_range params['kernel_size']
29
- program_counter = 0
30
- max_programs = params['max_programs']
31
- recur_limit = params['recur_limit'] || 0
32
-
33
- domains = convert_domains_hash params['domains']
34
- parameters = (params['parameters'] || %i(reg0 reg1 reg2 imm0 imm1)).map(&:to_sym)
35
-
36
- start_ts = Time.now
37
-
38
- search = Evoasm::Search.new x64,
39
- examples: params['examples'],
40
- instructions: insts,
41
- kernel_size: kernel_size,
42
- program_size: program_size,
43
- population_size: params['population_size'],
44
- parameters: parameters,
45
- domains: domains,
46
- recur_limit: recur_limit
47
-
48
- search.start!(params['max_loss'] || 0.0) do |program, loss|
49
- ts = Time.now
50
- puts pastel.bold "Program #{program_counter}, #{ts.strftime '%H:%M:%S'} (found after #{(ts - start_ts).to_i} seconds)"
51
-
52
- if program.buffer.respond_to? :disassemble
53
- puts program.buffer.disassemble.join "\n"
54
- else
55
- puts program.instructions.map(&:name)
56
- end
57
-
58
- puts
59
-
60
- if params['console'] != false
61
- binding.pry
62
- end
63
-
64
- program_counter += 1
65
-
66
- if program_counter == max_programs
67
- # stops search
68
- return false
69
- end
70
- end
71
- end
72
-
73
- private
74
- def filter_insts(insts, params)
75
- op_types = %i(rm reg imm)
76
- reg_types = %i(rflags)
77
- bad_regs = %i(SP IP)
78
-
79
- grep_regexp = params && Regexp.new(params['grep']) rescue nil
80
- grep_v_regexp = params && Regexp.new(params['grep_v']) rescue nil
81
-
82
- reg_types.concat params['reg_types'].map(&:to_sym)
83
-
84
- insts.select do |inst|
85
- next false if grep_regexp && inst.name !~ grep_regexp
86
- next false if grep_v_regexp && inst.name =~ grep_v_regexp
87
- next false if inst.operands.size == 0
88
-
89
- inst.operands.all? do |op|
90
- next false unless op_types.include? op.type
91
- if op.register
92
- next false unless reg_types.include?(op.register.type)
93
- next false if bad_regs.include? op.register.name
94
- end
95
-
96
- true
97
- end
98
- end
99
- end
100
-
101
- def convert_domains_hash(hash)
102
- Hash(hash).map do |k, v|
103
- new_k = k.to_sym
104
- new_v =
105
- case v
106
- when Array
107
- v.map {|e| e.is_a?(String) ? e.to_sym : e }
108
- else
109
- v
110
- end
111
- [new_k, new_v]
112
- end.to_h
113
- end
114
-
115
- def parse_range(str)
116
- case str
117
- when Integer
118
- str
119
- when /^\(?(\d+)\.\.(\.?)(\d+)\)?$/
120
- Range.new($1.to_i, $3.to_i, !$2.empty?)
121
- else
122
- raise ArgumentError, "invalid range '#{str}'"
123
- end
124
- end
125
- end
126
- end
127
- end
@@ -1 +0,0 @@
1
- require 'evoasm/core_ext/range'
@@ -1,9 +0,0 @@
1
- class Array
2
- def keys
3
- map { |k, _v| k }
4
- end
5
-
6
- def values
7
- map { |_k, v| v }
8
- end
9
- end
@@ -1,10 +0,0 @@
1
- class Integer
2
- INT8_MAX = 0x7f
3
- INT8_MIN = -INT8_MAX - 1
4
- INT16_MAX = 0x7fff
5
- INT16_MIN = -INT16_MAX - 1
6
- INT32_MAX = 0x7fffffff
7
- INT32_MIN = -INT32_MAX - 1
8
- INT64_MAX = 0x7fffffffffffffff
9
- INT64_MIN = -INT64_MAX - 1
10
- end
@@ -1,13 +0,0 @@
1
- # The MIT License (MIT)
2
- # Copyright (c) 2015 Maxim Chernyak
3
- class KwStruct < Struct
4
- def self.new(*members, &block)
5
- super.tap do |struct_class|
6
- struct_class.class_eval <<-RUBY
7
- def initialize(#{members.map { |m| "#{m}: nil" }.join(', ')})
8
- super(#{members.join(', ')})
9
- end
10
- RUBY
11
- end
12
- end
13
- end
@@ -1,5 +0,0 @@
1
- class Range
2
- def sample
3
- rand self
4
- end
5
- end
@@ -1,27 +0,0 @@
1
- module Evoasm
2
- module Examples
3
-
4
- class << self
5
- def convert(examples)
6
- examples.inject(nil) do |(in_arity, out_arity), example|
7
- inputs, outputs = example
8
- example_in_arity = inputs.size
9
- example_out_arity = outputs.size
10
-
11
- validate_example inputs, example_in_arity, in_arity
12
- validate_example outputs, example_out_arity, out_arity
13
-
14
- [example_in_arity, example_out_arity]
15
- end.unshift(examples.flatten)
16
- end
17
-
18
- private
19
- def validate_example(example, example_arity, arity)
20
- if arity && arity != example_arity
21
- raise ArgumentError, "invalid arity for example '#{example}'"\
22
- " (#{example_arity} for #{arity})"
23
- end
24
- end
25
- end
26
- end
27
- end
data/lib/evoasm/gen.rb DELETED
@@ -1,8 +0,0 @@
1
- require 'evoasm/gen/version'
2
-
3
- module Evoasm
4
- module Gen
5
- end
6
- end
7
-
8
- require 'evoasm/gen/generator'
@@ -1,169 +0,0 @@
1
- require 'evoasm/gen/strio'
2
- require 'evoasm/gen/name_util'
3
-
4
- module Evoasm
5
- module Gen
6
- class Enum
7
- include NameUtil
8
-
9
- attr_reader :name, :flags
10
- alias_method :flags?, :flags
11
-
12
- def initialize(name = nil, elems = [], prefix: nil, flags: false)
13
- @name = name
14
- @prefix = prefix
15
- @map = {}
16
- @counter = 0
17
- @flags = flags
18
- add_all elems
19
- end
20
-
21
- def n
22
- @counter
23
- end
24
-
25
- def to_c(io = StrIO.new, typedef: true)
26
- raise 'name missing' if !name
27
-
28
- type_name = c_type_name
29
-
30
- io.puts "#{typedef ? 'typedef ' : ''}enum #{type_name} {"
31
- io.indent do
32
- each do |elem, value|
33
- elem_name = elem_name_to_c elem
34
- c_value =
35
- if valid_elem?(value)
36
- elem_name_to_c value
37
- else
38
- if flags?
39
- "1 << #{value}"
40
- else
41
- "#{value}"
42
- end
43
- end
44
- io.puts "#{elem_name} = #{c_value},"
45
- end
46
- if !flags?
47
- io.puts n_elem_to_c
48
- end
49
- end
50
- io.write '}'
51
- io.write " #{type_name}" if typedef
52
- io.puts ';'
53
- io.puts "#define #{bitsize_to_c} #{bitsize}"
54
- unless flags?
55
- io.puts "#define #{bitsize_to_c true} #{bitsize true}"
56
- else
57
- io.puts "#define #{all_to_c} #{all_value}"
58
- end
59
-
60
- io.string
61
- end
62
-
63
- def bitsize(with_n = false)
64
- if flags?
65
- @map.size
66
- else
67
- Math.log2(max + 1 + (with_n ? 1 : 0)).ceil.to_i
68
- end
69
- end
70
-
71
- def max
72
- @map.each_with_index.inject(0) do |acc, (index, (k, v))|
73
- if v
74
- [v + 1, acc + 1].max
75
- else
76
- acc + 1
77
- end
78
- end - 1
79
- end
80
-
81
- def c_type(typedef = false)
82
- "#{typedef ? '' : 'enum '}#{c_type_name}"
83
- end
84
-
85
- def c_type_name
86
- name_to_c name, @prefix
87
- end
88
-
89
- def all_to_c
90
- name_to_c "#{prefix_name}_all", @prefix, const: true
91
- end
92
-
93
- def all_value
94
- (2**@map.size) - 1
95
- end
96
-
97
- def bitsize_to_c(with_n = false)
98
- name_to_c "#{prefix_name}_bitsize#{with_n ? '_WITH_N' : ''}", @prefix, const: true
99
- end
100
-
101
- def n_elem_to_c
102
- name_to_c "n_#{prefix_name}s", @prefix, const: true
103
- end
104
-
105
- def keys
106
- @map.keys
107
- end
108
-
109
- def add(elem, alias_elem = nil)
110
- fail ArgumentError, 'can only add symbols or strings' \
111
- unless valid_elem?(elem) && (!alias_elem || valid_elem?(alias_elem))
112
-
113
- return if @map.key? elem
114
-
115
- value = alias_elem || @counter
116
- @counter += 1 if alias_elem.nil?
117
-
118
- @map[elem] = value
119
- end
120
-
121
- def add_all(elems)
122
- elems.each do |elem|
123
- add elem
124
- end
125
- end
126
-
127
- def each(&block)
128
- return to_enum(:each) if block.nil?
129
- @map.each_key do |k|
130
- block[k, self[k]]
131
- end
132
- end
133
-
134
- def alias(key)
135
- key = @map[key]
136
- case key
137
- when Symbol, String
138
- key
139
- else
140
- nil
141
- end
142
- end
143
-
144
- def [](elem)
145
- value = @map[elem]
146
-
147
- if @map.key? value
148
- @map.fetch value
149
- else
150
- value
151
- end
152
- end
153
-
154
- private
155
- def prefix_name
156
- name.to_s.sub(/_id$/, '')
157
- end
158
-
159
- def elem_name_to_c(elem_name)
160
- # convention: _id does not appear in element's name
161
- name_to_c elem_name, Array(@prefix) + [prefix_name], const: true
162
- end
163
-
164
- def valid_elem?(elem)
165
- elem.is_a?(Symbol) || elem.is_a?(String)
166
- end
167
- end
168
- end
169
- end
@@ -1,80 +0,0 @@
1
- module Evoasm
2
- module Gen
3
- module NameUtil
4
- def namespace
5
- 'evoasm'
6
- end
7
-
8
- def const_name_to_c(name, prefix)
9
- name_to_c name, prefix, const: true
10
- end
11
-
12
- def name_to_c(name, prefix = nil, const: false)
13
- c_name = [namespace, *prefix, name.to_s.sub(/\?$/, '')].compact.join '_'
14
- if const
15
- c_name.upcase
16
- else
17
- c_name
18
- end
19
- end
20
-
21
- def indep_arch_prefix(name = nil)
22
- ['arch', name]
23
- end
24
-
25
- def arch_prefix(name = nil)
26
- [arch, name]
27
- end
28
-
29
- def error_code_to_c(name)
30
- prefix = name == :ok ? :error_code : indep_arch_prefix(:error_code)
31
- const_name_to_c name, prefix
32
- end
33
-
34
- def reg_name_to_c(name)
35
- const_name_to_c name, arch_prefix(:reg)
36
- end
37
-
38
- def exception_to_c(name)
39
- const_name_to_c name, arch_prefix(:exception)
40
- end
41
-
42
- def reg_type_to_c(name)
43
- const_name_to_c name, arch_prefix(:reg_type)
44
- end
45
-
46
- def operand_type_to_c(name)
47
- const_name_to_c name, arch_prefix(:operand_type)
48
- end
49
-
50
- def inst_name_to_c(inst)
51
- const_name_to_c inst.name, arch_prefix(:inst)
52
- end
53
-
54
- def operand_size_to_c(size)
55
- const_name_to_c size, :operand_size
56
- end
57
-
58
- def bit_mask_to_c(mask)
59
- name =
60
- case mask
61
- when Range then"#{mask.min}_#{mask.max}"
62
- else mask.to_s
63
- end
64
- const_name_to_c name, arch_prefix(:bit_mask)
65
- end
66
-
67
- def feature_name_to_c(name)
68
- const_name_to_c name, arch_prefix(:feature)
69
- end
70
-
71
- def inst_flag_to_c(flag)
72
- const_name_to_c flag, arch_prefix(:inst_flag)
73
- end
74
-
75
- def param_name_to_c(name)
76
- const_name_to_c name, arch_prefix(:param)
77
- end
78
- end
79
- end
80
- end