rltk3 3.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +7 -0
  2. data/AUTHORS +1 -0
  3. data/LICENSE +27 -0
  4. data/README.md +852 -0
  5. data/Rakefile +197 -0
  6. data/lib/rltk/ast.rb +573 -0
  7. data/lib/rltk/cfg.rb +683 -0
  8. data/lib/rltk/cg/basic_block.rb +157 -0
  9. data/lib/rltk/cg/bindings.rb +151 -0
  10. data/lib/rltk/cg/builder.rb +1127 -0
  11. data/lib/rltk/cg/context.rb +48 -0
  12. data/lib/rltk/cg/contractor.rb +51 -0
  13. data/lib/rltk/cg/execution_engine.rb +194 -0
  14. data/lib/rltk/cg/function.rb +237 -0
  15. data/lib/rltk/cg/generated_bindings.rb +8118 -0
  16. data/lib/rltk/cg/generic_value.rb +95 -0
  17. data/lib/rltk/cg/instruction.rb +519 -0
  18. data/lib/rltk/cg/llvm.rb +150 -0
  19. data/lib/rltk/cg/memory_buffer.rb +75 -0
  20. data/lib/rltk/cg/module.rb +451 -0
  21. data/lib/rltk/cg/pass_manager.rb +252 -0
  22. data/lib/rltk/cg/support.rb +29 -0
  23. data/lib/rltk/cg/target.rb +230 -0
  24. data/lib/rltk/cg/triple.rb +58 -0
  25. data/lib/rltk/cg/type.rb +554 -0
  26. data/lib/rltk/cg/value.rb +1272 -0
  27. data/lib/rltk/cg.rb +32 -0
  28. data/lib/rltk/lexer.rb +372 -0
  29. data/lib/rltk/lexers/calculator.rb +44 -0
  30. data/lib/rltk/lexers/ebnf.rb +38 -0
  31. data/lib/rltk/parser.rb +1702 -0
  32. data/lib/rltk/parsers/infix_calc.rb +43 -0
  33. data/lib/rltk/parsers/postfix_calc.rb +34 -0
  34. data/lib/rltk/parsers/prefix_calc.rb +34 -0
  35. data/lib/rltk/token.rb +90 -0
  36. data/lib/rltk/version.rb +11 -0
  37. data/lib/rltk.rb +16 -0
  38. data/test/cg/tc_basic_block.rb +83 -0
  39. data/test/cg/tc_control_flow.rb +191 -0
  40. data/test/cg/tc_function.rb +54 -0
  41. data/test/cg/tc_generic_value.rb +33 -0
  42. data/test/cg/tc_instruction.rb +256 -0
  43. data/test/cg/tc_llvm.rb +25 -0
  44. data/test/cg/tc_math.rb +88 -0
  45. data/test/cg/tc_module.rb +89 -0
  46. data/test/cg/tc_transforms.rb +68 -0
  47. data/test/cg/tc_type.rb +69 -0
  48. data/test/cg/tc_value.rb +151 -0
  49. data/test/cg/ts_cg.rb +23 -0
  50. data/test/tc_ast.rb +332 -0
  51. data/test/tc_cfg.rb +164 -0
  52. data/test/tc_lexer.rb +216 -0
  53. data/test/tc_parser.rb +711 -0
  54. data/test/tc_token.rb +34 -0
  55. data/test/ts_rltk.rb +47 -0
  56. metadata +317 -0
