ruby-llvm 2.9.1 → 2.9.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,88 @@
1
+ require "test_helper"
2
+
3
+ class BasicBlockTestCase < Test::Unit::TestCase
4
+
5
+ def setup
6
+ LLVM.init_x86
7
+ @module = LLVM::Module.new("BasicBlockTestCase")
8
+ end
9
+
10
+ def test_basic_block_collection
11
+ @module.functions.add("test_basic_block_collection", [], LLVM.Void) do |fn|
12
+ coll = fn.basic_blocks
13
+
14
+ block1 = coll.append
15
+ assert_instance_of LLVM::BasicBlock, block1
16
+
17
+ assert_equal 1, coll.size
18
+ assert_equal coll.first, coll.last,
19
+ 'Only one block exists in the function'
20
+ assert_equal coll.first, coll.entry,
21
+ 'The entry block for the function is always the first block'
22
+
23
+ block2 = coll.append
24
+ assert_equal 2, coll.size
25
+ assert_equal block1, coll.first
26
+ assert_equal block2, coll.last
27
+
28
+ [ coll.each.to_a, coll.to_a ].each do |blocks|
29
+ assert_equal 2, blocks.size
30
+ assert_equal block1, blocks[0]
31
+ assert_equal block2, blocks[1]
32
+ end
33
+ end
34
+ end
35
+
36
+ def test_basic_block
37
+ @module.functions.add("test_basic_block", [], LLVM.Void) do |fn|
38
+ coll = fn.basic_blocks
39
+
40
+ block1 = coll.append
41
+ block2 = coll.append
42
+
43
+ assert_equal fn, block1.parent
44
+ assert_equal fn, block2.parent
45
+
46
+ assert_equal block2, block1.next
47
+ assert_equal block1, block2.previous
48
+
49
+ block1.build do |builder|
50
+ builder.br(block2)
51
+ end
52
+
53
+ block2.build do |builder|
54
+ builder.ret_void
55
+ end
56
+
57
+ assert_equal block1.first_instruction,
58
+ block1.last_instruction
59
+ assert_equal block2.first_instruction,
60
+ block2.last_instruction
61
+ end
62
+ end
63
+
64
+ def test_basic_block_enumerable
65
+ @module.functions.add("test_basic_block_enumerable", [LLVM::Double], LLVM::Double) do |fn, arg|
66
+ block1 = fn.basic_blocks.append
67
+
68
+ [ block1.instructions.to_a, block1.instructions.each.to_a ].each do |insts|
69
+ assert_equal 0, insts.size, 'Empty basic block'
70
+ end
71
+
72
+ block1.build do |builder|
73
+ builder.ret(builder.fadd(arg, LLVM.Double(1.0)))
74
+ end
75
+
76
+ [ block1.instructions.to_a, block1.instructions.each.to_a ].each do |insts|
77
+ assert_equal 2, insts.size
78
+ assert_equal block1.first_instruction, insts[0] # deprecated
79
+ assert_equal block1.last_instruction, insts[1] # deprecated
80
+ assert_equal block1.instructions.first, insts[0]
81
+ assert_equal block1.instructions.last, insts[1]
82
+ end
83
+
84
+ end
85
+ end
86
+
87
+ end
88
+
@@ -0,0 +1,11 @@
1
+ require "test_helper"
2
+
3
+ class BasicTestCase < Test::Unit::TestCase
4
+
5
+ def test_llvm_initialization
6
+ assert_nothing_raised do
7
+ LLVM.init_x86
8
+ end
9
+ end
10
+
11
+ end
@@ -0,0 +1,58 @@
1
+ require "test_helper"
2
+
3
+ class BasicOperationsTestCase < Test::Unit::TestCase
4
+
5
+ def setup
6
+ LLVM.init_x86
7
+ end
8
+
9
+ def test_integer_binary_operations
10
+ integer_binary_operation_assertion(:add, 3, 2, 3 + 2)
11
+ integer_binary_operation_assertion(:sub, 3, 2, 3 - 2)
12
+ integer_binary_operation_assertion(:mul, 3, 2, 3 * 2)
13
+ integer_binary_operation_assertion(:udiv, 10, 2, 10 / 2)
14
+ integer_binary_operation_assertion(:sdiv, 10, 2, 10 / 2)
15
+ integer_binary_operation_assertion(:urem, 10, 3, 10 % 3)
16
+ integer_binary_operation_assertion(:srem, 10, 3, 10 % 3)
17
+ end
18
+
19
+ def test_integer_bitwise_binary_operations
20
+ integer_binary_operation_assertion(:shl, 2, 3, 2 << 3)
21
+ integer_binary_operation_assertion(:lshr, 16, 3, 16 >> 3)
22
+ integer_binary_operation_assertion(:ashr, 16, 3, 16 >> 3)
23
+ integer_binary_operation_assertion(:and, 2, 1, 2 & 1)
24
+ integer_binary_operation_assertion(:or, 2, 1, 2 | 1)
25
+ integer_binary_operation_assertion(:xor, 3, 2, 3 ^ 2)
26
+ end
27
+
28
+ def test_float_binary_operations
29
+ float_binary_operation_assertion(:fadd, 3.1, 2.2, 3.1 + 2.2)
30
+ float_binary_operation_assertion(:fsub, 3.1, 2.2, 3.1 - 2.2)
31
+ float_binary_operation_assertion(:fmul, 3.1, 2.2, 3.1 * 2.2)
32
+ float_binary_operation_assertion(:fdiv, 3.1, 2.2, 3.1 / 2.2)
33
+ float_binary_operation_assertion(:frem, 3.1, 2.2, 3.1 % 2.2)
34
+ end
35
+
36
+ def integer_binary_operation_assertion(operation, operand1, operand2, expected_result)
37
+ result = run_binary_operation(operation,
38
+ LLVM::Int(operand1), LLVM::Int(operand2),
39
+ LLVM::Int).to_i
40
+ assert_equal expected_result, result
41
+ end
42
+
43
+ def float_binary_operation_assertion(operation, operand1, operand2, expected_result)
44
+ result = run_binary_operation(operation,
45
+ LLVM::Float(operand1), LLVM::Float(operand2),
46
+ LLVM::Float).to_f
47
+ assert_in_delta expected_result, result, 0.001
48
+ end
49
+
50
+ def run_binary_operation(operation, operand1, operand2, return_type)
51
+ run_function([], [], return_type) do |builder, function, *arguments|
52
+ entry = function.basic_blocks.append
53
+ builder.position_at_end(entry)
54
+ builder.ret(builder.send(operation, operand1, operand2))
55
+ end
56
+ end
57
+
58
+ end
@@ -0,0 +1,25 @@
1
+ require "test_helper"
2
+ require "tempfile"
3
+
4
+ class BitcodeTestCase < Test::Unit::TestCase
5
+ def setup
6
+ LLVM.init_x86
7
+ end
8
+
9
+ def test_bitcode
10
+ test_module = define_module("test_module") do |mod|
11
+ define_function(mod, "test_function", [], LLVM::Int) do
12
+ |builder, function, *arguments|
13
+ entry = function.basic_blocks.append
14
+ builder.position_at_end(entry)
15
+ builder.ret(LLVM::Int(1))
16
+ end
17
+ end
18
+ Tempfile.open("bitcode") do |tmp|
19
+ assert test_module.write_bitcode(tmp)
20
+ new_module = LLVM::Module.parse_bitcode(tmp.path)
21
+ result = run_function_on_module(new_module, "test_function").to_i
22
+ assert_equal 1, result
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,57 @@
1
+ require "test_helper"
2
+
3
+ class BranchTestCase < Test::Unit::TestCase
4
+
5
+ def setup
6
+ LLVM.init_x86
7
+ end
8
+
9
+ def test_branching
10
+ assert_equal 0, direct_jump_function().to_i
11
+ assert_equal 0, conditional_jump_function().to_i
12
+ assert_equal 0, switched_jump_function().to_i
13
+ end
14
+
15
+ def direct_jump_function
16
+ run_function([], [], LLVM::Int) do |builder, function, *arguments|
17
+ entry = function.basic_blocks.append
18
+ branch_1 = function.basic_blocks.append
19
+ branch_2 = function.basic_blocks.append
20
+ builder.position_at_end(entry)
21
+ builder.br(branch_2)
22
+ builder.position_at_end(branch_1)
23
+ builder.ret(LLVM::Int(1))
24
+ builder.position_at_end(branch_2)
25
+ builder.ret(LLVM::Int(0))
26
+ end
27
+ end
28
+
29
+ def conditional_jump_function
30
+ run_function([], [], LLVM::Int) do |builder, function, *arguments|
31
+ entry = function.basic_blocks.append
32
+ branch_1 = function.basic_blocks.append
33
+ branch_2 = function.basic_blocks.append
34
+ builder.position_at_end(entry)
35
+ builder.cond(builder.icmp(:eq, LLVM::Int(1), LLVM::Int(2)), branch_1, branch_2)
36
+ builder.position_at_end(branch_1)
37
+ builder.ret(LLVM::Int(1))
38
+ builder.position_at_end(branch_2)
39
+ builder.ret(LLVM::Int(0))
40
+ end
41
+ end
42
+
43
+ def switched_jump_function
44
+ run_function([], [], LLVM::Int) do |builder, function, *arguments|
45
+ entry = function.basic_blocks.append
46
+ branch_1 = function.basic_blocks.append
47
+ branch_2 = function.basic_blocks.append
48
+ builder.position_at_end(entry)
49
+ switch = builder.switch(LLVM::Int(1), branch_1, LLVM::Int(1) => branch_2)
50
+ builder.position_at_end(branch_1)
51
+ builder.ret(LLVM::Int(1))
52
+ builder.position_at_end(branch_2)
53
+ builder.ret(LLVM::Int(0))
54
+ end
55
+ end
56
+
57
+ end
data/test/call_test.rb ADDED
@@ -0,0 +1,82 @@
1
+ require "test_helper"
2
+
3
+ class CallTestCase < Test::Unit::TestCase
4
+
5
+ def setup
6
+ LLVM.init_x86
7
+ end
8
+
9
+ def test_simple_call
10
+ test_module = define_module("test_module") do |host_module|
11
+ define_function(host_module, "test_function", [], LLVM::Int) do |builder, function, *arguments|
12
+ entry = function.basic_blocks.append
13
+ builder.position_at_end(entry)
14
+ builder.ret(LLVM::Int(1))
15
+ end
16
+ end
17
+ assert_equal 1, run_function_on_module(test_module, "test_function").to_i
18
+ end
19
+
20
+ def test_nested_call
21
+ test_module = define_module("test_module") do |host_module|
22
+ function_1 = define_function(host_module, "test_function_1", [], LLVM::Int) do |builder, function, *arguments|
23
+ entry = function.basic_blocks.append
24
+ builder.position_at_end(entry)
25
+ builder.ret(LLVM::Int(1))
26
+ end
27
+ function_2 = define_function(host_module, "test_function_2", [], LLVM::Int) do |builder, function, *arguments|
28
+ entry = function.basic_blocks.append
29
+ builder.position_at_end(entry)
30
+ builder.ret(builder.call(function_1))
31
+ end
32
+ end
33
+ assert_equal 1, run_function_on_module(test_module, "test_function_2").to_i
34
+ end
35
+
36
+ def test_recursive_call
37
+ test_module = define_module("test_module") do |host_module|
38
+ define_function(host_module, "test_function", [LLVM::Int], LLVM::Int) do |builder, function, *arguments|
39
+ entry = function.basic_blocks.append
40
+ recurse = function.basic_blocks.append
41
+ exit = function.basic_blocks.append
42
+ builder.position_at_end(entry)
43
+ builder.cond(builder.icmp(:uge, arguments.first, LLVM::Int(5)), exit, recurse)
44
+ builder.position_at_end(recurse)
45
+ result = builder.call(function, builder.add(arguments.first, LLVM::Int(1)))
46
+ builder.br(exit)
47
+ builder.position_at_end(exit)
48
+ builder.ret(builder.phi(LLVM::Int, entry => arguments.first, recurse => result))
49
+ end
50
+ end
51
+ assert_equal 5, run_function_on_module(test_module, "test_function", 1).to_i
52
+ end
53
+
54
+ def test_external
55
+ test_module = define_module("test_module") do |host_module|
56
+ external = host_module.functions.add("abs", [LLVM::Int], LLVM::Int)
57
+ define_function(host_module, "test_function", [LLVM::Int], LLVM::Int) do |builder, function, *arguments|
58
+ entry = function.basic_blocks.append
59
+ builder.position_at_end(entry)
60
+ builder.ret(builder.call(external, arguments.first))
61
+ end
62
+ end
63
+ assert_equal -10.abs, run_function_on_module(test_module, "test_function", -10).to_i
64
+ end
65
+
66
+ def test_external_string
67
+ test_module = define_module("test_module") do |host_module|
68
+ global = host_module.globals.add(LLVM::Array(LLVM::Int8, 5), "path")
69
+ global.linkage = :internal
70
+ global.initializer = LLVM::ConstantArray.string("PATH")
71
+ external = host_module.functions.add("getenv", [LLVM::Pointer(LLVM::Int8)], LLVM::Pointer(LLVM::Int8))
72
+ define_function(host_module, "test_function", [], LLVM::Pointer(LLVM::Int8)) do |builder, function, *arguments|
73
+ entry = function.basic_blocks.append
74
+ builder.position_at_end(entry)
75
+ parameter = builder.gep(global, [LLVM::Int(0), LLVM::Int(0)])
76
+ builder.ret(builder.call(external, parameter))
77
+ end
78
+ end
79
+ assert_equal ENV["PATH"], run_function_on_module(test_module, "test_function").to_ptr.read_pointer.read_string
80
+ end
81
+
82
+ end
@@ -0,0 +1,66 @@
1
+ require "test_helper"
2
+
3
+ class ComparisonsTestCase < Test::Unit::TestCase
4
+
5
+ def setup
6
+ LLVM.init_x86
7
+ end
8
+
9
+ def test_integer_comparison
10
+ integer_comparison_assertion(:eq, 1, 1, LLVM_SIGNED, LLVM_TRUE)
11
+ integer_comparison_assertion(:ne, 1, 1, LLVM_SIGNED, LLVM_FALSE)
12
+ integer_comparison_assertion(:ugt, 2, 2, LLVM_UNSIGNED, LLVM_FALSE)
13
+ integer_comparison_assertion(:uge, 2, 1, LLVM_UNSIGNED, LLVM_TRUE)
14
+ integer_comparison_assertion(:ult, 1, 1, LLVM_UNSIGNED, LLVM_FALSE)
15
+ integer_comparison_assertion(:ule, 1, 2, LLVM_UNSIGNED, LLVM_TRUE)
16
+ integer_comparison_assertion(:sgt, -2, 2, LLVM_SIGNED, LLVM_FALSE)
17
+ integer_comparison_assertion(:sge, -2, 1, LLVM_SIGNED, LLVM_FALSE)
18
+ integer_comparison_assertion(:slt, -1, 2, LLVM_SIGNED, LLVM_TRUE)
19
+ integer_comparison_assertion(:sle, -1, 2, LLVM_SIGNED, LLVM_TRUE)
20
+ end
21
+
22
+ def test_float_comparison
23
+ float_comparison_assertion(:oeq, 1.0, 1.0, LLVM_TRUE)
24
+ float_comparison_assertion(:one, 1.0, 1.0, LLVM_FALSE)
25
+ float_comparison_assertion(:ogt, 2.0, 2.0, LLVM_FALSE)
26
+ float_comparison_assertion(:oge, 2.0, 1.0, LLVM_TRUE)
27
+ float_comparison_assertion(:olt, 1.0, 1.0, LLVM_FALSE)
28
+ float_comparison_assertion(:ole, 1.0, 2.0, LLVM_TRUE)
29
+ float_comparison_assertion(:ord, 1.0, 2.0, LLVM_TRUE)
30
+ float_comparison_assertion(:ueq, 1.0, 1.0, LLVM_TRUE)
31
+ float_comparison_assertion(:une, 1.0, 1.0, LLVM_FALSE)
32
+ float_comparison_assertion(:ugt, 2.0, 2.0, LLVM_FALSE)
33
+ float_comparison_assertion(:uge, 2.0, 1.0, LLVM_TRUE)
34
+ float_comparison_assertion(:ult, 1.0, 1.0, LLVM_FALSE)
35
+ float_comparison_assertion(:ule, 1.0, 2.0, LLVM_TRUE)
36
+ float_comparison_assertion(:uno, 1.0, 2.0, LLVM_FALSE)
37
+ end
38
+
39
+ def integer_comparison_assertion(operation, operand1, operand2, signed, expected_result)
40
+ result = run_comparison_operation(:icmp,
41
+ operation,
42
+ LLVM::Int.from_i(operand1, signed),
43
+ LLVM::Int.from_i(operand2, signed),
44
+ LLVM::Int1).to_i(false)
45
+ assert_equal expected_result, result
46
+ end
47
+
48
+ def float_comparison_assertion(operation, operand1, operand2, expected_result)
49
+ result = run_comparison_operation(:fcmp,
50
+ operation,
51
+ LLVM::Float(operand1),
52
+ LLVM::Float(operand2),
53
+ LLVM::Int1).to_i(false)
54
+ assert_equal expected_result, result
55
+ end
56
+
57
+ def run_comparison_operation(comparison_operation, comparison_operator,
58
+ operand1, operand2, return_type)
59
+ run_function([], [], return_type) do |builder, function, *arguments|
60
+ entry = function.basic_blocks.append
61
+ builder.position_at_end(entry)
62
+ builder.ret(builder.send(comparison_operation, comparison_operator, operand1, operand2))
63
+ end
64
+ end
65
+
66
+ end
@@ -0,0 +1,86 @@
1
+ require "test_helper"
2
+
3
+ class ConversionsTestCase < Test::Unit::TestCase
4
+
5
+ def setup
6
+ LLVM.init_x86
7
+ end
8
+
9
+ def test_trunc_to
10
+ integer_conversion_assertion(:trunc, LLVM::Int32.from_i(257), LLVM::Int8, LLVM_UNSIGNED, 1)
11
+ integer_conversion_assertion(:trunc, LLVM::Int32.from_i(123), LLVM::Int1, LLVM_UNSIGNED, 1)
12
+ integer_conversion_assertion(:trunc, LLVM::Int32.from_i(122), LLVM::Int1, LLVM_UNSIGNED, 0)
13
+ end
14
+
15
+ def test_zext_to
16
+ integer_conversion_assertion(:zext, LLVM::Int16.from_i(257), LLVM::Int32, LLVM_UNSIGNED, 257)
17
+ end
18
+
19
+ def test_sext_to
20
+ integer_conversion_assertion(:sext, LLVM::Int1.from_i(1), LLVM::Int32, LLVM_SIGNED, -1)
21
+ integer_conversion_assertion(:sext, LLVM::Int8.from_i(-1), LLVM::Int16, LLVM_UNSIGNED, 65535)
22
+ end
23
+
24
+ def test_fptrunc_to
25
+ float_conversion_assertion(:fp_trunc, LLVM::Double(123.0), LLVM::Float, 123.0)
26
+ end
27
+
28
+ def test_fpext_to
29
+ float_conversion_assertion(:fp_ext, LLVM::Float(123.0), LLVM::Double, 123.0)
30
+ float_conversion_assertion(:fp_ext, LLVM::Float(123.0), LLVM::Float, 123.0)
31
+ end
32
+
33
+ def test_fptoui_to
34
+ different_type_assertion(:fp2ui, LLVM::Double(123.3), LLVM::Int32, :integer, 123)
35
+ different_type_assertion(:fp2ui, LLVM::Double(0.7), LLVM::Int32, :integer, 0)
36
+ different_type_assertion(:fp2ui, LLVM::Double(1.7), LLVM::Int32, :integer, 1)
37
+ end
38
+
39
+ def test_fptosi_to
40
+ different_type_assertion(:fp2si, LLVM::Double(-123.3), LLVM::Int32, :integer, -123)
41
+ different_type_assertion(:fp2si, LLVM::Double(0.7), LLVM::Int32, :integer, 0)
42
+ different_type_assertion(:fp2si, LLVM::Double(1.7), LLVM::Int32, :integer, 1)
43
+ end
44
+
45
+ def test_uitofp_to
46
+ different_type_assertion(:ui2fp, LLVM::Int32.from_i(257), LLVM::Float, :float, 257.0)
47
+ different_type_assertion(:ui2fp, LLVM::Int8.from_i(-1), LLVM::Double, :float, 255.0)
48
+ end
49
+
50
+ def test_sitofp_to
51
+ different_type_assertion(:si2fp, LLVM::Int32.from_i(257), LLVM::Float, :float, 257.0)
52
+ different_type_assertion(:si2fp, LLVM::Int8.from_i(-1), LLVM::Double, :float, -1.0)
53
+ end
54
+
55
+ def test_bitcast_to
56
+ different_type_assertion(:bit_cast, LLVM::Int8.from_i(255), LLVM::Int8, :integer, -1)
57
+ end
58
+
59
+ def integer_conversion_assertion(operation, operand, return_type, signed, expected_result)
60
+ result = run_conversion_operation(operation, operand, return_type)
61
+ assert_equal expected_result, result.to_i(signed)
62
+ end
63
+
64
+ def float_conversion_assertion(operation, operand, return_type, expected_result)
65
+ result = run_conversion_operation(operation, operand, return_type)
66
+ assert_in_delta expected_result, result.to_f(return_type), 0.001
67
+ end
68
+
69
+ def different_type_assertion(operation, operand, return_type, assertion_type, expected_result)
70
+ result = run_conversion_operation(operation, operand, return_type)
71
+ if assertion_type == :integer
72
+ assert_equal expected_result, result.to_i
73
+ else
74
+ assert_in_delta expected_result, result.to_f(return_type), 0.001
75
+ end
76
+ end
77
+
78
+ def run_conversion_operation(operation, operand, return_type)
79
+ run_function([], [], return_type) do |builder, function, *arguments|
80
+ entry = function.basic_blocks.append
81
+ builder.position_at_end(entry)
82
+ builder.ret(builder.send(operation, operand, return_type))
83
+ end
84
+ end
85
+
86
+ end
@@ -0,0 +1,33 @@
1
+ require "test_helper"
2
+
3
+ class DoubleTestCase < Test::Unit::TestCase
4
+ def setup
5
+ LLVM.init_x86
6
+ end
7
+
8
+ def test_double
9
+ mod = LLVM::Module.new("Double Test")
10
+ mod.functions.add(:sin, [LLVM::Double], LLVM::Double)
11
+
12
+ builder = LLVM::Builder.new
13
+
14
+ mod.functions.add('test', [LLVM::Double], LLVM::Double) do |fun, p0|
15
+ p0.name = 'x'
16
+
17
+ bb = fun.basic_blocks.append
18
+ builder.position_at_end(bb)
19
+
20
+ builder.ret(builder.fadd(p0, LLVM::Double(1.0)))
21
+ end
22
+
23
+ engine = LLVM::JITCompiler.new(mod)
24
+
25
+ arg = 5.0
26
+ result = engine.run_function(mod.functions["test"], arg)
27
+ assert_equal arg+1, result.to_f(LLVM::Double)
28
+
29
+ assert_in_delta(Math.sin(1.0),
30
+ engine.run_function(mod.functions["sin"], 1.0).to_f(LLVM::Double),
31
+ 1e-10)
32
+ end
33
+ end
@@ -0,0 +1,91 @@
1
+ require "test_helper"
2
+ require "llvm/core"
3
+
4
+ class EqualityTestCase < Test::Unit::TestCase
5
+ def setup
6
+ LLVM.init_x86
7
+ end
8
+
9
+ class MyModule < LLVM::Module; end
10
+ class MyInt < LLVM::Int32; end
11
+ class MyType < LLVM::Type; end
12
+ class MyFunction < LLVM::Function; end
13
+
14
+ def assert_equalities(options)
15
+ map = {
16
+ :equal => method(:assert_equal),
17
+ :not_equal => method(:assert_not_equal),
18
+ :same => method(:assert_same),
19
+ :not_same => method(:assert_not_same),
20
+ :eql => lambda {|n, m, name| assert n.eql?(m), name },
21
+ :not_eql => lambda {|n, m, name| assert !n.eql?(m), name },
22
+ }
23
+
24
+ map.each do |name, callable|
25
+ options[name].combination(2).each do |n, m|
26
+ callable.call(n, m, name.to_s)
27
+ end
28
+ end
29
+
30
+ end
31
+
32
+ def test_int_value
33
+ int1 = LLVM::Int32.from_i(1)
34
+ int2 = LLVM::Int32.from_ptr(int1.to_ptr)
35
+ int3 = LLVM::Int32.from_i(2)
36
+ int4 = MyInt.from_ptr(int1.to_ptr)
37
+
38
+ assert_equalities :equal => [int1, int2, int4],
39
+ :not_equal => [int1, int3],
40
+ :same => [int1, int1],
41
+ :not_same => [int1, int2, int3, int4],
42
+ :eql => [int1, int2],
43
+ :not_eql => [int1, int3, int4]
44
+ end
45
+
46
+ def test_module
47
+ mod1 = LLVM::Module.new('test')
48
+ mod2 = LLVM::Module.from_ptr(mod1.to_ptr)
49
+ mod3 = LLVM::Module.new('dummy')
50
+ mod4 = MyModule.from_ptr(mod1.to_ptr)
51
+
52
+ assert_equalities :equal => [mod1, mod2, mod4],
53
+ :not_equal => [mod1, mod3],
54
+ :same => [mod1, mod1],
55
+ :not_same => [mod1, mod2, mod3, mod4],
56
+ :eql => [mod1, mod2],
57
+ :not_eql => [mod1, mod3, mod4]
58
+ end
59
+
60
+ def test_type
61
+ type1 = LLVM::Float.type
62
+ type2 = LLVM::Type.from_ptr(type1.to_ptr)
63
+ type3 = LLVM::Double.type
64
+ type4 = MyType.from_ptr(type1.to_ptr)
65
+
66
+ assert_equalities :equal => [type1, type2, type4],
67
+ :not_equal => [type1, type3],
68
+ :same => [type1, type1],
69
+ :not_same => [type1, type2, type3, type4],
70
+ :eql => [type1, type2],
71
+ :not_eql => [type1, type3, type4]
72
+ end
73
+
74
+ def test_function
75
+ mod = LLVM::Module.new('test')
76
+
77
+ fn1 = mod.functions.add('test1', LLVM.Void)
78
+ fn2 = LLVM::Function.from_ptr(fn1.to_ptr)
79
+ fn3 = mod.functions.add('test2', LLVM.Void)
80
+ fn4 = MyFunction.from_ptr(fn1.to_ptr)
81
+
82
+ assert_equalities :equal => [fn1, fn2, fn4],
83
+ :not_equal => [fn1, fn3],
84
+ :same => [fn1, fn1],
85
+ :not_same => [fn1, fn2, fn3, fn4],
86
+ :eql => [fn1, fn2],
87
+ :not_eql => [fn1, fn3, fn4]
88
+ end
89
+
90
+ end
91
+
@@ -0,0 +1,22 @@
1
+ require "test_helper"
2
+
3
+ class GenericValueTestCase < Test::Unit::TestCase
4
+
5
+ def setup
6
+ LLVM.init_x86
7
+ end
8
+
9
+ def test_from_i
10
+ assert_equal 2, LLVM::GenericValue.from_i(2).to_i
11
+ assert_equal 2 ,LLVM::GenericValue.from_i(2.2).to_i
12
+ end
13
+
14
+ def test_from_float
15
+ assert_in_delta 2.2, LLVM::GenericValue.from_f(2.2).to_f, 1e-6
16
+ end
17
+
18
+ def test_from_double
19
+ assert_in_delta 2.2, LLVM::GenericValue.from_d(2.2).to_f(LLVM::Double), 1e-6
20
+ end
21
+
22
+ end
@@ -0,0 +1,32 @@
1
+ require "test_helper"
2
+
3
+ class InstructionTestCase < Test::Unit::TestCase
4
+ def setup
5
+ LLVM.init_x86
6
+ @module = LLVM::Module.new("InstructionTestCase")
7
+ end
8
+
9
+ def test_instruction
10
+ fn = @module.functions.add("test_instruction", [LLVM::Double], LLVM::Double) do |fn, arg|
11
+ fn.basic_blocks.append.build do |builder|
12
+ builder.ret(
13
+ builder.fadd(arg, LLVM.Double(3.0)))
14
+ end
15
+ end
16
+
17
+ entry = fn.basic_blocks.entry
18
+
19
+ inst1 = entry.instructions.first
20
+ inst2 = entry.instructions.last
21
+
22
+ assert_kind_of LLVM::Instruction, inst1
23
+ assert_kind_of LLVM::Instruction, inst2
24
+
25
+ assert_equal inst2, inst1.next
26
+ assert_equal inst1, inst2.previous
27
+ assert_equal entry, inst1.parent
28
+ assert_equal entry, inst2.parent
29
+ end
30
+ end
31
+
32
+