Skip to content

Commit e23db0c

Browse files
authored
Merge pull request #194 from maleadt/tb/cleanup
Clean-ups
2 parents 2eca72f + 709ed69 commit e23db0c

38 files changed

+630
-619
lines changed

examples/sum.jl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# https://pauladamsmith.com/blog/2015/01/how-to-get-started-with-llvm-c-api.html
22

3+
using Test
4+
35
using LLVM
46

57
if length(ARGS) == 2
@@ -35,7 +37,7 @@ Interpreter(mod) do engine
3537
GenericValue(LLVM.Int32Type(), y)]
3638

3739
res = LLVM.run(engine, sum, args)
38-
println(convert(Int, res))
40+
@test convert(Int, res) == x + y
3941

4042
dispose.(args)
4143
dispose(res)

examples/sum_integrated.jl

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# same as `sum.jl`, but reusing the Julia compiler to compile and execute the IR
22

3+
using Test
4+
35
using LLVM
46
using LLVM.Interop
57

@@ -25,6 +27,5 @@ end
2527

2628
# make Julia compile and execute the function
2729
push!(function_attributes(sum), EnumAttribute("alwaysinline"))
28-
ptr = LLVM.ref(sum)
29-
call_sum(x, y) = Base.llvmcall(ptr, Int32, Tuple{Int32, Int32}, x, y)
30-
@show call_sum(x, y)
30+
@eval call_sum(x, y) = $(call_function(sum, Int32, Tuple{Int32, Int32}, :(x, y)))
31+
@test call_sum(x, y) == x + y

lib/libLLVM_extra.jl

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ end
5151

5252
const LLVMPassRef = Ptr{LLVMOpaquePass}
5353

54-
function LLVMAddPass(PM::LLVMPassManagerRef, P::LLVMPassRef)
54+
function LLVMAddPass(PM, P)
5555
ccall(:LLVMExtraAddPass,Cvoid,
5656
(LLVMPassManagerRef, LLVMPassRef),
5757
PM, P)
@@ -78,100 +78,100 @@ end
7878

7979
# various missing functions
8080

81-
function LLVMAddInternalizePassWithExportList(PM::LLVMPassManagerRef, ExportList, Length)
81+
function LLVMAddInternalizePassWithExportList(PM, ExportList, Length)
8282
ccall(:LLVMExtraAddInternalizePassWithExportList,Cvoid,(LLVMPassManagerRef,Ptr{Cstring},Csize_t), PM, ExportList, Length)
8383
end
8484

85-
function LLVMAddTargetLibraryInfoByTriple(Triple, PM::LLVMPassManagerRef)
85+
function LLVMAddTargetLibraryInfoByTriple(Triple, PM)
8686
ccall(:LLVMExtraAddTargetLibraryInfoByTiple,Cvoid,(Cstring, LLVMPassManagerRef), Triple, PM)
8787
end
8888

8989
if VERSION < v"1.2.0-DEV.531"
90-
function LLVMAddNVVMReflectPass(PM::LLVMPassManagerRef, smversion)
90+
function LLVMAddNVVMReflectPass(PM, smversion)
9191
ccall(:LLVMExtraAddMVVMReflectPass,Cvoid,(LLVMPassManagerRef,), PM)
9292
end
9393
else
9494

9595
if version() < v"8.0"
96-
function LLVMAddNVVMReflectPass(PM::LLVMPassManagerRef, smversion)
96+
function LLVMAddNVVMReflectPass(PM, smversion)
9797
ccall(:LLVMExtraAddNVVMReflectPass,Cvoid,(LLVMPassManagerRef,), PM)
9898
end
9999
else
100-
function LLVMAddNVVMReflectPass(PM::LLVMPassManagerRef, smversion)
100+
function LLVMAddNVVMReflectPass(PM, smversion)
101101
ccall(:LLVMExtraAddNVVMReflectFunctionPass,Cvoid,(LLVMPassManagerRef, Cuint), PM, smversion)
102102
end
103103
end
104104

105-
function LLVMAddAllocOptPass(PM::LLVMPassManagerRef)
105+
function LLVMAddAllocOptPass(PM)
106106
ccall(:LLVMExtraAddAllocOptPass,Cvoid,(LLVMPassManagerRef,), PM)
107107
end
108108

109-
function LLVMAddBarrierNoopPass(PM::LLVMPassManagerRef)
109+
function LLVMAddBarrierNoopPass(PM)
110110
ccall(:LLVMExtraAddBarrierNoopPass,Cvoid,(LLVMPassManagerRef,), PM)
111111
end
112112