@@ -0,0 +1,256 @@
1
+ # Author: Chris Wailes <chris.wailes@gmail.com>
2
+ # Project: Ruby Language Toolkit
3
+ # Date: 2012/05/09
4
+ # Description: This file contains unit tests for the RLTK::CG::Instruction
5
+ # class.
6
+
7
+ ############
8
+ # Requires #
9
+ ############
10
+
11
+ # Gems
12
+ require 'minitest/autorun'
13
+
14
+ # Ruby Language Toolkit
15
+ require 'rltk/cg/llvm'
16
+ require 'rltk/cg/module'
17
+ require 'rltk/cg/instruction'
18
+
19
+ class InstructionTester < Minitest::Test
20
+ def setup
21
+ RLTK::CG::LLVM.init(:X86)
22
+
23
+ @mod = RLTK::CG::Module.new('Testing Module')
24
+ @jit = RLTK::CG::JITCompiler.new(@mod)
25
+ end
26
+
27
+ def test_float_comparison
28
+ fcmp_assert(:oeq, 1.0, 1.0, true )
29
+ fcmp_assert(:one, 1.0, 1.0, false)
30
+ fcmp_assert(:ogt, 2.0, 2.0, false)
31
+ fcmp_assert(:oge, 2.0, 1.0, true )
32
+ fcmp_assert(:olt, 1.0, 1.0, false)
33
+ fcmp_assert(:ole, 1.0, 2.0, true )
34
+ fcmp_assert(:ord, 1.0, 2.0, true )
35
+ fcmp_assert(:ueq, 1.0, 1.0, true )
36
+ fcmp_assert(:une, 1.0, 1.0, false)
37
+ fcmp_assert(:ugt, 2.0, 2.0, false)
38
+ fcmp_assert(:uge, 2.0, 1.0, true )
39
+ fcmp_assert(:ult, 1.0, 1.0, false)
40
+ fcmp_assert(:ule, 1.0, 2.0, true )
41
+ fcmp_assert(:uno, 1.0, 2.0, false)
42
+ end
43
+
44
+ def test_instruction
45
+ fun = @mod.functions.add('instruction_tester', RLTK::CG::DoubleType, [RLTK::CG::DoubleType]) do |fun|
46
+ blocks.append do
47
+ ret(fadd(fun.params[0], RLTK::CG::Double.new(3.0)))
48
+ end
49
+ end
50
+
51
+ entry = fun.blocks.entry
52
+
53
+ inst0 = entry.instructions.first
54
+ inst1 = entry.instructions.last
55
+
56
+ assert_kind_of(RLTK::CG::Instruction, inst0)
57
+ assert_kind_of(RLTK::CG::Instruction, inst1)
58
+
59
+ assert_equal(inst1, inst0.next)
60
+ assert_equal(inst0, inst1.previous)
61
+
62
+ assert_equal(entry, inst0.parent)
63
+ assert_equal(entry, inst1.parent)
64
+ end
65
+
66
+ def test_integer_comparison
67
+ icmp_assert(:eq, 1, 1, true, true )
68
+ icmp_assert(:ne, 1, 1, true, false)
69
+ icmp_assert(:ugt, 2, 2, false, false)
70
+ icmp_assert(:uge, 2, 1, false, true )
71
+ icmp_assert(:ult, 1, 1, false, false)
72
+ icmp_assert(:ule, 1, 2, false, true )
73
+ icmp_assert(:sgt, -2, 2, true, false)
74
+ icmp_assert(:sge, -2, 1, true, false)
75
+ icmp_assert(:slt, -1, 2, true, true )
76
+ icmp_assert(:sle, -1, 2, true, true )
77
+ end
78
+
79
+ def test_array_memory_access
80
+ fun = @mod.functions.add('array_memory_access_tester', RLTK::CG::NativeIntType,
81
+ [RLTK::CG::NativeIntType, RLTK::CG::NativeIntType]) do |fun|
82
+
83
+ blocks.append do
84
+ ptr = array_alloca(RLTK::CG::NativeIntType, RLTK::CG::NativeInt.new(2))
85
+
86
+ store(fun.params[0], gep(ptr, [RLTK::CG::NativeInt.new(0)]))
87
+ store(fun.params[1], gep(ptr, [RLTK::CG::NativeInt.new(1)]))
88
+
89
+ ret(add(load(gep(ptr, [RLTK::CG::NativeInt.new(0)])), load(gep(ptr, [RLTK::CG::NativeInt.new(1)]))))
90
+ end
91
+ end
92
+
93
+ assert_equal(3, @jit.run_function(fun, 1, 2).to_i)
94
+ end
95
+
96
+ def test_simple_memory_access
97
+ fun = @mod.functions.add('simple_memory_access_tester', RLTK::CG::NativeIntType,
98
+ [RLTK::CG::NativeIntType, RLTK::CG::NativeIntType]) do |fun|
99
+
100
+ blocks.append do
101
+ p0 = alloca(RLTK::CG::NativeIntType)
102
+ p1 = alloca(RLTK::CG::NativeIntType)
103
+
104
+ store(fun.params[0], p0)
105
+ store(fun.params[1], p1)
106
+
107
+ ret(add(load(p0), load(p1)))
108
+ end
109
+ end
110
+
111
+ assert_equal(3, @jit.run_function(fun, 1, 2).to_i)
112
+ end
113
+
114
+ def test_struct_access
115
+ fun = @mod.functions.add('struct_access_tester', RLTK::CG::FloatType, [RLTK::CG::NativeIntType, RLTK::CG::FloatType]) do |fun|
116
+ blocks.append do
117
+ st0 = RLTK::CG::StructType.new([RLTK::CG::NativeIntType, RLTK::CG::FloatType])
118
+ st1 = RLTK::CG::StructType.new([RLTK::CG::FloatType, st0, RLTK::CG::NativeIntType])
119
+
120
+ ptr = alloca(st1)
121
+
122
+ store(fun.params[0], gep(ptr, [RLTK::CG::NativeInt.new(0), RLTK::CG::NativeInt.new(1), RLTK::CG::NativeInt.new(0)]))
123
+ store(fun.params[1], gep(ptr, [RLTK::CG::NativeInt.new(0), RLTK::CG::NativeInt.new(1), RLTK::CG::NativeInt.new(1)]))
124
+
125
+ addr0 = gep(ptr, [RLTK::CG::NativeInt.new(0), RLTK::CG::NativeInt.new(1), RLTK::CG::NativeInt.new(0)])
126
+ addr1 = gep(ptr, [RLTK::CG::NativeInt.new(0), RLTK::CG::NativeInt.new(1), RLTK::CG::NativeInt.new(1)])
127
+
128
+ ret(fadd(ui2fp(load(addr0), RLTK::CG::FloatType), load(addr1)))
129
+ end
130
+ end
131
+
132
+ assert_in_delta(5.3, @jit.run_function(fun, 2, 3.3).to_f, 0.001)
133
+ end
134
+
135
+ def test_struct_values
136
+ fun = @mod.functions.add('struct_values_tester', RLTK::CG::NativeIntType, [RLTK::CG::NativeIntType, RLTK::CG::NativeIntType]) do |fun|
137
+ blocks.append do
138
+ ptr = alloca(RLTK::CG::StructType.new([RLTK::CG::NativeIntType, RLTK::CG::NativeIntType]))
139
+
140
+ struct = load(ptr)
141
+ struct = insert_value(struct, fun.params[0], 0)
142
+ struct = insert_value(struct, fun.params[1], 1)
143
+
144
+ ret(add(extract_value(struct, 0), extract_value(struct, 1)))
145
+ end
146
+ end
147
+
148
+ assert_equal(5, @jit.run_function(fun, 2, 3).to_i)
149
+ end
150
+
151
+ ####################
152
+ # Conversion Tests #
153
+ ####################
154
+
155
+ def test_bitcast
156
+ difftype_assert(:bitcast, RLTK::CG::Int8.new(255), RLTK::CG::Int8Type, :integer, -1)
157
+ end
158
+
159
+ def test_fp2ui
160
+ difftype_assert(:fp2ui, RLTK::CG::Double.new(123.3), RLTK::CG::Int32Type, :integer, 123)
161
+ difftype_assert(:fp2ui, RLTK::CG::Double.new(0.7), RLTK::CG::Int32Type, :integer, 0)
162
+ difftype_assert(:fp2ui, RLTK::CG::Double.new(1.7), RLTK::CG::Int32Type, :integer, 1)
163
+ end
164
+
165
+ def test_fp2si
166
+ difftype_assert(:fp2si, RLTK::CG::Double.new(-123.3), RLTK::CG::Int32Type, :integer, -123)
167
+ difftype_assert(:fp2si, RLTK::CG::Double.new(0.7), RLTK::CG::Int32Type, :integer, 0)
168
+ difftype_assert(:fp2si, RLTK::CG::Double.new(1.7), RLTK::CG::Int32Type, :integer, 1)
169
+ end
170
+
171
+ def test_fpext
172
+ fconv_assert(:fp_ext, RLTK::CG::Float.new(123.0), RLTK::CG::DoubleType, 123.0)
173
+ fconv_assert(:fp_ext, RLTK::CG::Float.new(123.0), RLTK::CG::FloatType, 123.0)
174
+ end
175
+
176
+ def test_fptrunc
177
+ fconv_assert(:fp_trunc, RLTK::CG::Double.new(123.0), RLTK::CG::FloatType, 123.0)
178
+ end
179
+
180
+ def test_int64
181
+ iconv_assert(:zext, RLTK::CG::Int64.new( 2**62 + 123), RLTK::CG::Int64Type, true, 2**62 + 123)
182
+ iconv_assert(:zext, RLTK::CG::Int64.new(-2**62 - 123), RLTK::CG::Int64Type, true, -2**62 - 123)
183
+ iconv_assert(:zext, RLTK::CG::Int64.new( 2**63 + 123), RLTK::CG::Int64Type, false, 2**63 + 123)
184
+ end
185
+
186
+ def test_sext
187
+ iconv_assert(:sext, RLTK::CG::Int1.new(1), RLTK::CG::Int32Type, true, -1)
188
+ iconv_assert(:sext, RLTK::CG::Int8.new(-1), RLTK::CG::Int16Type, false, 65535)
189
+ end
190
+
191
+ def test_si2fp
192
+ difftype_assert(:si2fp, RLTK::CG::Int32.new(257), RLTK::CG::FloatType, :float, 257.0)
193
+ difftype_assert(:si2fp, RLTK::CG::Int8.new(-1), RLTK::CG::DoubleType, :float, -1.0)
194
+ end
195
+
196
+ def test_truncate
197
+ iconv_assert(:trunc, RLTK::CG::Int32.new(257), RLTK::CG::Int8Type, false, 1)
198
+ iconv_assert(:trunc, RLTK::CG::Int32.new(123), RLTK::CG::Int1Type, false, 1)
199
+ iconv_assert(:trunc, RLTK::CG::Int32.new(122), RLTK::CG::Int1Type, false, 0)
200
+ end
201
+
202
+ def test_ui2fp
203
+ difftype_assert(:ui2fp, RLTK::CG::Int32.new(257), RLTK::CG::FloatType, :float, 257.0)
204
+ difftype_assert(:ui2fp, RLTK::CG::Int8.new(-1), RLTK::CG::DoubleType, :float, 255.0)
205
+ end
206
+
207
+ def test_zext
208
+ iconv_assert(:zext, RLTK::CG::Int16.new(257), RLTK::CG::Int32Type, false, 257)
209
+ end
210
+
211
+ ##################
212
+ # Helper Methods #
213
+ ##################
214
+
215
+ def difftype_assert(op, operand, ret_type, assert_type, expected)
216
+ res = run_convert(op, operand, ret_type)
217
+
218
+ if assert_type == :integer then assert_equal(expected, res.to_i) else assert_in_delta(expected, res.to_f(ret_type), 0.001) end
219
+ end
220
+
221
+ def fcmp_assert(mode, operand0, operand1, expected)
222
+ res = run_cmp(:fcmp, mode, RLTK::CG::Float.new(operand0), RLTK::CG::Float.new(operand1), RLTK::CG::Int1Type).to_i(false)
223
+ assert_equal(expected.to_i, res)
224
+ end
225
+
226
+ def icmp_assert(mode, operand0, operand1, signed, expected)
227
+ res = run_cmp(:icmp, mode, RLTK::CG::NativeInt.new(operand0, signed),
228
+ RLTK::CG::NativeInt.new(operand1, signed), RLTK::CG::Int1Type).to_i(false)
229
+
230
+ assert_equal(expected.to_i, res)
231
+ end
232
+
233
+ def fconv_assert(op, operand, ret_type, expected)
234
+ assert_in_delta(expected, run_convert(op, operand, ret_type).to_f(ret_type), 0.001)
235
+ end
236
+
237
+ def iconv_assert(op, operand, ret_type, signed, expected)
238
+ assert_equal(expected, run_convert(op, operand, ret_type).to_i(signed))
239
+ end
240
+
241
+ def run_cmp(op, mode, operand0, operand1, ret_type)
242
+ fun = @mod.functions.add("#{op}_#{mode}_tester", ret_type, []) do
243
+ blocks.append { ret(self.send(op, mode, operand0, operand1)) }
244
+ end
245
+
246
+ @jit.run_function(fun)
247
+ end
248
+
249
+ def run_convert(op, operand, ret_type)
250
+ fun = @mod.functions.add("#{op}_tester", ret_type, []) do
251
+ blocks.append { ret(self.send(op, operand, ret_type)) }
252
+ end
253
+
254
+ @jit.run_function(fun)
255
+ end
256
+ end
@@ -0,0 +1,25 @@
1
+ # Author: Chris Wailes <chris.wailes@gmail.com>
2
+ # Project: Ruby Language Toolkit
3
+ # Date: 2012/05/04
4
+ # Description: This file contains unit tests for rltk/cg/llvm.rb file.
5
+
6
+ ############
7
+ # Requires #
8
+ ############
9
+
10
+ # Gems
11
+ require 'minitest/autorun'
12
+
13
+ # Ruby Language Toolkit
14
+ require 'rltk/version'
15
+ require 'rltk/cg/llvm'
16
+
17
+ #######################
18
+ # Classes and Modules #
19
+ #######################
20
+
21
+ class LLVMTester < Minitest::Test
22
+ def test_init
23
+ assert_raises(ArgumentError) { RLTK::CG::LLVM.init(:foo) }
24
+ end
25
+ end
@@ -0,0 +1,88 @@
1
+ # Author: Chris Wailes <chris.wailes@gmail.com>
2
+ # Project: Ruby Language Toolkit
3
+ # Date: 2012/05/09
4
+ # Description: This file contains unit tests for various math instructions.
5
+
6
+ ############
7
+ # Requires #
8
+ ############
9
+
10
+ # Gems
11
+ require 'minitest/autorun'
12
+
13
+ # Ruby Language Toolkit
14
+ require 'rltk/cg/llvm'
15
+ require 'rltk/cg/module'
16
+ require 'rltk/cg/execution_engine'
17
+ require 'rltk/cg/type'
18
+ require 'rltk/cg/value'
19
+
20
+ #######################
21
+ # Classes and Modules #
22
+ #######################
23
+
24
+ class MathTester < Minitest::Test
25
+ def setup
26
+ RLTK::CG::LLVM.init(:X86)
27
+
28
+ @mod = RLTK::CG::Module.new('Testing Module')
29
+ @jit = RLTK::CG::JITCompiler.new(@mod)
30
+ end
31
+
32
+ def test_integer_binary_operations
33
+ int_binop_assert(:add, 3, 2, 3 + 2)
34
+ int_binop_assert(:sub, 3, 2, 3 - 2)
35
+ int_binop_assert(:mul, 3, 2, 3 * 2)
36
+ int_binop_assert(:udiv, 10, 2, 10 / 2)
37
+ int_binop_assert(:sdiv, 10, 2, 10 / 2)
38
+ int_binop_assert(:urem, 10, 3, 10 % 3)
39
+ int_binop_assert(:srem, 10, 3, 10 % 3)
40
+ end
41
+
42
+ def test_integer_bitwise_binary_operations
43
+ int_binop_assert(:shl, 2, 3, 2 << 3)
44
+ int_binop_assert(:lshr, 16, 3, 16 >> 3)
45
+ int_binop_assert(:ashr, 16, 3, 16 >> 3)
46
+ int_binop_assert(:and, 2, 1, 2 & 1)
47
+ int_binop_assert(:or, 2, 1, 2 | 1)
48
+ int_binop_assert(:xor, 3, 2, 3 ^ 2)
49
+ end
50
+
51
+ def test_float_binary_operations
52
+ float_binop_assert(:fadd, 3.1, 2.2, 3.1 + 2.2)
53
+ float_binop_assert(:fsub, 3.1, 2.2, 3.1 - 2.2)
54
+ float_binop_assert(:fmul, 3.1, 2.2, 3.1 * 2.2)
55
+ float_binop_assert(:fdiv, 3.1, 2.2, 3.1 / 2.2)
56
+ float_binop_assert(:frem, 3.1, 2.2, 3.1 % 2.2)
57
+ end
58
+
59
+ def test_simple_math_fun
60
+ fun = @mod.functions.add('simple_math_tester', RLTK::CG::FloatType, [RLTK::CG::FloatType]) do |fun|
61
+ blocks.append do
62
+ ret(fadd(fun.params[0], RLTK::CG::Float.new(1.0)))
63
+ end
64
+ end
65
+
66
+ assert_equal(6.0, @jit.run_function(fun, 5.0).to_f)
67
+ end
68
+
69
+ ##################
70
+ # Helper Methods #
71
+ ##################
72
+
73
+ def float_binop_assert(op, operand0, operand1, expected)
74
+ assert_in_delta(expected, run_binop(op, RLTK::CG::Float.new(operand0), RLTK::CG::Float.new(operand1), RLTK::CG::FloatType).to_f, 0.001)
75
+ end
76
+
77
+ def int_binop_assert(op, operand0, operand1, expected)
78
+ assert_equal(expected, run_binop(op, RLTK::CG::NativeInt.new(operand0), RLTK::CG::NativeInt.new(operand1), RLTK::CG::NativeIntType).to_i)
79
+ end
80
+
81
+ def run_binop(op, operand0, operand1, ret_type)
82
+ fun = @mod.functions.add(op.to_s + '_tester', ret_type, []) do
83
+ blocks.append { ret(self.send(op, operand0, operand1)) }
84
+ end
85
+
86
+ @jit.run_function(fun)
87
+ end
88
+ end
@@ -0,0 +1,89 @@
1
+ # Author: Chris Wailes <chris.wailes@gmail.com>
2
+ # Project: Ruby Language Toolkit
3
+ # Date: 2012/05/04
4
+ # Description: This file contains unit tests for the RLTK::CG::Module class.
5
+
6
+ ############
7
+ # Requires #
8
+ ############
9
+
10
+ # Standard Library
11
+ require 'tempfile'
12
+
13
+ # Gems
14
+ require 'minitest/autorun'
15
+
16
+ # Ruby Language Toolkit
17
+ require 'rltk/cg/llvm'
18
+ require 'rltk/cg/module'
19
+ require 'rltk/cg/execution_engine'
20
+ require 'rltk/cg/type'
21
+ require 'rltk/cg/value'
22
+
23
+ #######################
24
+ # Classes and Modules #
25
+ #######################
26
+
27
+ class ModuleTester < Minitest::Test
28
+ def setup
29
+ RLTK::CG::LLVM.init(:X86)
30
+
31
+ @mod = RLTK::CG::Module.new('Testing Module')
32
+ @jit = RLTK::CG::JITCompiler.new(@mod)
33
+
34
+ @mod.functions.add('int_function_tester', RLTK::CG::NativeIntType, []) do
35
+ blocks.append { ret RLTK::CG::NativeInt.new(1) }
36
+ end
37
+ end
38
+
39
+ def test_bitcode
40
+ Tempfile.open('bitcode') do |tmp|
41
+ assert(@mod.write_bitcode(tmp))
42
+
43
+ new_mod = RLTK::CG::Module.read_bitcode(tmp.path)
44
+ new_jit = RLTK::CG::JITCompiler.new(new_mod)
45
+
46
+ assert_equal(1, new_jit.run_function(new_mod.functions['int_function_tester']).to_i)
47
+ end
48
+ end
49
+
50
+ def test_equality
51
+ mod0 = RLTK::CG::Module.new('foo')
52
+ mod1 = RLTK::CG::Module.new('bar')
53
+ mod2 = RLTK::CG::Module.new(mod0.ptr)
54
+
55
+ assert_equal(mod0, mod2)
56
+ refute_equal(mod0, mod1)
57
+ end
58
+
59
+ def test_external_fun
60
+ fun = @mod.functions.add(:sin, RLTK::CG::DoubleType, [RLTK::CG::DoubleType])
61
+ res = @jit.run_function(fun, RLTK::CG::GenericValue.new(1.0, RLTK::CG::DoubleType)).to_f(RLTK::CG::DoubleType)
62
+
63
+ assert_in_delta(Math.sin(1.0), res, 1e-10)
64
+ end
65
+
66
+ def test_simple_int_fun
67
+ assert_equal(1, @jit.run_function(@mod.functions['int_function_tester']).to_i)
68
+ end
69
+
70
+ def test_simple_float_fun
71
+ fun = @mod.functions.add('float_function_tester', RLTK::CG::FloatType, []) do
72
+ blocks.append do
73
+ ret RLTK::CG::Float.new(1.5)
74
+ end
75
+ end
76
+
77
+ assert_equal(1.5, @jit.run_function(fun).to_f(RLTK::CG::FloatType))
78
+ end
79
+
80
+ def test_simple_double_fun
81
+ fun = @mod.functions.add('double_function_tester', RLTK::CG::DoubleType, []) do
82
+ blocks.append do
83
+ ret RLTK::CG::Double.new(1.6)
84
+ end
85
+ end
86
+
87
+ assert_equal(1.6, @jit.run_function(fun).to_f(RLTK::CG::DoubleType))
88
+ end
89
+ end
@@ -0,0 +1,68 @@
1
+ # Author: Chris Wailes <chris.wailes@gmail.com>
2
+ # Project: Ruby Language Toolkit
3
+ # Date: 2012/05/11
4
+ # Description: This file contains unit tests for the mechanics beind
5
+ # transformation passes.
6
+
7
+ ############
8
+ # Requires #
9
+ ############
10
+
11
+ # Gems
12
+ require 'minitest/autorun'
13
+
14
+ # Ruby Language Toolkit
15
+ require 'rltk/cg/llvm'
16
+ require 'rltk/cg/module'
17
+ require 'rltk/cg/execution_engine'
18
+ require 'rltk/cg/type'
19
+ require 'rltk/cg/value'
20
+
21
+ class TransformTester < Minitest::Test
22
+ def setup
23
+ RLTK::CG::LLVM.init(:X86)
24
+
25
+ @mod = RLTK::CG::Module.new('Testing Module')
26
+ @jit = RLTK::CG::JITCompiler.new(@mod)
27
+ end
28
+
29
+ def test_gdce
30
+ fn0 = @mod.functions.add('fn0', RLTK::CG::VoidType, []) do |fun|
31
+ fun.linkage = :internal
32
+
33
+ blocks.append do
34
+ ret_void
35
+ end
36
+ end
37
+
38
+ fn1 = @mod.functions.add('fn1', RLTK::CG::VoidType, []) do |fun|
39
+ fun.linkage = :internal
40
+
41
+ blocks.append do
42
+ ret_void
43
+ end
44
+ end
45
+
46
+ main = @mod.functions.add('main', RLTK::CG::VoidType, []) do
47
+ blocks.append do
48
+ call(fn0)
49
+ ret_void
50
+ end
51
+ end
52
+
53
+ funs = @mod.functions.to_a
54
+
55
+ assert(funs.include?(fn0))
56
+ assert(funs.include?(fn1))
57
+ assert(funs.include?(main))
58
+
59
+ @mod.pass_manager << :GDCE
60
+ assert(@mod.pass_manager.run)
61
+
62
+ funs = @mod.functions.to_a
63
+
64
+ assert( funs.include?(fn0))
65
+ assert(!funs.include?(fn1))
66
+ assert( funs.include?(main))
67
+ end
68
+ end
@@ -0,0 +1,69 @@
1
+ # Author: Chris Wailes <chris.wailes@gmail.com>
2
+ # Project: Ruby Language Toolkit
3
+ # Date: 2012/05/09
4
+ # Description: This file contains unit tests for the RLTK::CG::Type class and
5
+ # its subclasses.
6
+
7
+ ############
8
+ # Requires #
9
+ ############
10
+
11
+ # Gems
12
+ require 'minitest/autorun'
13
+
14
+ # Ruby Language Toolkit
15
+ require 'rltk/cg/type'
16
+
17
+ class TypeTester < Minitest::Test
18
+ def setup
19
+ @pointee = RLTK::CG::NativeIntType.instance
20
+ @pointer = RLTK::CG::PointerType.new(@pointee)
21
+ end
22
+
23
+ def test_deferrent_element_type_stuct_type
24
+ type = RLTK::CG::StructType.new([], 'test_struct')
25
+ type.element_types = [RLTK::CG::NativeIntType, RLTK::CG::FloatType]
26
+
27
+ assert_equal(2, type.element_types.size)
28
+ assert_equal(RLTK::CG::NativeIntType.instance, type.element_types[0])
29
+ assert_equal(RLTK::CG::FloatType.instance, type.element_types[1])
30
+
31
+ end
32
+
33
+ def test_element_type
34
+ assert_equal(@pointee, @pointer.element_type)
35
+ end
36
+
37
+ def test_equality
38
+ assert_equal(RLTK::CG::NativeIntType, RLTK::CG::NativeIntType)
39
+ refute_equal(RLTK::CG::NativeIntType, RLTK::CG::FloatType)
40
+
41
+ at0 = RLTK::CG::ArrayType.new(RLTK::CG::NativeIntType, 2)
42
+ at1 = RLTK::CG::ArrayType.new(RLTK::CG::NativeIntType, 2)
43
+ at2 = RLTK::CG::ArrayType.new(RLTK::CG::FloatType, 2)
44
+
45
+ assert_equal(at0, at1)
46
+ refute_equal(at0, at2)
47
+ end
48
+
49
+ def test_kind
50
+ assert_equal(:pointer, @pointer.kind)
51
+ assert_equal(:integer, @pointee.kind)
52
+ end
53
+
54
+ def test_named_struct_type
55
+ type = RLTK::CG::StructType.new([RLTK::CG::NativeIntType, RLTK::CG::FloatType], 'test_struct')
56
+
57
+ assert_instance_of(RLTK::CG::StructType, type)
58
+ assert_equal('test_struct', type.name)
59
+ end
60
+
61
+ def test_simple_struct_type
62
+ type = RLTK::CG::StructType.new([RLTK::CG::NativeIntType, RLTK::CG::FloatType])
63
+
64
+ assert_instance_of(RLTK::CG::StructType, type)
65
+ assert_equal(2, type.element_types.size)
66
+ assert_equal(RLTK::CG::NativeIntType.instance, type.element_types[0])
67
+ assert_equal(RLTK::CG::FloatType.instance, type.element_types[1])
68
+ end
69
+ end