evoasm 0.0.2.pre7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gemrelease +2 -0
- data/.gitignore +16 -0
- data/Gemfile +4 -0
- data/Gemfile.rake +8 -0
- data/Gemfile.rake.lock +51 -0
- data/LICENSE.txt +373 -0
- data/Makefile +6 -0
- data/README.md +43 -0
- data/Rakefile +128 -0
- data/bin/gdb +2 -0
- data/data/tables/README.md +19 -0
- data/data/tables/x64.csv +1684 -0
- data/data/templates/evoasm-x64.c.erb +319 -0
- data/data/templates/evoasm-x64.h.erb +126 -0
- data/evoasm.gemspec +30 -0
- data/examples/abs.yml +20 -0
- data/examples/popcnt.yml +17 -0
- data/examples/sym_reg.yml +26 -0
- data/exe/evoasm-search +13 -0
- data/ext/evoasm_ext/evoasm-alloc.c +145 -0
- data/ext/evoasm_ext/evoasm-alloc.h +59 -0
- data/ext/evoasm_ext/evoasm-arch.c +44 -0
- data/ext/evoasm_ext/evoasm-arch.h +161 -0
- data/ext/evoasm_ext/evoasm-bitmap.h +114 -0
- data/ext/evoasm_ext/evoasm-buf.c +130 -0
- data/ext/evoasm_ext/evoasm-buf.h +47 -0
- data/ext/evoasm_ext/evoasm-error.c +31 -0
- data/ext/evoasm_ext/evoasm-error.h +75 -0
- data/ext/evoasm_ext/evoasm-free-list.c.tmpl +121 -0
- data/ext/evoasm_ext/evoasm-free-list.h.tmpl +86 -0
- data/ext/evoasm_ext/evoasm-log.c +108 -0
- data/ext/evoasm_ext/evoasm-log.h +69 -0
- data/ext/evoasm_ext/evoasm-misc.c +23 -0
- data/ext/evoasm_ext/evoasm-misc.h +282 -0
- data/ext/evoasm_ext/evoasm-param.h +37 -0
- data/ext/evoasm_ext/evoasm-search.c +2145 -0
- data/ext/evoasm_ext/evoasm-search.h +214 -0
- data/ext/evoasm_ext/evoasm-util.h +40 -0
- data/ext/evoasm_ext/evoasm-x64.c +275624 -0
- data/ext/evoasm_ext/evoasm-x64.h +5436 -0
- data/ext/evoasm_ext/evoasm.c +7 -0
- data/ext/evoasm_ext/evoasm.h +23 -0
- data/ext/evoasm_ext/evoasm_ext.c +1757 -0
- data/ext/evoasm_ext/extconf.rb +31 -0
- data/lib/evoasm/cli/search.rb +127 -0
- data/lib/evoasm/cli.rb +6 -0
- data/lib/evoasm/core_ext/array.rb +9 -0
- data/lib/evoasm/core_ext/integer.rb +10 -0
- data/lib/evoasm/core_ext/kwstruct.rb +13 -0
- data/lib/evoasm/core_ext/range.rb +5 -0
- data/lib/evoasm/core_ext.rb +1 -0
- data/lib/evoasm/error.rb +20 -0
- data/lib/evoasm/examples.rb +27 -0
- data/lib/evoasm/gen/enum.rb +169 -0
- data/lib/evoasm/gen/name_util.rb +80 -0
- data/lib/evoasm/gen/state.rb +176 -0
- data/lib/evoasm/gen/state_dsl.rb +152 -0
- data/lib/evoasm/gen/strio.rb +27 -0
- data/lib/evoasm/gen/translator.rb +1102 -0
- data/lib/evoasm/gen/version.rb +5 -0
- data/lib/evoasm/gen/x64/funcs.rb +495 -0
- data/lib/evoasm/gen/x64/inst.rb +781 -0
- data/lib/evoasm/gen/x64.rb +237 -0
- data/lib/evoasm/gen.rb +8 -0
- data/lib/evoasm/program.rb +23 -0
- data/lib/evoasm/search.rb +40 -0
- data/lib/evoasm/tasks/gen_task.rb +86 -0
- data/lib/evoasm/tasks/template_task.rb +52 -0
- data/lib/evoasm/version.rb +3 -0
- data/lib/evoasm.rb +22 -0
- data/test/test_helper.rb +1 -0
- data/test/x64/test_helper.rb +19 -0
- data/test/x64/x64_test.rb +87 -0
- metadata +221 -0
@@ -0,0 +1,152 @@
|
|
1
|
+
require 'evoasm/gen/state'
|
2
|
+
|
3
|
+
module Evoasm::Gen
|
4
|
+
module StateDSL
|
5
|
+
LOWEST_PRIORITY = 999
|
6
|
+
|
7
|
+
def self.included(base)
|
8
|
+
base.send :extend, ClassMethods
|
9
|
+
end
|
10
|
+
|
11
|
+
module ClassMethods
|
12
|
+
def state(name)
|
13
|
+
f = instance_method(name)
|
14
|
+
var_name = :"@#{name}"
|
15
|
+
|
16
|
+
define_method(name) do
|
17
|
+
return instance_variable_get var_name if instance_variable_defined? var_name
|
18
|
+
instance_variable_set var_name, f.bind(self).call
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class DSLState
|
24
|
+
include StateDSL
|
25
|
+
|
26
|
+
def initialize(state)
|
27
|
+
@__state__ = state
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def comment(comment = nil)
|
32
|
+
if comment
|
33
|
+
@__state__.comment = comment
|
34
|
+
else
|
35
|
+
@__state__.comment
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def exec(name, args)
|
40
|
+
@__state__.actions << [name, args]
|
41
|
+
end
|
42
|
+
|
43
|
+
def set(param, value, options = {})
|
44
|
+
fail ArgumentError, 'nil not allowed' if value.nil?
|
45
|
+
exec :set, [param.to_sym, value, options]
|
46
|
+
@__state__.add_local_param param
|
47
|
+
end
|
48
|
+
|
49
|
+
def write(value = nil, size = nil)
|
50
|
+
if Array === size && Array === value
|
51
|
+
fail ArgumentError, 'values and sizes must have same length' unless value.size == size.size
|
52
|
+
end
|
53
|
+
exec :write, [value, size]
|
54
|
+
end
|
55
|
+
|
56
|
+
def unordered_writes(param_name, writes)
|
57
|
+
exec :unordered_writes, [param_name, writes]
|
58
|
+
end
|
59
|
+
|
60
|
+
def call(func)
|
61
|
+
exec :call, [func]
|
62
|
+
end
|
63
|
+
|
64
|
+
def access(op, modes)
|
65
|
+
exec :access, [op, modes]
|
66
|
+
end
|
67
|
+
|
68
|
+
def recover_with(param, range = nil, **opts)
|
69
|
+
@__state__.recovery << [param, range, opts]
|
70
|
+
end
|
71
|
+
|
72
|
+
def log(level, msg, *args)
|
73
|
+
exec :log, [level, msg, *args]
|
74
|
+
end
|
75
|
+
|
76
|
+
def assert(*args)
|
77
|
+
exec :assert, args
|
78
|
+
end
|
79
|
+
|
80
|
+
def calls?(name)
|
81
|
+
@__state__.calls.include? name
|
82
|
+
end
|
83
|
+
|
84
|
+
def ret
|
85
|
+
@__state__.ret = true
|
86
|
+
end
|
87
|
+
|
88
|
+
def error(code = nil, msg = nil, reg: nil, param: nil)
|
89
|
+
exec :error, [code, msg, reg, param]
|
90
|
+
ret
|
91
|
+
end
|
92
|
+
|
93
|
+
def to(child = nil, **attrs, &block)
|
94
|
+
if child.nil?
|
95
|
+
child = State.new
|
96
|
+
instance_eval_with_state child, &block
|
97
|
+
end
|
98
|
+
|
99
|
+
@__state__.add_child child, nil, default_attrs(attrs)
|
100
|
+
child
|
101
|
+
end
|
102
|
+
|
103
|
+
def lowest_priority
|
104
|
+
@__state__.children.map { |_, _, attrs| attrs[:priority] }.max || 0
|
105
|
+
end
|
106
|
+
|
107
|
+
def default_attrs(attrs)
|
108
|
+
{ priority: lowest_priority + 1 }.merge attrs
|
109
|
+
end
|
110
|
+
|
111
|
+
def else_to(state = nil, &block)
|
112
|
+
to_if(:else, state, priority: LOWEST_PRIORITY, &block)
|
113
|
+
end
|
114
|
+
|
115
|
+
def to_if(*args, **attrs, &block)
|
116
|
+
if block
|
117
|
+
child = State.new
|
118
|
+
instance_eval_with_state child, &block
|
119
|
+
|
120
|
+
args.compact!
|
121
|
+
else
|
122
|
+
child = args.pop
|
123
|
+
end
|
124
|
+
|
125
|
+
@__state__.add_child child, args, default_attrs(attrs)
|
126
|
+
child
|
127
|
+
end
|
128
|
+
|
129
|
+
def self_state
|
130
|
+
@__state__
|
131
|
+
end
|
132
|
+
|
133
|
+
def state(*args, &block)
|
134
|
+
if args.size == 1 && State === args.first
|
135
|
+
instance_eval_with_state(args.first, &block)
|
136
|
+
else
|
137
|
+
State.new(*args).tap do |s|
|
138
|
+
instance_eval_with_state(s, &block)
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
def instance_eval_with_state(state, &block)
|
144
|
+
prev_state = @__state__
|
145
|
+
@__state__ = state
|
146
|
+
result = instance_eval(&block) if block
|
147
|
+
@__state__ = prev_state
|
148
|
+
|
149
|
+
result
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Evoasm
|
2
|
+
module Gen
|
3
|
+
class StrIO < ::StringIO
|
4
|
+
def indent(indent = nil)
|
5
|
+
@indent ||= 0
|
6
|
+
|
7
|
+
prev_indent = @indent
|
8
|
+
@indent = indent || @indent + 1
|
9
|
+
yield
|
10
|
+
@indent = prev_indent
|
11
|
+
end
|
12
|
+
|
13
|
+
def indent_str
|
14
|
+
' ' * @indent
|
15
|
+
end
|
16
|
+
|
17
|
+
def puts(line = nil, eol: '')
|
18
|
+
if line
|
19
|
+
write indent_str if @indent
|
20
|
+
super("#{line}#{eol}")
|
21
|
+
else
|
22
|
+
super()
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|