113-
function LLVMAddGCInvariantVerifierPass(PM::LLVMPassManagerRef, Strong)
113+
function LLVMAddGCInvariantVerifierPass(PM, Strong)
114114
ccall(:LLVMExtraAddGCInvariantVerifierPass,Cvoid,(LLVMPassManagerRef,LLVMBool), PM, Strong)
115115
end
116116

117-
function LLVMAddLowerExcHandlersPass(PM::LLVMPassManagerRef)
117+
function LLVMAddLowerExcHandlersPass(PM)
118118
ccall(:LLVMExtraAddLowerExcHandlersPass,Cvoid,(LLVMPassManagerRef,), PM)
119119
end
120120

121-
function LLVMAddCombineMulAddPass(PM::LLVMPassManagerRef)
121+
function LLVMAddCombineMulAddPass(PM)
122122
ccall(:LLVMExtraAddCombineMulAddPass,Cvoid,(LLVMPassManagerRef,), PM)
123123
end
124124

125-
function LLVMAddMultiVersioningPass(PM::LLVMPassManagerRef)
125+
function LLVMAddMultiVersioningPass(PM)
126126
ccall(:LLVMExtraAddMultiVersioningPass,Cvoid,(LLVMPassManagerRef,), PM)
127127
end
128128

129-
function LLVMAddPropagateJuliaAddrspaces(PM::LLVMPassManagerRef)
129+
function LLVMAddPropagateJuliaAddrspaces(PM)
130130
ccall(:LLVMExtraAddPropagateJuliaAddrspaces,Cvoid,(LLVMPassManagerRef,), PM)
131131
end
132132

133-
function LLVMAddLowerPTLSPass(PM::LLVMPassManagerRef, imaging_mode)
133+
function LLVMAddLowerPTLSPass(PM, imaging_mode)
134134
ccall(:LLVMExtraAddLowerPTLSPass,Cvoid,(LLVMPassManagerRef,LLVMBool), PM, imaging_mode)
135135
end
136136

137-
function LLVMAddLowerSimdLoopPass(PM::LLVMPassManagerRef)
137+
function LLVMAddLowerSimdLoopPass(PM)
138138
ccall(:LLVMExtraAddLowerSimdLoopPass,Cvoid,(LLVMPassManagerRef,), PM)
139139
end
140140

141-
function LLVMAddLateLowerGCFramePass(PM::LLVMPassManagerRef)
141+
function LLVMAddLateLowerGCFramePass(PM)
142142
ccall(:LLVMExtraAddLateLowerGCFramePass,Cvoid,(LLVMPassManagerRef,), PM)
143143
end
144144

145145
end
146146

147147
if VERSION >= v"1.3.0-DEV.95"
148-
function LLVMAddFinalLowerGCPass(PM::LLVMPassManagerRef)
148+
function LLVMAddFinalLowerGCPass(PM)
149149
ccall(:LLVMExtraAddFinalLowerGCPass,Cvoid,(LLVMPassManagerRef,), PM)
150150
end
151151
end
152152

153153
if VERSION >= v"1.5.0-DEV.802"
154-
function LLVMAddRemoveJuliaAddrspacesPass(PM::LLVMPassManagerRef)
154+
function LLVMAddRemoveJuliaAddrspacesPass(PM)
155155
ccall(:LLVMExtraAddRemoveJuliaAddrspacesPass,Cvoid,(LLVMPassManagerRef,), PM)
156156
end
157157
end
158158

159-
function LLVMGetValueContext(V::LLVMValueRef)
159+
function LLVMGetValueContext(V)
160160
ccall(:LLVMExtraGetValueContext,LLVMContextRef,(LLVMValueRef,),V)
161161
end
162162

163163
if VERSION >= v"0.7.0-alpha.37"
164-
function LLVMGetSourceLocation(V::LLVMValueRef, index, Name, Filename, Line, Column)
164+
function LLVMGetSourceLocation(V, index, Name, Filename, Line, Column)
165165
ccall(:LLVMExtraGetSourceLocation,Cint,(LLVMValueRef,Cint,Ptr{Cstring},Ptr{Cstring},Ptr{Cuint},Ptr{Cuint}), V, index, Name, Filename, Line, Column)
166166
end
167167
end
168168

169169
if VERSION >= v"1.5" && !(v"1.6-" <= VERSION < v"1.6.0-DEV.90")
170-
function LLVMExtraAppendToUsed(Mod::LLVMModuleRef, Values, Count)
170+
function LLVMExtraAppendToUsed(Mod, Values, Count)
171171
ccall(:LLVMExtraAppendToUsed,Cvoid,(LLVMModuleRef,Ptr{LLVMValueRef},Csize_t), Mod, Values, Count)
172172
end
173173

