Skip to content

Commit a2233a8

Browse files
authored
Merge pull request #136 from maleadt/tb/isempty
Specialized isempty functions.
2 parents 595ade3 + e331c08 commit a2233a8

File tree

5 files changed

+78
-3
lines changed

5 files changed

+78
-3
lines changed

lib/libLLVM_extra.jl

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,12 +86,58 @@ function LLVMAddTargetLibraryInfoByTriple(Triple, PM::LLVMPassManagerRef)
8686
@apicall(:LLVMExtraAddTargetLibraryInfoByTiple,Cvoid,(Cstring, LLVMPassManagerRef), Triple, PM)
8787
end
8888

89+
if VERSION < v"1.2.0-DEV.531"
90+
8991
function LLVMAddNVVMReflectPass(PM::LLVMPassManagerRef)
9092
@apicall(:LLVMExtraAddMVVMReflectPass,Cvoid,(LLVMPassManagerRef,), PM)
9193
end
9294

93-
function LLVMAddNVVMReflectPassWithMapping(PM::LLVMPassManagerRef, Params, Values, Length)
94-
@apicall(:LLVMExtraAddMVVMReflectPassWithMapping,Cvoid,(LLVMPassManagerRef,Ptr{Cstring},Ptr{Int},Csize_t), PM, Params, Values, Length)
95+
else
96+
97+
function LLVMAddNVVMReflectPass(PM::LLVMPassManagerRef)
98+
@apicall(:LLVMExtraAddNVVMReflectPass,Cvoid,(LLVMPassManagerRef,), PM)
99+
end
100+
101+
function LLVMAddAllocOptPass(PM::LLVMPassManagerRef)
102+
@apicall(:LLVMExtraAddAllocOptPass,Cvoid,(LLVMPassManagerRef,), PM)
103+
end
104+
105+
function LLVMAddBarrierNoopPass(PM::LLVMPassManagerRef)
106+
@apicall(:LLVMExtraAddBarrierNoopPass,Cvoid,(LLVMPassManagerRef,), PM)
107+
end
108+
109+
function LLVMAddGCInvariantVerifierPass(PM::LLVMPassManagerRef, Strong)
110+
@apicall(:LLVMExtraAddGCInvariantVerifierPass,Cvoid,(LLVMPassManagerRef,LLVMBool), PM, Strong)
111+
end
112+
113+
function LLVMAddLowerExcHandlersPass(PM::LLVMPassManagerRef)
114+
@apicall(:LLVMExtraAddLowerExcHandlersPass,Cvoid,(LLVMPassManagerRef,), PM)
115+
end
116+
117+
function LLVMAddCombineMulAddPass(PM::LLVMPassManagerRef)
118+
@apicall(:LLVMExtraAddCombineMulAddPass,Cvoid,(LLVMPassManagerRef,), PM)
119+
end
120+
121+
function LLVMAddMultiVersioningPass(PM::LLVMPassManagerRef)
122+
@apicall(:LLVMExtraAddMultiVersioningPass,Cvoid,(LLVMPassManagerRef,), PM)
123+
end
124+
125+
function LLVMAddPropagateJuliaAddrspaces(PM::LLVMPassManagerRef)
126+
@apicall(:LLVMExtraAddPropagateJuliaAddrspaces,Cvoid,(LLVMPassManagerRef,), PM)
127+
end
128+
129+
function LLVMAddLowerPTLSPass(PM::LLVMPassManagerRef, imaging_mode)
130+
@apicall(:LLVMExtraAddLowerPTLSPass,Cvoid,(LLVMPassManagerRef,LLVMBool), PM, imaging_mode)
131+
end
132+
133+
function LLVMAddLowerSimdLoopPass(PM::LLVMPassManagerRef)
134+
@apicall(:LLVMExtraAddLowerSimdLoopPass,Cvoid,(LLVMPassManagerRef,), PM)
135+
end
136+
137+
function LLVMAddLateLowerGCFramePass(PM::LLVMPassManagerRef)
138+
@apicall(:LLVMExtraAddLateLowerGCFramePass,Cvoid,(LLVMPassManagerRef,), PM)
139+
end
140+
95141
end
96142

97143
function LLVMGetValueContext(V::LLVMValueRef)

src/core/basicblock.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,4 +61,7 @@ end
6161
Base.last(iter::BasicBlockInstructionSet) =
6262
Instruction(API.LLVMGetLastInstruction(blockref(iter.bb)))
6363

64+
Base.isempty(iter::BasicBlockInstructionSet) =
65+
API.LLVMGetLastInstruction(blockref(iter.bb)) == C_NULL
66+
6467
Base.IteratorSize(::BasicBlockInstructionSet) = Base.SizeUnknown()

src/core/function.jl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,9 @@ end
9494
Base.last(iter::FunctionParameterSet) =
9595
Argument(API.LLVMGetLastParam(ref(iter.f)))
9696

97+
Base.isempty(iter::FunctionParameterSet) =
98+
API.LLVMGetLastParam(ref(iter.f)) == C_NULL
99+
97100
Base.length(iter::FunctionParameterSet) = API.LLVMCountParams(ref(iter.f))
98101

