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.
Files changed (75) hide show
  1. checksums.yaml +7 -0
  2. data/.gemrelease +2 -0
  3. data/.gitignore +16 -0
  4. data/Gemfile +4 -0
  5. data/Gemfile.rake +8 -0
  6. data/Gemfile.rake.lock +51 -0
  7. data/LICENSE.txt +373 -0
  8. data/Makefile +6 -0
  9. data/README.md +43 -0
  10. data/Rakefile +128 -0
  11. data/bin/gdb +2 -0
  12. data/data/tables/README.md +19 -0
  13. data/data/tables/x64.csv +1684 -0
  14. data/data/templates/evoasm-x64.c.erb +319 -0
  15. data/data/templates/evoasm-x64.h.erb +126 -0
  16. data/evoasm.gemspec +30 -0
  17. data/examples/abs.yml +20 -0
  18. data/examples/popcnt.yml +17 -0
  19. data/examples/sym_reg.yml +26 -0
  20. data/exe/evoasm-search +13 -0
  21. data/ext/evoasm_ext/evoasm-alloc.c +145 -0
  22. data/ext/evoasm_ext/evoasm-alloc.h +59 -0
  23. data/ext/evoasm_ext/evoasm-arch.c +44 -0
  24. data/ext/evoasm_ext/evoasm-arch.h +161 -0
  25. data/ext/evoasm_ext/evoasm-bitmap.h +114 -0
  26. data/ext/evoasm_ext/evoasm-buf.c +130 -0
  27. data/ext/evoasm_ext/evoasm-buf.h +47 -0
  28. data/ext/evoasm_ext/evoasm-error.c +31 -0
  29. data/ext/evoasm_ext/evoasm-error.h +75 -0
  30. data/ext/evoasm_ext/evoasm-free-list.c.tmpl +121 -0
  31. data/ext/evoasm_ext/evoasm-free-list.h.tmpl +86 -0
  32. data/ext/evoasm_ext/evoasm-log.c +108 -0
  33. data/ext/evoasm_ext/evoasm-log.h +69 -0
  34. data/ext/evoasm_ext/evoasm-misc.c +23 -0
  35. data/ext/evoasm_ext/evoasm-misc.h +282 -0
  36. data/ext/evoasm_ext/evoasm-param.h +37 -0
  37. data/ext/evoasm_ext/evoasm-search.c +2145 -0
  38. data/ext/evoasm_ext/evoasm-search.h +214 -0
  39. data/ext/evoasm_ext/evoasm-util.h +40 -0
  40. data/ext/evoasm_ext/evoasm-x64.c +275624 -0
  41. data/ext/evoasm_ext/evoasm-x64.h +5436 -0
  42. data/ext/evoasm_ext/evoasm.c +7 -0
  43. data/ext/evoasm_ext/evoasm.h +23 -0
  44. data/ext/evoasm_ext/evoasm_ext.c +1757 -0
  45. data/ext/evoasm_ext/extconf.rb +31 -0
  46. data/lib/evoasm/cli/search.rb +127 -0
  47. data/lib/evoasm/cli.rb +6 -0
  48. data/lib/evoasm/core_ext/array.rb +9 -0
  49. data/lib/evoasm/core_ext/integer.rb +10 -0
  50. data/lib/evoasm/core_ext/kwstruct.rb +13 -0
  51. data/lib/evoasm/core_ext/range.rb +5 -0
  52. data/lib/evoasm/core_ext.rb +1 -0
  53. data/lib/evoasm/error.rb +20 -0
  54. data/lib/evoasm/examples.rb +27 -0
  55. data/lib/evoasm/gen/enum.rb +169 -0
  56. data/lib/evoasm/gen/name_util.rb +80 -0
  57. data/lib/evoasm/gen/state.rb +176 -0
  58. data/lib/evoasm/gen/state_dsl.rb +152 -0
  59. data/lib/evoasm/gen/strio.rb +27 -0
  60. data/lib/evoasm/gen/translator.rb +1102 -0
  61. data/lib/evoasm/gen/version.rb +5 -0
  62. data/lib/evoasm/gen/x64/funcs.rb +495 -0
  63. data/lib/evoasm/gen/x64/inst.rb +781 -0
  64. data/lib/evoasm/gen/x64.rb +237 -0
  65. data/lib/evoasm/gen.rb +8 -0
  66. data/lib/evoasm/program.rb +23 -0
  67. data/lib/evoasm/search.rb +40 -0
  68. data/lib/evoasm/tasks/gen_task.rb +86 -0
  69. data/lib/evoasm/tasks/template_task.rb +52 -0
  70. data/lib/evoasm/version.rb +3 -0
  71. data/lib/evoasm.rb +22 -0
  72. data/test/test_helper.rb +1 -0
  73. data/test/x64/test_helper.rb +19 -0
  74. data/test/x64/x64_test.rb +87 -0
  75. 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