ruby-llvm 13.0.1 → 13.0.2
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 +4 -4
- data/lib/llvm/core/builder.rb +87 -9
- data/lib/llvm/core/type.rb +4 -0
- data/lib/llvm/version.rb +1 -1
- metadata +13 -68
- data/test/array_test.rb +0 -40
- data/test/basic_block_test.rb +0 -89
- data/test/binary_operations_test.rb +0 -60
- data/test/bitcode_test.rb +0 -26
- data/test/branch_test.rb +0 -59
- data/test/call_test.rb +0 -84
- data/test/comparisons_test.rb +0 -68
- data/test/conversions_test.rb +0 -94
- data/test/double_test.rb +0 -36
- data/test/equality_test.rb +0 -91
- data/test/function_test.rb +0 -102
- data/test/generic_value_test.rb +0 -24
- data/test/instruction_test.rb +0 -32
- data/test/integer_test.rb +0 -28
- data/test/ipo_test.rb +0 -55
- data/test/linker_test.rb +0 -39
- data/test/mcjit_test.rb +0 -102
- data/test/memory_access_test.rb +0 -40
- data/test/module_test.rb +0 -95
- data/test/parameter_collection_test.rb +0 -30
- data/test/pass_manager_builder_test.rb +0 -74
- data/test/phi_test.rb +0 -35
- data/test/select_test.rb +0 -24
- data/test/struct_test.rb +0 -100
- data/test/target_test.rb +0 -126
- data/test/test_helper.rb +0 -64
- data/test/type_test.rb +0 -62
- data/test/vector_test.rb +0 -66
data/test/call_test.rb
DELETED
@@ -1,84 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "test_helper"
|
4
|
-
|
5
|
-
class CallTestCase < Minitest::Test
|
6
|
-
|
7
|
-
def setup
|
8
|
-
LLVM.init_jit
|
9
|
-
end
|
10
|
-
|
11
|
-
def test_simple_call
|
12
|
-
test_module = define_module("test_module") do |host_module|
|
13
|
-
define_function(host_module, "test_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
|
-
assert_equal 1, run_function_on_module(test_module, "test_function").to_i
|
20
|
-
end
|
21
|
-
|
22
|
-
def test_nested_call
|
23
|
-
test_module = define_module("test_module") do |host_module|
|
24
|
-
function_1 = define_function(host_module, "test_function_1", [], LLVM::Int) do |builder, function, *arguments|
|
25
|
-
entry = function.basic_blocks.append
|
26
|
-
builder.position_at_end(entry)
|
27
|
-
builder.ret(LLVM::Int(1))
|
28
|
-
end
|
29
|
-
function_2 = define_function(host_module, "test_function_2", [], LLVM::Int) do |builder, function, *arguments|
|
30
|
-
entry = function.basic_blocks.append
|
31
|
-
builder.position_at_end(entry)
|
32
|
-
builder.ret(builder.call(function_1))
|
33
|
-
end
|
34
|
-
end
|
35
|
-
assert_equal 1, run_function_on_module(test_module, "test_function_2").to_i
|
36
|
-
end
|
37
|
-
|
38
|
-
def test_recursive_call
|
39
|
-
test_module = define_module("test_module") do |host_module|
|
40
|
-
define_function(host_module, "test_function", [LLVM::Int], LLVM::Int) do |builder, function, *arguments|
|
41
|
-
entry = function.basic_blocks.append
|
42
|
-
recurse = function.basic_blocks.append
|
43
|
-
exit = function.basic_blocks.append
|
44
|
-
builder.position_at_end(entry)
|
45
|
-
builder.cond(builder.icmp(:uge, arguments.first, LLVM::Int(5)), exit, recurse)
|
46
|
-
builder.position_at_end(recurse)
|
47
|
-
result = builder.call(function, builder.add(arguments.first, LLVM::Int(1)))
|
48
|
-
builder.br(exit)
|
49
|
-
builder.position_at_end(exit)
|
50
|
-
builder.ret(builder.phi(LLVM::Int, entry => arguments.first, recurse => result))
|
51
|
-
end
|
52
|
-
end
|
53
|
-
assert_equal 5, run_function_on_module(test_module, "test_function", 1).to_i
|
54
|
-
end
|
55
|
-
|
56
|
-
def test_external
|
57
|
-
test_module = define_module("test_module") do |host_module|
|
58
|
-
external = host_module.functions.add("abs", [LLVM::Int], LLVM::Int)
|
59
|
-
define_function(host_module, "test_function", [LLVM::Int], LLVM::Int) do |builder, function, *arguments|
|
60
|
-
entry = function.basic_blocks.append
|
61
|
-
builder.position_at_end(entry)
|
62
|
-
builder.ret(builder.call(external, arguments.first))
|
63
|
-
end
|
64
|
-
end
|
65
|
-
assert_equal(-10.abs, run_function_on_module(test_module, "test_function", -10).to_i)
|
66
|
-
end
|
67
|
-
|
68
|
-
def test_external_string
|
69
|
-
test_module = define_module("test_module") do |host_module|
|
70
|
-
global = host_module.globals.add(LLVM::Array(LLVM::Int8, 5), "path")
|
71
|
-
global.linkage = :internal
|
72
|
-
global.initializer = LLVM::ConstantArray.string("PATH")
|
73
|
-
external = host_module.functions.add("getenv", [LLVM::Pointer(LLVM::Int8)], LLVM::Pointer(LLVM::Int8))
|
74
|
-
define_function(host_module, "test_function", [], LLVM::Pointer(LLVM::Int8)) do |builder, function, *arguments|
|
75
|
-
entry = function.basic_blocks.append
|
76
|
-
builder.position_at_end(entry)
|
77
|
-
parameter = builder.gep(global, [LLVM::Int(0), LLVM::Int(0)])
|
78
|
-
builder.ret(builder.call(external, parameter))
|
79
|
-
end
|
80
|
-
end
|
81
|
-
assert_equal ENV["PATH"], run_function_on_module(test_module, "test_function").to_ptr.read_pointer.read_string
|
82
|
-
end
|
83
|
-
|
84
|
-
end
|
data/test/comparisons_test.rb
DELETED
@@ -1,68 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "test_helper"
|
4
|
-
|
5
|
-
class ComparisonsTestCase < Minitest::Test
|
6
|
-
|
7
|
-
def setup
|
8
|
-
LLVM.init_jit
|
9
|
-
end
|
10
|
-
|
11
|
-
def test_integer_comparison
|
12
|
-
integer_comparison_assertion(:eq, 1, 1, LLVM_SIGNED, LLVM_TRUE)
|
13
|
-
integer_comparison_assertion(:ne, 1, 1, LLVM_SIGNED, LLVM_FALSE)
|
14
|
-
integer_comparison_assertion(:ugt, 2, 2, LLVM_UNSIGNED, LLVM_FALSE)
|
15
|
-
integer_comparison_assertion(:uge, 2, 1, LLVM_UNSIGNED, LLVM_TRUE)
|
16
|
-
integer_comparison_assertion(:ult, 1, 1, LLVM_UNSIGNED, LLVM_FALSE)
|
17
|
-
integer_comparison_assertion(:ule, 1, 2, LLVM_UNSIGNED, LLVM_TRUE)
|
18
|
-
integer_comparison_assertion(:sgt, -2, 2, LLVM_SIGNED, LLVM_FALSE)
|
19
|
-
integer_comparison_assertion(:sge, -2, 1, LLVM_SIGNED, LLVM_FALSE)
|
20
|
-
integer_comparison_assertion(:slt, -1, 2, LLVM_SIGNED, LLVM_TRUE)
|
21
|
-
integer_comparison_assertion(:sle, -1, 2, LLVM_SIGNED, LLVM_TRUE)
|
22
|
-
end
|
23
|
-
|
24
|
-
def test_float_comparison
|
25
|
-
float_comparison_assertion(:oeq, 1.0, 1.0, LLVM_TRUE)
|
26
|
-
float_comparison_assertion(:one, 1.0, 1.0, LLVM_FALSE)
|
27
|
-
float_comparison_assertion(:ogt, 2.0, 2.0, LLVM_FALSE)
|
28
|
-
float_comparison_assertion(:oge, 2.0, 1.0, LLVM_TRUE)
|
29
|
-
float_comparison_assertion(:olt, 1.0, 1.0, LLVM_FALSE)
|
30
|
-
float_comparison_assertion(:ole, 1.0, 2.0, LLVM_TRUE)
|
31
|
-
float_comparison_assertion(:ord, 1.0, 2.0, LLVM_TRUE)
|
32
|
-
float_comparison_assertion(:ueq, 1.0, 1.0, LLVM_TRUE)
|
33
|
-
float_comparison_assertion(:une, 1.0, 1.0, LLVM_FALSE)
|
34
|
-
float_comparison_assertion(:ugt, 2.0, 2.0, LLVM_FALSE)
|
35
|
-
float_comparison_assertion(:uge, 2.0, 1.0, LLVM_TRUE)
|
36
|
-
float_comparison_assertion(:ult, 1.0, 1.0, LLVM_FALSE)
|
37
|
-
float_comparison_assertion(:ule, 1.0, 2.0, LLVM_TRUE)
|
38
|
-
float_comparison_assertion(:uno, 1.0, 2.0, LLVM_FALSE)
|
39
|
-
end
|
40
|
-
|
41
|
-
def integer_comparison_assertion(operation, operand1, operand2, signed, expected_result)
|
42
|
-
result = run_comparison_operation(:icmp,
|
43
|
-
operation,
|
44
|
-
LLVM::Int.from_i(operand1, signed),
|
45
|
-
LLVM::Int.from_i(operand2, signed),
|
46
|
-
LLVM::Int1).to_i(false)
|
47
|
-
assert_equal expected_result, result
|
48
|
-
end
|
49
|
-
|
50
|
-
def float_comparison_assertion(operation, operand1, operand2, expected_result)
|
51
|
-
result = run_comparison_operation(:fcmp,
|
52
|
-
operation,
|
53
|
-
LLVM::Float(operand1),
|
54
|
-
LLVM::Float(operand2),
|
55
|
-
LLVM::Int1).to_i(false)
|
56
|
-
assert_equal expected_result, result
|
57
|
-
end
|
58
|
-
|
59
|
-
def run_comparison_operation(comparison_operation, comparison_operator,
|
60
|
-
operand1, operand2, return_type)
|
61
|
-
run_function([], [], return_type) do |builder, function, *arguments|
|
62
|
-
entry = function.basic_blocks.append
|
63
|
-
builder.position_at_end(entry)
|
64
|
-
builder.ret(builder.send(comparison_operation, comparison_operator, operand1, operand2))
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
end
|
data/test/conversions_test.rb
DELETED
@@ -1,94 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "test_helper"
|
4
|
-
|
5
|
-
class ConversionsTestCase < Minitest::Test
|
6
|
-
|
7
|
-
def setup
|
8
|
-
LLVM.init_jit
|
9
|
-
end
|
10
|
-
|
11
|
-
def test_trunc_to
|
12
|
-
integer_conversion_assertion(:trunc, LLVM::Int32.from_i(257), LLVM::Int8, LLVM_UNSIGNED, 1)
|
13
|
-
integer_conversion_assertion(:trunc, LLVM::Int32.from_i(123), LLVM::Int1, LLVM_UNSIGNED, 1)
|
14
|
-
integer_conversion_assertion(:trunc, LLVM::Int32.from_i(122), LLVM::Int1, LLVM_UNSIGNED, 0)
|
15
|
-
end
|
16
|
-
|
17
|
-
def test_zext_to
|
18
|
-
integer_conversion_assertion(:zext, LLVM::Int16.from_i(257), LLVM::Int32, LLVM_UNSIGNED, 257)
|
19
|
-
end
|
20
|
-
|
21
|
-
def test_sext_to
|
22
|
-
integer_conversion_assertion(:sext, LLVM::Int1.from_i(1), LLVM::Int32, LLVM_SIGNED, -1)
|
23
|
-
integer_conversion_assertion(:sext, LLVM::Int8.from_i(-1), LLVM::Int16, LLVM_UNSIGNED, 65535)
|
24
|
-
end
|
25
|
-
|
26
|
-
def test_fptrunc_to
|
27
|
-
float_conversion_assertion(:fp_trunc, LLVM::Double(123.0), LLVM::Float, 123.0)
|
28
|
-
end
|
29
|
-
|
30
|
-
def test_fpext_to
|
31
|
-
float_conversion_assertion(:fp_ext, LLVM::Float(123.0), LLVM::Double, 123.0)
|
32
|
-
float_conversion_assertion(:fp_ext, LLVM::Float(123.0), LLVM::Float, 123.0)
|
33
|
-
end
|
34
|
-
|
35
|
-
def test_fptoui_to
|
36
|
-
different_type_assertion(:fp2ui, LLVM::Double(123.3), LLVM::Int32, :integer, 123)
|
37
|
-
different_type_assertion(:fp2ui, LLVM::Double(0.7), LLVM::Int32, :integer, 0)
|
38
|
-
different_type_assertion(:fp2ui, LLVM::Double(1.7), LLVM::Int32, :integer, 1)
|
39
|
-
end
|
40
|
-
|
41
|
-
def test_fptosi_to
|
42
|
-
different_type_assertion(:fp2si, LLVM::Double(-123.3), LLVM::Int32, :integer, -123)
|
43
|
-
different_type_assertion(:fp2si, LLVM::Double(0.7), LLVM::Int32, :integer, 0)
|
44
|
-
different_type_assertion(:fp2si, LLVM::Double(1.7), LLVM::Int32, :integer, 1)
|
45
|
-
end
|
46
|
-
|
47
|
-
def test_uitofp_to
|
48
|
-
different_type_assertion(:ui2fp, LLVM::Int32.from_i(257), LLVM::Float, :float, 257.0)
|
49
|
-
different_type_assertion(:ui2fp, LLVM::Int8.from_i(-1), LLVM::Double, :float, 255.0)
|
50
|
-
end
|
51
|
-
|
52
|
-
def test_sitofp_to
|
53
|
-
different_type_assertion(:si2fp, LLVM::Int32.from_i(257), LLVM::Float, :float, 257.0)
|
54
|
-
different_type_assertion(:si2fp, LLVM::Int8.from_i(-1), LLVM::Double, :float, -1.0)
|
55
|
-
end
|
56
|
-
|
57
|
-
def test_bitcast_to
|
58
|
-
different_type_assertion(:bit_cast, LLVM::Int8.from_i(255), LLVM::Int8, :integer, -1)
|
59
|
-
end
|
60
|
-
|
61
|
-
def test_int64
|
62
|
-
integer_conversion_assertion(:zext, LLVM::Int64.from_i(2**62 + 123), LLVM::Int64, LLVM_SIGNED, 2**62 + 123)
|
63
|
-
integer_conversion_assertion(:zext, LLVM::Int64.from_i(-2**62 - 123), LLVM::Int64, LLVM_SIGNED, -2**62 - 123)
|
64
|
-
integer_conversion_assertion(:zext, LLVM::Int64.from_i(2**63 + 123), LLVM::Int64, LLVM_UNSIGNED, 2**63 + 123)
|
65
|
-
end
|
66
|
-
|
67
|
-
def integer_conversion_assertion(operation, operand, return_type, signed, expected_result)
|
68
|
-
result = run_conversion_operation(operation, operand, return_type)
|
69
|
-
assert_equal expected_result, result.to_i(signed)
|
70
|
-
end
|
71
|
-
|
72
|
-
def float_conversion_assertion(operation, operand, return_type, expected_result)
|
73
|
-
result = run_conversion_operation(operation, operand, return_type)
|
74
|
-
assert_in_delta expected_result, result.to_f(return_type), 0.001
|
75
|
-
end
|
76
|
-
|
77
|
-
def different_type_assertion(operation, operand, return_type, assertion_type, expected_result)
|
78
|
-
result = run_conversion_operation(operation, operand, return_type)
|
79
|
-
if assertion_type == :integer
|
80
|
-
assert_equal expected_result, result.to_i
|
81
|
-
else
|
82
|
-
assert_in_delta expected_result, result.to_f(return_type), 0.001
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
def run_conversion_operation(operation, operand, return_type)
|
87
|
-
run_function([], [], return_type) do |builder, function, *arguments|
|
88
|
-
entry = function.basic_blocks.append
|
89
|
-
builder.position_at_end(entry)
|
90
|
-
builder.ret(builder.send(operation, operand, return_type))
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
end
|
data/test/double_test.rb
DELETED
@@ -1,36 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "test_helper"
|
4
|
-
|
5
|
-
class DoubleTestCase < Minitest::Test
|
6
|
-
def setup
|
7
|
-
LLVM.init_jit
|
8
|
-
end
|
9
|
-
|
10
|
-
def test_double
|
11
|
-
mod = LLVM::Module.new("Double Test")
|
12
|
-
mod.functions.add(:sin, [LLVM::Double], LLVM::Double)
|
13
|
-
|
14
|
-
builder = LLVM::Builder.new
|
15
|
-
|
16
|
-
mod.functions.add('test', [LLVM::Double], LLVM::Double) do |fun, p0|
|
17
|
-
p0.name = 'x'
|
18
|
-
|
19
|
-
bb = fun.basic_blocks.append
|
20
|
-
builder.position_at_end(bb)
|
21
|
-
|
22
|
-
builder.ret(builder.fadd(p0, LLVM::Double(1.0)))
|
23
|
-
end
|
24
|
-
|
25
|
-
engine = LLVM::MCJITCompiler.new(mod)
|
26
|
-
|
27
|
-
arg = 5.0
|
28
|
-
result = engine.run_function(mod.functions["test"], arg)
|
29
|
-
assert_equal arg + 1, result.to_f(LLVM::Double)
|
30
|
-
|
31
|
-
# TODO: fix this
|
32
|
-
# assert_in_delta(Math.sin(1.0),
|
33
|
-
# engine.run_function(mod.functions["sin"], 1.0).to_f(LLVM::Double),
|
34
|
-
# 1e-10)
|
35
|
-
end
|
36
|
-
end
|
data/test/equality_test.rb
DELETED
@@ -1,91 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "test_helper"
|
4
|
-
require "llvm/core"
|
5
|
-
|
6
|
-
class EqualityTestCase < Minitest::Test
|
7
|
-
def setup
|
8
|
-
LLVM.init_jit
|
9
|
-
end
|
10
|
-
|
11
|
-
class MyModule < LLVM::Module; end
|
12
|
-
class MyInt < LLVM::Int32; end
|
13
|
-
class MyType < LLVM::Type; end
|
14
|
-
class MyFunction < LLVM::Function; end
|
15
|
-
|
16
|
-
def assert_equalities(options)
|
17
|
-
map = {
|
18
|
-
:equal => method(:assert_equal),
|
19
|
-
:not_equal => lambda {|n, m, name| assert n != m, name },
|
20
|
-
:same => method(:assert_same),
|
21
|
-
:not_same => lambda {|n, m, name| assert !n.equal?(m), name },
|
22
|
-
:eql => lambda {|n, m, name| assert n.eql?(m), name },
|
23
|
-
:not_eql => lambda {|n, m, name| assert !n.eql?(m), name },
|
24
|
-
}
|
25
|
-
|
26
|
-
map.each do |name, callable|
|
27
|
-
options[name].combination(2).each do |n, m|
|
28
|
-
callable.call(n, m, name.to_s)
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
def test_int_value
|
34
|
-
int1 = LLVM::Int32.from_i(1)
|
35
|
-
int2 = LLVM::Int32.from_ptr(int1.to_ptr)
|
36
|
-
int3 = LLVM::Int32.from_i(2)
|
37
|
-
int4 = MyInt.from_ptr(int1.to_ptr)
|
38
|
-
|
39
|
-
assert_equalities :equal => [int1, int2, int4],
|
40
|
-
:not_equal => [int1, int3],
|
41
|
-
:same => [int1, int1],
|
42
|
-
:not_same => [int1, int2, int3, int4],
|
43
|
-
:eql => [int1, int2],
|
44
|
-
:not_eql => [int1, int3]
|
45
|
-
end
|
46
|
-
|
47
|
-
def test_module
|
48
|
-
mod1 = LLVM::Module.new('test')
|
49
|
-
mod2 = LLVM::Module.from_ptr(mod1.to_ptr)
|
50
|
-
mod3 = LLVM::Module.new('dummy')
|
51
|
-
mod4 = MyModule.from_ptr(mod1.to_ptr)
|
52
|
-
|
53
|
-
assert_equalities :equal => [mod1, mod2, mod4],
|
54
|
-
:not_equal => [mod1, mod3],
|
55
|
-
:same => [mod1, mod1],
|
56
|
-
:not_same => [mod1, mod2, mod3, mod4],
|
57
|
-
:eql => [mod1, mod2],
|
58
|
-
:not_eql => [mod1, mod3]
|
59
|
-
end
|
60
|
-
|
61
|
-
def test_type
|
62
|
-
type1 = LLVM::Float.type
|
63
|
-
type2 = LLVM::Type.from_ptr(type1.to_ptr, nil)
|
64
|
-
type3 = LLVM::Double.type
|
65
|
-
type4 = MyType.from_ptr(type1.to_ptr, :mytype)
|
66
|
-
|
67
|
-
assert_equalities :equal => [type1, type2, type4],
|
68
|
-
:not_equal => [type1, type3],
|
69
|
-
:same => [type1, type1],
|
70
|
-
:not_same => [type1, type2, type3, type4],
|
71
|
-
:eql => [type1, type2],
|
72
|
-
:not_eql => [type1, type3]
|
73
|
-
end
|
74
|
-
|
75
|
-
def test_function
|
76
|
-
mod = LLVM::Module.new('test')
|
77
|
-
|
78
|
-
fn1 = mod.functions.add('test1', [], LLVM.Void)
|
79
|
-
fn2 = LLVM::Function.from_ptr(fn1.to_ptr)
|
80
|
-
fn3 = mod.functions.add('test2', [], LLVM.Void)
|
81
|
-
fn4 = MyFunction.from_ptr(fn1.to_ptr)
|
82
|
-
|
83
|
-
assert_equalities :equal => [fn1, fn2, fn4],
|
84
|
-
:not_equal => [fn1, fn3],
|
85
|
-
:same => [fn1, fn1],
|
86
|
-
:not_same => [fn1, fn2, fn3, fn4],
|
87
|
-
:eql => [fn1, fn2],
|
88
|
-
:not_eql => [fn1, fn3]
|
89
|
-
end
|
90
|
-
|
91
|
-
end
|
data/test/function_test.rb
DELETED
@@ -1,102 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "test_helper"
|
4
|
-
require "llvm/core"
|
5
|
-
|
6
|
-
|
7
|
-
def with_function(arguments, retty, &block)
|
8
|
-
mod = LLVM::Module.new('test')
|
9
|
-
fun = mod.functions.add('fun', arguments, retty)
|
10
|
-
block.yield(fun)
|
11
|
-
mod.dispose
|
12
|
-
end
|
13
|
-
|
14
|
-
class FunctionTest < Minitest::Test
|
15
|
-
|
16
|
-
def test_type
|
17
|
-
with_function [], LLVM.Void do |fun|
|
18
|
-
type = fun.type
|
19
|
-
|
20
|
-
assert_instance_of LLVM::Type, type
|
21
|
-
assert_equal :pointer, type.kind
|
22
|
-
assert_equal :function, type.element_type.kind
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def test_function_type
|
27
|
-
with_function [], LLVM.Void do |fun|
|
28
|
-
type = fun.function_type
|
29
|
-
|
30
|
-
assert_instance_of LLVM::FunctionType, type
|
31
|
-
assert_equal :function, type.kind
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
def helper_test_attribute(name)
|
36
|
-
with_function [], LLVM.Void do |fun|
|
37
|
-
assert_equal 0, fun.attribute_count
|
38
|
-
assert_equal [], fun.attributes
|
39
|
-
|
40
|
-
fun.add_attribute(name)
|
41
|
-
assert_equal 1, fun.attribute_count
|
42
|
-
assert_equal [34], fun.attributes
|
43
|
-
|
44
|
-
assert_equal false, fun.verify
|
45
|
-
|
46
|
-
fun.remove_attribute(name)
|
47
|
-
assert_equal 0, fun.attribute_count
|
48
|
-
assert_equal [], fun.attributes
|
49
|
-
|
50
|
-
assert_equal false, fun.verify
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
def test_add_attribute_old_name
|
55
|
-
helper_test_attribute(:no_unwind_attribute)
|
56
|
-
end
|
57
|
-
|
58
|
-
def test_add_attribute_new_name
|
59
|
-
helper_test_attribute(:nounwind)
|
60
|
-
end
|
61
|
-
|
62
|
-
end
|
63
|
-
|
64
|
-
class FunctionTypeTest < Minitest::Test
|
65
|
-
|
66
|
-
def test_return_type
|
67
|
-
with_function [], LLVM.Void do |fun|
|
68
|
-
type = fun.function_type
|
69
|
-
assert_equal LLVM.Void, type.return_type
|
70
|
-
end
|
71
|
-
|
72
|
-
with_function [], LLVM::Int32 do |fun|
|
73
|
-
retty = fun.function_type.return_type
|
74
|
-
|
75
|
-
assert_kind_of LLVM::IntType, retty
|
76
|
-
assert_equal 32, retty.width
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
def test_argument_types
|
81
|
-
with_function [], LLVM.Void do |fun|
|
82
|
-
types = fun.function_type.argument_types
|
83
|
-
assert_equal [], types
|
84
|
-
end
|
85
|
-
|
86
|
-
with_function [LLVM::Int32], LLVM.Void do |fun|
|
87
|
-
types = fun.function_type.argument_types
|
88
|
-
assert_equal 1, types.size
|
89
|
-
a1 = types[0]
|
90
|
-
assert_kind_of LLVM::IntType, a1
|
91
|
-
assert_equal 32, a1.width
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
def test_vararg
|
96
|
-
with_function [], LLVM.Void do |fun|
|
97
|
-
type = fun.function_type
|
98
|
-
assert !type.vararg?, 'should be false'
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
end
|
data/test/generic_value_test.rb
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "test_helper"
|
4
|
-
|
5
|
-
class GenericValueTestCase < Minitest::Test
|
6
|
-
|
7
|
-
def setup
|
8
|
-
LLVM.init_jit
|
9
|
-
end
|
10
|
-
|
11
|
-
def test_from_i
|
12
|
-
assert_equal 2, LLVM::GenericValue.from_i(2).to_i
|
13
|
-
assert_equal 2, LLVM::GenericValue.from_i(2.2).to_i
|
14
|
-
end
|
15
|
-
|
16
|
-
def test_from_float
|
17
|
-
assert_in_delta 2.2, LLVM::GenericValue.from_f(2.2).to_f, 1e-6
|
18
|
-
end
|
19
|
-
|
20
|
-
def test_from_double
|
21
|
-
assert_in_delta 2.2, LLVM::GenericValue.from_d(2.2).to_f(LLVM::Double), 1e-6
|
22
|
-
end
|
23
|
-
|
24
|
-
end
|
data/test/instruction_test.rb
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "test_helper"
|
4
|
-
|
5
|
-
class InstructionTestCase < Minitest::Test
|
6
|
-
def setup
|
7
|
-
LLVM.init_jit
|
8
|
-
@module = LLVM::Module.new("InstructionTestCase")
|
9
|
-
end
|
10
|
-
|
11
|
-
def test_instruction
|
12
|
-
fn = @module.functions.add("test_instruction", [LLVM::Double], LLVM::Double) do |fn, arg|
|
13
|
-
fn.basic_blocks.append.build do |builder|
|
14
|
-
builder.ret(
|
15
|
-
builder.fadd(arg, LLVM.Double(3.0)))
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
entry = fn.basic_blocks.entry
|
20
|
-
|
21
|
-
inst1 = entry.instructions.first
|
22
|
-
inst2 = entry.instructions.last
|
23
|
-
|
24
|
-
assert_kind_of LLVM::Instruction, inst1
|
25
|
-
assert_kind_of LLVM::Instruction, inst2
|
26
|
-
|
27
|
-
assert_equal inst2, inst1.next
|
28
|
-
assert_equal inst1, inst2.previous
|
29
|
-
assert_equal entry, inst1.parent
|
30
|
-
assert_equal entry, inst2.parent
|
31
|
-
end
|
32
|
-
end
|
data/test/integer_test.rb
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "test_helper"
|
4
|
-
|
5
|
-
class IntegerTestCase < Minitest::Test
|
6
|
-
|
7
|
-
def test_const_zext
|
8
|
-
assert i = LLVM::Int8.from_i(-1)
|
9
|
-
assert_equal 'i8 -1', i.to_s
|
10
|
-
assert_equal :integer, i.type.kind
|
11
|
-
assert_equal 8, i.type.width
|
12
|
-
assert zext = i.zext(LLVM::Int64)
|
13
|
-
assert_equal 'i64 255', zext.to_s
|
14
|
-
assert_equal :integer, zext.type.kind
|
15
|
-
assert_equal 64, zext.type.width
|
16
|
-
end
|
17
|
-
|
18
|
-
def test_const_sext
|
19
|
-
assert i = LLVM::Int8.from_i(-1)
|
20
|
-
assert_equal 'i8 -1', i.to_s
|
21
|
-
assert_equal :integer, i.type.kind
|
22
|
-
assert_equal 8, i.type.width
|
23
|
-
assert sext = i.sext(LLVM::Int64)
|
24
|
-
assert_equal 'i64 -1', sext.to_s
|
25
|
-
assert_equal :integer, sext.type.kind
|
26
|
-
assert_equal 64, sext.type.width
|
27
|
-
end
|
28
|
-
end
|
data/test/ipo_test.rb
DELETED
@@ -1,55 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "test_helper"
|
4
|
-
require "llvm/core"
|
5
|
-
require 'llvm/transforms/ipo'
|
6
|
-
require 'llvm/core/pass_manager'
|
7
|
-
|
8
|
-
class IPOTestCase < Minitest::Test
|
9
|
-
|
10
|
-
def setup
|
11
|
-
LLVM.init_jit
|
12
|
-
end
|
13
|
-
|
14
|
-
def test_gdce
|
15
|
-
mod = LLVM::Module.new('test')
|
16
|
-
|
17
|
-
fn1 = mod.functions.add("fn1", [], LLVM.Void) do |fn|
|
18
|
-
fn.linkage = :internal
|
19
|
-
fn.basic_blocks.append.build do |builder|
|
20
|
-
builder.ret_void
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
fn2 = mod.functions.add("fn2", [], LLVM.Void) do |fn|
|
25
|
-
fn.linkage = :internal
|
26
|
-
fn.basic_blocks.append.build do |builder|
|
27
|
-
builder.ret_void
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
main = mod.functions.add("main", [], LLVM.Void) do |fn|
|
32
|
-
fn.basic_blocks.append.build do |builder|
|
33
|
-
builder.call(fn1)
|
34
|
-
builder.ret_void
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
fns = mod.functions.to_a
|
39
|
-
assert fns.include?(fn1)
|
40
|
-
assert fns.include?(fn2)
|
41
|
-
assert fns.include?(main)
|
42
|
-
|
43
|
-
# optimize
|
44
|
-
engine = LLVM::MCJITCompiler.new(mod)
|
45
|
-
passm = LLVM::PassManager.new(engine)
|
46
|
-
|
47
|
-
passm.gdce!
|
48
|
-
passm.run(mod)
|
49
|
-
|
50
|
-
fns = mod.functions.to_a
|
51
|
-
assert fns.include?(fn1)
|
52
|
-
assert !fns.include?(fn2), 'fn2 should be eliminated'
|
53
|
-
assert fns.include?(main)
|
54
|
-
end
|
55
|
-
end
|
data/test/linker_test.rb
DELETED
@@ -1,39 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'test_helper'
|
4
|
-
require 'llvm/core'
|
5
|
-
require 'llvm/linker'
|
6
|
-
|
7
|
-
class LinkerTestCase < Minitest::Test
|
8
|
-
def setup
|
9
|
-
LLVM.init_jit
|
10
|
-
end
|
11
|
-
|
12
|
-
def create_modules
|
13
|
-
@mod1 = define_module('mod1') do |mod|
|
14
|
-
mod1calc = mod.functions.add("calc", [], LLVM::Int32)
|
15
|
-
|
16
|
-
mod.functions.add("main", [], LLVM::Int32) do |fn|
|
17
|
-
fn.basic_blocks.append.build do |builder|
|
18
|
-
val = builder.call(mod1calc)
|
19
|
-
builder.ret val
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
@mod2 = define_module('mod2') do |mod|
|
25
|
-
mod.functions.add("calc", [], LLVM::Int32) do |fn|
|
26
|
-
fn.basic_blocks.append.build do |builder|
|
27
|
-
builder.ret LLVM::Int32.from_i(42)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
def test_link_into
|
34
|
-
create_modules
|
35
|
-
@mod2.link_into(@mod1)
|
36
|
-
|
37
|
-
assert_equal 42, run_function_on_module(@mod1, 'main').to_i
|
38
|
-
end
|
39
|
-
end
|