174-
function LLVMExtraAppendToCompilerUsed(Mod::LLVMModuleRef, Values, Count)
174+
function LLVMExtraAppendToCompilerUsed(Mod, Values, Count)
175175
ccall(:LLVMExtraAppendToCompilerUsed,Cvoid,(LLVMModuleRef,Ptr{LLVMValueRef},Csize_t), Mod, Values, Count)
176176
end
177177

src/analysis.jl

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,16 @@ export verify
33
function verify(mod::Module)
44
out_error = Ref{Cstring}()
55
status =
6-
convert(Core.Bool, API.LLVMVerifyModule(ref(mod), API.LLVMReturnStatusAction, out_error))
6+
convert(Core.Bool, API.LLVMVerifyModule(mod, API.LLVMReturnStatusAction, out_error))
77

88
if status
9-
error = unsafe_string(out_error[])
10-
API.LLVMDisposeMessage(out_error[])
9+
error = unsafe_message(out_error[])
1110
throw(LLVMException(error))
1211
end
1312
end
1413

1514
function verify(f::Function)
16-
status = convert(Core.Bool, API.LLVMVerifyFunction(ref(f), API.LLVMReturnStatusAction))
15+
status = convert(Core.Bool, API.LLVMVerifyFunction(f, API.LLVMReturnStatusAction))
1716

1817
if status
1918
throw(LLVMException("broken function"))

src/bitcode.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ function Base.parse(::Type{Module}, data::Vector{T}) where T<:Union{UInt8,Int8}
44
membuf = MemoryBuffer(data, "", false)
55
out_ref = Ref{API.LLVMModuleRef}()
66

7-
status = convert(Core.Bool, API.LLVMParseBitcode2(ref(membuf), out_ref))
7+
status = convert(Core.Bool, API.LLVMParseBitcode2(membuf, out_ref))
88
@assert !status # caught by diagnostics handler
99

1010
Module(out_ref[])
@@ -14,7 +14,7 @@ function Base.parse(::Type{Module}, data::Vector{T}, ctx::Context) where T<:Unio
1414
membuf = MemoryBuffer(data, "", false)
1515
out_ref = Ref{API.LLVMModuleRef}()
1616

17-
status = convert(Core.Bool, API.LLVMParseBitcodeInContext2(ref(ctx), ref(membuf), out_ref))
17+
status = convert(Core.Bool, API.LLVMParseBitcodeInContext2(ctx, membuf, out_ref))
1818
@assert !status # caught by diagnostics handler
1919

2020
Module(out_ref[])
@@ -24,10 +24,10 @@ end
2424
## writer
2525

2626
Base.write(io::IOStream, mod::Module) =
27-
API.LLVMWriteBitcodeToFD(ref(mod), Cint(fd(io)), convert(Bool, false), convert(Bool, true))
27+
API.LLVMWriteBitcodeToFD(mod, Cint(fd(io)), convert(Bool, false), convert(Bool, true))
2828

2929
Base.convert(::Type{MemoryBuffer}, mod::Module) = MemoryBuffer(
30-
API.LLVMWriteBitcodeToMemoryBuffer(ref(mod)))
30+
API.LLVMWriteBitcodeToMemoryBuffer(mod))
3131

3232
Base.convert(::Type{Vector{T}}, mod::Module) where {T<:Union{UInt8,Int8}} =
3333
convert(Vector{T}, convert(MemoryBuffer, mod))

src/buffer.jl

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ export MemoryBuffer, MemoryBufferFile, dispose
33
@checked struct MemoryBuffer
44
ref::API.LLVMMemoryBufferRef
55
end
6-
reftype(::Type{MemoryBuffer}) = API.LLVMMemoryBufferRef
6+
7+
Base.unsafe_convert(::Type{API.LLVMMemoryBufferRef}, membuf::MemoryBuffer) = membuf.ref
78

89
function MemoryBuffer(data::Vector{T}, name::String="", copy::Core.Bool=true) where T<:Union{UInt8,Int8}
910
ptr = pointer(data)
@@ -33,8 +34,7 @@ function MemoryBufferFile(path::String)
3334
convert(Core.Bool, API.LLVMCreateMemoryBufferWithContentsOfFile(path, out_ref, out_error))
3435

3536
if status
36-
error = unsafe_string(out_error[])
37-
API.LLVMDisposeMessage(out_error[])
37+
error = unsafe_message(out_error[])
3838
throw(LLVMException(error))
3939
end
4040

@@ -50,11 +50,11 @@ function MemoryBufferFile(f::Core.Function, args...)
5050
end
5151
end
5252

