summaryrefslogtreecommitdiff
path: root/erts/emulator/beam/beam_bif_load.c
diff options
context:
space:
mode:
Diffstat (limited to 'erts/emulator/beam/beam_bif_load.c')
-rw-r--r--erts/emulator/beam/beam_bif_load.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/erts/emulator/beam/beam_bif_load.c b/erts/emulator/beam/beam_bif_load.c
index 587a61d814..a406e14741 100644
--- a/erts/emulator/beam/beam_bif_load.c
+++ b/erts/emulator/beam/beam_bif_load.c
@@ -847,8 +847,7 @@ BIF_RETTYPE finish_after_on_load_2(BIF_ALIST_2)
ep->addressv[code_ix] = (void*)ep->trampoline.not_loaded.deferred;
ep->trampoline.not_loaded.deferred = 0;
} else {
- if (ep->addressv[code_ix] == ep->trampoline.raw &&
- BeamIsOpCode(ep->trampoline.op, op_apply_bif)) {
+ if (ep->bif_table_index != -1) {
continue;
}
@@ -877,7 +876,7 @@ BIF_RETTYPE finish_after_on_load_2(BIF_ALIST_2)
if (ep == NULL || ep->info.mfa.module != BIF_ARG_1) {
continue;
}
- if (BeamIsOpCode(ep->trampoline.op, op_apply_bif)) {
+ if (ep->bif_table_index != -1) {
continue;
}
@@ -1891,10 +1890,7 @@ delete_code(Module* modp)
Export *ep = export_list(i, code_ix);
if (ep != NULL && (ep->info.mfa.module == module)) {
if (ep->addressv[code_ix] == ep->trampoline.raw) {
- if (BeamIsOpCode(ep->trampoline.op, op_apply_bif)) {
- continue;
- }
- else if (BeamIsOpCode(ep->trampoline.op, op_i_generic_breakpoint)) {
+ if (BeamIsOpCode(ep->trampoline.op, op_i_generic_breakpoint)) {
ERTS_LC_ASSERT(erts_thr_progress_is_blocking());
ASSERT(modp->curr.num_traced_exports > 0);
DBG_TRACE_MFA_P(&ep->info.mfa,
@@ -1906,6 +1902,12 @@ delete_code(Module* modp)
!erts_initialized);
}
}
+
+ if (ep->bif_table_index != -1 && ep->is_bif_traced) {
+ /* Code unloading kills both global and local call tracing. */
+ ep->is_bif_traced = 0;
+ }
+
ep->addressv[code_ix] = ep->trampoline.raw;
ep->trampoline.op = BeamOpCodeAddr(op_call_error_handler);
ep->trampoline.not_loaded.deferred = 0;