ruby-llvm 2.9.3 → 3.0.0.beta
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +1 -1
- data/ext/ruby-llvm-support/Rakefile +1 -1
- data/ext/ruby-llvm-support/support.cpp +1 -0
- data/lib/llvm.rb +1 -1
- data/lib/llvm/core.rb +33 -18
- data/lib/llvm/core/builder.rb +0 -7
- data/lib/llvm/core/context.rb +2 -2
- data/lib/llvm/core/module.rb +1 -6
- data/lib/llvm/core/type.rb +19 -12
- data/lib/llvm/execution_engine.rb +3 -0
- data/lib/llvm/support.rb +1 -1
- data/lib/llvm/version.rb +2 -2
- data/test/equality_test.rb +2 -2
- data/test/struct_test.rb +6 -0
- metadata +14 -14
data/README.rdoc
CHANGED
@@ -20,7 +20,7 @@ ruby-llvm has been tested on Mac OS X 10.6 using the following Ruby interpreters
|
|
20
20
|
If using MRI, ffi >= 1.0.7 is recommended (only ffi >= 1.0.0 is required).
|
21
21
|
|
22
22
|
== Requirements
|
23
|
-
* LLVM
|
23
|
+
* LLVM 3.0, including libLLVM-3.0 (compile LLVM with --enable-shared).
|
24
24
|
* In order to ensure the usability of JIT features (i.e. create_jit_compiler), compile LLVM with --enable-jit as well.
|
25
25
|
|
26
26
|
== About version numbers
|
@@ -3,7 +3,7 @@ require 'ffi'
|
|
3
3
|
|
4
4
|
CC = "g++"
|
5
5
|
LLVM_CONFIG = `llvm-config --cxxflags --ldflags --libs all`.gsub("\n"," ")
|
6
|
-
OUTPUT = FFI.map_library_name "RubyLLVMSupport-
|
6
|
+
OUTPUT = FFI.map_library_name "RubyLLVMSupport-3.0.0"
|
7
7
|
OUTPUT_DIR = "../../lib"
|
8
8
|
SRC = "support.cpp"
|
9
9
|
CLOBBER.include(OUTPUT)
|
data/lib/llvm.rb
CHANGED
data/lib/llvm/core.rb
CHANGED
@@ -20,10 +20,16 @@ module LLVM
|
|
20
20
|
:optimize_for_size, 1 << 13,
|
21
21
|
:stack_protect, 1 << 14,
|
22
22
|
:stack_protect_req, 1 << 15,
|
23
|
+
:alignment, 31 << 16,
|
23
24
|
:no_capture, 1 << 21,
|
24
25
|
:no_red_zone, 1 << 22,
|
25
26
|
:no_implicit_float, 1 << 23,
|
26
|
-
:naked, 1 << 24
|
27
|
+
:naked, 1 << 24,
|
28
|
+
:inline_hint, 1 << 25,
|
29
|
+
:stack_alignment, 7 << 26,
|
30
|
+
:returns_twice, 1 << 29,
|
31
|
+
:uw_table, 1 << 30,
|
32
|
+
:non_lazy_bind, 1 << 31
|
27
33
|
]
|
28
34
|
|
29
35
|
enum :opcode, [
|
@@ -33,7 +39,7 @@ module LLVM
|
|
33
39
|
:switch, 3,
|
34
40
|
:indirectbr, 4,
|
35
41
|
:invoke, 5,
|
36
|
-
|
42
|
+
# removed 6 due to API changes
|
37
43
|
:unreachable, 7,
|
38
44
|
|
39
45
|
# Standard Binary Operators
|
@@ -84,15 +90,24 @@ module LLVM
|
|
84
90
|
:phi, 44,
|
85
91
|
:call, 45,
|
86
92
|
:select, 46,
|
87
|
-
|
88
|
-
|
89
|
-
# UserOp2
|
93
|
+
:user_op_1, 47,
|
94
|
+
:user_op_2, 48,
|
90
95
|
:vaarg, 49,
|
91
96
|
:extractelement, 50,
|
92
97
|
:insertelement, 51,
|
93
98
|
:shufflevector, 52,
|
94
99
|
:extractvalue, 53,
|
95
100
|
:insertvalue, 54,
|
101
|
+
|
102
|
+
# Atomic Operators
|
103
|
+
:fence, 55,
|
104
|
+
:atomic_cmp_xchg, 56,
|
105
|
+
:atomic_rmw, 57,
|
106
|
+
|
107
|
+
# Exception Handling Operators
|
108
|
+
:resume, 58,
|
109
|
+
:landing_pad, 59,
|
110
|
+
:unwind, 60
|
96
111
|
]
|
97
112
|
|
98
113
|
enum :type_kind, [
|
@@ -108,9 +123,9 @@ module LLVM
|
|
108
123
|
:struct,
|
109
124
|
:array,
|
110
125
|
:pointer,
|
111
|
-
:opaque,
|
112
126
|
:vector,
|
113
|
-
:metadata
|
127
|
+
:metadata,
|
128
|
+
:x86_mmx
|
114
129
|
]
|
115
130
|
|
116
131
|
enum :linkage, [
|
@@ -177,6 +192,11 @@ module LLVM
|
|
177
192
|
:true
|
178
193
|
]
|
179
194
|
|
195
|
+
enum :landing_pad_clause_type, [
|
196
|
+
:catch,
|
197
|
+
:filter
|
198
|
+
]
|
199
|
+
|
180
200
|
# Error handling
|
181
201
|
attach_function :LLVMDisposeMessage, [:pointer], :void
|
182
202
|
|
@@ -193,13 +213,12 @@ module LLVM
|
|
193
213
|
attach_function :LLVMSetDataLayout, [:pointer, :string], :void
|
194
214
|
attach_function :LLVMGetTarget, [:pointer], :string
|
195
215
|
attach_function :LLVMSetTarget, [:pointer, :string], :void
|
196
|
-
attach_function :LLVMAddTypeName, [:pointer, :string, :pointer], :int
|
197
|
-
attach_function :LLVMDeleteTypeName, [:pointer, :string], :void
|
198
216
|
attach_function :LLVMGetTypeByName, [:pointer, :string], :pointer
|
199
217
|
attach_function :LLVMDumpModule, [:pointer], :void
|
200
218
|
|
201
219
|
# Types
|
202
220
|
attach_function :LLVMGetTypeKind, [:pointer], :type_kind
|
221
|
+
attach_function :LLVMTypeIsSized, [:pointer], :int
|
203
222
|
attach_function :LLVMGetTypeContext, [:pointer], :pointer
|
204
223
|
|
205
224
|
# Integer types
|
@@ -241,9 +260,14 @@ module LLVM
|
|
241
260
|
# Struct types
|
242
261
|
attach_function :LLVMStructTypeInContext, [:pointer, :pointer, :uint, :int], :pointer
|
243
262
|
attach_function :LLVMStructType, [:pointer, :uint, :int], :pointer
|
263
|
+
attach_function :LLVMStructCreateNamed, [:pointer, :string], :pointer
|
264
|
+
attach_function :LLVMGetStructName, [:pointer], :string
|
265
|
+
attach_function :LLVMStructSetBody, [:pointer, :pointer, :uint, :int], :void
|
244
266
|
attach_function :LLVMCountStructElementTypes, [:pointer], :uint
|
245
267
|
attach_function :LLVMGetStructElementTypes, [:pointer, :pointer], :void
|
246
268
|
attach_function :LLVMIsPackedStruct, [:pointer], :int
|
269
|
+
attach_function :LLVMIsOpaqueStruct, [:pointer], :int
|
270
|
+
attach_function :LLVMGetTypeByName, [:pointer, :string], :pointer
|
247
271
|
|
248
272
|
# Array, pointer and vector types (sequence types)
|
249
273
|
attach_function :LLVMArrayType, [:pointer, :uint], :pointer
|
@@ -258,17 +282,9 @@ module LLVM
|
|
258
282
|
# All other types
|
259
283
|
attach_function :LLVMVoidTypeInContext, [:pointer], :pointer
|
260
284
|
attach_function :LLVMLabelTypeInContext, [:pointer], :pointer
|
261
|
-
attach_function :LLVMOpaqueTypeInContext, [:pointer], :pointer
|
262
285
|
|
263
286
|
attach_function :LLVMVoidType, [], :pointer
|
264
287
|
attach_function :LLVMLabelType, [], :pointer
|
265
|
-
attach_function :LLVMOpaqueType, [], :pointer
|
266
|
-
|
267
|
-
# Type handles
|
268
|
-
attach_function :LLVMCreateTypeHandle, [:pointer], :pointer
|
269
|
-
attach_function :LLVMRefineType, [:pointer, :pointer], :void
|
270
|
-
attach_function :LLVMResolveTypeHandle, [:pointer], :pointer
|
271
|
-
attach_function :LLVMDisposeTypeHandle, [:pointer], :void
|
272
288
|
|
273
289
|
# All values
|
274
290
|
attach_function :LLVMTypeOf, [:pointer], :pointer
|
@@ -485,7 +501,6 @@ module LLVM
|
|
485
501
|
attach_function :LLVMBuildCondBr, [:pointer, :pointer, :pointer, :pointer], :pointer
|
486
502
|
attach_function :LLVMBuildSwitch, [:pointer, :pointer, :pointer, :uint], :pointer
|
487
503
|
attach_function :LLVMBuildInvoke, [:pointer, :pointer, :pointer, :uint, :pointer, :pointer, :string], :pointer
|
488
|
-
attach_function :LLVMBuildUnwind, [:pointer], :pointer
|
489
504
|
attach_function :LLVMBuildUnreachable, [:pointer], :pointer
|
490
505
|
|
491
506
|
# Switch instruction
|
data/lib/llvm/core/builder.rb
CHANGED
@@ -117,13 +117,6 @@ module LLVM
|
|
117
117
|
fun, args, args.size, normal, exception, name))
|
118
118
|
end
|
119
119
|
|
120
|
-
# Builds an unwind Instruction.
|
121
|
-
# @return [LLVM::Instruction]
|
122
|
-
# @LLVMinst unwind
|
123
|
-
def unwind
|
124
|
-
Instruction.from_ptr(C.LLVMBuildUnwind(self))
|
125
|
-
end
|
126
|
-
|
127
120
|
# Generates an instruction with no defined semantics. Can be used to
|
128
121
|
# provide hints to the optimizer.
|
129
122
|
# @return [LLVM::Instruction]
|
data/lib/llvm/core/context.rb
CHANGED
data/lib/llvm/core/module.rb
CHANGED
@@ -42,11 +42,6 @@ module LLVM
|
|
42
42
|
@module = mod
|
43
43
|
end
|
44
44
|
|
45
|
-
# Adds the given Type to the collection with the given name (symbol or string).
|
46
|
-
def add(name, type)
|
47
|
-
C.LLVMAddTypeName(@module, name.to_s, type)
|
48
|
-
end
|
49
|
-
|
50
45
|
# Returns the Type with the given name (symbol or string).
|
51
46
|
def named(name)
|
52
47
|
Type.from_ptr(C.LLVMGetTypeByName(@module, name.to_s))
|
@@ -149,7 +144,7 @@ module LLVM
|
|
149
144
|
|
150
145
|
# Adds a Function with the given name (symbol or string) and args (Types).
|
151
146
|
def add(name, *args)
|
152
|
-
if args.first.kind_of?
|
147
|
+
if args.first.kind_of? FunctionType
|
153
148
|
type = args.first
|
154
149
|
else
|
155
150
|
type = Type.function(*args)
|
data/lib/llvm/core/type.rb
CHANGED
@@ -57,6 +57,11 @@ module LLVM
|
|
57
57
|
Type.pointer(self, address_space)
|
58
58
|
end
|
59
59
|
|
60
|
+
# Returns the name of the struct type.
|
61
|
+
def name
|
62
|
+
C.LLVMGetStructName(self)
|
63
|
+
end
|
64
|
+
|
60
65
|
# @private
|
61
66
|
def self.from_ptr(ptr)
|
62
67
|
return if ptr.null?
|
@@ -90,11 +95,17 @@ module LLVM
|
|
90
95
|
end
|
91
96
|
|
92
97
|
# Creates a struct type with the given array of element types.
|
93
|
-
def self.struct(elt_types, is_packed)
|
98
|
+
def self.struct(elt_types, is_packed, name = nil)
|
94
99
|
elt_types.map! { |ty| LLVM::Type(ty) }
|
95
100
|
elt_types_ptr = FFI::MemoryPointer.new(FFI.type_size(:pointer) * elt_types.size)
|
96
101
|
elt_types_ptr.write_array_of_pointer(elt_types)
|
97
|
-
|
102
|
+
if name
|
103
|
+
struct = from_ptr(C.LLVMStructCreateNamed(Context.global, name))
|
104
|
+
C.LLVMStructSetBody(struct, elt_types_ptr, elt_types.size, is_packed ? 1 : 0)
|
105
|
+
struct
|
106
|
+
else
|
107
|
+
from_ptr(C.LLVMStructType(elt_types_ptr, elt_types.size, is_packed ? 1 : 0))
|
108
|
+
end
|
98
109
|
end
|
99
110
|
|
100
111
|
# Creates a void type.
|
@@ -102,21 +113,12 @@ module LLVM
|
|
102
113
|
from_ptr(C.LLVMVoidType)
|
103
114
|
end
|
104
115
|
|
105
|
-
# Creates an opaque type.
|
106
|
-
def self.opaque
|
107
|
-
from_ptr(C.LLVMOpaqueType)
|
108
|
-
end
|
109
|
-
|
110
116
|
def self.rec
|
111
117
|
h = opaque
|
112
118
|
ty = yield h
|
113
119
|
h.refine(ty)
|
114
120
|
ty
|
115
121
|
end
|
116
|
-
|
117
|
-
def refine(ty)
|
118
|
-
C.LLVMRefineType(self, ty)
|
119
|
-
end
|
120
122
|
end
|
121
123
|
|
122
124
|
class IntType < Type
|
@@ -163,7 +165,12 @@ module LLVM
|
|
163
165
|
|
164
166
|
# Shortcut to Type.struct.
|
165
167
|
def Struct(*elt_types)
|
166
|
-
|
168
|
+
name = if elt_types.last.is_a? String
|
169
|
+
elt_types.pop
|
170
|
+
else
|
171
|
+
nil
|
172
|
+
end
|
173
|
+
LLVM::Type.struct(elt_types, false, name)
|
167
174
|
end
|
168
175
|
|
169
176
|
# Shortcut to Type.void.
|
@@ -45,11 +45,14 @@ module LLVM
|
|
45
45
|
attach_function :LLVMInitializeX86TargetInfo, [], :void
|
46
46
|
|
47
47
|
attach_function :LLVMInitializeX86Target, [], :void
|
48
|
+
|
49
|
+
attach_function :LLVMInitializeX86TargetMC, [], :void
|
48
50
|
end
|
49
51
|
|
50
52
|
def LLVM.init_x86
|
51
53
|
LLVM::C.LLVMInitializeX86Target
|
52
54
|
LLVM::C.LLVMInitializeX86TargetInfo
|
55
|
+
LLVM::C.LLVMInitializeX86TargetMC
|
53
56
|
end
|
54
57
|
|
55
58
|
class JITCompiler
|
data/lib/llvm/support.rb
CHANGED
data/lib/llvm/version.rb
CHANGED
data/test/equality_test.rb
CHANGED
@@ -74,9 +74,9 @@ class EqualityTestCase < Test::Unit::TestCase
|
|
74
74
|
def test_function
|
75
75
|
mod = LLVM::Module.new('test')
|
76
76
|
|
77
|
-
fn1 = mod.functions.add('test1', LLVM.Void)
|
77
|
+
fn1 = mod.functions.add('test1', [], LLVM.Void)
|
78
78
|
fn2 = LLVM::Function.from_ptr(fn1.to_ptr)
|
79
|
-
fn3 = mod.functions.add('test2', LLVM.Void)
|
79
|
+
fn3 = mod.functions.add('test2', [], LLVM.Void)
|
80
80
|
fn4 = MyFunction.from_ptr(fn1.to_ptr)
|
81
81
|
|
82
82
|
assert_equalities :equal => [fn1, fn2, fn4],
|
data/test/struct_test.rb
CHANGED
@@ -13,6 +13,12 @@ class StructTestCase < Test::Unit::TestCase
|
|
13
13
|
struct = LLVM::Struct(LLVM::Int, LLVM::Float)
|
14
14
|
assert_instance_of LLVM::Type, struct
|
15
15
|
end
|
16
|
+
|
17
|
+
def test_named_struct
|
18
|
+
struct = LLVM::Struct(LLVM::Int, LLVM::Float, "struct100")
|
19
|
+
assert_instance_of LLVM::Type, struct
|
20
|
+
assert_equal "struct100", struct.name
|
21
|
+
end
|
16
22
|
|
17
23
|
def test_unpacked_constant_struct_from_size
|
18
24
|
struct = LLVM::ConstantStruct.const(2, LLVM_UNPACKED) { |i| LLVM::Int(i) }
|
metadata
CHANGED
@@ -1,19 +1,19 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-llvm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
5
|
-
prerelease:
|
4
|
+
version: 3.0.0.beta
|
5
|
+
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Jeremy Voorhis
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2012-02-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: ffi
|
16
|
-
requirement: &
|
16
|
+
requirement: &70123470125560 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 1.0.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70123470125560
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rake
|
27
|
-
requirement: &
|
27
|
+
requirement: &70123470125140 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70123470125140
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rcov
|
38
|
-
requirement: &
|
38
|
+
requirement: &70123470124680 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70123470124680
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: yard
|
49
|
-
requirement: &
|
49
|
+
requirement: &70123470124260 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,7 +54,7 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70123470124260
|
58
58
|
description: LLVM bindings for Ruby
|
59
59
|
email: jvoorhis@gmail.com
|
60
60
|
executables: []
|
@@ -120,12 +120,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
120
120
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
121
121
|
none: false
|
122
122
|
requirements:
|
123
|
-
- - ! '
|
123
|
+
- - ! '>'
|
124
124
|
- !ruby/object:Gem::Version
|
125
|
-
version:
|
125
|
+
version: 1.3.1
|
126
126
|
requirements: []
|
127
127
|
rubyforge_project:
|
128
|
-
rubygems_version: 1.8.
|
128
|
+
rubygems_version: 1.8.11
|
129
129
|
signing_key:
|
130
130
|
specification_version: 3
|
131
131
|
summary: LLVM bindings for Ruby
|