ruby-llvm 2.9.1 → 2.9.3
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.
- data/README.rdoc +3 -2
- data/ext/ruby-llvm-support/Rakefile +18 -0
- data/ext/ruby-llvm-support/support.cpp +12 -0
- data/lib/llvm/analysis.rb +22 -3
- data/lib/llvm/core/bitcode.rb +88 -0
- data/lib/llvm/core/builder.rb +401 -81
- data/lib/llvm/core/context.rb +5 -13
- data/lib/llvm/core/module.rb +6 -11
- data/lib/llvm/core/pass_manager.rb +27 -13
- data/lib/llvm/core/type.rb +29 -18
- data/lib/llvm/core/value.rb +32 -24
- data/lib/llvm/core.rb +1 -0
- data/lib/llvm/execution_engine.rb +45 -40
- data/lib/llvm/support.rb +22 -0
- data/lib/llvm/transforms/ipo.rb +6 -0
- data/lib/llvm/version.rb +4 -0
- data/lib/llvm.rb +3 -9
- data/test/array_test.rb +38 -0
- data/test/basic_block_test.rb +88 -0
- data/test/basic_test.rb +11 -0
- data/test/binary_operations_test.rb +58 -0
- data/test/bitcode_test.rb +25 -0
- data/test/branch_test.rb +57 -0
- data/test/call_test.rb +82 -0
- data/test/comparisons_test.rb +66 -0
- data/test/conversions_test.rb +86 -0
- data/test/double_test.rb +33 -0
- data/test/equality_test.rb +91 -0
- data/test/generic_value_test.rb +22 -0
- data/test/instruction_test.rb +32 -0
- data/test/ipo_test.rb +53 -0
- data/test/memory_access_test.rb +38 -0
- data/test/module_test.rb +21 -0
- data/test/parameter_collection_test.rb +28 -0
- data/test/phi_test.rb +33 -0
- data/test/select_test.rb +22 -0
- data/test/struct_test.rb +75 -0
- data/test/test_helper.rb +50 -0
- data/test/type_test.rb +15 -0
- data/test/vector_test.rb +64 -0
- metadata +116 -39
data/README.rdoc
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
= LLVM
|
2
2
|
|
3
3
|
Author:: Jeremy Voorhis
|
4
|
-
Contributors:: Evan Phoenix, David Holroyd, Takanori Ishikawa, Ronaldo M. Ferraz, Mac Malone
|
4
|
+
Contributors:: Evan Phoenix, David Holroyd, Takanori Ishikawa, Ronaldo M. Ferraz, Mac Malone, Chris Wailes, Ary Borenszweig
|
5
5
|
Copyright:: Copyright (c) 2010-2011 Jeremy Voorhis
|
6
6
|
License:: BSD 3-clause (see LICENSE)
|
7
7
|
|
@@ -13,7 +13,8 @@ implementations.
|
|
13
13
|
ruby-llvm has been tested on Mac OS X 10.6 using the following Ruby interpreters:
|
14
14
|
|
15
15
|
* MRI 1.8.7-p174
|
16
|
-
* MRI 1.9.2-
|
16
|
+
* MRI 1.9.2-p290
|
17
|
+
* MRI 1.9.3-preview1
|
17
18
|
* JRuby 1.4.0
|
18
19
|
|
19
20
|
If using MRI, ffi >= 1.0.7 is recommended (only ffi >= 1.0.0 is required).
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'rake/clean'
|
2
|
+
require 'ffi'
|
3
|
+
|
4
|
+
CC = "g++"
|
5
|
+
LLVM_CONFIG = `llvm-config --cxxflags --ldflags --libs all`.gsub("\n"," ")
|
6
|
+
OUTPUT = FFI.map_library_name "RubyLLVMSupport-2.9.2"
|
7
|
+
OUTPUT_DIR = "../../lib"
|
8
|
+
SRC = "support.cpp"
|
9
|
+
CLOBBER.include(OUTPUT)
|
10
|
+
|
11
|
+
task :default => [:build]
|
12
|
+
|
13
|
+
desc "Build the shared library"
|
14
|
+
task :build => [OUTPUT]
|
15
|
+
|
16
|
+
file OUTPUT => [SRC] do
|
17
|
+
sh "#{CC} -shared #{SRC} #{LLVM_CONFIG} -o #{OUTPUT_DIR}/#{OUTPUT}"
|
18
|
+
end
|
data/lib/llvm/analysis.rb
CHANGED
@@ -16,10 +16,15 @@ module LLVM
|
|
16
16
|
end
|
17
17
|
|
18
18
|
class Module
|
19
|
+
# Verify that the module is valid.
|
20
|
+
# @return [nil, String] human-readable description of any invalid
|
21
|
+
# constructs if invalid.
|
19
22
|
def verify
|
20
23
|
do_verification(:return_status)
|
21
24
|
end
|
22
25
|
|
26
|
+
# Verify that a module is valid, and abort the process if not.
|
27
|
+
# @return [nil]
|
23
28
|
def verify!
|
24
29
|
do_verification(:abort_process)
|
25
30
|
end
|
@@ -29,14 +34,28 @@ module LLVM
|
|
29
34
|
str = FFI::MemoryPointer.new(FFI.type_size(:pointer))
|
30
35
|
status = C.LLVMVerifyModule(self, action, str)
|
31
36
|
case status
|
32
|
-
|
33
|
-
|
37
|
+
when 1 then str.read_string
|
38
|
+
else nil
|
34
39
|
end
|
35
40
|
end
|
36
41
|
end
|
37
42
|
|
38
43
|
class Function
|
39
|
-
|
44
|
+
# Verify that a function is valid.
|
45
|
+
# @return [true, false]
|
46
|
+
def verify
|
47
|
+
do_verification(:return_status)
|
48
|
+
end
|
49
|
+
|
50
|
+
# Verify that a function is valid, and abort the process if not.
|
51
|
+
# @return [true, false]
|
52
|
+
def verify!
|
53
|
+
do_verification(:abort_process)
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
def do_verification(action)
|
40
59
|
C.LLVMVerifyFunction(self, action) != 0
|
41
60
|
end
|
42
61
|
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
module LLVM
|
2
|
+
# @private
|
3
|
+
module C
|
4
|
+
attach_function :LLVMParseBitcode, [:pointer, :buffer_out, :buffer_out], :int
|
5
|
+
attach_function :LLVMParseBitcodeInContext, [:pointer, :pointer, :buffer_out, :buffer_out], :int
|
6
|
+
attach_function :LLVMWriteBitcodeToFile, [:pointer, :string], :int
|
7
|
+
attach_function :LLVMWriteBitcodeToFD, [:pointer, :int, :int, :int], :int
|
8
|
+
end
|
9
|
+
|
10
|
+
class Module
|
11
|
+
# Parse a module from a memory buffer
|
12
|
+
# @param [String, LLVM::MemoryBuffer] path_or_memory_buffer
|
13
|
+
# @return [LLVM::Module]
|
14
|
+
def self.parse_bitcode(path_or_memory_buffer)
|
15
|
+
memory_buffer = case path_or_memory_buffer
|
16
|
+
when MemoryBuffer then path_or_memory_buffer
|
17
|
+
else MemoryBuffer.from_file(path_or_memory_buffer)
|
18
|
+
end
|
19
|
+
FFI::MemoryPointer.new(:pointer) do |mod_ref|
|
20
|
+
FFI::MemoryPointer.new(:pointer) do |msg_ref|
|
21
|
+
status = C.LLVMParseBitcode(memory_buffer, mod_ref, msg_ref)
|
22
|
+
raise msg_ref.get_pointer(0).get_string(0) if status != 0
|
23
|
+
return from_ptr(mod_ref.get_pointer(0))
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# Write bitcode to the given path, IO object or file descriptor
|
29
|
+
# @param [String, IO, Integer] path_or_io Pathname, IO object or file descriptor
|
30
|
+
# @return [true, false] Success
|
31
|
+
def write_bitcode(path_or_io)
|
32
|
+
status = if path_or_io.respond_to?(:path)
|
33
|
+
C.LLVMWriteBitcodeToFile(self, path_or_io.path)
|
34
|
+
elsif path_or_io.respond_to?(:fileno)
|
35
|
+
C.LLVMWriteBitcodeToFD(self, path_or_io.fileno, 0, 1)
|
36
|
+
elsif path_or_io.kind_of?(Integer)
|
37
|
+
C.LLVMWriteBitcodeToFD(self, path_or_io, 0, 1)
|
38
|
+
else
|
39
|
+
C.LLVMWriteBitcodeToFile(self, path_or_io.to_str)
|
40
|
+
end
|
41
|
+
return status == 0
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# @private
|
46
|
+
class MemoryBuffer
|
47
|
+
private_class_method :new
|
48
|
+
|
49
|
+
# @private
|
50
|
+
def initialize(ptr)
|
51
|
+
@ptr = ptr
|
52
|
+
end
|
53
|
+
|
54
|
+
# @private
|
55
|
+
def to_ptr
|
56
|
+
@ptr
|
57
|
+
end
|
58
|
+
|
59
|
+
# Read the contents of a file into a memory buffer
|
60
|
+
# @param [String] path
|
61
|
+
# @return [LLVM::MemoryBuffer]
|
62
|
+
def self.from_file(path)
|
63
|
+
FFI::MemoryPointer.new(:pointer) do |buf_ref|
|
64
|
+
FFI::MemoryPointer.new(:pointer) do |msg_ref|
|
65
|
+
status = C.LLVMCreateMemoryBufferWithContentsOfFile(path.to_str, buf_ref, msg_ref)
|
66
|
+
raise msg_ref.get_pointer(0).get_string(0) if status != 0
|
67
|
+
return new(buf_ref.get_pointer(0))
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
# Read STDIN into a memory buffer
|
73
|
+
# @return [LLVM::MemoryBuffer]
|
74
|
+
def self.from_stdin
|
75
|
+
FFI::Buffer.new(:pointer) do |buf_ref|
|
76
|
+
FFI::Buffer.new(:pointer) do |msg_ref|
|
77
|
+
status = C.LLVMCreateMemoryBufferWithSTDIN(buf_ref, msg_ref)
|
78
|
+
raise msg_ref.get_pointer(0).get_string(0) if status != 0
|
79
|
+
return new(buf_ref.get_pointer(0))
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def dispose
|
85
|
+
C.LLVMDisposeMemoryBuffer(@ptr)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|