Skip to content

Commit b5addb6

Browse files
authored
Add finalizer under jlcall (#1483)
1 parent 1e45f26 commit b5addb6

File tree

2 files changed

+43
-5
lines changed

2 files changed

+43
-5
lines changed

src/rules/llvmrules.jl

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ function jlcall_fwd(B, orig, gutils, normalR, shadowR)
3131
if in(name, ("ijl_f__svec_ref", "jl_f__svec_ref"))
3232
return common_f_svec_ref_fwd(2, B, orig, gutils, normalR, shadowR)
3333
end
34+
if in(name, ("ijl_f_finalizer", "jl_f_finalizer"))
35+
return common_finalizer_fwd(2, B, orig, gutils, normalR, shadowR)
36+
end
3437
if any(map(k->kind(k)==kind(StringAttribute("enzyme_inactive")), collect(function_attributes(F))))
3538
return true
3639
end
@@ -69,6 +72,9 @@ function jlcall_augfwd(B, orig, gutils, normalR, shadowR, tapeR)
6972
if in(name, ("ijl_f__svec_rev", "jl_f__svec_ref"))
7073
return common_f_svec_ref_augfwd(2, B, orig, gutils, normalR, shadowR, tapeR)
7174
end
75+
if in(name, ("ijl_f_finalizer", "jl_f_finalizer"))
76+
return common_finalizer_augfwd(2, B, orig, gutils, normalR, shadowR, tapeR)
77+
end
7278
if any(map(k->kind(k)==kind(StringAttribute("enzyme_inactive")), collect(function_attributes(F))))
7379
return true
7480
end
@@ -115,6 +121,10 @@ function jlcall_rev(B, orig, gutils, tape)
115121
common_f_svec_ref_rev(2, B, orig, gutils, tape)
116122
return nothing
117123
end
124+
if in(name, ("ijl_f_finalizer", "jl_f_finalizer"))
125+
common_finalizer_rev(2, B, orig, gutils, tape)
126+
return nothing
127+
end
118128
if any(map(k->kind(k)==kind(StringAttribute("enzyme_inactive")), collect(function_attributes(F))))
119129
return nothing
120130
end
@@ -1103,7 +1113,7 @@ function finalizer_fwd(B, orig, gutils, normalR, shadowR)
11031113
if is_constant_value(gutils, orig) && is_constant_inst(gutils, orig)
11041114
return true
11051115
end
1106-
err = emit_error(B, orig, "Enzyme: unhandled augmented forward for jl_gc_add_finalizer_th or jl_gc_add_ptr_finalizer")
1116+
err = emit_error(B, orig, "Enzyme: unhandled forward for jl_gc_add_finalizer_th or jl_gc_add_ptr_finalizer")
11071117
newo = new_from_original(gutils, orig)
11081118
API.moveBefore(newo, err, B)
11091119
normal = (unsafe_load(normalR) != C_NULL) ? LLVM.Instruction(unsafe_load(normalR)) : nothing
@@ -1117,9 +1127,9 @@ function finalizer_augfwd(B, orig, gutils, normalR, shadowR, tapeR)
11171127
if is_constant_value(gutils, orig) && is_constant_inst(gutils, orig)
11181128
return true
11191129
end
1120-
# err = emit_error(B, orig, "Enzyme: unhandled augmented forward for jl_gc_add_finalizer_th")
1121-
# newo = new_from_original(gutils, orig)
1122-
# API.moveBefore(newo, err, B)
1130+
err = emit_error(B, orig, "Enzyme: unhandled augmented forward for jl_gc_add_finalizer_th")
1131+
newo = new_from_original(gutils, orig)
1132+
API.moveBefore(newo, err, B)
11231133
normal = (unsafe_load(normalR) != C_NULL) ? LLVM.Instruction(unsafe_load(normalR)) : nothing
11241134
if shadowR != C_NULL && normal !== nothing
11251135
unsafe_store!(shadowR, normal.ref)

src/rules/typeunstablerules.jl

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -822,7 +822,7 @@ function common_f_svec_ref_fwd(offset, B, orig, gutils, normalR, shadowR)
822822
if is_constant_value(gutils, orig) && is_constant_inst(gutils, orig)
823823
return true
824824
end
825-
emit_error(B, orig, "Enzyme: unhandled augmented forward for jl_f__svec_ref")
825+
emit_error(B, orig, "Enzyme: unhandled forward for jl_f__svec_ref")
826826
normal = (unsafe_load(normalR) != C_NULL) ? LLVM.Instruction(unsafe_load(normalR)) : nothing
827827
if shadowR != C_NULL && normal !== nothing
828828
unsafe_store!(shadowR, normal.ref)
@@ -900,6 +900,34 @@ function common_f_svec_ref_rev(offset, B, orig, gutils, tape)
900900
return nothing
901901
end
902902

903+
function common_finalizer_fwd(offset, B, orig, gutils, normalR, shadowR)
904+
if is_constant_value(gutils, orig) && is_constant_inst(gutils, orig)
905+
return true
906+
end
907+
emit_error(B, orig, "Enzyme: unhandled forward for jl_f_finalizer")
908+
normal = (unsafe_load(normalR) != C_NULL) ? LLVM.Instruction(unsafe_load(normalR)) : nothing
909+
if shadowR != C_NULL && normal !== nothing
910+
unsafe_store!(shadowR, normal.ref)
911+
end
912+
return false
913+
end
914+
915+
function common_finalizer_augfwd(offset, B, orig, gutils, normalR, shadowR)
916+
if is_constant_value(gutils, orig) && is_constant_inst(gutils, orig)
917+
return true
918+
end
919+
emit_error(B, orig, "Enzyme: unhandled augmented forward for jl_f_finalizer")
920+
normal = (unsafe_load(normalR) != C_NULL) ? LLVM.Instruction(unsafe_load(normalR)) : nothing
921+
if shadowR != C_NULL && normal !== nothing
922+
unsafe_store!(shadowR, normal.ref)
923+
end
924+
return false
925+
end
926+
927+
function common_finalizer_rev(offset, B, orig, gutils, tape)
928+
return nothing
929+
end
930+
903931
function f_svec_ref_fwd(B, orig, gutils, normalR, shadowR)
904932
common_f_svec_ref_fwd(1, B, orig, gutils, normalR, shadowR)
905933
return nothing

0 commit comments

Comments
 (0)