53-
dispose(membuf::MemoryBuffer) = API.LLVMDisposeMemoryBuffer(ref(membuf))
53+
dispose(membuf::MemoryBuffer) = API.LLVMDisposeMemoryBuffer(membuf)
5454

55-
Base.length(membuf::MemoryBuffer) = API.LLVMGetBufferSize(ref(membuf))
55+
Base.length(membuf::MemoryBuffer) = API.LLVMGetBufferSize(membuf)
5656

57-
Base.pointer(membuf::MemoryBuffer) = convert(Ptr{UInt8}, API.LLVMGetBufferStart(ref(membuf)))
57+
Base.pointer(membuf::MemoryBuffer) = convert(Ptr{UInt8}, API.LLVMGetBufferStart(membuf))
5858

5959
Base.convert(::Type{Vector{UInt8}}, membuf::MemoryBuffer) =
6060
unsafe_wrap(Array, pointer(membuf), length(membuf))

src/core/attributes.jl

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,18 @@ export Attribute,
66
kind, value
77

88
abstract type Attribute end
9-
reftype(::Type{T}) where {T<:Attribute} = API.LLVMAttributeRef
9+
10+
Base.unsafe_convert(::Type{API.LLVMAttributeRef}, attr::Attribute) = attr.ref
1011

1112
@checked struct EnumAttribute <: Attribute
12-
ref::reftype(Attribute)
13+
ref::API.LLVMAttributeRef
1314
end
1415

1516
@checked struct StringAttribute <: Attribute
16-
ref::reftype(Attribute)
17+
ref::API.LLVMAttributeRef
1718
end
1819

19-
# TODO: make @reftype's identify mechanism flexible enough to cover cases like this one,
20+
# TODO: make the identify mechanism flexible enough to cover cases like this one,
2021
# and not only Value and Type
2122

2223
function Attribute(ref::API.LLVMAttributeRef)
@@ -42,28 +43,28 @@ end
4243
# (which also would conflict with the inner ref constructor)
4344
function EnumAttribute(kind::String, value::Integer=0, ctx::Context=GlobalContext())
4445
enum_kind = API.LLVMGetEnumAttributeKindForName(kind, Csize_t(length(kind)))
45-
return EnumAttribute(API.LLVMCreateEnumAttribute(ref(ctx), enum_kind, UInt64(value)))
46+
return EnumAttribute(API.LLVMCreateEnumAttribute(ctx, enum_kind, UInt64(value)))
4647
end
4748

48-
kind(attr::EnumAttribute) = API.LLVMGetEnumAttributeKind(ref(attr))
49+
kind(attr::EnumAttribute) = API.LLVMGetEnumAttributeKind(attr)
4950

50-
value(attr::EnumAttribute) = API.LLVMGetEnumAttributeValue(ref(attr))
51+
value(attr::EnumAttribute) = API.LLVMGetEnumAttributeValue(attr)
5152

5253

5354
## string attribute
5455

