Skip to content

Commit dc836c8

Browse files
committed
Fix personality function handling.
1 parent ce57320 commit dc836c8

File tree

2 files changed

+14
-3
lines changed

2 files changed

+14
-3
lines changed

src/core/function.jl

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,12 @@ Function(mod::Module, name::String, ft::FunctionType) =
1212

1313
unsafe_delete!(::Module, f::Function) = API.LLVMDeleteFunction(ref(f))
1414

15-
personality(f::Function) = Function(API.LLVMGetPersonalityFn(ref(f)))
16-
personality!(f::Function, persfn::Function) = API.LLVMSetPersonalityFn(ref(f), ref(persfn))
15+
function personality(f::Function)
16+
has_personality = convert(Core.Bool, API.LLVMHasPersonalityFn(ref(f)))
17+
return has_personality ? Function(API.LLVMGetPersonalityFn(ref(f))) : nothing
18+
end
19+
personality!(f::Function, persfn::Union{Nothing,Function}) =
20+
API.LLVMSetPersonalityFn(ref(f), persfn===nothing ? C_NULL : ref(persfn))
1721

1822
intrinsic_id(f::Function) = API.LLVMGetIntrinsicID(ref(f))
1923

test/core.jl

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -669,7 +669,14 @@ LLVM.Module("SomeModule", ctx) do mod
669669

670670
show(devnull, fn)
671671

672-
# @show personality(fn)
672+
@test personality(fn) === nothing
673+
pers_ft = LLVM.FunctionType(LLVM.Int32Type(ctx); vararg=true)
674+
pers_fn = LLVM.Function(mod, "PersonalityFunction", ft)
675+
personality!(fn, pers_fn)
676+
@test personality(fn) == pers_fn
677+
personality!(fn, nothing)
678+
@test personality(fn) === nothing
679+
unsafe_delete!(mod, pers_fn)
673680

674681
@test intrinsic_id(fn) == 0
675682

0 commit comments

Comments
 (0)