ruby-llvm 13.0.1 → 13.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/test/mcjit_test.rb DELETED
@@ -1,102 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'test_helper'
4
-
5
- class MCJITTestCase < Minitest::Test
6
- def setup
7
- LLVM.init_jit(true)
8
- end
9
-
10
- def create_square_function_module
11
- LLVM::Module.new('square').tap do |mod|
12
- mod.functions.add(:square, [LLVM::Int], LLVM::Int) do |fun, x|
13
- fun.basic_blocks.append.build do |builder|
14
- n = builder.mul(x, x)
15
- builder.ret(n)
16
- end
17
- end
18
-
19
- mod.verify!
20
- end
21
- end
22
-
23
- def test_simple_function
24
- mod = create_square_function_module
25
-
26
- engine = LLVM::MCJITCompiler.new(mod, :opt_level => 0)
27
-
28
- result = engine.run_function(mod.functions['square'], 5)
29
- assert_equal 25, result.to_i
30
- end
31
-
32
- def test_functions_named
33
- mod = LLVM::Module.new('foo').tap do |mod|
34
- mod.functions.add(:foo, [], LLVM::Int)
35
- mod.verify!
36
- end
37
-
38
- engine = LLVM::MCJITCompiler.new(mod, :opt_level => 0)
39
-
40
- # TODO: fix or replace find_function
41
- skip
42
-
43
- ['foo', :foo].each do |name|
44
- engine.functions[name].tap do |fun|
45
- assert fun, "function named #{name.inspect}"
46
- assert_equal 'foo', fun.name
47
- end
48
- end
49
- end
50
-
51
- def test_add_module
52
- main_mod = LLVM::Module.new('main')
53
-
54
- main_mod.functions.add(:square, [LLVM::Int], LLVM::Int) do |square|
55
- main_mod.functions.add(:call_square, [], LLVM::Int) do |call_square|
56
- call_square.basic_blocks.append.build do |builder|
57
- n = builder.call(square, LLVM::Int(5))
58
- builder.ret(n)
59
- end
60
- end
61
- end
62
-
63
- main_mod.verify!
64
-
65
- engine = LLVM::MCJITCompiler.new(main_mod, :opt_level => 0)
66
- engine.modules << create_square_function_module
67
-
68
- result = engine.run_function(main_mod.functions['call_square'])
69
- assert_equal 25, result.to_i
70
- end
71
-
72
- def test_remove_module
73
- mod1 = LLVM::Module.new('foo')
74
- mod2 = LLVM::Module.new('bar')
75
-
76
- foo = mod1.functions.add(:foo, [], LLVM::Int)
77
- bar = mod2.functions.add(:bar, [], LLVM::Int)
78
-
79
- engine = LLVM::MCJITCompiler.new(mod1, :opt_level => 0)
80
-
81
- (engine.modules << mod2).tap do |ret|
82
- assert_equal engine.modules, ret, '#<< returns self'
83
- end
84
-
85
- # TODO: fix or replace find_function
86
- skip
87
-
88
- refute_nil engine.functions[:bar]
89
- engine.modules.delete(mod2).tap do |ret|
90
- assert_instance_of LLVM::Module, ret, '#delete returns module'
91
- assert_equal mod2, ret
92
- end
93
- assert_nil engine.functions[:bar]
94
- end
95
-
96
- def test_accessors
97
- main_mod = LLVM::Module.new('main')
98
- engine = LLVM::MCJITCompiler.new(main_mod, :opt_level => 0)
99
- assert_match(/^e-/, engine.data_layout.to_s)
100
- assert_match(/gnu/, engine.target_machine.triple)
101
- end
102
- end
@@ -1,40 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "test_helper"
4
-
5
- class MemoryAccessTestCase < Minitest::Test
6
-
7
- def setup
8
- LLVM.init_jit
9
- end
10
-
11
- def test_memory_access
12
- assert_equal 1 + 2, simple_memory_access_function(1, 2).to_i
13
- assert_equal 3 + 4, array_memory_access_function(3, 4).to_i
14
- end
15
-
16
- def simple_memory_access_function(value1, value2)
17
- run_function([LLVM::Int, LLVM::Int], [value1, value2], LLVM::Int) do |builder, function, *arguments|
18
- entry = function.basic_blocks.append
19
- builder.position_at_end(entry)
20
- pointer1 = builder.alloca(LLVM::Int)
21
- pointer2 = builder.alloca(LLVM::Int)
22
- builder.store(arguments.first, pointer1)
23
- builder.store(arguments.last, pointer2)
24
- builder.ret(builder.add(builder.load(pointer1), builder.load(pointer2)))
25
- end
26
- end
27
-
28
- def array_memory_access_function(value1, value2)
29
- run_function([LLVM::Int, LLVM::Int], [value1, value2], LLVM::Int) do |builder, function, *arguments|
30
- entry = function.basic_blocks.append
31
- builder.position_at_end(entry)
32
- pointer = builder.array_alloca(LLVM::Int, LLVM::Int(2))
33
- builder.store(arguments.first, builder.gep(pointer, [LLVM::Int(0)]))
34
- builder.store(arguments.last, builder.gep(pointer, [LLVM::Int(1)]))
35
- builder.ret(builder.add(builder.load(builder.gep(pointer, [LLVM::Int(0)])),
36
- builder.load(builder.gep(pointer, [LLVM::Int(1)]))))
37
- end
38
- end
39
-
40
- end
data/test/module_test.rb DELETED
@@ -1,95 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "test_helper"
4
- require "tempfile"
5
-
6
- class ModuleTestCase < Minitest::Test
7
-
8
- def setup
9
- LLVM.init_jit
10
- end
11
-
12
- def simple_function
13
- run_function([], [], LLVM::Int) do |builder, function, *arguments|
14
- entry = function.basic_blocks.append
15
- builder.position_at_end(entry)
16
- builder.ret(LLVM::Int(1))
17
- end
18
- end
19
-
20
- def test_simple_module
21
- assert_equal 1, simple_function().to_i
22
- end
23
-
24
- def test_global_variable
25
- yielded = false
26
-
27
- define_module('test_globals_add') do |mod|
28
- mod.globals.add(LLVM::Int32, 'i') do |var|
29
- yielded = true
30
-
31
- assert var.kind_of?(LLVM::GlobalVariable)
32
-
33
- # unnamed_addr
34
- assert !var.unnamed_addr?
35
- var.unnamed_addr = true
36
- assert var.unnamed_addr?
37
-
38
- assert (var.dll_storage_class == :default)
39
- var.dll_storage_class = :dll_import
40
- assert (var.dll_storage_class == :dll_import)
41
-
42
- # global_constant
43
- assert !var.global_constant?
44
- var.global_constant = true
45
- assert var.global_constant?
46
-
47
- assert_output("", "Warning: Passing Integer value to LLVM::GlobalValue#global_constant=(Boolean) is deprecated.\n") do
48
- var.global_constant = 0
49
- end
50
- assert !var.global_constant?
51
- end
52
- end
53
-
54
- assert yielded, 'LLVM::Module::GlobalCollection#add takes block'
55
- end
56
-
57
- def test_to_s
58
- mod = LLVM::Module.new('test_print')
59
- assert_equal mod.to_s,
60
- "; ModuleID = 'test_print'\nsource_filename = \"test_print\"\n"
61
- end
62
-
63
- def test_dump
64
- mod = LLVM::Module.new('test_print')
65
- expected_pattern = /^; ModuleID = 'test_print'$/
66
-
67
- Tempfile.open('test_dump.1') do |tmpfile|
68
- # debug stream (stderr)
69
- stderr_old = $stderr.dup
70
- $stderr.reopen(tmpfile.path, 'a')
71
- begin
72
- mod.dump
73
- $stderr.flush
74
- assert_match expected_pattern, File.read(tmpfile.path)
75
- ensure
76
- $stderr.reopen(stderr_old)
77
- end
78
- end
79
- end
80
-
81
- def test_module_properties
82
- mod = LLVM::Module.new('mod')
83
-
84
- assert_equal '', mod.triple
85
-
86
- mod.triple = 'x86-linux-gnu'
87
- assert_equal 'x86-linux-gnu', mod.triple
88
-
89
- assert_equal '', mod.data_layout
90
-
91
- mod.data_layout = 'e-p:32:32'
92
- assert_equal 'e-p:32:32', mod.data_layout
93
- end
94
-
95
- end
@@ -1,30 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "test_helper"
4
-
5
- class ParameterCollectionTestCase < Minitest::Test
6
- def setup
7
- @mod = LLVM::Module.new('test')
8
- @fun = @mod.functions.add('fun', [LLVM::Int, LLVM::Int], LLVM::Int)
9
- @fun.params[0].name = 'foo'
10
- @fun.params[1].name = 'bar'
11
- end
12
-
13
- def test_positive_index_in_range
14
- assert_equal 'foo', @fun.params[0].name
15
- assert_equal 'bar', @fun.params[1].name
16
- end
17
-
18
- def test_negative_index_in_range
19
- assert_equal 'foo', @fun.params[-2].name
20
- assert_equal 'bar', @fun.params[-1].name
21
- end
22
-
23
- def test_positive_index_out_of_range
24
- assert_nil @fun.params[2]
25
- end
26
-
27
- def test_negative_index_out_of_range
28
- assert_nil @fun.params[-3]
29
- end
30
- end
@@ -1,74 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'test_helper'
4
- require 'llvm/config'
5
- require 'llvm/transforms/builder'
6
-
7
- class PassManagerBuilderTest < Minitest::Test
8
- def setup
9
- LLVM.init_jit
10
- @builder = LLVM::PassManagerBuilder.new
11
-
12
- @pass_manager = LLVM::PassManager.new
13
- end
14
-
15
- def teardown
16
- @builder.dispose
17
- @pass_manager.dispose
18
- end
19
-
20
- def test_init
21
- assert_equal 0, @builder.size_level
22
- assert_equal 0, @builder.opt_level
23
- assert_equal false, @builder.unit_at_a_time
24
- assert_equal false, @builder.unroll_loops
25
- assert_equal false, @builder.simplify_lib_calls
26
- assert_equal 0, @builder.inliner_threshold
27
- end
28
-
29
- def test_opt_level
30
- @builder.opt_level = 3
31
- assert_equal 3, @builder.opt_level
32
- end
33
-
34
- def test_build
35
- @builder.build(@pass_manager)
36
- end
37
-
38
- def test_build_with_lto
39
- assert_output('', '') do
40
- @builder.build_with_lto(@pass_manager)
41
- end
42
- end
43
-
44
- def test_build_with_lto_deprecated_internalize_param
45
- assert_output("", "Warning: Passing Integer value to LLVM::PassManagerBuilder#build_with_lto is deprecated.\n") do
46
- @builder.build_with_lto(@pass_manager, 0)
47
- end
48
- end
49
-
50
- def test_build_with_lto_deprecated_run_inliner_param
51
- assert_output("", "Warning: Passing Integer value to LLVM::PassManagerBuilder#build_with_lto is deprecated.\n") do
52
- @builder.build_with_lto(@pass_manager, false, 0)
53
- end
54
- end
55
-
56
- PASSES = [
57
- 'always_inline!',
58
- 'adce!',
59
- 'tailcallelim!',
60
- 'fun_attrs!',
61
- 'mergefunc!',
62
- ].freeze
63
-
64
- describe "PassManager Passes" do
65
- before do
66
- assert @pass_manager = LLVM::PassManager.new
67
- end
68
- PASSES.each do |pass|
69
- it "should return '#{pass}'" do
70
- assert_nil @pass_manager.send(pass)
71
- end
72
- end
73
- end
74
- end
data/test/phi_test.rb DELETED
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "test_helper"
4
-
5
- class PhiTest < Minitest::Test
6
- def setup
7
- LLVM.init_jit
8
- end
9
-
10
- def test_phi
11
- assert_equal 1, run_phi_function(0).to_i
12
- assert_equal 0, run_phi_function(1).to_i
13
- end
14
-
15
- def run_phi_function(argument)
16
- run_function([LLVM::Int], argument, LLVM::Int) do |builder, function, *arguments|
17
- entry = function.basic_blocks.append
18
- block1 = function.basic_blocks.append
19
- block2 = function.basic_blocks.append
20
- exit = function.basic_blocks.append
21
- builder.position_at_end(entry)
22
- builder.cond(builder.icmp(:eq, arguments.first, LLVM::Int(0)), block1, block2)
23
- builder.position_at_end(block1)
24
- result1 = builder.add(arguments.first, LLVM::Int(1))
25
- builder.br(exit)
26
- builder.position_at_end(block2)
27
- result2 = builder.sub(arguments.first, LLVM::Int(1))
28
- builder.br(exit)
29
- builder.position_at_end(exit)
30
- builder.ret(builder.phi(LLVM::Int,
31
- block1 => result1,
32
- block2 => result2))
33
- end
34
- end
35
- end
data/test/select_test.rb DELETED
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "test_helper"
4
-
5
- class SelectTestCase < Minitest::Test
6
-
7
- def setup
8
- LLVM.init_jit
9
- end
10
-
11
- def test_select
12
- assert_equal 0, select_function(1).to_i
13
- assert_equal 1, select_function(0).to_i
14
- end
15
-
16
- def select_function(value)
17
- run_function([LLVM::Int1], [value], LLVM::Int) do |builder, function, *arguments|
18
- entry = function.basic_blocks.append
19
- builder.position_at_end(entry)
20
- builder.ret(builder.select(arguments.first, LLVM::Int(0), LLVM::Int(1)))
21
- end
22
- end
23
-
24
- end
data/test/struct_test.rb DELETED
@@ -1,100 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "test_helper"
4
-
5
- class StructTestCase < Minitest::Test
6
-
7
- LLVM_UNPACKED = false
8
- LLVM_PACKED = true
9
-
10
- def setup
11
- LLVM.init_jit
12
- end
13
-
14
- def test_simple_struct
15
- struct = LLVM::Struct(LLVM::Int, LLVM::Float)
16
- assert_instance_of LLVM::StructType, struct
17
- assert_equal 2, struct.element_types.size
18
- assert_equal LLVM::Int.type, struct.element_types[0]
19
- assert_equal LLVM::Float.type, struct.element_types[1]
20
- end
21
-
22
- def test_named_struct
23
- struct = LLVM::Struct(LLVM::Int, LLVM::Float, "struct100")
24
- assert_instance_of LLVM::StructType, struct
25
- assert_equal "struct100", struct.name
26
- end
27
-
28
- def test_deferred_element_type_setting
29
- struct = LLVM::Struct("struct200")
30
- struct.element_types = [LLVM::Int, LLVM::Float]
31
- assert_equal 2, struct.element_types.size
32
- end
33
-
34
- def test_unpacked_constant_struct_from_size
35
- struct = LLVM::ConstantStruct.const(2, LLVM_UNPACKED) { |i| LLVM::Int(i) }
36
- assert_instance_of LLVM::ConstantStruct, struct
37
- assert_equal 2, struct.operands.size
38
- end
39
-
40
- def test_unpacked_constant_struct_from_struct
41
- struct = LLVM::ConstantStruct.const([LLVM::Int(0), LLVM::Int(1)], LLVM_UNPACKED)
42
- assert_instance_of LLVM::ConstantStruct, struct
43
- assert_equal 2, struct.operands.size
44
- end
45
-
46
- def test_packed_constant_struct_from_size
47
- struct = LLVM::ConstantStruct.const(2, LLVM_PACKED) { |i| LLVM::Int(i) }
48
- assert_instance_of LLVM::ConstantStruct, struct
49
- assert_equal 2, struct.operands.size
50
- end
51
-
52
- def test_packed_constant_struct_from_struct
53
- struct = LLVM::ConstantStruct.const([LLVM::Int(0), LLVM::Int(1)], LLVM_PACKED)
54
- assert_instance_of LLVM::ConstantStruct, struct
55
- assert_equal 2, struct.operands.size
56
- end
57
-
58
- def test_constant_named_struct
59
- struct_ty = LLVM::Struct(LLVM::Int, "struct300")
60
- struct = LLVM::ConstantStruct.named_const(struct_ty, [ LLVM::Int(1) ])
61
- assert_instance_of LLVM::ConstantStruct, struct
62
- assert_equal 1, struct.operands.size
63
- assert_equal struct_ty, struct.type
64
- end
65
-
66
- def test_struct_values
67
- assert_equal 2 + 3, run_struct_values(2, 3).to_i
68
- end
69
-
70
- def test_struct_access
71
- assert_in_delta 2 + 3.3, run_struct_access(LLVM::Float, 2, 3.3).to_f, 0.001
72
- end
73
-
74
- def run_struct_values(value1, value2)
75
- run_function([LLVM::Int, LLVM::Int], [value1, value2], LLVM::Int) do |builder, function, *arguments|
76
- entry = function.basic_blocks.append
77
- builder.position_at_end(entry)
78
- pointer = builder.alloca(LLVM::Struct(LLVM::Int, LLVM::Int))
79
- struct = builder.load(pointer)
80
- struct = builder.insert_value(struct, arguments.first, 0)
81
- struct = builder.insert_value(struct, arguments.last, 1)
82
- builder.ret(builder.add(builder.extract_value(struct, 0),
83
- builder.extract_value(struct, 1)))
84
- end
85
- end
86
-
87
- def run_struct_access(return_type, value1, value2)
88
- run_function([LLVM::Int, LLVM::Float], [value1, value2], return_type) do |builder, function, *arguments|
89
- entry = function.basic_blocks.append
90
- builder.position_at_end(entry)
91
- pointer = builder.alloca(LLVM::Struct(LLVM::Float, LLVM::Struct(LLVM::Int, LLVM::Float), LLVM::Int))
92
- builder.store(arguments.first, builder.gep(pointer, [LLVM::Int(0), LLVM::Int32.from_i(1), LLVM::Int32.from_i(0)]))
93
- builder.store(arguments.last, builder.gep(pointer, [LLVM::Int(0), LLVM::Int32.from_i(1), LLVM::Int32.from_i(1)]))
94
- address1 = builder.gep(pointer, [LLVM::Int(0), LLVM::Int32.from_i(1), LLVM::Int32.from_i(0)])
95
- address2 = builder.gep(pointer, [LLVM::Int(0), LLVM::Int32.from_i(1), LLVM::Int32.from_i(1)])
96
- builder.ret(builder.fadd(builder.ui2fp(builder.load(address1), LLVM::Float), builder.load(address2)))
97
- end
98
- end
99
-
100
- end
data/test/target_test.rb DELETED
@@ -1,126 +0,0 @@
1
- # encoding: ascii-8bit
2
- # frozen_string_literal: true
3
-
4
- require "test_helper"
5
- require 'tempfile'
6
- require 'llvm/version'
7
- require 'llvm/config'
8
-
9
- class TargetTestCase < Minitest::Test
10
-
11
- def setup
12
- LLVM::Target.init('X86', true)
13
-
14
- @x86 = LLVM::Target.by_name('x86')
15
- end
16
-
17
- def test_init_native
18
- LLVM::Target.init_native
19
- LLVM::Target.init_native(true)
20
- end
21
-
22
- if LLVM::CONFIG::TARGETS_BUILT.include?('ARM')
23
- def test_init_arm
24
- LLVM::Target.init('ARM')
25
- LLVM::Target.init('ARM', true)
26
-
27
- arm_target = LLVM::Target.by_name('arm')
28
- assert_equal 'arm', arm_target.name
29
- end
30
- end
31
-
32
- def test_init_all
33
- LLVM::Target.init_all
34
- LLVM::Target.init_all(true)
35
- end
36
-
37
- def test_each
38
- targets = LLVM::Target.each
39
-
40
- assert_instance_of Enumerator, targets
41
- assert targets.count > 0
42
- end
43
-
44
- def test_target
45
- assert_equal 'x86', @x86.name
46
- assert_equal "32-bit X86: Pentium-Pro and above", @x86.description
47
- assert_equal true, @x86.jit?
48
- assert_equal true, @x86.target_machine?
49
- assert_equal true, @x86.asm_backend?
50
- end
51
-
52
- def test_target_machine
53
- @x86 = LLVM::Target.by_name('x86')
54
- mach = @x86.create_machine('x86-linux-gnu', 'i686')
55
-
56
- assert_equal @x86, mach.target
57
- assert_equal 'x86-linux-gnu', mach.triple
58
- assert_equal 'i686', mach.cpu
59
- assert_equal '', mach.features
60
- end
61
-
62
- def test_emit
63
- mach = @x86.create_machine('x86-linux-gnu')
64
-
65
- mod = define_module('test') do |mod|
66
- define_function(mod, 'main', [], LLVM::Int) do |builder, fun|
67
- entry = fun.basic_blocks.append
68
- builder.position_at_end(entry)
69
- builder.ret(LLVM::Int(0))
70
- end
71
- end
72
-
73
- Tempfile.open('emit') do |tmp|
74
- mach.emit(mod, tmp.path)
75
- data = tmp.read
76
- assert_match(/xorl\t%eax, %eax/, data)
77
- assert_equal 218, data.length
78
- end
79
-
80
- # despite the above test, in LLVM <= 11 the objdump output was:
81
- # 00000000 <main>:
82
- # 0: 66 31 c0 xor %ax,%ax
83
- # 3: 66 c3 retw
84
- # In LLVM 13, the objdump output is:
85
- # 00000000 <main>:
86
- # 0: 31 c0 xor %eax,%eax
87
- # 2: c3 ret
88
- Tempfile.open('emit') do |tmp|
89
- mach.emit(mod, tmp.path, :object)
90
- data = File.read(tmp.path, mode: 'rb')
91
- assert_match(/\x31\xc0\xc3/, data)
92
- assert_equal 528, data.length
93
- end
94
- end
95
-
96
- def test_data_layout
97
- layout_be = LLVM::TargetDataLayout.new('E')
98
- assert_equal :big_endian, layout_be.byte_order
99
-
100
- desc = "e-p:32:32:32-S0-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f16:16:16-f32:32:32-f64:64:64-f128:128:128-v64:64:64-v128:128:128-a0:0:64"
101
- layout = LLVM::TargetDataLayout.new(desc)
102
-
103
- assert_equal desc, layout.to_s
104
- assert_equal :little_endian, layout.byte_order
105
- assert_equal 4, layout.pointer_size
106
- assert_equal 4, layout.pointer_size(0)
107
- assert_equal LLVM::Int32.type, layout.int_ptr_type
108
- assert_equal LLVM::Int32.type, layout.int_ptr_type(0)
109
-
110
- assert_equal 19, layout.bit_size_of(LLVM::Int19.type)
111
- assert_equal 3, layout.storage_size_of(LLVM::Int19.type)
112
- assert_equal 4, layout.abi_size_of(LLVM::Int19.type)
113
- assert_equal 4, layout.abi_alignment_of(LLVM::Int19.type)
114
- assert_equal 4, layout.call_frame_alignment_of(LLVM::Int19.type)
115
- assert_equal 4, layout.preferred_alignment_of(LLVM::Int19.type)
116
-
117
- struct = LLVM.Struct(LLVM::Int8, LLVM::Int32)
118
-
119
- assert_equal 0, layout.offset_of_element(struct, 0)
120
- assert_equal 4, layout.offset_of_element(struct, 1)
121
-
122
- assert_equal 0, layout.element_at_offset(struct, 0)
123
- assert_equal 0, layout.element_at_offset(struct, 3)
124
- assert_equal 1, layout.element_at_offset(struct, 4)
125
- end
126
- end
data/test/test_helper.rb DELETED
@@ -1,64 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
4
-
5
- begin
6
- require "ruby-debug"
7
- rescue LoadError
8
- # Ignore ruby-debug is case it's not installed
9
- end
10
-
11
- begin
12
- require 'simplecov'
13
-
14
- SimpleCov.start do
15
- add_filter "/test/"
16
- end
17
- rescue LoadError
18
- warn "Proceeding without SimpleCov. gem install simplecov on supported platforms."
19
- end
20
-
21
- require "minitest/autorun"
22
- require 'minitest/reporters'
23
-
24
- Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new
25
-
26
- require "llvm/core"
27
- require "llvm/execution_engine"
28
- require "llvm/transforms/scalar"
29
-
30
- class Minitest::Test
31
-
32
- LLVM_SIGNED = true
33
- LLVM_UNSIGNED = false
34
-
35
- LLVM_FALSE = 0
36
- LLVM_TRUE = 1
37
-
38
- end
39
-
40
- def define_module(module_name)
41
- new_module = LLVM::Module.new(module_name)
42
- yield new_module
43
- new_module.verify
44
- new_module
45
- end
46
-
47
- def define_function(host_module, function_name, argument_types, return_type)
48
- host_module.functions.add(function_name, argument_types, return_type) do |function, *arguments|
49
- yield(LLVM::Builder.new, function, *arguments)
50
- end
51
- end
52
-
53
- def run_function_on_module(host_module, function_name, *argument_values)
54
- LLVM::MCJITCompiler.new(host_module).
55
- run_function(host_module.functions[function_name], *argument_values)
56
- end
57
-
58
- def run_function(argument_types, argument_values, return_type, &block)
59
- test_module = define_module("test_module") do |host_module|
60
- define_function(host_module, "test_function", argument_types, return_type, &block)
61
- end
62
-
63
- run_function_on_module(test_module, "test_function", *argument_values)
64
- end