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
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 84318238934c7be3357466dfcda5fdf52b587164a4756f1663a749edd3754964
|
4
|
+
data.tar.gz: 2fee5d96b91ebe3edf7d835c4cbe5111e1d9ce8fa63042a32123b506cb65085d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5e03ffebe80a650098d8974ea5b218a727b3f165400cd797bc1d3e652d10cb06f4a621310917e6ee9011b31f4b3ab2dfe215165373c666e78b5d68c8e15703e6
|
7
|
+
data.tar.gz: bd40aa282aeac16fe3e189c05ab26db1230af73f7b536803e218f1d78a86087fe6f4389e3dfe4ae66eab4fdc7a4417dd712bd2449c6c12b77efd1d99bfffc7a3
|
data/lib/llvm/core/builder.rb
CHANGED
@@ -24,7 +24,10 @@ module LLVM
|
|
24
24
|
# @param [LLVM::Instruction] instruction
|
25
25
|
# @return [LLVM::Builder]
|
26
26
|
def position(block, instruction)
|
27
|
-
raise "Block must
|
27
|
+
raise ArgumentError, "Block must be LLVM::BasicBlock" if !block.is_a?(LLVM::BasicBlock)
|
28
|
+
|
29
|
+
raise ArgumentError, "Instruction must be LLVM::Instruction" if !instruction.is_a?(LLVM::Instruction)
|
30
|
+
|
28
31
|
C.position_builder(self, block, instruction)
|
29
32
|
self
|
30
33
|
end
|
@@ -34,7 +37,8 @@ module LLVM
|
|
34
37
|
# @param [LLVM::Instruction] instruction
|
35
38
|
# @return [LLVM::Builder]
|
36
39
|
def position_before(instruction)
|
37
|
-
raise "Instruction must
|
40
|
+
raise ArgumentError, "Instruction must be LLVM::Instruction" if !instruction.is_a?(LLVM::Instruction)
|
41
|
+
|
38
42
|
C.position_builder_before(self, instruction)
|
39
43
|
self
|
40
44
|
end
|
@@ -44,7 +48,8 @@ module LLVM
|
|
44
48
|
# @param [LLVM::BasicBlock] block
|
45
49
|
# @return [LLVM::Builder]
|
46
50
|
def position_at_end(block)
|
47
|
-
raise "Block must
|
51
|
+
raise ArgumentError, "Block must be LLVM::BasicBlock" if !block.is_a?(LLVM::BasicBlock)
|
52
|
+
|
48
53
|
C.position_builder_at_end(self, block)
|
49
54
|
self
|
50
55
|
end
|
@@ -65,7 +70,11 @@ module LLVM
|
|
65
70
|
# @param [LLVM::Value] val The value to return
|
66
71
|
# @return [LLVM::Instruction]
|
67
72
|
# @LLVMinst ret
|
68
|
-
def ret(val)
|
73
|
+
def ret(val = nil)
|
74
|
+
unless [LLVM::Value, NilClass].any? { |c| val.is_a?(c) }
|
75
|
+
raise ArgumentError, "Trying to build LLVM ret with non-value: #{val.inspect}"
|
76
|
+
end
|
77
|
+
|
69
78
|
Instruction.from_ptr(C.build_ret(self, val))
|
70
79
|
end
|
71
80
|
|
@@ -85,7 +94,8 @@ module LLVM
|
|
85
94
|
# @return [LLVM::Instruction]
|
86
95
|
# @LLVMinst br
|
87
96
|
def br(block)
|
88
|
-
raise "
|
97
|
+
raise ArgumentError, "Trying to build LLVM br with non-block: #{block.inspect}" if !block.is_a?(LLVM::BasicBlock)
|
98
|
+
|
89
99
|
Instruction.from_ptr(
|
90
100
|
C.build_br(self, block))
|
91
101
|
end
|
@@ -107,8 +117,31 @@ module LLVM
|
|
107
117
|
# @return [LLVM::Instruction]
|
108
118
|
# @LLVMinst br
|
109
119
|
def cond(cond, iftrue, iffalse)
|
120
|
+
raise ArgumentError, "Trying to build LLVM cond br with non-block (true branch): #{iftrue.inspect}" if !iftrue.is_a?(LLVM::BasicBlock)
|
121
|
+
|
122
|
+
raise ArgumentError, "Trying to build LLVM cond br with non-block (false branch): #{iffalse.inspect}" if !iffalse.is_a?(LLVM::BasicBlock)
|
123
|
+
|
124
|
+
cond2 = cond_condition(cond)
|
125
|
+
|
110
126
|
Instruction.from_ptr(
|
111
|
-
C.build_cond_br(self,
|
127
|
+
C.build_cond_br(self, cond2, iftrue, iffalse))
|
128
|
+
end
|
129
|
+
|
130
|
+
private def cond_condition(cond) # rubocop:disable Style/AccessModifierDeclarations
|
131
|
+
case cond
|
132
|
+
when LLVM::Value
|
133
|
+
cond_type = cond.type
|
134
|
+
if (cond_type.kind != :integer) || (cond_type.width != 1)
|
135
|
+
raise ArgumentError, "Trying to build LLVM cond br with non-i1 condition: #{cond_type}"
|
136
|
+
end
|
137
|
+
cond
|
138
|
+
when true
|
139
|
+
LLVM::Int1.from_i(1)
|
140
|
+
when false
|
141
|
+
LLVM::Int1.from_i(0)
|
142
|
+
else
|
143
|
+
raise ArgumentError, "Trying to build LLVM cond br with non-value condition: #{cond.inspect}"
|
144
|
+
end
|
112
145
|
end
|
113
146
|
|
114
147
|
# @LLVMinst switch
|
@@ -835,7 +868,8 @@ module LLVM
|
|
835
868
|
# @param [LLVM::Instruction]
|
836
869
|
# @LLVMinst call
|
837
870
|
def call(fun, *args)
|
838
|
-
raise "
|
871
|
+
raise ArgumentError, "Trying to build LLVM call with non-function: #{fun.inspect}" if !fun.is_a?(LLVM::Function)
|
872
|
+
|
839
873
|
if args.last.kind_of? String
|
840
874
|
name = args.pop
|
841
875
|
else
|
@@ -870,6 +904,10 @@ module LLVM
|
|
870
904
|
# @return [LLVM::Instruction] The extracted element
|
871
905
|
# @LLVMinst extractelement
|
872
906
|
def extract_element(vector, idx, name = "")
|
907
|
+
error = element_error(vector, idx)
|
908
|
+
|
909
|
+
raise ArgumentError, "Error building extract_element with #{error}" if error
|
910
|
+
|
873
911
|
Instruction.from_ptr(C.build_extract_element(self, vector, idx, name))
|
874
912
|
end
|
875
913
|
|
@@ -881,9 +919,27 @@ module LLVM
|
|
881
919
|
# @return [LLVM::Instruction] A vector the same type as 'vector'
|
882
920
|
# @LLVMinst insertelement
|
883
921
|
def insert_element(vector, elem, idx, name = "")
|
922
|
+
error = element_error(vector, idx)
|
923
|
+
|
924
|
+
error ||= if !elem.is_a?(LLVM::Value)
|
925
|
+
"elem: #{elem.inspect}"
|
926
|
+
end
|
927
|
+
|
928
|
+
raise ArgumentError, "Error building insert_element with #{error}" if error
|
929
|
+
|
884
930
|
Instruction.from_ptr(C.build_insert_element(self, vector, elem, idx, name))
|
885
931
|
end
|
886
932
|
|
933
|
+
private def element_error(vector, idx) # rubocop:disable Style/AccessModifierDeclarations
|
934
|
+
if !vector.is_a?(LLVM::Value)
|
935
|
+
"non-value: #{vector.inspect}"
|
936
|
+
elsif vector.type.kind != :vector
|
937
|
+
"non-vector: #{vector.type.kind}"
|
938
|
+
elsif !idx.is_a?(LLVM::Value)
|
939
|
+
"index: #{idx}"
|
940
|
+
end
|
941
|
+
end
|
942
|
+
|
887
943
|
# Shuffle two vectors according to a given mask
|
888
944
|
# @param [LLVM::Value] vec1 A vector
|
889
945
|
# @param [LLVM::Value] vec2 A vector of the same type and arity as vec1
|
@@ -898,25 +954,47 @@ module LLVM
|
|
898
954
|
|
899
955
|
# Extract the value of a member field from an aggregate value
|
900
956
|
# @param [LLVM::Value] aggregate An aggregate value
|
901
|
-
# @param [
|
957
|
+
# @param [Integer] idx The index of the member to extract
|
902
958
|
# @param [String] name The name of the result in LLVM IR
|
903
959
|
# @return [LLVM::Instruction] The extracted value
|
904
960
|
# @LLVMinst extractvalue
|
905
961
|
def extract_value(aggregate, idx, name = "")
|
962
|
+
error = value_error(aggregate, idx)
|
963
|
+
|
964
|
+
raise ArgumentError, "Error building extract_value with #{error}" if error
|
965
|
+
|
906
966
|
Instruction.from_ptr(C.build_extract_value(self, aggregate, idx, name))
|
907
967
|
end
|
908
968
|
|
909
969
|
# Insert a value into an aggregate value's member field
|
910
970
|
# @param [LLVM::Value] aggregate An aggregate value
|
911
971
|
# @param [LLVM::Value] elem The value to insert into 'aggregate'
|
912
|
-
# @param [
|
972
|
+
# @param [Integer] idx The index at which to insert the value
|
913
973
|
# @param [String] name The name of the result in LLVM IR
|
914
974
|
# @return [LLVM::Instruction] An aggregate value of the same type as 'aggregate'
|
915
975
|
# @LLVMinst insertvalue
|
916
976
|
def insert_value(aggregate, elem, idx, name = "")
|
977
|
+
error = value_error(aggregate, idx)
|
978
|
+
|
979
|
+
error ||= if !elem.is_a?(LLVM::Value)
|
980
|
+
"elem: #{elem.inspect}"
|
981
|
+
end
|
982
|
+
|
983
|
+
raise ArgumentError, "Error building insert_value with #{error}" if error
|
984
|
+
|
917
985
|
Instruction.from_ptr(C.build_insert_value(self, aggregate, elem, idx, name))
|
918
986
|
end
|
919
987
|
|
988
|
+
private def value_error(aggregate, idx) # rubocop:disable Style/AccessModifierDeclarations
|
989
|
+
if !aggregate.is_a?(LLVM::Value)
|
990
|
+
"non-value: #{aggregate.inspect}"
|
991
|
+
elsif !aggregate.type.aggregate?
|
992
|
+
"non-aggregate: #{aggregate.type.kind}"
|
993
|
+
elsif !idx.is_a?(Integer) || idx.negative?
|
994
|
+
"index: #{idx}"
|
995
|
+
end
|
996
|
+
end
|
997
|
+
|
920
998
|
# Check if a value is null
|
921
999
|
# @param [LLVM::Value] val The value to check
|
922
1000
|
# @param [String] name The name of the result in LLVM IR
|
data/lib/llvm/core/type.rb
CHANGED
@@ -66,6 +66,10 @@ module LLVM
|
|
66
66
|
C.print_type_to_string(self)
|
67
67
|
end
|
68
68
|
|
69
|
+
def aggregate?
|
70
|
+
[:struct, :array].include?(kind)
|
71
|
+
end
|
72
|
+
|
69
73
|
# Creates an array type of Type with the given size.
|
70
74
|
def self.array(ty, sz = 0)
|
71
75
|
from_ptr(C.array_type(LLVM::Type(ty), sz), :array)
|
data/lib/llvm/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-llvm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 13.0.
|
4
|
+
version: 13.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jesse Johnson
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2022-06-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: ffi
|
@@ -65,42 +65,42 @@ dependencies:
|
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 5.
|
68
|
+
version: 5.15.0
|
69
69
|
type: :development
|
70
70
|
prerelease: false
|
71
71
|
version_requirements: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: 5.
|
75
|
+
version: 5.15.0
|
76
76
|
- !ruby/object:Gem::Dependency
|
77
77
|
name: minitest-reporters
|
78
78
|
requirement: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: 1.
|
82
|
+
version: 1.5.0
|
83
83
|
type: :development
|
84
84
|
prerelease: false
|
85
85
|
version_requirements: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: 1.
|
89
|
+
version: 1.5.0
|
90
90
|
- !ruby/object:Gem::Dependency
|
91
91
|
name: rubocop
|
92
92
|
requirement: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: 1.
|
96
|
+
version: 1.30.0
|
97
97
|
type: :development
|
98
98
|
prerelease: false
|
99
99
|
version_requirements: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
101
|
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: 1.
|
103
|
+
version: 1.30.0
|
104
104
|
- !ruby/object:Gem::Dependency
|
105
105
|
name: rubocop-minitest
|
106
106
|
requirement: !ruby/object:Gem::Requirement
|
@@ -203,44 +203,17 @@ files:
|
|
203
203
|
- lib/llvm/transforms/vectorize.rb
|
204
204
|
- lib/llvm/transforms/vectorize_ffi.rb
|
205
205
|
- lib/llvm/version.rb
|
206
|
-
- test/array_test.rb
|
207
|
-
- test/basic_block_test.rb
|
208
|
-
- test/binary_operations_test.rb
|
209
|
-
- test/bitcode_test.rb
|
210
|
-
- test/branch_test.rb
|
211
|
-
- test/call_test.rb
|
212
|
-
- test/comparisons_test.rb
|
213
|
-
- test/conversions_test.rb
|
214
|
-
- test/double_test.rb
|
215
|
-
- test/equality_test.rb
|
216
|
-
- test/function_test.rb
|
217
|
-
- test/generic_value_test.rb
|
218
|
-
- test/instruction_test.rb
|
219
|
-
- test/integer_test.rb
|
220
|
-
- test/ipo_test.rb
|
221
|
-
- test/linker_test.rb
|
222
|
-
- test/mcjit_test.rb
|
223
|
-
- test/memory_access_test.rb
|
224
|
-
- test/module_test.rb
|
225
|
-
- test/parameter_collection_test.rb
|
226
|
-
- test/pass_manager_builder_test.rb
|
227
|
-
- test/phi_test.rb
|
228
|
-
- test/select_test.rb
|
229
|
-
- test/struct_test.rb
|
230
|
-
- test/target_test.rb
|
231
|
-
- test/test_helper.rb
|
232
|
-
- test/type_test.rb
|
233
|
-
- test/vector_test.rb
|
234
206
|
homepage: http://github.com/ruby-llvm/ruby-llvm
|
235
207
|
licenses: []
|
236
|
-
metadata:
|
208
|
+
metadata:
|
209
|
+
rubygems_mfa_required: 'true'
|
237
210
|
post_install_message:
|
238
211
|
rdoc_options: []
|
239
212
|
require_paths:
|
240
213
|
- lib
|
241
214
|
required_ruby_version: !ruby/object:Gem::Requirement
|
242
215
|
requirements:
|
243
|
-
- -
|
216
|
+
- - ">="
|
244
217
|
- !ruby/object:Gem::Version
|
245
218
|
version: '2.7'
|
246
219
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
@@ -249,36 +222,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
249
222
|
- !ruby/object:Gem::Version
|
250
223
|
version: '0'
|
251
224
|
requirements: []
|
252
|
-
rubygems_version: 3.
|
225
|
+
rubygems_version: 3.3.5
|
253
226
|
signing_key:
|
254
227
|
specification_version: 4
|
255
228
|
summary: LLVM bindings for Ruby
|
256
|
-
test_files:
|
257
|
-
- test/double_test.rb
|
258
|
-
- test/type_test.rb
|
259
|
-
- test/basic_block_test.rb
|
260
|
-
- test/struct_test.rb
|
261
|
-
- test/array_test.rb
|
262
|
-
- test/vector_test.rb
|
263
|
-
- test/instruction_test.rb
|
264
|
-
- test/ipo_test.rb
|
265
|
-
- test/branch_test.rb
|
266
|
-
- test/binary_operations_test.rb
|
267
|
-
- test/bitcode_test.rb
|
268
|
-
- test/pass_manager_builder_test.rb
|
269
|
-
- test/equality_test.rb
|
270
|
-
- test/function_test.rb
|
271
|
-
- test/parameter_collection_test.rb
|
272
|
-
- test/memory_access_test.rb
|
273
|
-
- test/select_test.rb
|
274
|
-
- test/module_test.rb
|
275
|
-
- test/test_helper.rb
|
276
|
-
- test/comparisons_test.rb
|
277
|
-
- test/target_test.rb
|
278
|
-
- test/call_test.rb
|
279
|
-
- test/conversions_test.rb
|
280
|
-
- test/linker_test.rb
|
281
|
-
- test/generic_value_test.rb
|
282
|
-
- test/phi_test.rb
|
283
|
-
- test/integer_test.rb
|
284
|
-
- test/mcjit_test.rb
|
229
|
+
test_files: []
|
data/test/array_test.rb
DELETED
@@ -1,40 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "test_helper"
|
4
|
-
|
5
|
-
class ArrayTestCase < Minitest::Test
|
6
|
-
|
7
|
-
def setup
|
8
|
-
LLVM.init_jit
|
9
|
-
end
|
10
|
-
|
11
|
-
def test_constant_array_from_size
|
12
|
-
array = LLVM::ConstantArray.const(LLVM::Int, 2) { |i| LLVM::Int(i) }
|
13
|
-
assert_instance_of LLVM::ConstantArray, array
|
14
|
-
assert_equal 2, array.size
|
15
|
-
end
|
16
|
-
|
17
|
-
def test_constant_array_from_array
|
18
|
-
array = LLVM::ConstantArray.const(LLVM::Int, [LLVM::Int(0), LLVM::Int(1)])
|
19
|
-
assert_instance_of LLVM::ConstantArray, array
|
20
|
-
assert_equal 2, array.size
|
21
|
-
end
|
22
|
-
|
23
|
-
def test_array_values
|
24
|
-
assert_equal 2 + 3, run_array_values(2, 3).to_i
|
25
|
-
end
|
26
|
-
|
27
|
-
def run_array_values(value1, value2)
|
28
|
-
run_function([LLVM::Int, LLVM::Int], [value1, value2], LLVM::Int) do |builder, function, *arguments|
|
29
|
-
entry = function.basic_blocks.append
|
30
|
-
builder.position_at_end(entry)
|
31
|
-
pointer = builder.alloca(LLVM::Array(LLVM::Int, 2))
|
32
|
-
array = builder.load(pointer)
|
33
|
-
array = builder.insert_value(array, arguments.first, 0)
|
34
|
-
array = builder.insert_value(array, arguments.last, 1)
|
35
|
-
builder.ret(builder.add(builder.extract_value(array, 0),
|
36
|
-
builder.extract_value(array, 1)))
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
end
|
data/test/basic_block_test.rb
DELETED
@@ -1,89 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "test_helper"
|
4
|
-
|
5
|
-
class BasicBlockTestCase < Minitest::Test
|
6
|
-
|
7
|
-
def setup
|
8
|
-
LLVM.init_jit
|
9
|
-
@module = LLVM::Module.new("BasicBlockTestCase")
|
10
|
-
end
|
11
|
-
|
12
|
-
def test_basic_block_collection
|
13
|
-
@module.functions.add("test_basic_block_collection", [], LLVM.Void) do |fn|
|
14
|
-
coll = fn.basic_blocks
|
15
|
-
|
16
|
-
block1 = coll.append
|
17
|
-
assert_instance_of LLVM::BasicBlock, block1
|
18
|
-
|
19
|
-
assert_equal 1, coll.size
|
20
|
-
assert_equal coll.first, coll.last,
|
21
|
-
'Only one block exists in the function'
|
22
|
-
assert_equal coll.first, coll.entry,
|
23
|
-
'The entry block for the function is always the first block'
|
24
|
-
|
25
|
-
block2 = coll.append
|
26
|
-
assert_equal 2, coll.size
|
27
|
-
assert_equal block1, coll.first
|
28
|
-
assert_equal block2, coll.last
|
29
|
-
|
30
|
-
[ coll.each.to_a, coll.to_a ].each do |blocks|
|
31
|
-
assert_equal 2, blocks.size
|
32
|
-
assert_equal block1, blocks[0]
|
33
|
-
assert_equal block2, blocks[1]
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
def test_basic_block
|
39
|
-
@module.functions.add("test_basic_block", [], LLVM.Void) do |fn|
|
40
|
-
coll = fn.basic_blocks
|
41
|
-
|
42
|
-
block1 = coll.append
|
43
|
-
block2 = coll.append
|
44
|
-
|
45
|
-
assert_equal fn, block1.parent
|
46
|
-
assert_equal fn, block2.parent
|
47
|
-
|
48
|
-
assert_equal block2, block1.next
|
49
|
-
assert_equal block1, block2.previous
|
50
|
-
|
51
|
-
block1.build do |builder|
|
52
|
-
builder.br(block2)
|
53
|
-
end
|
54
|
-
|
55
|
-
block2.build do |builder|
|
56
|
-
builder.ret_void
|
57
|
-
end
|
58
|
-
|
59
|
-
assert_equal block1.first_instruction,
|
60
|
-
block1.last_instruction
|
61
|
-
assert_equal block2.first_instruction,
|
62
|
-
block2.last_instruction
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
def test_basic_block_enumerable
|
67
|
-
@module.functions.add("test_basic_block_enumerable", [LLVM::Double], LLVM::Double) do |fn, arg|
|
68
|
-
block1 = fn.basic_blocks.append
|
69
|
-
|
70
|
-
[ block1.instructions.to_a, block1.instructions.each.to_a ].each do |insts|
|
71
|
-
assert_equal 0, insts.size, 'Empty basic block'
|
72
|
-
end
|
73
|
-
|
74
|
-
block1.build do |builder|
|
75
|
-
builder.ret(builder.fadd(arg, LLVM.Double(1.0)))
|
76
|
-
end
|
77
|
-
|
78
|
-
[ block1.instructions.to_a, block1.instructions.each.to_a ].each do |insts|
|
79
|
-
assert_equal 2, insts.size
|
80
|
-
assert_equal block1.first_instruction, insts[0] # deprecated
|
81
|
-
assert_equal block1.last_instruction, insts[1] # deprecated
|
82
|
-
assert_equal block1.instructions.first, insts[0]
|
83
|
-
assert_equal block1.instructions.last, insts[1]
|
84
|
-
end
|
85
|
-
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
end
|
@@ -1,60 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "test_helper"
|
4
|
-
|
5
|
-
class BasicOperationsTestCase < Minitest::Test
|
6
|
-
|
7
|
-
def setup
|
8
|
-
LLVM.init_jit
|
9
|
-
end
|
10
|
-
|
11
|
-
def test_integer_binary_operations
|
12
|
-
integer_binary_operation_assertion(:add, 3, 2, 3 + 2)
|
13
|
-
integer_binary_operation_assertion(:sub, 3, 2, 3 - 2)
|
14
|
-
integer_binary_operation_assertion(:mul, 3, 2, 3 * 2)
|
15
|
-
integer_binary_operation_assertion(:udiv, 10, 2, 10 / 2)
|
16
|
-
integer_binary_operation_assertion(:sdiv, 10, 2, 10 / 2)
|
17
|
-
integer_binary_operation_assertion(:urem, 10, 3, 10 % 3)
|
18
|
-
integer_binary_operation_assertion(:srem, 10, 3, 10 % 3)
|
19
|
-
end
|
20
|
-
|
21
|
-
def test_integer_bitwise_binary_operations
|
22
|
-
integer_binary_operation_assertion(:shl, 2, 3, 2 << 3)
|
23
|
-
integer_binary_operation_assertion(:lshr, 16, 3, 16 >> 3)
|
24
|
-
integer_binary_operation_assertion(:ashr, 16, 3, 16 >> 3)
|
25
|
-
integer_binary_operation_assertion(:and, 2, 1, 2 & 1)
|
26
|
-
integer_binary_operation_assertion(:or, 2, 1, 2 | 1)
|
27
|
-
integer_binary_operation_assertion(:xor, 3, 2, 3 ^ 2)
|
28
|
-
end
|
29
|
-
|
30
|
-
def test_float_binary_operations
|
31
|
-
float_binary_operation_assertion(:fadd, 3.1, 2.2, 3.1 + 2.2)
|
32
|
-
float_binary_operation_assertion(:fsub, 3.1, 2.2, 3.1 - 2.2)
|
33
|
-
float_binary_operation_assertion(:fmul, 3.1, 2.2, 3.1 * 2.2)
|
34
|
-
float_binary_operation_assertion(:fdiv, 3.1, 2.2, 3.1 / 2.2)
|
35
|
-
float_binary_operation_assertion(:frem, 3.1, 2.2, 3.1 % 2.2)
|
36
|
-
end
|
37
|
-
|
38
|
-
def integer_binary_operation_assertion(operation, operand1, operand2, expected_result)
|
39
|
-
result = run_binary_operation(operation,
|
40
|
-
LLVM::Int(operand1), LLVM::Int(operand2),
|
41
|
-
LLVM::Int).to_i
|
42
|
-
assert_equal expected_result, result
|
43
|
-
end
|
44
|
-
|
45
|
-
def float_binary_operation_assertion(operation, operand1, operand2, expected_result)
|
46
|
-
result = run_binary_operation(operation,
|
47
|
-
LLVM::Float(operand1), LLVM::Float(operand2),
|
48
|
-
LLVM::Float).to_f
|
49
|
-
assert_in_delta expected_result, result, 0.001
|
50
|
-
end
|
51
|
-
|
52
|
-
def run_binary_operation(operation, operand1, operand2, return_type)
|
53
|
-
run_function([], [], return_type) do |builder, function, *arguments|
|
54
|
-
entry = function.basic_blocks.append
|
55
|
-
builder.position_at_end(entry)
|
56
|
-
builder.ret(builder.send(operation, operand1, operand2))
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
end
|
data/test/bitcode_test.rb
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "test_helper"
|
4
|
-
require "tempfile"
|
5
|
-
|
6
|
-
class BitcodeTestCase < Minitest::Test
|
7
|
-
def setup
|
8
|
-
LLVM.init_jit
|
9
|
-
end
|
10
|
-
|
11
|
-
def test_bitcode
|
12
|
-
test_module = define_module("test_module") do |mod|
|
13
|
-
define_function(mod, "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
|
-
Tempfile.open("bitcode") do |tmp|
|
20
|
-
assert test_module.write_bitcode(tmp)
|
21
|
-
new_module = LLVM::Module.parse_bitcode(tmp.path)
|
22
|
-
result = run_function_on_module(new_module, "test_function").to_i
|
23
|
-
assert_equal 1, result
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
data/test/branch_test.rb
DELETED
@@ -1,59 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "test_helper"
|
4
|
-
|
5
|
-
class BranchTestCase < Minitest::Test
|
6
|
-
|
7
|
-
def setup
|
8
|
-
LLVM.init_jit
|
9
|
-
end
|
10
|
-
|
11
|
-
def test_branching
|
12
|
-
assert_equal 0, direct_jump_function().to_i
|
13
|
-
assert_equal 0, conditional_jump_function().to_i
|
14
|
-
assert_equal 0, switched_jump_function().to_i
|
15
|
-
end
|
16
|
-
|
17
|
-
def direct_jump_function
|
18
|
-
run_function([], [], LLVM::Int) do |builder, function, *arguments|
|
19
|
-
entry = function.basic_blocks.append
|
20
|
-
branch_1 = function.basic_blocks.append
|
21
|
-
branch_2 = function.basic_blocks.append
|
22
|
-
builder.position_at_end(entry)
|
23
|
-
builder.br(branch_2)
|
24
|
-
builder.position_at_end(branch_1)
|
25
|
-
builder.ret(LLVM::Int(1))
|
26
|
-
builder.position_at_end(branch_2)
|
27
|
-
builder.ret(LLVM::Int(0))
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def conditional_jump_function
|
32
|
-
run_function([], [], LLVM::Int) do |builder, function, *arguments|
|
33
|
-
entry = function.basic_blocks.append
|
34
|
-
branch_1 = function.basic_blocks.append
|
35
|
-
branch_2 = function.basic_blocks.append
|
36
|
-
builder.position_at_end(entry)
|
37
|
-
builder.cond(builder.icmp(:eq, LLVM::Int(1), LLVM::Int(2)), branch_1, branch_2)
|
38
|
-
builder.position_at_end(branch_1)
|
39
|
-
builder.ret(LLVM::Int(1))
|
40
|
-
builder.position_at_end(branch_2)
|
41
|
-
builder.ret(LLVM::Int(0))
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
def switched_jump_function
|
46
|
-
run_function([], [], LLVM::Int) do |builder, function, *arguments|
|
47
|
-
entry = function.basic_blocks.append
|
48
|
-
branch_1 = function.basic_blocks.append
|
49
|
-
branch_2 = function.basic_blocks.append
|
50
|
-
builder.position_at_end(entry)
|
51
|
-
switch = builder.switch(LLVM::Int(1), branch_1, LLVM::Int(1) => branch_2)
|
52
|
-
builder.position_at_end(branch_1)
|
53
|
-
builder.ret(LLVM::Int(1))
|
54
|
-
builder.position_at_end(branch_2)
|
55
|
-
builder.ret(LLVM::Int(0))
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
end
|