5556
StringAttribute(kind::String, value::String="", ctx::Context=GlobalContext()) =
56-
StringAttribute(API.LLVMCreateStringAttribute(ref(ctx), kind, length(kind),
57+
StringAttribute(API.LLVMCreateStringAttribute(ctx, kind, length(kind),
5758
value, length(value)))
5859

5960
function kind(attr::StringAttribute)
6061
len = Ref{Cuint}()
61-
data = API.LLVMGetStringAttributeKind(ref(attr), len)
62+
data = API.LLVMGetStringAttributeKind(attr, len)
6263
return unsafe_string(convert(Ptr{Int8}, data), len[])
6364
end
6465

6566
function value(attr::StringAttribute)
6667
len = Ref{Cuint}()
67-
data = API.LLVMGetStringAttributeValue(ref(attr), len)
68+
data = API.LLVMGetStringAttributeValue(attr, len)
6869
return unsafe_string(convert(Ptr{Int8}, data), len[])
6970
end

src/core/basicblock.jl

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,42 +3,42 @@ export BasicBlock, unsafe_delete!,
33
move_before, move_after
44

55
@checked struct BasicBlock <: Value
6-
ref::reftype(Value)
6+
ref::API.LLVMValueRef
77
end
88
identify(::Type{Value}, ::Val{API.LLVMBasicBlockValueKind}) = BasicBlock
99

10+
BasicBlock(ref::API.LLVMBasicBlockRef) = BasicBlock(API.LLVMBasicBlockAsValue(ref))
11+
Base.unsafe_convert(::Type{API.LLVMBasicBlockRef}, bb::BasicBlock) = API.LLVMValueAsBasicBlock(bb)
12+
1013
# forward declarations
1114
@checked struct Function <: GlobalObject
12-
ref::reftype(GlobalObject)
15+
ref::API.LLVMValueRef
1316
end
1417

15-
BasicBlock(ref::API.LLVMBasicBlockRef) = BasicBlock(API.LLVMBasicBlockAsValue(ref))
16-
blockref(bb::BasicBlock) = API.LLVMValueAsBasicBlock(ref(bb))
17-
18-
BasicBlock(f::Function, name::String) =
19-
BasicBlock(API.LLVMAppendBasicBlock(ref(f), name))
20-
BasicBlock(f::Function, name::String, ctx::Context) =
21-
BasicBlock(API.LLVMAppendBasicBlockInContext(ref(ctx), ref(f), name))
22-
BasicBlock(bb::BasicBlock, name::String) =
23-
BasicBlock(API.LLVMInsertBasicBlock(blockref(bb), name))
24-
BasicBlock(bb::BasicBlock, name::String, ctx::Context) =
25-
BasicBlock(API.LLVMInsertBasicBlockInContext(ref(ctx), blockref(bb), name))
26-
27-
unsafe_delete!(::Function, bb::BasicBlock) = API.LLVMDeleteBasicBlock(blockref(bb))
18+
BasicBlock(f::Function, name::String) =
19+
BasicBlock(API.LLVMAppendBasicBlock(f, name))
20+
BasicBlock(f::Function, name::String, ctx::Context) =
21+
BasicBlock(API.LLVMAppendBasicBlockInContext(ctx, f, name))
22+
BasicBlock(bb::BasicBlock, name::String) =
23+
BasicBlock(API.LLVMInsertBasicBlock(bb, name))
24+
BasicBlock(bb::BasicBlock, name::String, ctx::Context) =
25+
BasicBlock(API.LLVMInsertBasicBlockInContext(ctx, bb, name))
26+
27+
unsafe_delete!(::Function, bb::BasicBlock) = API.LLVMDeleteBasicBlock(bb)
2828
Base.delete!(::Function, bb::BasicBlock) =
29-
API.LLVMRemoveBasicBlockFromParent(blockref(bb))
29+
API.LLVMRemoveBasicBlockFromParent(bb)
3030

31-
parent(bb::BasicBlock) = Function(API.LLVMGetBasicBlockParent(blockref(bb)))
31+
parent(bb::BasicBlock) = Function(API.LLVMGetBasicBlockParent(bb))
3232

33-
terminator(bb::BasicBlock) = Instruction(API.LLVMGetBasicBlockTerminator(blockref(bb)))
33+
terminator(bb::BasicBlock) = Instruction(API.LLVMGetBasicBlockTerminator(bb))
3434

3535
name(bb::BasicBlock) =
36-
unsafe_string(API.LLVMGetBasicBlockName(blockref(bb)))
36+
unsafe_string(API.LLVMGetBasicBlockName(bb))
3737

3838
move_before(bb::BasicBlock, pos::BasicBlock) =
39-
API.LLVMMoveBasicBlockBefore(blockref(bb), blockref(pos))
39+
API.LLVMMoveBasicBlockBefore(bb, pos)
4040
move_after(bb::BasicBlock, pos::BasicBlock) =
41-
API.LLVMMoveBasicBlockAfter(blockref(bb), blockref(pos))
41+
API.LLVMMoveBasicBlockAfter(bb, pos)
4242

4343

4444
## instruction iteration
@@ -54,14 +54,14 @@ instructions(bb::BasicBlock) = BasicBlockInstructionSet(bb)
5454
Base.eltype(::BasicBlockInstructionSet) = Instruction
5555

5656
function Base.iterate(iter::BasicBlockInstructionSet,
57-
state=API.LLVMGetFirstInstruction(blockref(iter.bb)))
57+
state=API.LLVMGetFirstInstruction(iter.bb))
5858
state == C_NULL ? nothing : (Instruction(state), API.LLVMGetNextInstruction(state))
5959
end
6060

6161
Base.last(iter::BasicBlockInstructionSet) =
62-
Instruction(API.LLVMGetLastInstruction(blockref(iter.bb)))
62+
Instruction(API.LLVMGetLastInstruction(iter.bb))
6363

6464
Base.isempty(iter::BasicBlockInstructionSet) =
65-
API.LLVMGetLastInstruction(blockref(iter.bb)) == C_NULL
65+
API.LLVMGetLastInstruction(iter.bb) == C_NULL
6666

6767
Base.IteratorSize(::BasicBlockInstructionSet) = Base.SizeUnknown()

0 commit comments

Comments
 (0)