ruby-llvm 3.2.0.beta.1 → 3.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +6 -3
- data/ext/ruby-llvm-support/Rakefile +80 -24
- data/ext/ruby-llvm-support/support.cpp +4 -3
- data/lib/llvm.rb +2 -2
- data/lib/llvm/analysis_ffi.rb +1 -1
- data/lib/llvm/config.rb +10 -0
- data/lib/llvm/core.rb +7 -5
- data/lib/llvm/core/bitcode_ffi.rb +1 -1
- data/lib/llvm/core/builder.rb +88 -6
- data/lib/llvm/core/module.rb +1 -0
- data/lib/llvm/core/type.rb +4 -4
- data/lib/llvm/core/value.rb +111 -25
- data/lib/llvm/core_ffi.rb +248 -1
- data/lib/llvm/execution_engine_ffi.rb +61 -1
- data/lib/llvm/linker.rb +0 -2
- data/lib/llvm/linker_ffi.rb +1 -1
- data/lib/llvm/support.rb +1 -1
- data/lib/llvm/target.rb +1 -1
- data/lib/llvm/target_ffi.rb +30 -25
- data/lib/llvm/transforms/builder.rb +102 -0
- data/lib/llvm/transforms/builder_ffi.rb +118 -0
- data/lib/llvm/transforms/ipo.rb +64 -4
- data/lib/llvm/transforms/ipo_ffi.rb +1 -1
- data/lib/llvm/transforms/scalar.rb +60 -20
- data/lib/llvm/transforms/scalar_ffi.rb +1 -1
- data/lib/llvm/transforms/vectorize.rb +5 -0
- data/lib/llvm/transforms/vectorize_ffi.rb +9 -1
- data/lib/llvm/version.rb +2 -21
- data/test/array_test.rb +1 -1
- data/test/basic_block_test.rb +1 -1
- data/test/binary_operations_test.rb +1 -1
- data/test/bitcode_test.rb +1 -1
- data/test/branch_test.rb +1 -1
- data/test/call_test.rb +1 -1
- data/test/comparisons_test.rb +1 -1
- data/test/conversions_test.rb +1 -1
- data/test/double_test.rb +1 -1
- data/test/equality_test.rb +4 -4
- data/test/function_test.rb +73 -0
- data/test/generic_value_test.rb +1 -1
- data/test/instruction_test.rb +1 -1
- data/test/ipo_test.rb +1 -1
- data/test/linker_test.rb +2 -2
- data/test/memory_access_test.rb +1 -1
- data/test/module_test.rb +6 -6
- data/test/parameter_collection_test.rb +1 -1
- data/test/pass_manager_builder_test.rb +33 -0
- data/test/phi_test.rb +1 -1
- data/test/select_test.rb +1 -1
- data/test/struct_test.rb +9 -1
- data/test/target_test.rb +19 -13
- data/test/test_helper.rb +2 -2
- data/test/type_test.rb +1 -1
- data/test/vector_test.rb +2 -2
- metadata +117 -85
- data/test/basic_test.rb +0 -11
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 6cddca1edd8ba250d7003d333aeba9c4fffffc9a
|
4
|
+
data.tar.gz: 480c115d38ecc429338f474e7bfcbdba846406e0
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f9bd7e960dc2b5cc1654254e14afb0dfa10d447a330dc0950035517a6f31adaa488fa1cd4aad1b6d87dc286d420ff477e2bdc0801994f03929240346c4534da8
|
7
|
+
data.tar.gz: 7851c1b08cd9df28d8d518bfe97f6f1b8b2629ee68f3eac1feea6799d24549d9db92adc2d05bfd2a2611ed98a7f758bd0b9c2313564bc2bbb63153e187a4db34
|
data/README.md
CHANGED
@@ -4,12 +4,12 @@ Ruby-LLVM
|
|
4
4
|
Ruby-LLVM is a Ruby language binding to the LLVM compiler infrastructure
|
5
5
|
library. LLVM allows users to create just-in-time (JIT) compilers, ahead-of-time
|
6
6
|
(AOT) compilers for multiple architectures, code analyzers and more. LLVM
|
7
|
-
bindings can also be used to speed up Ruby code by compiling
|
8
|
-
fly.
|
7
|
+
bindings can also be used to speed up Ruby code by compiling and loading
|
8
|
+
computationally intensive algorithms on the fly.
|
9
9
|
|
10
10
|
Requirements
|
11
11
|
------------
|
12
|
-
* LLVM 3.
|
12
|
+
* LLVM 3.3, including libLLVM-3.3 (compile LLVM with --enable-shared).
|
13
13
|
* In order to ensure the usability of JIT features (i.e. create_jit_compiler), compile LLVM with --enable-jit as well.
|
14
14
|
|
15
15
|
About version numbers
|
@@ -47,3 +47,6 @@ Ruby-LLVM is possible because of its contributors:
|
|
47
47
|
* Juan Wajnerman
|
48
48
|
* Steven Farlie
|
49
49
|
* Peter Zotov
|
50
|
+
* Austin Seipp
|
51
|
+
* Torsten Rüger
|
52
|
+
* Nathaniel Barnes
|
@@ -1,42 +1,98 @@
|
|
1
|
-
require 'rake/clean'
|
2
1
|
require 'rubygems'
|
2
|
+
require 'rake/clean'
|
3
3
|
require 'ffi'
|
4
4
|
|
5
|
-
|
6
|
-
|
5
|
+
require File.expand_path('../../lib/llvm/version', File.dirname(__FILE__))
|
6
|
+
include LLVM
|
7
|
+
|
8
|
+
def check_for(what, variants, env_var)
|
9
|
+
variants = [ ENV[env_var], *variants ] if ENV.include?(env_var)
|
7
10
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
11
|
+
$stdout.print("checking for #{what}... ")
|
12
|
+
$stdout.flush
|
13
|
+
|
14
|
+
result = variants.find do |variant|
|
15
|
+
if yield(variant)
|
16
|
+
$stdout.puts(variant)
|
17
|
+
true
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
if result
|
22
|
+
result
|
23
|
+
else
|
24
|
+
raise RuntimeError, "Cannot find #{what}: tried #{variants}"
|
25
|
+
end
|
13
26
|
end
|
14
27
|
|
15
|
-
def
|
16
|
-
|
28
|
+
def find_llvm_config
|
29
|
+
check_for('llvm-config',
|
30
|
+
%W(llvm-config-#{LLVM_VERSION} llvm-config),
|
31
|
+
'LLVM_CONFIG') do |llvm_config|
|
17
32
|
|
18
|
-
|
19
|
-
|
20
|
-
|
33
|
+
begin
|
34
|
+
actual_version = `#{llvm_config} --version`.strip
|
35
|
+
|
36
|
+
actual_version == LLVM_VERSION
|
37
|
+
rescue Errno::ENOENT
|
38
|
+
false
|
21
39
|
end
|
22
40
|
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def find_cxx
|
44
|
+
check_for('C++ compiler', %W(clang++ g++), 'CXX') do |cxx|
|
45
|
+
system(cxx, "--version", out: :close, err: :close)
|
46
|
+
$?.success?
|
47
|
+
end
|
48
|
+
end
|
23
49
|
|
24
|
-
|
50
|
+
LLVM_CONFIG = find_llvm_config
|
51
|
+
CXX = find_cxx
|
52
|
+
|
53
|
+
def invoke_llvm_config(options)
|
54
|
+
`#{LLVM_CONFIG} #{options}`.gsub("\n", " ")
|
25
55
|
end
|
26
56
|
|
27
|
-
|
57
|
+
SUPPORT_LIB = FFI.map_library_name("RubyLLVMSupport-#{LLVM_VERSION}")
|
58
|
+
CONFIG_MOD = File.expand_path('../../lib/llvm/config.rb', File.dirname(__FILE__))
|
28
59
|
|
29
|
-
|
30
|
-
SRC = "support.cpp"
|
31
|
-
OUTPUT = FFI.map_library_name("RubyLLVMSupport-#{LLVM_VERSION}")
|
60
|
+
CLEAN.include(SUPPORT_LIB, CONFIG_MOD)
|
32
61
|
|
33
|
-
|
62
|
+
desc "Build the shared library and config module"
|
63
|
+
task :default => [SUPPORT_LIB, CONFIG_MOD]
|
34
64
|
|
35
|
-
|
65
|
+
file SUPPORT_LIB => %w(support.cpp) do |task|
|
66
|
+
sh "#{CXX} -shared -lLLVM-#{LLVM_VERSION} #{task.prerequisites.join(' ')} " \
|
67
|
+
"#{invoke_llvm_config('--cxxflags --ldflags')} -o #{SUPPORT_LIB}"
|
68
|
+
end
|
36
69
|
|
37
|
-
|
38
|
-
|
70
|
+
LLVM_CONFIG_OPTS = [
|
71
|
+
['COMPONENTS', :array, '--components'],
|
72
|
+
['TARGETS_BUILT', :array, '--targets-built'],
|
73
|
+
['HOST_TARGET', :string, '--host-target'],
|
74
|
+
['BUILD_MODE', :string, '--build-mode'],
|
75
|
+
['CFLAGS', :string, '--cflags'],
|
76
|
+
]
|
39
77
|
|
40
|
-
file
|
41
|
-
|
78
|
+
file CONFIG_MOD do
|
79
|
+
open(CONFIG_MOD, 'w') do |f|
|
80
|
+
f.puts '# Generated by ruby-llvm. Please do not change this file by hand.'
|
81
|
+
f.puts 'module LLVM'
|
82
|
+
f.puts ' module CONFIG'
|
83
|
+
|
84
|
+
LLVM_CONFIG_OPTS.each do |(const, fmt, flag)|
|
85
|
+
case fmt
|
86
|
+
when :string
|
87
|
+
value = invoke_llvm_config(flag)
|
88
|
+
when :array
|
89
|
+
value = invoke_llvm_config(flag).split
|
90
|
+
end
|
91
|
+
|
92
|
+
f.puts " #{const} = #{value.inspect}"
|
93
|
+
end
|
94
|
+
|
95
|
+
f.puts ' end'
|
96
|
+
f.puts 'end'
|
97
|
+
end
|
42
98
|
end
|
@@ -3,8 +3,9 @@
|
|
3
3
|
*/
|
4
4
|
|
5
5
|
#include <llvm-c/Core.h>
|
6
|
-
#include <llvm/Type.h>
|
7
|
-
#include <llvm/
|
6
|
+
#include <llvm/IR/Type.h>
|
7
|
+
#include <llvm/IR/Module.h>
|
8
|
+
#include <llvm/IR/GlobalValue.h>
|
8
9
|
#include <llvm/Support/DynamicLibrary.h>
|
9
10
|
#include <llvm/Support/TargetSelect.h>
|
10
11
|
#include <llvm/Support/raw_ostream.h>
|
@@ -28,7 +29,7 @@ extern "C" {
|
|
28
29
|
unwrap<Type>(type)->dump();
|
29
30
|
}
|
30
31
|
|
31
|
-
|
32
|
+
void LLVMPrintModuleToFD(LLVMModuleRef module, int fd, LLVMBool shouldClose, LLVMBool unbuffered) {
|
32
33
|
raw_fd_ostream os(fd, shouldClose, unbuffered);
|
33
34
|
unwrap(module)->print(os, 0);
|
34
35
|
}
|
data/lib/llvm.rb
CHANGED
data/lib/llvm/analysis_ffi.rb
CHANGED
data/lib/llvm/config.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
# Generated by ruby-llvm. Please do not change this file by hand.
|
2
|
+
module LLVM
|
3
|
+
module CONFIG
|
4
|
+
COMPONENTS = ["aarch64", "aarch64asmparser", "aarch64asmprinter", "aarch64codegen", "aarch64desc", "aarch64disassembler", "aarch64info", "aarch64utils", "all", "all-targets", "analysis", "archive", "arm", "armasmparser", "armasmprinter", "armcodegen", "armdesc", "armdisassembler", "arminfo", "asmparser", "asmprinter", "bitreader", "bitwriter", "codegen", "core", "cppbackend", "cppbackendcodegen", "cppbackendinfo", "debuginfo", "engine", "executionengine", "hexagon", "hexagonasmprinter", "hexagoncodegen", "hexagondesc", "hexagoninfo", "instcombine", "instrumentation", "interpreter", "ipa", "ipo", "irreader", "jit", "linker", "mblaze", "mblazeasmparser", "mblazeasmprinter", "mblazecodegen", "mblazedesc", "mblazedisassembler", "mblazeinfo", "mc", "mcdisassembler", "mcjit", "mcparser", "mips", "mipsasmparser", "mipsasmprinter", "mipscodegen", "mipsdesc", "mipsdisassembler", "mipsinfo", "msp430", "msp430asmprinter", "msp430codegen", "msp430desc", "msp430info", "native", "nativecodegen", "nvptx", "nvptxasmprinter", "nvptxcodegen", "nvptxdesc", "nvptxinfo", "objcarcopts", "object", "option", "powerpc", "powerpcasmparser", "powerpcasmprinter", "powerpccodegen", "powerpcdesc", "powerpcinfo", "r600", "r600asmprinter", "r600codegen", "r600desc", "r600info", "runtimedyld", "scalaropts", "selectiondag", "sparc", "sparccodegen", "sparcdesc", "sparcinfo", "support", "systemz", "systemzasmparser", "systemzasmprinter", "systemzcodegen", "systemzdesc", "systemzinfo", "tablegen", "target", "transformutils", "vectorize", "x86", "x86asmparser", "x86asmprinter", "x86codegen", "x86desc", "x86disassembler", "x86info", "x86utils", "xcore", "xcoreasmprinter", "xcorecodegen", "xcoredesc", "xcoredisassembler", "xcoreinfo"]
|
5
|
+
TARGETS_BUILT = ["R600", "X86", "Sparc", "PowerPC", "AArch64", "ARM", "Mips", "XCore", "MSP430", "CppBackend", "MBlaze", "NVPTX", "Hexagon", "SystemZ"]
|
6
|
+
HOST_TARGET = "x86_64-pc-linux-gnu "
|
7
|
+
BUILD_MODE = "Release "
|
8
|
+
CFLAGS = "-I/usr/lib/llvm-3.3/include -DNDEBUG -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -g -O2 -fomit-frame-pointer -fPIC "
|
9
|
+
end
|
10
|
+
end
|
data/lib/llvm/core.rb
CHANGED
@@ -15,20 +15,22 @@ module LLVM
|
|
15
15
|
# @yield [FFI::MemoryPointer]
|
16
16
|
# @return [String, nil]
|
17
17
|
def self.with_message_output
|
18
|
-
|
18
|
+
message = nil
|
19
19
|
|
20
20
|
FFI::MemoryPointer.new(FFI.type_size(:pointer)) do |str|
|
21
|
-
yield str
|
21
|
+
result = yield str
|
22
22
|
|
23
23
|
msg_ptr = str.read_pointer
|
24
24
|
|
25
|
-
|
26
|
-
|
25
|
+
if result != 0
|
26
|
+
raise RuntimeError, "Error is signalled, but msg_ptr is null" if msg_ptr.null?
|
27
|
+
|
28
|
+
message = msg_ptr.read_string
|
27
29
|
C.dispose_message msg_ptr
|
28
30
|
end
|
29
31
|
end
|
30
32
|
|
31
|
-
|
33
|
+
message
|
32
34
|
end
|
33
35
|
|
34
36
|
# Same as #with_message_output, but raises a RuntimeError with the
|
data/lib/llvm/core/builder.rb
CHANGED
@@ -79,7 +79,7 @@ module LLVM
|
|
79
79
|
end
|
80
80
|
|
81
81
|
# Unconditional branching (i.e. goto)
|
82
|
-
# @param
|
82
|
+
# @param [LLVM::BasicBlock] block Where to jump
|
83
83
|
# @return [LLVM::Instruction]
|
84
84
|
# @LLVMinst br
|
85
85
|
def br(block)
|
@@ -88,10 +88,20 @@ module LLVM
|
|
88
88
|
C.build_br(self, block))
|
89
89
|
end
|
90
90
|
|
91
|
+
# Indirect branching (i.e. computed goto)
|
92
|
+
# @param [LLVM::BasicBlock] addr Where to jump
|
93
|
+
# @param [Integer] num_dests Number of possible destinations to be added
|
94
|
+
# @return [LLVM::Instruction]
|
95
|
+
# @LLVMinst indirectbr
|
96
|
+
def ibr(addr, num_dests)
|
97
|
+
IndirectBr.from_ptr(
|
98
|
+
C.build_indirect_br(self, addr, num_dests))
|
99
|
+
end
|
100
|
+
|
91
101
|
# Conditional branching (i.e. if)
|
92
|
-
# @param
|
93
|
-
# @param
|
94
|
-
# @param
|
102
|
+
# @param [LLVM::Value] cond The condition
|
103
|
+
# @param [LLVM::BasicBlock] iftrue Where to jump if condition is true
|
104
|
+
# @param [LLVM::BasicBlock] iffalse Where to jump if condition is false
|
95
105
|
# @return [LLVM::Instruction]
|
96
106
|
# @LLVMinst br
|
97
107
|
def cond(cond, iftrue, iffalse)
|
@@ -136,7 +146,7 @@ module LLVM
|
|
136
146
|
# Builds an unwind Instruction.
|
137
147
|
# @LLVMinst unwind
|
138
148
|
def unwind
|
139
|
-
Instruction.from_ptr(C.
|
149
|
+
Instruction.from_ptr(C.build_unwind(self))
|
140
150
|
end
|
141
151
|
|
142
152
|
# Generates an instruction with no defined semantics. Can be used to
|
@@ -147,6 +157,7 @@ module LLVM
|
|
147
157
|
Instruction.from_ptr(C.build_unreachable(self))
|
148
158
|
end
|
149
159
|
|
160
|
+
# Integer addition.
|
150
161
|
# @param [LLVM::Value] lhs Integer or vector of integers
|
151
162
|
# @param [LLVM::Value] rhs Integer or vector of integers
|
152
163
|
# @param [String] name Name of the result in LLVM IR
|
@@ -156,7 +167,7 @@ module LLVM
|
|
156
167
|
Instruction.from_ptr(C.build_add(self, lhs, rhs, name))
|
157
168
|
end
|
158
169
|
|
159
|
-
# No signed wrap addition.
|
170
|
+
# "No signed wrap" integer addition.
|
160
171
|
# @param [LLVM::Value] lhs Integer or vector of integers
|
161
172
|
# @param [LLVM::Value] rhs Integer or vector of integers
|
162
173
|
# @param [String] name Name of the result in LLVM IR
|
@@ -166,6 +177,16 @@ module LLVM
|
|
166
177
|
Instruction.from_ptr(C.build_nsw_add(self, lhs, rhs, name))
|
167
178
|
end
|
168
179
|
|
180
|
+
# "No unsigned wrap" integer addition.
|
181
|
+
# @param [LLVM::Value] lhs Integer or vector of integers
|
182
|
+
# @param [LLVM::Value] rhs Integer or vector of integers
|
183
|
+
# @param [String] name Name of the result in LLVM IR
|
184
|
+
# @return [LLVM::Instruction] The integer sum of the two operands
|
185
|
+
# @LLVMinst add
|
186
|
+
def nuw_add(lhs, rhs, name = "")
|
187
|
+
Instruction.from_ptr(C.build_nuw_add(self, lhs, rhs, name))
|
188
|
+
end
|
189
|
+
|
169
190
|
# @param [LLVM::Value] lhs Floating point or vector of floating points
|
170
191
|
# @param [LLVM::Value] rhs Floating point or vector of floating points
|
171
192
|
# @param [String] name Name of the result in LLVM IR
|
@@ -175,6 +196,7 @@ module LLVM
|
|
175
196
|
Instruction.from_ptr(C.build_f_add(self, lhs, rhs, name))
|
176
197
|
end
|
177
198
|
|
199
|
+
# Integer subtraction.
|
178
200
|
# @param [LLVM::Value] lhs Integer or vector of integers
|
179
201
|
# @param [LLVM::Value] rhs Integer or vector of integers
|
180
202
|
# @param [String] name Name of the result in LLVM IR
|
@@ -184,6 +206,26 @@ module LLVM
|
|
184
206
|
Instruction.from_ptr(C.build_sub(self, lhs, rhs, name))
|
185
207
|
end
|
186
208
|
|
209
|
+
# No signed wrap integer subtraction.
|
210
|
+
# @param [LLVM::Value] lhs Integer or vector of integers
|
211
|
+
# @param [LLVM::Value] rhs Integer or vector of integers
|
212
|
+
# @param [String] name Name of the result in LLVM IR
|
213
|
+
# @return [LLVM::Instruction] The integer difference of the two operands
|
214
|
+
# @LLVMinst sub
|
215
|
+
def nsw_sub(lhs, rhs, name = "")
|
216
|
+
Instruction.from_ptr(C.build_nsw_sub(self, lhs, rhs, name))
|
217
|
+
end
|
218
|
+
|
219
|
+
# No unsigned wrap integer subtraction.
|
220
|
+
# @param [LLVM::Value] lhs Integer or vector of integers
|
221
|
+
# @param [LLVM::Value] rhs Integer or vector of integers
|
222
|
+
# @param [String] name Name of the result in LLVM IR
|
223
|
+
# @return [LLVM::Instruction] The integer difference of the two operands
|
224
|
+
# @LLVMinst sub
|
225
|
+
def nuw_sub(lhs, rhs, name = "")
|
226
|
+
Instruction.from_ptr(C.build_nuw_sub(self, lhs, rhs, name))
|
227
|
+
end
|
228
|
+
|
187
229
|
# @param [LLVM::Value] lhs Floating point or vector of floating points
|
188
230
|
# @param [LLVM::Value] rhs Floating point or vector of floating points
|
189
231
|
# @param [String] name Name of the result in LLVM IR
|
@@ -194,6 +236,7 @@ module LLVM
|
|
194
236
|
Instruction.from_ptr(C.build_f_sub(self, lhs, rhs, name))
|
195
237
|
end
|
196
238
|
|
239
|
+
# Integer multiplication.
|
197
240
|
# @param [LLVM::Value] lhs Integer or vector of integers
|
198
241
|
# @param [LLVM::Value] rhs Integer or vector of integers
|
199
242
|
# @param [String] name Name of the result in LLVM IR
|
@@ -203,6 +246,27 @@ module LLVM
|
|
203
246
|
Instruction.from_ptr(C.build_mul(self, lhs, rhs, name))
|
204
247
|
end
|
205
248
|
|
249
|
+
# "No signed wrap" integer multiplication.
|
250
|
+
# @param [LLVM::Value] lhs Integer or vector of integers
|
251
|
+
# @param [LLVM::Value] rhs Integer or vector of integers
|
252
|
+
# @param [String] name Name of the result in LLVM IR
|
253
|
+
# @return [LLVM::Instruction] The integer product of the two operands
|
254
|
+
# @LLVMinst mul
|
255
|
+
def nsw_mul(lhs, rhs, name = "")
|
256
|
+
Instruction.from_ptr(C.build_nsw_mul(self, lhs, rhs, name))
|
257
|
+
end
|
258
|
+
|
259
|
+
# "No unsigned wrap" integer multiplication.
|
260
|
+
# @param [LLVM::Value] lhs Integer or vector of integers
|
261
|
+
# @param [LLVM::Value] rhs Integer or vector of integers
|
262
|
+
# @param [String] name Name of the result in LLVM IR
|
263
|
+
# @return [LLVM::Instruction] The integer product of the two operands
|
264
|
+
# @LLVMinst mul
|
265
|
+
def nuw_mul(lhs, rhs, name = "")
|
266
|
+
Instruction.from_ptr(C.build_nuw_mul(self, lhs, rhs, name))
|
267
|
+
end
|
268
|
+
|
269
|
+
# Floating point multiplication
|
206
270
|
# @param [LLVM::Value] lhs Floating point or vector of floating points
|
207
271
|
# @param [LLVM::Value] rhs Floating point or vector of floating points
|
208
272
|
# @param [String] name Name of the result in LLVM IR
|
@@ -348,6 +412,24 @@ module LLVM
|
|
348
412
|
Instruction.from_ptr(C.build_neg(self, arg, name))
|
349
413
|
end
|
350
414
|
|
415
|
+
# "No signed wrap" integer negation.
|
416
|
+
# @param [LLVM::Value] arg Integer or vector of integers
|
417
|
+
# @param [String] name Name of the result in LLVM IR
|
418
|
+
# @return [LLVM::Instruction] The negated operand
|
419
|
+
# @LLVMinst sub
|
420
|
+
def nsw_neg(arg, name = "")
|
421
|
+
Instruction.from_ptr(C.build_nsw_neg(self, arg, name))
|
422
|
+
end
|
423
|
+
|
424
|
+
# "No unsigned wrap" integer negation.
|
425
|
+
# @param [LLVM::Value] arg Integer or vector of integers
|
426
|
+
# @param [String] name Name of the result in LLVM IR
|
427
|
+
# @return [LLVM::Instruction] The negated operand
|
428
|
+
# @LLVMinst sub
|
429
|
+
def nuw_neg(arg, name = "")
|
430
|
+
Instruction.from_ptr(C.build_nuw_neg(self, arg, name))
|
431
|
+
end
|
432
|
+
|
351
433
|
# Boolean negation.
|
352
434
|
# @param [LLVM::Value] arg Integer or vector of integers
|
353
435
|
# @param [String] name The name of the result in LLVM IR
|
data/lib/llvm/core/module.rb
CHANGED
data/lib/llvm/core/type.rb
CHANGED
@@ -125,14 +125,14 @@ module LLVM
|
|
125
125
|
size = C.count_param_types(self)
|
126
126
|
result = nil
|
127
127
|
FFI::MemoryPointer.new(FFI.type_size(:pointer) * size) do |types_ptr|
|
128
|
-
|
129
|
-
|
128
|
+
C.get_param_types(self, types_ptr)
|
129
|
+
result = types_ptr.read_array_of_pointer(size)
|
130
130
|
end
|
131
|
-
result.map{ |p| Type.from_ptr(p) }
|
131
|
+
result.map{ |p| Type.from_ptr(p, nil) }
|
132
132
|
end
|
133
133
|
|
134
134
|
def vararg?
|
135
|
-
C.
|
135
|
+
C.is_function_var_arg(self) != 0
|
136
136
|
end
|
137
137
|
end
|
138
138
|
|