Skip to content

Commit 632e02c

Browse files
committed
Use Base.unsafe_convert instead of LLVM.ref.
1 parent 85e04f3 commit 632e02c

34 files changed

+510
-473
lines changed

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: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ 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
99
error = unsafe_string(out_error[])
@@ -13,7 +13,7 @@ function verify(mod::Module)
1313
end
1414

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

1818
if status
1919
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: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ export MemoryBuffer, MemoryBufferFile, dispose
55
end
66
reftype(::Type{MemoryBuffer}) = API.LLVMMemoryBufferRef
77

8+
Base.unsafe_convert(::Type{API.LLVMMemoryBufferRef}, membuf::MemoryBuffer) = membuf.ref
9+
810
function MemoryBuffer(data::Vector{T}, name::String="", copy::Core.Bool=true) where T<:Union{UInt8,Int8}
911
ptr = pointer(data)
1012
len = Csize_t(length(data))
@@ -50,11 +52,11 @@ function MemoryBufferFile(f::Core.Function, args...)
5052
end
5153
end
5254

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

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

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

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

src/core/attributes.jl

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ export Attribute,
88
abstract type Attribute end
99
reftype(::Type{T}) where {T<:Attribute} = API.LLVMAttributeRef
1010

11+
Base.unsafe_convert(::Type{API.LLVMAttributeRef}, attr::Attribute) = attr.ref
12+
1113
@checked struct EnumAttribute <: Attribute
1214
ref::reftype(Attribute)
1315
end
@@ -42,28 +44,28 @@ end
4244
# (which also would conflict with the inner ref constructor)
4345
function EnumAttribute(kind::String, value::Integer=0, ctx::Context=GlobalContext())
4446
enum_kind = API.LLVMGetEnumAttributeKindForName(kind, Csize_t(length(kind)))
45-
return EnumAttribute(API.LLVMCreateEnumAttribute(ref(ctx), enum_kind, UInt64(value)))
47+
return EnumAttribute(API.LLVMCreateEnumAttribute(ctx, enum_kind, UInt64(value)))
4648
end
4749

48-
kind(attr::EnumAttribute) = API.LLVMGetEnumAttributeKind(ref(attr))
50+
kind(attr::EnumAttribute) = API.LLVMGetEnumAttributeKind(attr)
4951

50-
value(attr::EnumAttribute) = API.LLVMGetEnumAttributeValue(ref(attr))
52+
value(attr::EnumAttribute) = API.LLVMGetEnumAttributeValue(attr)
5153

5254

5355
## string attribute
5456

5557
StringAttribute(kind::String, value::String="", ctx::Context=GlobalContext()) =
56-
StringAttribute(API.LLVMCreateStringAttribute(ref(ctx), kind, length(kind),
58+
StringAttribute(API.LLVMCreateStringAttribute(ctx, kind, length(kind),
5759
value, length(value)))
5860

5961
function kind(attr::StringAttribute)
6062
len = Ref{Cuint}()
61-
data = API.LLVMGetStringAttributeKind(ref(attr), len)
63+
data = API.LLVMGetStringAttributeKind(attr, len)
6264
return unsafe_string(convert(Ptr{Int8}, data), len[])
6365
end
6466

6567
function value(attr::StringAttribute)
6668
len = Ref{Cuint}()
67-
data = API.LLVMGetStringAttributeValue(ref(attr), len)
69+
data = API.LLVMGetStringAttributeValue(attr, len)
6870
return unsafe_string(convert(Ptr{Int8}, data), len[])
6971
end

src/core/basicblock.jl

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -7,38 +7,38 @@ export BasicBlock, unsafe_delete!,
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
1215
ref::reftype(GlobalObject)
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()

src/core/context.jl

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,15 @@ export Context, dispose, GlobalContext
77
end
88
reftype(::Type{Context}) = API.LLVMContextRef
99

10+
Base.unsafe_convert(::Type{API.LLVMContextRef}, ctx::Context) = ctx.ref
11+
1012
function Context()
1113
ctx = Context(API.LLVMContextCreate())
1214
_install_handlers(ctx)
1315
ctx
1416
end
1517

16-
dispose(ctx::Context) = API.LLVMContextDispose(ref(ctx))
18+
dispose(ctx::Context) = API.LLVMContextDispose(ctx)
1719

1820
function Context(f::Core.Function)
1921
ctx = Context()
@@ -49,8 +51,10 @@ export DiagnosticInfo, severity, message
4951
end
5052
reftype(::Type{DiagnosticInfo}) = API.LLVMDiagnosticInfoRef
5153

52-
severity(di::DiagnosticInfo) = API.LLVMGetDiagInfoSeverity(ref(di))
53-
message(di::DiagnosticInfo) = unsafe_message(API.LLVMGetDiagInfoDescription(ref(di)))
54+
Base.unsafe_convert(::Type{API.LLVMDiagnosticInfoRef}, di::DiagnosticInfo) = di.ref
55+
56+
severity(di::DiagnosticInfo) = API.LLVMGetDiagInfoSeverity(di)
57+
message(di::DiagnosticInfo) = unsafe_message(API.LLVMGetDiagInfoDescription(di))
5458

5559

5660
## handlers
@@ -90,11 +94,11 @@ function _install_handlers(ctx::Context)
9094
# set yield callback
9195
callback = @cfunction(yield_callback, Cvoid, (Context, Ptr{Cvoid}))
9296
# NOTE: disabled until proven safe
93-
#API.LLVMContextSetYieldCallback(ref(ctx), callback, C_NULL)
97+
#API.LLVMContextSetYieldCallback(ctx, callback, C_NULL)
9498

9599
# set diagnostic callback
96100
handler = @cfunction(handle_diagnostic, Cvoid, (API.LLVMDiagnosticInfoRef, Ptr{Cvoid}))
97-
API.LLVMContextSetDiagnosticHandler(ref(ctx), handler, C_NULL)
101+
API.LLVMContextSetDiagnosticHandler(ctx, handler, C_NULL)
98102

99103
return nothing
100104
end

0 commit comments

Comments
 (0)