99102
# NOTE: optimized `collect`
@@ -122,6 +125,9 @@ end
122125
Base.last(iter::FunctionBlockSet) =
123126
BasicBlock(API.LLVMGetLastBasicBlock(ref(iter.f)))
124127

128+
Base.isempty(iter::FunctionBlockSet) =
129+
API.LLVMGetLastBasicBlock(ref(iter.f)) == C_NULL
130+
125131
Base.length(iter::FunctionBlockSet) = API.LLVMCountBasicBlocks(ref(iter.f))
126132

127133
# NOTE: optimized `collect`

src/core/module.jl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,9 @@ end
123123
Base.last(iter::ModuleGlobalSet) =
124124
GlobalVariable(API.LLVMGetLastGlobal(ref(iter.mod)))
125125

126+
Base.isempty(iter::ModuleGlobalSet) =
127+
API.LLVMGetLastGlobal(ref(iter.mod)) == C_NULL
128+
126129
Base.IteratorSize(::ModuleGlobalSet) = Base.SizeUnknown()
127130

128131
# partial associative interface
@@ -157,6 +160,9 @@ end
157160
Base.last(iter::ModuleFunctionSet) =
158161
Function(API.LLVMGetLastFunction(ref(iter.mod)))
159162

163+
Base.isempty(iter::ModuleFunctionSet) =
164+
API.LLVMGetLastFunction(ref(iter.mod)) == C_NULL
165+
160166
Base.IteratorSize(::ModuleFunctionSet) = Base.SizeUnknown()
161167

162168
# partial associative interface

test/core.jl

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -411,7 +411,9 @@ end
411411
# global variables
412412
Context() do ctx
413413
LLVM.Module("SomeModule", ctx) do mod
414+
@test isempty(globals(mod))
414415
gv = GlobalVariable(mod, LLVM.Int32Type(ctx), "SomeGlobal")
416+
@test !isempty(globals(mod))
415417

416418
show(devnull, gv)
417419

@@ -600,11 +602,14 @@ Context() do ctx
600602
LLVM.Module("SomeModule", ctx) do mod
601603
st = LLVM.StructType("SomeType", ctx)
602604
ft = LLVM.FunctionType(st, [st])
605+
@test isempty(functions(mod))
603606

604607
dummyfn = LLVM.Function(mod, "SomeFunction", ft)
605608
let fns = functions(mod)
606609
@test eltype(fns) == LLVM.Function
607610

611+
@test !isempty(fns)
612+
608613
@test first(fns) == dummyfn
609614
@test last(fns) == dummyfn
610615

@@ -738,12 +743,14 @@ Context() do ctx
738743
LLVM.Module("SomeModule", ctx) do mod
739744
ft = LLVM.FunctionType(LLVM.VoidType(ctx))
740745
fn = LLVM.Function(mod, "SomeFunction", ft)
746+
@test isempty(blocks(fn))
741747

742748
entrybb = BasicBlock(fn, "SomeBasicBlock")
743749
@test entry(fn) == entrybb
744750
let bbs = blocks(fn)
745751
@test eltype(bbs) == BasicBlock
746752

753+
@test !isempty(bbs)
747754
@test length(bbs) == 1
748755

749756
@test first(bbs) == entrybb
@@ -799,13 +806,15 @@ LLVM.Module("SomeModule", ctx) do mod
799806

800807
bb2 = BasicBlock(fn, "SomeOtherBasicBlock", ctx)
801808
@test LLVM.parent(bb2) == fn
809+
@test isempty(instructions(bb2))
802810

803811
bb1 = BasicBlock(bb2, "SomeBasicBlock", ctx)
804812
@test LLVM.parent(bb2) == fn
805813
position!(builder, bb1)
806814
brinst = br!(builder, bb2)
807815
position!(builder, bb2)
808816
retinst = ret!(builder)
817+
@test !isempty(instructions(bb2))
809818

810819
@test terminator(bb1) == brinst
811820
@test terminator(bb2) == retinst
@@ -835,8 +844,13 @@ end
835844
Context() do ctx
836845
Builder(ctx) do builder
837846
LLVM.Module("SomeModule", ctx) do mod
838-
ft = LLVM.FunctionType(LLVM.VoidType(ctx), [LLVM.Int1Type(ctx), LLVM.Int1Type(ctx)])
847+
ft = LLVM.FunctionType(LLVM.VoidType(ctx))
839848
fn = LLVM.Function(mod, "SomeFunction", ft)
849+
@test isempty(parameters(fn))
850+
851+
ft = LLVM.FunctionType(LLVM.VoidType(ctx), [LLVM.Int1Type(ctx), LLVM.Int1Type(ctx)])
852+
fn = LLVM.Function(mod, "SomeOtherFunction", ft)
853+
@test !isempty(parameters(fn))
840854

841855
bb1 = BasicBlock(fn, "entry", ctx)
842856
bb2 = BasicBlock(fn, "then", ctx)

0 commit comments

Comments
 (0)