ruby-llvm 15.0.1 → 15.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ext/ruby-llvm-support/Rakefile +1 -1
- data/lib/llvm/core/builder.rb +8 -8
- data/lib/llvm/core/opaque_pointer_builder.rb +2 -1
- data/lib/llvm/core/type.rb +40 -3
- data/lib/llvm/core/value.rb +2 -2
- data/lib/llvm/core.rb +32 -0
- data/lib/llvm/core_ffi.rb +0 -20
- data/lib/llvm/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 79169ec6b39406ef0c395bee5bbc02578340808b2728ba61b5b89c1532e05c94
|
4
|
+
data.tar.gz: 8fe97708a36b561acbd24433f1ddf5d940e6535a776d918eca463fd179a29aea
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 75303049be604101b44001f68264b0ba0e5902816cf8d001ed5302aa7b71067b1e8d4ac7f24cf3470e53f59aac5547391b31c5f1145dceb28661966e95c56928
|
7
|
+
data.tar.gz: 9bad15b50111baf7dd2804d9bd6e61d8a2d05b892eacbbbc52df0194662f961eba8c7f9b81f5ebf1b5e9ce796e4aaeb4b4b47e858874d474ea39e54d3a6dd042
|
@@ -77,7 +77,7 @@ desc "Build the shared library and config module"
|
|
77
77
|
task :default => [SUPPORT_LIB, CONFIG_MOD]
|
78
78
|
|
79
79
|
file SUPPORT_LIB => %w(support.cpp) do |task|
|
80
|
-
clang_stdlib = CXX
|
80
|
+
clang_stdlib = CXX.match?(/^clang++/) ? "-stdlib=libc++" : ""
|
81
81
|
sh "#{CXX} -O3 -shared #{task.prerequisites.join(' ')} -l#{llvm_lib_name} " \
|
82
82
|
"#{invoke_llvm_config('--cxxflags --ldflags')} -fPIC #{clang_stdlib} -o #{SUPPORT_LIB}"
|
83
83
|
end
|
data/lib/llvm/core/builder.rb
CHANGED
@@ -1070,20 +1070,20 @@ module LLVM
|
|
1070
1070
|
|
1071
1071
|
private
|
1072
1072
|
|
1073
|
-
|
1073
|
+
def must_be_value!(value)
|
1074
1074
|
raise "must be a Value, got #{value.class.name}" unless Value === value
|
1075
1075
|
end
|
1076
1076
|
|
1077
|
-
|
1077
|
+
def must_be_type!(type)
|
1078
1078
|
type2 = LLVM.Type(type)
|
1079
1079
|
raise "must be a Type (LLVMTypeRef), got #{type2.class.name}" unless Type === type2
|
1080
1080
|
end
|
1081
1081
|
|
1082
|
-
|
1082
|
+
def must_infer_type!(value)
|
1083
1083
|
infer_type(value)
|
1084
1084
|
end
|
1085
1085
|
|
1086
|
-
|
1086
|
+
def infer_type(ptr)
|
1087
1087
|
case ptr
|
1088
1088
|
when GlobalVariable
|
1089
1089
|
Type.from_ptr(C.global_get_value_type(ptr))
|
@@ -1094,7 +1094,7 @@ module LLVM
|
|
1094
1094
|
end
|
1095
1095
|
end
|
1096
1096
|
|
1097
|
-
|
1097
|
+
def must_infer_instruction_type!(ptr)
|
1098
1098
|
case ptr.opcode
|
1099
1099
|
when :get_element_ptr
|
1100
1100
|
must_infer_gep!(ptr)
|
@@ -1107,7 +1107,7 @@ module LLVM
|
|
1107
1107
|
end
|
1108
1108
|
end
|
1109
1109
|
|
1110
|
-
|
1110
|
+
def must_infer_gep!(ptr)
|
1111
1111
|
source_type = Type.from_ptr(C.get_gep_source_element_type(ptr))
|
1112
1112
|
case source_type.kind
|
1113
1113
|
when :integer
|
@@ -1121,7 +1121,7 @@ module LLVM
|
|
1121
1121
|
end
|
1122
1122
|
end
|
1123
1123
|
|
1124
|
-
|
1124
|
+
def element_error(vector, idx)
|
1125
1125
|
if !vector.is_a?(LLVM::Value)
|
1126
1126
|
"non-value: #{vector.inspect}"
|
1127
1127
|
elsif vector.type.kind != :vector
|
@@ -1131,7 +1131,7 @@ module LLVM
|
|
1131
1131
|
end
|
1132
1132
|
end
|
1133
1133
|
|
1134
|
-
|
1134
|
+
def value_error(aggregate, idx)
|
1135
1135
|
if !aggregate.is_a?(LLVM::Value)
|
1136
1136
|
"non-value: #{aggregate.inspect}"
|
1137
1137
|
# TODO: fix this
|
data/lib/llvm/core/type.rb
CHANGED
@@ -79,18 +79,47 @@ module LLVM
|
|
79
79
|
[:struct, :array].include?(kind)
|
80
80
|
end
|
81
81
|
|
82
|
+
def opaque_struct?
|
83
|
+
C.is_opaque_struct(self)
|
84
|
+
end
|
85
|
+
|
86
|
+
def packed_struct?
|
87
|
+
C.is_packed_struct(self)
|
88
|
+
end
|
89
|
+
|
90
|
+
def literal_struct?
|
91
|
+
C.is_literal_struct(self)
|
92
|
+
end
|
93
|
+
|
82
94
|
# Creates an array type of Type with the given size.
|
95
|
+
# arrays can be size >= 0, https://llvm.org/docs/LangRef.html#array-type
|
83
96
|
def self.array(ty, sz = 0)
|
97
|
+
sz = sz.to_i
|
98
|
+
raise ArgumentError, "LLVM Array size must be >= 0" if sz.negative?
|
99
|
+
|
84
100
|
from_ptr(C.array_type(LLVM::Type(ty), sz), :array)
|
85
101
|
end
|
86
102
|
|
87
103
|
# Creates the pointer type of Type with the given address space.
|
88
|
-
def self.pointer(ty, address_space = 0)
|
89
|
-
|
104
|
+
def self.pointer(ty = nil, address_space = 0)
|
105
|
+
if ty
|
106
|
+
from_ptr(C.pointer_type(LLVM::Type(ty), address_space), :pointer)
|
107
|
+
else
|
108
|
+
ptr(address_space)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
# opaque pointer
|
113
|
+
def self.ptr(address_space = 0)
|
114
|
+
from_ptr(C.pointer_type(void, address_space), :pointer)
|
90
115
|
end
|
91
116
|
|
92
117
|
# Creates a vector type of Type with the given element count.
|
118
|
+
# vectors can be size > 0, https://llvm.org/docs/LangRef.html#vector-type
|
93
119
|
def self.vector(ty, element_count)
|
120
|
+
element_count = element_count.to_i
|
121
|
+
raise ArgumentError, "LLVM Vector size must be > 0" unless element_count.positive?
|
122
|
+
|
94
123
|
from_ptr(C.vector_type(LLVM::Type(ty), element_count), :vector)
|
95
124
|
end
|
96
125
|
|
@@ -117,6 +146,14 @@ module LLVM
|
|
117
146
|
end
|
118
147
|
end
|
119
148
|
|
149
|
+
def self.opaque_struct(name)
|
150
|
+
from_ptr(C.struct_create_named(Context.global, name.to_s), :struct)
|
151
|
+
end
|
152
|
+
|
153
|
+
def self.named(name)
|
154
|
+
from_ptr(C.get_type_by_name2(Context.global, name.to_s), nil)
|
155
|
+
end
|
156
|
+
|
120
157
|
# Creates a void type.
|
121
158
|
def self.void
|
122
159
|
from_ptr(C.void_type, :void)
|
@@ -217,7 +254,7 @@ module LLVM
|
|
217
254
|
end
|
218
255
|
|
219
256
|
# Shortcut to Type.pointer.
|
220
|
-
def Pointer(ty)
|
257
|
+
def Pointer(ty = nil)
|
221
258
|
LLVM::Type.pointer(ty)
|
222
259
|
end
|
223
260
|
|
data/lib/llvm/core/value.rb
CHANGED
@@ -291,7 +291,7 @@ module LLVM
|
|
291
291
|
module Support
|
292
292
|
def allocate_pointers(size_or_values, &block)
|
293
293
|
if size_or_values.is_a?(Integer)
|
294
|
-
raise ArgumentError, 'block not given' unless
|
294
|
+
raise ArgumentError, 'block not given' unless block
|
295
295
|
size = size_or_values
|
296
296
|
values = (0...size).map { |i| yield i }
|
297
297
|
else
|
@@ -832,7 +832,7 @@ module LLVM
|
|
832
832
|
|
833
833
|
def attribute_name(attr_name)
|
834
834
|
attr_name = attr_name.to_s
|
835
|
-
if
|
835
|
+
if /_attribute$/.match?(attr_name)
|
836
836
|
attr_name.chomp('_attribute').tr('_', '')
|
837
837
|
else
|
838
838
|
attr_name
|
data/lib/llvm/core.rb
CHANGED
@@ -102,6 +102,38 @@ module LLVM
|
|
102
102
|
|
103
103
|
# LLVMValueRef LLVMGetAggregateElement(LLVMValueRef C, unsigned Idx);
|
104
104
|
attach_function :get_aggregate_element, :LLVMGetAggregateElement, [:pointer, :int], :pointer
|
105
|
+
|
106
|
+
attach_function :get_type_by_name2, :LLVMGetTypeByName2, [:pointer, :string], :pointer
|
107
|
+
|
108
|
+
# Determine whether a structure is packed.
|
109
|
+
#
|
110
|
+
# @see llvm::StructType::isPacked()
|
111
|
+
#
|
112
|
+
# @method is_packed_struct(struct_ty)
|
113
|
+
# @param [FFI::Pointer(TypeRef)] struct_ty
|
114
|
+
# @return [Bool]
|
115
|
+
# @scope class
|
116
|
+
attach_function :is_packed_struct, :LLVMIsPackedStruct, [:pointer], :bool
|
117
|
+
|
118
|
+
# Determine whether a structure is opaque.
|
119
|
+
#
|
120
|
+
# @see llvm::StructType::isOpaque()
|
121
|
+
#
|
122
|
+
# @method is_opaque_struct(struct_ty)
|
123
|
+
# @param [FFI::Pointer(TypeRef)] struct_ty
|
124
|
+
# @return [Bool]
|
125
|
+
# @scope class
|
126
|
+
attach_function :is_opaque_struct, :LLVMIsOpaqueStruct, [:pointer], :bool
|
127
|
+
|
128
|
+
# Determine whether a structure is literal.
|
129
|
+
#
|
130
|
+
# @see llvm::StructType::isLiteral()
|
131
|
+
#
|
132
|
+
# @method is_literal_struct(struct_ty)
|
133
|
+
# @param [FFI::Pointer(TypeRef)] struct_ty
|
134
|
+
# @return [Bool]
|
135
|
+
# @scope class
|
136
|
+
attach_function :is_literal_struct, :LLVMIsLiteralStruct, [:pointer], :bool
|
105
137
|
end
|
106
138
|
|
107
139
|
# Yields a pointer suitable for storing an LLVM output message.
|
data/lib/llvm/core_ffi.rb
CHANGED
@@ -1651,26 +1651,6 @@ module LLVM::C
|
|
1651
1651
|
# @scope class
|
1652
1652
|
attach_function :struct_get_type_at_index, :LLVMStructGetTypeAtIndex, [:pointer, :uint], :pointer
|
1653
1653
|
|
1654
|
-
# Determine whether a structure is packed.
|
1655
|
-
#
|
1656
|
-
# @see llvm::StructType::isPacked()
|
1657
|
-
#
|
1658
|
-
# @method is_packed_struct(struct_ty)
|
1659
|
-
# @param [FFI::Pointer(TypeRef)] struct_ty
|
1660
|
-
# @return [Integer]
|
1661
|
-
# @scope class
|
1662
|
-
attach_function :is_packed_struct, :LLVMIsPackedStruct, [:pointer], :int
|
1663
|
-
|
1664
|
-
# Determine whether a structure is opaque.
|
1665
|
-
#
|
1666
|
-
# @see llvm::StructType::isOpaque()
|
1667
|
-
#
|
1668
|
-
# @method is_opaque_struct(struct_ty)
|
1669
|
-
# @param [FFI::Pointer(TypeRef)] struct_ty
|
1670
|
-
# @return [Integer]
|
1671
|
-
# @scope class
|
1672
|
-
attach_function :is_opaque_struct, :LLVMIsOpaqueStruct, [:pointer], :int
|
1673
|
-
|
1674
1654
|
# Obtain the type of elements within a sequential type.
|
1675
1655
|
#
|
1676
1656
|
# This works on array, vector, and pointer types.
|
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: 15.0.
|
4
|
+
version: 15.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: 2023-01-31 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: ffi
|