summaryrefslogtreecommitdiff
path: root/erts/emulator
diff options
context:
space:
mode:
authorLukas Larsson <lukas@erlang.org>2020-07-08 17:18:53 +0200
committerLukas Larsson <lukas@erlang.org>2020-09-21 16:40:30 +0200
commit2c251b21dc53b2105be33b0237986880957e3ed3 (patch)
tree3a89c950e35783e888543fc66f7745766eaf5351 /erts/emulator
parent8c3b8f05798ba6feca3804a6b54c328e75db89d7 (diff)
downloaderlang-2c251b21dc53b2105be33b0237986880957e3ed3.tar.gz
erts: Refactor bif exports to be allocated at start-time
This is needed as BeamAsm needs the export entries to be executable, which means that we need to allocate them. Co-authored-by: John Högberg <john@erlang.org> Co-authored-by: Dan Gudmundsson <dgud@erlang.org>
Diffstat (limited to 'erts/emulator')
-rw-r--r--erts/emulator/beam/arith_instrs.tab4
-rw-r--r--erts/emulator/beam/beam_bif_load.c12
-rw-r--r--erts/emulator/beam/beam_debug.c2
-rw-r--r--erts/emulator/beam/beam_emu.c6
-rw-r--r--erts/emulator/beam/bif.c52
-rw-r--r--erts/emulator/beam/bif.h6
-rw-r--r--erts/emulator/beam/binary.c20
-rw-r--r--erts/emulator/beam/dist.c10
-rw-r--r--erts/emulator/beam/erl_bif_binary.c28
-rw-r--r--erts/emulator/beam/erl_bif_chksum.c16
-rw-r--r--erts/emulator/beam/erl_bif_guard.c6
-rw-r--r--erts/emulator/beam/erl_bif_info.c8
-rw-r--r--erts/emulator/beam/erl_bif_lists.c20
-rw-r--r--erts/emulator/beam/erl_bif_persistent.c26
-rw-r--r--erts/emulator/beam/erl_bif_port.c2
-rw-r--r--erts/emulator/beam/erl_bif_re.c6
-rw-r--r--erts/emulator/beam/erl_bif_trace.c6
-rw-r--r--erts/emulator/beam/erl_db.c40
-rw-r--r--erts/emulator/beam/erl_db.h8
-rw-r--r--erts/emulator/beam/erl_db_hash.c8
-rw-r--r--erts/emulator/beam/erl_db_tree.c32
-rw-r--r--erts/emulator/beam/erl_io_queue.c2
-rw-r--r--erts/emulator/beam/erl_map.c4
-rw-r--r--erts/emulator/beam/erl_process.c2
-rw-r--r--erts/emulator/beam/erl_ptab.c6
-rw-r--r--erts/emulator/beam/erl_unicode.c20
-rw-r--r--erts/emulator/beam/external.c30
-rw-r--r--erts/emulator/beam/global.h2
-rw-r--r--erts/emulator/beam/macros.tab4
-rw-r--r--erts/emulator/beam/trace_instrs.tab2
-rwxr-xr-xerts/emulator/utils/make_tables11
31 files changed, 204 insertions, 197 deletions
diff --git a/erts/emulator/beam/arith_instrs.tab b/erts/emulator/beam/arith_instrs.tab
index 406c1bd21b..cbb2005f9e 100644
--- a/erts/emulator/beam/arith_instrs.tab
+++ b/erts/emulator/beam/arith_instrs.tab
@@ -459,10 +459,10 @@ shift.execute(Fail, Dst) {
reg[1] = Op2;
SWAPOUT;
if (IsOpCode(I[0], i_bsl_ssjd)) {
- I = handle_error(c_p, I, reg, &bif_trap_export[BIF_bsl_2].info.mfa);
+ I = handle_error(c_p, I, reg, &BIF_TRAP_EXPORT(BIF_bsl_2)->info.mfa);
} else {
ASSERT(IsOpCode(I[0], i_bsr_ssjd));
- I = handle_error(c_p, I, reg, &bif_trap_export[BIF_bsr_2].info.mfa);
+ I = handle_error(c_p, I, reg, &BIF_TRAP_EXPORT(BIF_bsr_2)->info.mfa);
}
goto post_error_handling;
}
diff --git a/erts/emulator/beam/beam_bif_load.c b/erts/emulator/beam/beam_bif_load.c
index 9dadc07c36..50f6d2aeef 100644
--- a/erts/emulator/beam/beam_bif_load.c
+++ b/erts/emulator/beam/beam_bif_load.c
@@ -260,7 +260,7 @@ BIF_RETTYPE code_make_stub_module_3(BIF_ALIST_3)
BIF_ERROR(BIF_P, BADARG);
if (!erts_try_seize_code_write_permission(BIF_P)) {
- ERTS_BIF_YIELD3(&bif_trap_export[BIF_code_make_stub_module_3],
+ ERTS_BIF_YIELD3(BIF_TRAP_EXPORT(BIF_code_make_stub_module_3),
BIF_P, BIF_ARG_1, BIF_ARG_2, BIF_ARG_3);
}
@@ -395,7 +395,7 @@ finish_loading_1(BIF_ALIST_1)
int do_commit = 0;
if (!erts_try_seize_code_write_permission(BIF_P)) {
- ERTS_BIF_YIELD1(&bif_trap_export[BIF_finish_loading_1], BIF_P, BIF_ARG_1);
+ ERTS_BIF_YIELD1(BIF_TRAP_EXPORT(BIF_finish_loading_1), BIF_P, BIF_ARG_1);
}
/*
@@ -759,7 +759,7 @@ BIF_RETTYPE delete_module_1(BIF_ALIST_1)
}
if (!erts_try_seize_code_write_permission(BIF_P)) {
- ERTS_BIF_YIELD1(&bif_trap_export[BIF_delete_module_1], BIF_P, BIF_ARG_1);
+ ERTS_BIF_YIELD1(BIF_TRAP_EXPORT(BIF_delete_module_1), BIF_P, BIF_ARG_1);
}
{
@@ -886,7 +886,7 @@ BIF_RETTYPE finish_after_on_load_2(BIF_ALIST_2)
}
if (!erts_try_seize_code_write_permission(BIF_P)) {
- ERTS_BIF_YIELD2(&bif_trap_export[BIF_finish_after_on_load_2],
+ ERTS_BIF_YIELD2(BIF_TRAP_EXPORT(BIF_finish_after_on_load_2),
BIF_P, BIF_ARG_1, BIF_ARG_2);
}
@@ -1784,7 +1784,7 @@ BIF_RETTYPE erts_internal_release_literal_area_switch_0(BIF_ALIST_0)
ASSERT(old_area);
ERTS_VBUMP_ALL_REDS(BIF_P);
- BIF_TRAP0(&bif_trap_export[BIF_erts_internal_release_literal_area_switch_0],
+ BIF_TRAP0(BIF_TRAP_EXPORT(BIF_erts_internal_release_literal_area_switch_0),
BIF_P);
}
@@ -2146,7 +2146,7 @@ BIF_RETTYPE erts_internal_purge_module_2(BIF_ALIST_2)
BIF_ERROR(BIF_P, BADARG);
if (!erts_try_seize_code_write_permission(BIF_P)) {
- ERTS_BIF_YIELD2(&bif_trap_export[BIF_erts_internal_purge_module_2],
+ ERTS_BIF_YIELD2(BIF_TRAP_EXPORT(BIF_erts_internal_purge_module_2),
BIF_P, BIF_ARG_1, BIF_ARG_2);
}
diff --git a/erts/emulator/beam/beam_debug.c b/erts/emulator/beam/beam_debug.c
index 9952ae42aa..53f3ea5864 100644
--- a/erts/emulator/beam/beam_debug.c
+++ b/erts/emulator/beam/beam_debug.c
@@ -157,7 +157,7 @@ erts_debug_breakpoint_2(BIF_ALIST_2)
}
if (!erts_try_seize_code_write_permission(BIF_P)) {
- ERTS_BIF_YIELD2(&bif_trap_export[BIF_erts_debug_breakpoint_2],
+ ERTS_BIF_YIELD2(BIF_TRAP_EXPORT(BIF_erts_debug_breakpoint_2),
BIF_P, BIF_ARG_1, BIF_ARG_2);
}
erts_proc_unlock(p, ERTS_PROC_LOCK_MAIN);
diff --git a/erts/emulator/beam/beam_emu.c b/erts/emulator/beam/beam_emu.c
index b7196b87b4..dd862979b4 100644
--- a/erts/emulator/beam/beam_emu.c
+++ b/erts/emulator/beam/beam_emu.c
@@ -926,7 +926,7 @@ static void install_bifs(void) {
/* Set up a hidden export entry so we can trap to this BIF without
* it being seen when tracing. */
- erts_init_trap_export(&bif_trap_export[i],
+ erts_init_trap_export(&BIF_TRAP_EXPORT(i),
entry->module, entry->name, entry->arity,
entry->f);
}
@@ -1221,7 +1221,7 @@ ubif2mfa(void* uf)
int i;
for (i = 0; erts_u_bifs[i].bif; i++) {
if (erts_u_bifs[i].bif == uf)
- return &bif_trap_export[erts_u_bifs[i].exp_ix].info.mfa;
+ return &BIF_TRAP_EXPORT(erts_u_bifs[i].exp_ix)->info.mfa;
}
erts_exit(ERTS_ERROR_EXIT, "bad u bif: %p\n", uf);
return NULL;
@@ -2315,7 +2315,7 @@ erts_hibernate(Process* c_p, Eterm* reg)
ASSERT(!ERTS_PROC_IS_EXITING(c_p));
}
erts_proc_unlock(c_p, ERTS_PROC_LOCK_MSGQ|ERTS_PROC_LOCK_STATUS);
- c_p->current = &bif_trap_export[BIF_hibernate_3].info.mfa;
+ c_p->current = &BIF_TRAP_EXPORT(BIF_hibernate_3)->info.mfa;
c_p->flags |= F_HIBERNATE_SCHED; /* Needed also when woken! */
return 1;
}
diff --git a/erts/emulator/beam/bif.c b/erts/emulator/beam/bif.c
index 7418d2fb78..b8b279c51b 100644
--- a/erts/emulator/beam/bif.c
+++ b/erts/emulator/beam/bif.c
@@ -49,12 +49,12 @@
#include "erl_proc_sig_queue.h"
Export *erts_await_result;
-static Export await_exit_trap;
+static Export *await_exit_trap;
static Export* flush_monitor_messages_trap = NULL;
static Export* set_cpu_topology_trap = NULL;
static Export* await_port_send_result_trap = NULL;
Export* erts_format_cpu_topology_trap = NULL;
-static Export dsend_continue_trap_export;
+static Export *dsend_continue_trap_export;
Export *erts_convert_time_unit_trap = NULL;
static Export *await_msacc_mod_trap = NULL;
@@ -1264,7 +1264,7 @@ erts_internal_await_exit_trap(BIF_ALIST_0)
if (state & ERTS_PSFLG_EXITING)
ERTS_BIF_EXITED(BIF_P);
- ERTS_BIF_YIELD0(&await_exit_trap, BIF_P);
+ ERTS_BIF_YIELD0(await_exit_trap, BIF_P);
}
/**********************************************************************/
@@ -1299,7 +1299,7 @@ static BIF_RETTYPE send_exit_signal_bif(Process *c_p, Eterm id, Eterm reason, in
erts_proc_lock(c_p, ERTS_PROC_LOCK_MSGQ);
erts_proc_sig_fetch(c_p);
erts_proc_unlock(c_p, ERTS_PROC_LOCK_MSGQ);
- ERTS_BIF_PREP_TRAP0(ret_val, &await_exit_trap, c_p);
+ ERTS_BIF_PREP_TRAP0(ret_val, await_exit_trap, c_p);
}
}
else if (is_internal_port(id)) {
@@ -1358,7 +1358,7 @@ static BIF_RETTYPE send_exit_signal_bif(Process *c_p, Eterm id, Eterm reason, in
case ERTS_DSIG_SEND_CONTINUE:
BUMP_ALL_REDS(c_p);
erts_set_gc_state(c_p, 0);
- ERTS_BIF_PREP_TRAP1(ret_val, &dsend_continue_trap_export, c_p,
+ ERTS_BIF_PREP_TRAP1(ret_val, dsend_continue_trap_export, c_p,
erts_dsend_export_trap_context(c_p, &ctx));
break;
case ERTS_DSIG_SEND_OK:
@@ -2196,7 +2196,7 @@ BIF_RETTYPE send_3(BIF_ALIST_3)
break;
case SEND_YIELD:
if (suspend) {
- ERTS_BIF_PREP_YIELD3(retval, &bif_trap_export[BIF_send_3], p, to, msg, opts);
+ ERTS_BIF_PREP_YIELD3(retval, BIF_TRAP_EXPORT(BIF_send_3), p, to, msg, opts);
} else {
ERTS_BIF_PREP_RET(retval, am_nosuspend);
}
@@ -2227,7 +2227,7 @@ BIF_RETTYPE send_3(BIF_ALIST_3)
break;
case SEND_YIELD_CONTINUE:
BUMP_ALL_REDS(p);
- ERTS_BIF_PREP_TRAP1(retval, &dsend_continue_trap_export, p, ctx);
+ ERTS_BIF_PREP_TRAP1(retval, dsend_continue_trap_export, p, ctx);
break;
default:
erts_exit(ERTS_ABORT_EXIT, "send_3 invalid result %d\n", (int)result);
@@ -2270,7 +2270,7 @@ static BIF_RETTYPE dsend_continue_trap_1(BIF_ALIST_1)
case ERTS_DSIG_SEND_CONTINUE: { /*SEND_YIELD_CONTINUE*/
BUMP_ALL_REDS(BIF_P);
- BIF_TRAP1(&dsend_continue_trap_export, BIF_P, BIF_ARG_1);
+ BIF_TRAP1(dsend_continue_trap_export, BIF_P, BIF_ARG_1);
}
case ERTS_DSIG_SEND_TOO_LRG: { /*SEND_SYSTEM_LIMIT*/
erts_set_gc_state(BIF_P, 1);
@@ -2313,7 +2313,7 @@ Eterm erl_send(Process *p, Eterm to, Eterm msg)
ERTS_BIF_PREP_RET(retval, msg);
break;
case SEND_YIELD:
- ERTS_BIF_PREP_YIELD2(retval, &bif_trap_export[BIF_send_2], p, to, msg);
+ ERTS_BIF_PREP_YIELD2(retval, BIF_TRAP_EXPORT(BIF_send_2), p, to, msg);
break;
case SEND_YIELD_RETURN:
yield_return:
@@ -2338,7 +2338,7 @@ Eterm erl_send(Process *p, Eterm to, Eterm msg)
break;
case SEND_YIELD_CONTINUE:
BUMP_ALL_REDS(p);
- ERTS_BIF_PREP_TRAP1(retval, &dsend_continue_trap_export, p, ctx);
+ ERTS_BIF_PREP_TRAP1(retval, dsend_continue_trap_export, p, ctx);
break;
default:
erts_exit(ERTS_ABORT_EXIT, "invalid send result %d\n", (int)result);
@@ -2599,7 +2599,7 @@ BIF_RETTYPE iolist_size_1(BIF_ALIST_1)
} else {
ERTS_BIF_ERROR_TRAPPED1(BIF_P,
BADARG,
- &bif_trap_export[BIF_iolist_size_1],
+ BIF_TRAP_EXPORT(BIF_iolist_size_1),
input_list);
}
@@ -2619,7 +2619,7 @@ BIF_RETTYPE iolist_size_1(BIF_ALIST_1)
ESTACK_SAVE(s, &context->stack);
erts_set_gc_state(BIF_P, 0);
BUMP_ALL_REDS(BIF_P);
- BIF_TRAP1(&bif_trap_export[BIF_iolist_size_1], BIF_P, state_mref);
+ BIF_TRAP1(BIF_TRAP_EXPORT(BIF_iolist_size_1), BIF_P, state_mref);
}
/**********************************************************************/
@@ -3957,7 +3957,7 @@ BIF_RETTYPE halt_2(BIF_ALIST_2)
("System halted by BIF halt(%T, %T)\n", BIF_ARG_1, BIF_ARG_2));
if (flush) {
erts_halt(pos_int_code);
- ERTS_BIF_YIELD2(&bif_trap_export[BIF_halt_2], BIF_P, am_undefined, am_undefined);
+ ERTS_BIF_YIELD2(BIF_TRAP_EXPORT(BIF_halt_2), BIF_P, am_undefined, am_undefined);
}
else {
erts_proc_unlock(BIF_P, ERTS_PROC_LOCK_MAIN);
@@ -4545,7 +4545,7 @@ BIF_RETTYPE system_flag_2(BIF_ALIST_2)
BIF_RET(am_enabled);
case ERTS_SCHDLR_SSPND_YIELD_RESTART:
ERTS_VBUMP_ALL_REDS(BIF_P);
- BIF_TRAP2(&bif_trap_export[BIF_system_flag_2],
+ BIF_TRAP2(BIF_TRAP_EXPORT(BIF_system_flag_2),
BIF_P, BIF_ARG_1, BIF_ARG_2);
case ERTS_SCHDLR_SSPND_YIELD_DONE:
ERTS_BIF_YIELD_RETURN_X(BIF_P, am_enabled,
@@ -4570,7 +4570,7 @@ BIF_RETTYPE system_flag_2(BIF_ALIST_2)
BIF_RET(make_small(old_no));
case ERTS_SCHDLR_SSPND_YIELD_RESTART:
ERTS_VBUMP_ALL_REDS(BIF_P);
- BIF_TRAP2(&bif_trap_export[BIF_system_flag_2],
+ BIF_TRAP2(BIF_TRAP_EXPORT(BIF_system_flag_2),
BIF_P, BIF_ARG_1, BIF_ARG_2);
case ERTS_SCHDLR_SSPND_YIELD_DONE:
ERTS_BIF_YIELD_RETURN_X(BIF_P, make_small(old_no),
@@ -4734,7 +4734,7 @@ BIF_RETTYPE system_flag_2(BIF_ALIST_2)
BIF_RET(make_small(old_no));
case ERTS_SCHDLR_SSPND_YIELD_RESTART:
ERTS_VBUMP_ALL_REDS(BIF_P);
- BIF_TRAP2(&bif_trap_export[BIF_system_flag_2],
+ BIF_TRAP2(BIF_TRAP_EXPORT(BIF_system_flag_2),
BIF_P, BIF_ARG_1, BIF_ARG_2);
case ERTS_SCHDLR_SSPND_YIELD_DONE:
ERTS_BIF_YIELD_RETURN_X(BIF_P, make_small(old_no),
@@ -4889,7 +4889,7 @@ BIF_RETTYPE phash2_1(BIF_ALIST_1)
if (trap_state == THE_NON_VALUE) {
BIF_RET(make_small(hash & ((1L << 27) - 1)));
} else {
- BIF_TRAP1(&bif_trap_export[BIF_phash2_1], BIF_P, trap_state);
+ BIF_TRAP1(BIF_TRAP_EXPORT(BIF_phash2_1), BIF_P, trap_state);
}
}
@@ -4912,7 +4912,7 @@ BIF_RETTYPE phash2_2(BIF_ALIST_2)
}
hash = trapping_make_hash2(BIF_ARG_1, &trap_state, BIF_P);
if (trap_state != THE_NON_VALUE) {
- BIF_TRAP2(&bif_trap_export[BIF_phash2_2], BIF_P, trap_state, BIF_ARG_2);
+ BIF_TRAP2(BIF_TRAP_EXPORT(BIF_phash2_2), BIF_P, trap_state, BIF_ARG_2);
}
if (range) {
final_hash = hash % range; /* [0..range-1] */
@@ -4983,21 +4983,22 @@ static BIF_RETTYPE bif_return_trap(BIF_ALIST_2)
BIF_RET(res);
}
-Export bif_return_trap_export;
+Export *bif_return_trap_export;
-void erts_init_trap_export(Export* ep, Eterm m, Eterm f, Uint a,
+void erts_init_trap_export(Export** epp, Eterm m, Eterm f, Uint a,
Eterm (*bif)(BIF_ALIST))
{
+ Export* ep;
int i;
+ ep = erts_alloc(ERTS_ALC_T_EXPORT, sizeof(Export));
sys_memset((void *) ep, 0, sizeof(Export));
- for (i=0; i<ERTS_NUM_CODE_IX; i++) {
- ep->addressv[i] = ep->trampoline.raw;
+ for (i = 0; i < ERTS_NUM_CODE_IX; i++) {
+ ep->addressv[i] = &ep->trampoline.raw[0];
}
ep->bif_number = -1;
-
ep->info.op = op_i_func_info_IaaI;
ep->info.mfa.module = m;
ep->info.mfa.function = f;
@@ -5005,13 +5006,16 @@ void erts_init_trap_export(Export* ep, Eterm m, Eterm f, Uint a,
ep->trampoline.op = BeamOpCodeAddr(op_call_bif_W);
ep->trampoline.raw[1] = (BeamInstr)bif;
+ *epp = ep;
}
/*
* Writes a BIF call wrapper to the given address.
*/
void erts_write_bif_wrapper(Export *export, BeamInstr *address) {
- BifEntry *entry = &bif_table[export->bif_number];
+ BifEntry *entry;
+ ASSERT(export->bif_number >= 0 && export->bif_number < BIF_SIZE);
+ entry = &bif_table[export->bif_number];
address[0] = BeamOpCodeAddr(op_call_bif_W);
address[1] = (BeamInstr)entry->f;
diff --git a/erts/emulator/beam/bif.h b/erts/emulator/beam/bif.h
index cf9f61c0b8..9925c6895e 100644
--- a/erts/emulator/beam/bif.h
+++ b/erts/emulator/beam/bif.h
@@ -381,11 +381,11 @@ do { \
return THE_NON_VALUE; \
} while(0)
-extern Export bif_return_trap_export;
+extern Export *bif_return_trap_export;
#define ERTS_BIF_PREP_YIELD_RETURN_X(RET, P, VAL, OP) \
do { \
ERTS_VBUMP_ALL_REDS(P); \
- ERTS_BIF_PREP_TRAP2(RET, &bif_return_trap_export, (P), (VAL), (OP));\
+ ERTS_BIF_PREP_TRAP2(RET, bif_return_trap_export, (P), (VAL), (OP));\
} while (0)
#define ERTS_BIF_PREP_YIELD_RETURN(RET, P, VAL) \
@@ -394,7 +394,7 @@ do { \
#define ERTS_BIF_YIELD_RETURN_X(P, VAL, OP) \
do { \
ERTS_VBUMP_ALL_REDS(P); \
- BIF_TRAP2(&bif_return_trap_export, (P), (VAL), (OP)); \
+ BIF_TRAP2(bif_return_trap_export, (P), (VAL), (OP)); \
} while (0)
#define ERTS_BIF_RETURN_YIELD(P) ERTS_VBUMP_ALL_REDS((P))
diff --git a/erts/emulator/beam/binary.c b/erts/emulator/beam/binary.c
index 436eafbff2..dc7272857c 100644
--- a/erts/emulator/beam/binary.c
+++ b/erts/emulator/beam/binary.c
@@ -37,8 +37,8 @@
#define L2B_B2L_MIN_EXEC_REDS (CONTEXT_REDS/4)
#define L2B_B2L_RESCHED_REDS (CONTEXT_REDS/40)
-static Export binary_to_list_continue_export;
-static Export list_to_binary_continue_export;
+static Export *binary_to_list_continue_export;
+static Export *list_to_binary_continue_export;
static BIF_RETTYPE binary_to_list_continue(BIF_ALIST_1);
static BIF_RETTYPE list_to_binary_continue(BIF_ALIST_1);
@@ -477,7 +477,7 @@ binary_to_list_chunk(Process *c_p,
ASSERT(c_p->flags & F_DISABLE_GC);
ASSERT(is_value(mb_eterm));
ERTS_BIF_PREP_TRAP1(ret,
- &binary_to_list_continue_export,
+ binary_to_list_continue_export,
c_p,
mb_eterm);
}
@@ -567,7 +567,7 @@ BIF_RETTYPE binary_to_list_1(BIF_ALIST_1)
if (size < L2B_B2L_MIN_EXEC_REDS*ERTS_B2L_BYTES_PER_REDUCTION) {
if (reds_left <= L2B_B2L_RESCHED_REDS) {
/* Yield and do it with full context reds... */
- ERTS_BIF_YIELD1(&bif_trap_export[BIF_binary_to_list_1],
+ ERTS_BIF_YIELD1(BIF_TRAP_EXPORT(BIF_binary_to_list_1),
BIF_P, BIF_ARG_1);
}
/* Allow a bit more reductions... */
@@ -621,7 +621,7 @@ BIF_RETTYPE binary_to_list_3(BIF_ALIST_3)
if (size < L2B_B2L_MIN_EXEC_REDS*ERTS_B2L_BYTES_PER_REDUCTION) {
if (reds_left <= L2B_B2L_RESCHED_REDS) {
/* Yield and do it with full context reds... */
- ERTS_BIF_YIELD3(&bif_trap_export[BIF_binary_to_list_3],
+ ERTS_BIF_YIELD3(BIF_TRAP_EXPORT(BIF_binary_to_list_3),
BIF_P, BIF_ARG_1, BIF_ARG_2, BIF_ARG_3);
}
/* Allow a bit more reductions... */
@@ -668,7 +668,7 @@ BIF_RETTYPE bitstring_to_list_1(BIF_ALIST_1)
if (size < L2B_B2L_MIN_EXEC_REDS*ERTS_B2L_BYTES_PER_REDUCTION) {
if (reds_left <= L2B_B2L_RESCHED_REDS) {
/* Yield and do it with full context reds... */
- ERTS_BIF_YIELD1(&bif_trap_export[BIF_bitstring_to_list_1],
+ ERTS_BIF_YIELD1(BIF_TRAP_EXPORT(BIF_bitstring_to_list_1),
BIF_P, BIF_ARG_1);
}
/* Allow a bit more reductions... */
@@ -882,7 +882,7 @@ list_to_binary_chunk(Eterm mb_eterm,
ASSERT(c_p->flags & F_DISABLE_GC);
ERTS_BIF_PREP_TRAP1(ret,
- &list_to_binary_continue_export,
+ list_to_binary_continue_export,
c_p,
mb_eterm);
break;
@@ -1041,7 +1041,7 @@ HIPE_WRAPPER_BIF_DISABLE_GC(list_to_binary, 1)
BIF_RETTYPE list_to_binary_1(BIF_ALIST_1)
{
- return erts_list_to_binary_bif(BIF_P, BIF_ARG_1, &bif_trap_export[BIF_list_to_binary_1]);
+ return erts_list_to_binary_bif(BIF_P, BIF_ARG_1, BIF_TRAP_EXPORT(BIF_list_to_binary_1));
}
HIPE_WRAPPER_BIF_DISABLE_GC(iolist_to_binary, 1)
@@ -1054,7 +1054,7 @@ BIF_RETTYPE iolist_to_binary_1(BIF_ALIST_1)
}
BIF_ERROR(BIF_P, BADARG);
}
- return erts_list_to_binary_bif(BIF_P, BIF_ARG_1, &bif_trap_export[BIF_iolist_to_binary_1]);
+ return erts_list_to_binary_bif(BIF_P, BIF_ARG_1, BIF_TRAP_EXPORT(BIF_iolist_to_binary_1));
}
static int bitstr_list_len(ErtsIOListState *);
@@ -1081,7 +1081,7 @@ BIF_RETTYPE list_to_bitstring_1(BIF_ALIST_1)
else {
ErtsL2BState state = ERTS_L2B_STATE_INITER(BIF_P,
BIF_ARG_1,
- &bif_trap_export[BIF_list_to_bitstring_1],
+ BIF_TRAP_EXPORT(BIF_list_to_bitstring_1),
bitstr_list_len,
list_to_bitstr_buf_yielding);
int orig_reds_left = ERTS_BIF_REDS_LEFT(BIF_P);
diff --git a/erts/emulator/beam/dist.c b/erts/emulator/beam/dist.c
index 6a674dffd4..4aaa030e49 100644
--- a/erts/emulator/beam/dist.c
+++ b/erts/emulator/beam/dist.c
@@ -177,7 +177,7 @@ int erts_dist_buf_busy_limit;
int erts_dflags_test_remove_hopefull_flags;
-Export spawn_request_yield_export;
+Export *spawn_request_yield_export;
/* distribution trap functions */
Export* dmonitor_node_trap = NULL;
@@ -4136,7 +4136,7 @@ dist_ctrl_get_data_1(BIF_ALIST_1)
erts_de_runlock(dep);
if (obufsize)
erts_atomic_add_nob(&dep->qsize, (erts_aint_t) -obufsize);
- ERTS_BIF_YIELD1(&bif_trap_export[BIF_dist_ctrl_get_data_1],
+ ERTS_BIF_YIELD1(BIF_TRAP_EXPORT(BIF_dist_ctrl_get_data_1),
BIF_P, BIF_ARG_1);
}
@@ -4837,7 +4837,7 @@ BIF_RETTYPE erts_internal_create_dist_channel_3(BIF_ALIST_3)
erts_proc_inc_refc(BIF_P);
erts_suspend(BIF_P, ERTS_PROC_LOCK_MAIN, NULL);
ERTS_BIF_PREP_YIELD3(ret,
- &bif_trap_export[BIF_erts_internal_create_dist_channel_3],
+ BIF_TRAP_EXPORT(BIF_erts_internal_create_dist_channel_3),
BIF_P, BIF_ARG_1, BIF_ARG_2, BIF_ARG_3);
goto done;
@@ -5240,7 +5240,7 @@ static BIF_RETTYPE spawn_request_yield_3(BIF_ALIST_3)
case ERTS_DSIG_SEND_CONTINUE: {
BUMP_ALL_REDS(BIF_P);
- BIF_TRAP3(&spawn_request_yield_export, BIF_P,
+ BIF_TRAP3(spawn_request_yield_export, BIF_P,
BIF_ARG_1, BIF_ARG_2, BIF_ARG_3);
}
@@ -5546,7 +5546,7 @@ BIF_RETTYPE erts_internal_dist_spawn_request_4(BIF_ALIST_4)
erts_set_gc_state(BIF_P, 0);
ctx_term = erts_dsend_export_trap_context(BIF_P, &ctx);
BUMP_ALL_REDS(BIF_P);
- ERTS_BIF_PREP_TRAP3(ret_val, &spawn_request_yield_export,
+ ERTS_BIF_PREP_TRAP3(ret_val, spawn_request_yield_export,
BIF_P, ctx_term, ok_result, tag);
break;
}
diff --git a/erts/emulator/beam/erl_bif_binary.c b/erts/emulator/beam/erl_bif_binary.c
index 98b38f156a..90e1d22097 100644
--- a/erts/emulator/beam/erl_bif_binary.c
+++ b/erts/emulator/beam/erl_bif_binary.c
@@ -55,13 +55,13 @@
/* Init and local variables */
-static Export binary_find_trap_export;
+static Export *binary_find_trap_export;
static BIF_RETTYPE binary_find_trap(BIF_ALIST_3);
-static Export binary_longest_prefix_trap_export;
+static Export *binary_longest_prefix_trap_export;
static BIF_RETTYPE binary_longest_prefix_trap(BIF_ALIST_3);
-static Export binary_longest_suffix_trap_export;
+static Export *binary_longest_suffix_trap_export;
static BIF_RETTYPE binary_longest_suffix_trap(BIF_ALIST_3);
-static Export binary_copy_trap_export;
+static Export *binary_copy_trap_export;
static BIF_RETTYPE binary_copy_trap(BIF_ALIST_2);
static Uint max_loop_limit;
@@ -1555,7 +1555,7 @@ binary_match(Process *p, Eterm arg1, Eterm arg2, Eterm arg3, Uint flags)
BIF_RET(result);
case BF_RESTART:
ASSERT(result == THE_NON_VALUE && ctx->trap_term != result && ctx->pat_term != result);
- BIF_TRAP3(&binary_find_trap_export, p, arg1, ctx->trap_term, ctx->pat_term);
+ BIF_TRAP3(binary_find_trap_export, p, arg1, ctx->trap_term, ctx->pat_term);
default:
goto badarg;
}
@@ -1616,7 +1616,7 @@ binary_split(Process *p, Eterm arg1, Eterm arg2, Eterm arg3)
BIF_RET(result);
case BF_RESTART:
ASSERT(result == THE_NON_VALUE && ctx->trap_term != result && ctx->pat_term != result);
- BIF_TRAP3(&binary_find_trap_export, p, arg1, ctx->trap_term, ctx->pat_term);
+ BIF_TRAP3(binary_find_trap_export, p, arg1, ctx->trap_term, ctx->pat_term);
default:
goto badarg;
}
@@ -1927,7 +1927,7 @@ static BIF_RETTYPE binary_find_trap(BIF_ALIST_3)
BIF_RET(result);
} else {
ASSERT(result == THE_NON_VALUE && ctx->trap_term != result && ctx->pat_term != result);
- BIF_TRAP3(&binary_find_trap_export, BIF_P, BIF_ARG_1, BIF_ARG_2, BIF_ARG_3);
+ BIF_TRAP3(binary_find_trap_export, BIF_P, BIF_ARG_1, BIF_ARG_2, BIF_ARG_3);
}
}
@@ -2220,11 +2220,11 @@ static BIF_RETTYPE do_longest_common(Process *p, Eterm list, int direction)
pos = 0;
if (direction == DIRECTION_PREFIX) {
- trapper = &binary_longest_prefix_trap_export;
+ trapper = binary_longest_prefix_trap_export;
res = do_search_forward(cd,&pos,&reds);
} else {
ASSERT(direction == DIRECTION_SUFFIX);
- trapper = &binary_longest_suffix_trap_export;
+ trapper = binary_longest_suffix_trap_export;
res = do_search_backward(cd,&pos,&reds);
}
epos = erts_make_integer(pos,p);
@@ -2274,11 +2274,11 @@ static BIF_RETTYPE do_longest_common_trap(Process *p, Eterm bin_term, Eterm curr
bin = erts_magic_ref2bin(bin_term);
cd = (CommonData *) ERTS_MAGIC_BIN_DATA(bin);
if (direction == DIRECTION_PREFIX) {
- trapper = &binary_longest_prefix_trap_export;
+ trapper = binary_longest_prefix_trap_export;
res = do_search_forward(cd,&pos,&reds);
} else {
ASSERT(direction == DIRECTION_SUFFIX);
- trapper = &binary_longest_suffix_trap_export;
+ trapper = binary_longest_suffix_trap_export;
res = do_search_backward(cd,&pos,&reds);
}
epos = erts_make_integer(pos,p);
@@ -2413,7 +2413,7 @@ HIPE_WRAPPER_BIF_DISABLE_GC(binary_list_to_bin, 1)
BIF_RETTYPE binary_list_to_bin_1(BIF_ALIST_1)
{
- return erts_list_to_binary_bif(BIF_P, BIF_ARG_1, &bif_trap_export[BIF_binary_list_to_bin_1]);
+ return erts_list_to_binary_bif(BIF_P, BIF_ARG_1, BIF_TRAP_EXPORT(BIF_binary_list_to_bin_1));
}
typedef struct {
@@ -2554,7 +2554,7 @@ static BIF_RETTYPE do_binary_copy(Process *p, Eterm bin, Eterm en)
hp = HAlloc(p, ERTS_MAGIC_REF_THING_SIZE);
trap_term = erts_mk_magic_ref(&hp, &MSO(p), mb);
BUMP_ALL_REDS(p);
- BIF_TRAP2(&binary_copy_trap_export, p, bin, trap_term);
+ BIF_TRAP2(binary_copy_trap_export, p, bin, trap_term);
} else {
Eterm res_term;
byte *temp_alloc = NULL;
@@ -2606,7 +2606,7 @@ BIF_RETTYPE binary_copy_trap(BIF_ALIST_2)
cbs->result_pos = pos;
cbs->times_left -= i;
BUMP_ALL_REDS(BIF_P);
- BIF_TRAP2(&binary_copy_trap_export, BIF_P, BIF_ARG_1, BIF_ARG_2);
+ BIF_TRAP2(binary_copy_trap_export, BIF_P, BIF_ARG_1, BIF_ARG_2);
} else {
Binary *save;
Eterm resbin;
diff --git a/erts/emulator/beam/erl_bif_chksum.c b/erts/emulator/beam/erl_bif_chksum.c
index 4cab9bec1d..d19b7d0590 100644
--- a/erts/emulator/beam/erl_bif_chksum.c
+++ b/erts/emulator/beam/erl_bif_chksum.c
@@ -38,7 +38,7 @@ typedef void (*ChksumFun)(void *sum_in_out, unsigned char *buf,
/* Hidden trap target */
static BIF_RETTYPE md5_2(BIF_ALIST_2);
-static Export chksum_md5_2_exp;
+static Export *chksum_md5_2_exp;
void erts_init_bif_chksum(void)
{
@@ -327,7 +327,7 @@ crc32_1(BIF_ALIST_1)
res_sum = erts_make_integer(chksum,BIF_P);
if (rest != NIL) {
BUMP_ALL_REDS(BIF_P);
- BIF_TRAP2(&bif_trap_export[BIF_crc32_2], BIF_P, res_sum, rest);
+ BIF_TRAP2(BIF_TRAP_EXPORT(BIF_crc32_2), BIF_P, res_sum, rest);
}
BIF_RET(res_sum);
}
@@ -354,7 +354,7 @@ crc32_2(BIF_ALIST_2)
res_sum = erts_make_integer(chksum,BIF_P);
if (rest != NIL) {
BUMP_ALL_REDS(BIF_P);
- BIF_TRAP2(&bif_trap_export[BIF_crc32_2], BIF_P, res_sum, rest);
+ BIF_TRAP2(BIF_TRAP_EXPORT(BIF_crc32_2), BIF_P, res_sum, rest);
}
BIF_RET(res_sum);
}
@@ -407,7 +407,7 @@ adler32_1(BIF_ALIST_1)
res_sum = erts_make_integer(chksum,BIF_P);
if (rest != NIL) {
BUMP_ALL_REDS(BIF_P);
- BIF_TRAP2(&bif_trap_export[BIF_adler32_2], BIF_P, res_sum, rest);
+ BIF_TRAP2(BIF_TRAP_EXPORT(BIF_adler32_2), BIF_P, res_sum, rest);
}
BIF_RET(res_sum);
}
@@ -434,7 +434,7 @@ adler32_2(BIF_ALIST_2)
res_sum = erts_make_integer(chksum,BIF_P);
if (rest != NIL) {
BUMP_ALL_REDS(BIF_P);
- BIF_TRAP2(&bif_trap_export[BIF_adler32_2], BIF_P, res_sum, rest);
+ BIF_TRAP2(BIF_TRAP_EXPORT(BIF_adler32_2), BIF_P, res_sum, rest);
}
BIF_RET(res_sum);
}
@@ -494,7 +494,7 @@ md5_1(BIF_ALIST_1)
if (rest != NIL) {
BUMP_ALL_REDS(BIF_P);
bin = new_binary(BIF_P, (byte *) &context, sizeof(MD5_CTX));
- BIF_TRAP2(&chksum_md5_2_exp, BIF_P, bin, rest);
+ BIF_TRAP2(chksum_md5_2_exp, BIF_P, bin, rest);
}
BUMP_REDS(BIF_P,res);
bin = new_binary(BIF_P, (byte *)NULL, 16);
@@ -526,7 +526,7 @@ md5_2(BIF_ALIST_2)
if (rest != NIL) {
BUMP_ALL_REDS(BIF_P);
bin = new_binary(BIF_P, (byte *) &context, sizeof(MD5_CTX));
- BIF_TRAP2(&chksum_md5_2_exp, BIF_P, bin, rest);
+ BIF_TRAP2(chksum_md5_2_exp, BIF_P, bin, rest);
}
BUMP_REDS(BIF_P,res);
bin = new_binary(BIF_P, (byte *)NULL, 16);
@@ -575,7 +575,7 @@ md5_update_2(BIF_ALIST_2)
bin = new_binary(BIF_P, (byte *) &context, sizeof(MD5_CTX));
if (rest != NIL) {
BUMP_ALL_REDS(BIF_P);
- BIF_TRAP2(&bif_trap_export[BIF_md5_update_2], BIF_P, bin, rest);
+ BIF_TRAP2(BIF_TRAP_EXPORT(BIF_md5_update_2), BIF_P, bin, rest);
}
BUMP_REDS(BIF_P,res);
BIF_RET(bin);
diff --git a/erts/emulator/beam/erl_bif_guard.c b/erts/emulator/beam/erl_bif_guard.c
index 7526888106..8b463a1189 100644
--- a/erts/emulator/beam/erl_bif_guard.c
+++ b/erts/emulator/beam/erl_bif_guard.c
@@ -43,7 +43,7 @@
static Eterm double_to_integer(Process* p, double x);
static BIF_RETTYPE erlang_length_trap(BIF_ALIST_3);
-static Export erlang_length_export;
+static Export *erlang_length_export;
void erts_init_bif_guard(void)
{
@@ -233,13 +233,13 @@ static BIF_RETTYPE erlang_length_trap(BIF_ALIST_3)
/*
* The available reductions were exceeded. Trap.
*/
- BIF_TRAP3(&erlang_length_export, BIF_P, BIF_ARG_1, BIF_ARG_2, BIF_ARG_3);
+ BIF_TRAP3(erlang_length_export, BIF_P, BIF_ARG_1, BIF_ARG_2, BIF_ARG_3);
} else {
/*
* Signal an error. The original argument was tucked away in BIF_ARG_3.
*/
ERTS_BIF_ERROR_TRAPPED1(BIF_P, BIF_P->freason,
- &bif_trap_export[BIF_length_1], BIF_ARG_3);
+ BIF_TRAP_EXPORT(BIF_length_1), BIF_ARG_3);
}
}
}
diff --git a/erts/emulator/beam/erl_bif_info.c b/erts/emulator/beam/erl_bif_info.c
index 1566fe0bc3..359359a948 100644
--- a/erts/emulator/beam/erl_bif_info.c
+++ b/erts/emulator/beam/erl_bif_info.c
@@ -1249,9 +1249,9 @@ exited:
yield:
if (pi2)
- ERTS_BIF_PREP_YIELD2(ret, &bif_trap_export[BIF_process_info_2], c_p, pid, opt);
+ ERTS_BIF_PREP_YIELD2(ret, BIF_TRAP_EXPORT(BIF_process_info_2), c_p, pid, opt);
else
- ERTS_BIF_PREP_YIELD1(ret, &bif_trap_export[BIF_process_info_1], c_p, pid);
+ ERTS_BIF_PREP_YIELD1(ret, BIF_TRAP_EXPORT(BIF_process_info_1), c_p, pid);
goto done;
send_signal: {
@@ -4666,7 +4666,7 @@ BIF_RETTYPE erts_debug_set_internal_state_2(BIF_ALIST_2)
if (!flag && BIF_ARG_2 != am_false) {
erts_atomic_set_nob(&hipe_test_reschedule_flag, 1);
erts_suspend(BIF_P, ERTS_PROC_LOCK_MAIN, NULL);
- ERTS_BIF_YIELD2(&bif_trap_export[BIF_erts_debug_set_internal_state_2],
+ ERTS_BIF_YIELD2(BIF_TRAP_EXPORT(BIF_erts_debug_set_internal_state_2),
BIF_P, BIF_ARG_1, BIF_ARG_2);
}
erts_atomic_set_nob(&hipe_test_reschedule_flag, !flag);
@@ -4840,7 +4840,7 @@ BIF_RETTYPE erts_debug_set_internal_state_2(BIF_ALIST_2)
switch(BIF_ARG_2) {
case am_true:
if (!erts_try_seize_code_write_permission(BIF_P)) {
- ERTS_BIF_YIELD2(&bif_trap_export[BIF_erts_debug_set_internal_state_2],
+ ERTS_BIF_YIELD2(BIF_TRAP_EXPORT(BIF_erts_debug_set_internal_state_2),
BIF_P, BIF_ARG_1, BIF_ARG_2);
}
BIF_RET(am_true);
diff --git a/erts/emulator/beam/erl_bif_lists.c b/erts/emulator/beam/erl_bif_lists.c
index 7cb9b4900b..906edab8c0 100644
--- a/erts/emulator/beam/erl_bif_lists.c
+++ b/erts/emulator/beam/erl_bif_lists.c
@@ -307,12 +307,12 @@ static Eterm append(Export *bif_entry, BIF_ALIST_2) {
Eterm
ebif_plusplus_2(BIF_ALIST_2)
{
- return append(&bif_trap_export[BIF_ebif_plusplus_2], BIF_CALL_ARGS);
+ return append(BIF_TRAP_EXPORT(BIF_ebif_plusplus_2), BIF_CALL_ARGS);
}
BIF_RETTYPE append_2(BIF_ALIST_2)
{
- return append(&bif_trap_export[BIF_append_2], BIF_CALL_ARGS);
+ return append(BIF_TRAP_EXPORT(BIF_append_2), BIF_CALL_ARGS);
}
/* erlang:'--'/2
@@ -1036,11 +1036,11 @@ static Eterm subtract(Export *bif_entry, BIF_ALIST_2) {
}
BIF_RETTYPE ebif_minusminus_2(BIF_ALIST_2) {
- return subtract(&bif_trap_export[BIF_ebif_minusminus_2], BIF_CALL_ARGS);
+ return subtract(BIF_TRAP_EXPORT(BIF_ebif_minusminus_2), BIF_CALL_ARGS);
}
BIF_RETTYPE subtract_2(BIF_ALIST_2) {
- return subtract(&bif_trap_export[BIF_subtract_2], BIF_CALL_ARGS);
+ return subtract(BIF_TRAP_EXPORT(BIF_subtract_2), BIF_CALL_ARGS);
}
@@ -1065,7 +1065,7 @@ BIF_RETTYPE lists_member_2(BIF_ALIST_2)
while (is_list(list)) {
if (--max_iter < 0) {
BUMP_ALL_REDS(BIF_P);
- BIF_TRAP2(&bif_trap_export[BIF_lists_member_2], BIF_P, term, list);
+ BIF_TRAP2(BIF_TRAP_EXPORT(BIF_lists_member_2), BIF_P, term, list);
}
item = CAR(list_val(list));
if ((item == term) || (non_immed_key && eq(item, term))) {
@@ -1127,7 +1127,7 @@ static BIF_RETTYPE lists_reverse_alloc(Process *c_p,
}
ASSERT(is_list(tail) && cells_left == 0);
- BIF_TRAP2(&bif_trap_export[BIF_lists_reverse_2], c_p, list, tail);
+ BIF_TRAP2(BIF_TRAP_EXPORT(BIF_lists_reverse_2), c_p, list, tail);
}
static BIF_RETTYPE lists_reverse_onheap(Process *c_p,
@@ -1176,7 +1176,7 @@ static BIF_RETTYPE lists_reverse_onheap(Process *c_p,
}
BUMP_ALL_REDS(c_p);
- BIF_TRAP2(&bif_trap_export[BIF_lists_reverse_2], c_p, list, tail);
+ BIF_TRAP2(BIF_TRAP_EXPORT(BIF_lists_reverse_2), c_p, list, tail);
}
BIF_ERROR(c_p, BADARG);
@@ -1206,7 +1206,7 @@ lists_keymember_3(BIF_ALIST_3)
{
Eterm res;
- res = keyfind(&bif_trap_export[BIF_lists_keymember_3], BIF_P,
+ res = keyfind(BIF_TRAP_EXPORT(BIF_lists_keymember_3), BIF_P,
BIF_ARG_1, BIF_ARG_2, BIF_ARG_3);
if (is_value(res) && is_tuple(res)) {
return am_true;
@@ -1220,7 +1220,7 @@ lists_keysearch_3(BIF_ALIST_3)
{
Eterm res;
- res = keyfind(&bif_trap_export[BIF_lists_keysearch_3], BIF_P,
+ res = keyfind(BIF_TRAP_EXPORT(BIF_lists_keysearch_3), BIF_P,
BIF_ARG_1, BIF_ARG_2, BIF_ARG_3);
if (is_non_value(res) || is_not_tuple(res)) {
return res;
@@ -1233,7 +1233,7 @@ lists_keysearch_3(BIF_ALIST_3)
BIF_RETTYPE
lists_keyfind_3(BIF_ALIST_3)
{
- return keyfind(&bif_trap_export[BIF_lists_keyfind_3], BIF_P,
+ return keyfind(BIF_TRAP_EXPORT(BIF_lists_keyfind_3), BIF_P,
BIF_ARG_1, BIF_ARG_2, BIF_ARG_3);
}
diff --git a/erts/emulator/beam/erl_bif_persistent.c b/erts/emulator/beam/erl_bif_persistent.c
index 461e8862d8..4f720cacb0 100644
--- a/erts/emulator/beam/erl_bif_persistent.c
+++ b/erts/emulator/beam/erl_bif_persistent.c
@@ -170,9 +170,9 @@ static int cleanup_trap_data(Binary *bp);
* Traps
*/
-static Export persistent_term_get_all_export;
+static Export *persistent_term_get_all_export;
static BIF_RETTYPE persistent_term_get_all_trap(BIF_ALIST_2);
-static Export persistent_term_info_export;
+static Export *persistent_term_info_export;
static BIF_RETTYPE persistent_term_info_trap(BIF_ALIST_1);
/*
@@ -310,7 +310,7 @@ BIF_RETTYPE persistent_term_put_2(BIF_ALIST_2)
long iterations_until_trap;
long max_iterations;
#define PUT_TRAP_CODE \
- BIF_TRAP2(&bif_trap_export[BIF_persistent_term_put_2], BIF_P, state_mref, BIF_ARG_2)
+ BIF_TRAP2(BIF_TRAP_EXPORT(BIF_persistent_term_put_2), BIF_P, state_mref, BIF_ARG_2)
#define TRAPPING_COPY_TABLE_PUT(TABLE_DEST, OLD_TABLE, NEW_SIZE, COPY_TYPE, LOC_NAME) \
TRAPPING_COPY_TABLE(TABLE_DEST, OLD_TABLE, NEW_SIZE, COPY_TYPE, LOC_NAME, PUT_TRAP_CODE)
@@ -351,7 +351,7 @@ BIF_RETTYPE persistent_term_put_2(BIF_ALIST_2)
if (!try_seize_update_permission(BIF_P)) {
- ERTS_BIF_YIELD2(&bif_trap_export[BIF_persistent_term_put_2],
+ ERTS_BIF_YIELD2(BIF_TRAP_EXPORT(BIF_persistent_term_put_2),
BIF_P, BIF_ARG_1, BIF_ARG_2);
}
ctx->hash_table = (HashTable *) erts_atomic_read_nob(&the_hash_table);
@@ -447,7 +447,7 @@ BIF_RETTYPE persistent_term_get_0(BIF_ALIST_0)
/* Prevent concurrent updates to get a consistent view */
if (!try_seize_update_permission(BIF_P)) {
- ERTS_BIF_YIELD0(&bif_trap_export[BIF_persistent_term_get_0], BIF_P);
+ ERTS_BIF_YIELD0(BIF_TRAP_EXPORT(BIF_persistent_term_get_0), BIF_P);
}
magic_ref = alloc_trap_data(BIF_P);
@@ -465,7 +465,7 @@ BIF_RETTYPE persistent_term_get_0(BIF_ALIST_0)
BIF_RET(res);
} else {
BUMP_ALL_REDS(BIF_P);
- BIF_TRAP2(&persistent_term_get_all_export, BIF_P, magic_ref, res);
+ BIF_TRAP2(persistent_term_get_all_export, BIF_P, magic_ref, res);
}
}
@@ -535,7 +535,7 @@ BIF_RETTYPE persistent_term_erase_1(BIF_ALIST_1)
ITERATIONS_PER_RED * ERTS_BIF_REDS_LEFT(BIF_P);
#endif
#define ERASE_TRAP_CODE \
- BIF_TRAP1(&bif_trap_export[BIF_persistent_term_erase_1], BIF_P, state_mref);
+ BIF_TRAP1(BIF_TRAP_EXPORT(BIF_persistent_term_erase_1), BIF_P, state_mref);
#define TRAPPING_COPY_TABLE_ERASE(TABLE_DEST, OLD_TABLE, NEW_SIZE, REHASH, LOC_NAME) \
TRAPPING_COPY_TABLE(TABLE_DEST, OLD_TABLE, NEW_SIZE, REHASH, LOC_NAME, ERASE_TRAP_CODE)
if (is_internal_magic_ref(BIF_ARG_1) &&
@@ -570,7 +570,7 @@ BIF_RETTYPE persistent_term_erase_1(BIF_ALIST_1)
ctx->tmp_table = NULL;
}
if (!try_seize_update_permission(BIF_P)) {
- ERTS_BIF_YIELD1(&bif_trap_export[BIF_persistent_term_erase_1],
+ ERTS_BIF_YIELD1(BIF_TRAP_EXPORT(BIF_persistent_term_erase_1),
BIF_P, BIF_ARG_1);
}
@@ -659,7 +659,7 @@ BIF_RETTYPE erts_internal_erase_persistent_terms_0(BIF_ALIST_0)
HashTable* new_table;
if (!try_seize_update_permission(BIF_P)) {
- ERTS_BIF_YIELD0(&bif_trap_export[BIF_erts_internal_erase_persistent_terms_0],
+ ERTS_BIF_YIELD0(BIF_TRAP_EXPORT(BIF_erts_internal_erase_persistent_terms_0),
BIF_P);
}
old_table = (HashTable *) erts_atomic_read_nob(&the_hash_table);
@@ -681,7 +681,7 @@ BIF_RETTYPE persistent_term_info_0(BIF_ALIST_0)
/* Prevent concurrent updates to get a consistent view */
if (!try_seize_update_permission(BIF_P)) {
- ERTS_BIF_YIELD0(&bif_trap_export[BIF_persistent_term_info_0], BIF_P);
+ ERTS_BIF_YIELD0(BIF_TRAP_EXPORT(BIF_persistent_term_info_0), BIF_P);
}
magic_ref = alloc_trap_data(BIF_P);
@@ -700,7 +700,7 @@ BIF_RETTYPE persistent_term_info_0(BIF_ALIST_0)
BIF_RET(res);
} else {
BUMP_ALL_REDS(BIF_P);
- BIF_TRAP2(&persistent_term_info_export, BIF_P, magic_ref, res);
+ BIF_TRAP2(persistent_term_info_export, BIF_P, magic_ref, res);
}
}
@@ -767,7 +767,7 @@ persistent_term_get_all_trap(BIF_ALIST_2)
ASSERT(is_list(res));
if (trap_data->remaining > 0) {
BUMP_ALL_REDS(BIF_P);
- BIF_TRAP2(&persistent_term_get_all_export, BIF_P, BIF_ARG_1, res);
+ BIF_TRAP2(persistent_term_get_all_export, BIF_P, BIF_ARG_1, res);
} else {
release_update_permission(0);
trap_data->got_update_permission = 0;
@@ -863,7 +863,7 @@ persistent_term_info_trap(BIF_ALIST_1)
if (trap_data->remaining > 0) {
ASSERT(res == am_ok);
BUMP_ALL_REDS(BIF_P);
- BIF_TRAP1(&persistent_term_info_export, BIF_P, BIF_ARG_1);
+ BIF_TRAP1(persistent_term_info_export, BIF_P, BIF_ARG_1);
} else {
release_update_permission(0);
trap_data->got_update_permission = 0;
diff --git a/erts/emulator/beam/erl_bif_port.c b/erts/emulator/beam/erl_bif_port.c
index 78857e9b33..1b3173574d 100644
--- a/erts/emulator/beam/erl_bif_port.c
+++ b/erts/emulator/beam/erl_bif_port.c
@@ -211,7 +211,7 @@ BIF_RETTYPE erts_internal_port_command_3(BIF_ALIST_3)
ERTS_BIF_PREP_RET(res, am_false);
else {
erts_suspend(BIF_P, ERTS_PROC_LOCK_MAIN, prt);
- ERTS_BIF_PREP_YIELD3(res, &bif_trap_export[BIF_erts_internal_port_command_3],
+ ERTS_BIF_PREP_YIELD3(res, BIF_TRAP_EXPORT(BIF_erts_internal_port_command_3),
BIF_P, BIF_ARG_1, BIF_ARG_2, BIF_ARG_3);
}
break;
diff --git a/erts/emulator/beam/erl_bif_re.c b/erts/emulator/beam/erl_bif_re.c
index 568534cab2..40a0d4173d 100644
--- a/erts/emulator/beam/erl_bif_re.c
+++ b/erts/emulator/beam/erl_bif_re.c
@@ -40,7 +40,7 @@
static const unsigned char *default_table;
static Uint max_loop_limit;
-static Export re_exec_trap_export;
+static Export *re_exec_trap_export;
static Export *grun_trap_exportp = NULL;
static Export *urun_trap_exportp = NULL;
static Export *ucompile_trap_exportp = NULL;
@@ -1356,7 +1356,7 @@ handle_iolist:
ERTS_VBUMP_ALL_REDS(p);
hp = HAlloc(p, ERTS_MAGIC_REF_THING_SIZE);
magic_ref = erts_mk_magic_ref(&hp, &MSO(p), mbp);
- BIF_TRAP3(&re_exec_trap_export,
+ BIF_TRAP3(re_exec_trap_export,
p,
arg1,
arg2 /* To avoid GC of precompiled code, XXX: not utilized yet */,
@@ -1472,7 +1472,7 @@ static BIF_RETTYPE re_exec_trap(BIF_ALIST_3)
if (rc == PCRE_ERROR_LOOP_LIMIT) {
/* Trap */
BUMP_ALL_REDS(BIF_P);
- BIF_TRAP3(&re_exec_trap_export, BIF_P, BIF_ARG_1, BIF_ARG_2, BIF_ARG_3);
+ BIF_TRAP3(re_exec_trap_export, BIF_P, BIF_ARG_1, BIF_ARG_2, BIF_ARG_3);
}
res = build_exec_return(BIF_P, rc, restartp, BIF_ARG_1);
diff --git a/erts/emulator/beam/erl_bif_trace.c b/erts/emulator/beam/erl_bif_trace.c
index 7708e0755c..69403dfe16 100644
--- a/erts/emulator/beam/erl_bif_trace.c
+++ b/erts/emulator/beam/erl_bif_trace.c
@@ -131,7 +131,7 @@ trace_pattern(Process* p, Eterm MFA, Eterm Pattern, Eterm flaglist)
Uint freason = BADARG;
if (!erts_try_seize_code_write_permission(p)) {
- ERTS_BIF_YIELD3(&bif_trap_export[BIF_erts_internal_trace_pattern_3], p, MFA, Pattern, flaglist);
+ ERTS_BIF_YIELD3(BIF_TRAP_EXPORT(BIF_erts_internal_trace_pattern_3), p, MFA, Pattern, flaglist);
}
finish_bp.current = -1;
@@ -541,7 +541,7 @@ Eterm erts_internal_trace_3(BIF_ALIST_3)
}
if (!erts_try_seize_code_write_permission(BIF_P)) {
- ERTS_BIF_YIELD3(&bif_trap_export[BIF_erts_internal_trace_3],
+ ERTS_BIF_YIELD3(BIF_TRAP_EXPORT(BIF_erts_internal_trace_3),
BIF_P, BIF_ARG_1, BIF_ARG_2, BIF_ARG_3);
}
@@ -791,7 +791,7 @@ Eterm trace_info_2(BIF_ALIST_2)
Eterm res;
if (!erts_try_seize_code_write_permission(p)) {
- ERTS_BIF_YIELD2(&bif_trap_export[BIF_trace_info_2], p, What, Key);
+ ERTS_BIF_YIELD2(BIF_TRAP_EXPORT(BIF_trace_info_2), p, What, Key);
}
if (What == am_on_load) {
diff --git a/erts/emulator/beam/erl_db.c b/erts/emulator/beam/erl_db.c
index 495d846a6a..103827e326 100644
--- a/erts/emulator/beam/erl_db.c
+++ b/erts/emulator/beam/erl_db.c
@@ -84,7 +84,7 @@ static BIF_RETTYPE db_bif_fail(Process* p, Uint freason,
{
if (freason == TRAP) {
if (!bif_exp)
- bif_exp = &bif_trap_export[bif_ix];
+ bif_exp = BIF_TRAP_EXPORT(bif_ix);
p->arity = bif_exp->info.mfa.arity;
p->i = (BeamInstr*) bif_exp->addressv[erts_active_code_ix()];
}
@@ -404,15 +404,15 @@ static BIF_RETTYPE ets_select3(Process* p, DbTable*, Eterm tid, Eterm ms, Sint c
/*
* Exported global
*/
-Export ets_select_delete_continue_exp;
-Export ets_select_count_continue_exp;
-Export ets_select_replace_continue_exp;
-Export ets_select_continue_exp;
+Export *ets_select_delete_continue_exp;
+Export *ets_select_count_continue_exp;
+Export *ets_select_replace_continue_exp;
+Export *ets_select_continue_exp;
/*
* Static traps
*/
-static Export ets_delete_continue_exp;
+static Export *ets_delete_continue_exp;
static Export *ets_info_binary_trap = NULL;
@@ -1936,7 +1936,7 @@ static BIF_RETTYPE ets_insert_2_list_driver(Process* p,
}
if (ctx->continuation_state != NULL) {
erts_set_gc_state(p, 0);
- BIF_TRAP2(&bif_trap_export[bix], p, tid, state_mref);
+ BIF_TRAP2(BIF_TRAP_EXPORT(bix), p, tid, state_mref);
}
return ret;
}
@@ -2548,7 +2548,7 @@ BIF_RETTYPE ets_delete_1(BIF_ALIST_1)
hp[0] = make_pos_bignum_header(1);
hp[1] = (Eterm) tb;
BUMP_ALL_REDS(BIF_P);
- BIF_TRAP1(&ets_delete_continue_exp, BIF_P, make_big(hp));
+ BIF_TRAP1(ets_delete_continue_exp, BIF_P, make_big(hp));
}
else {
BUMP_REDS(BIF_P, (initial_reds - reds));
@@ -2720,7 +2720,7 @@ BIF_RETTYPE ets_internal_delete_all_2(BIF_ALIST_2)
tb->common.status |= DB_BUSY;
db_unlock(tb, LCK_WRITE);
BUMP_ALL_REDS(BIF_P);
- BIF_TRAP2(&bif_trap_export[BIF_ets_internal_delete_all_2], BIF_P,
+ BIF_TRAP2(BIF_TRAP_EXPORT(BIF_ets_internal_delete_all_2), BIF_P,
BIF_ARG_1, nitems_holder);
}
else {
@@ -2850,7 +2850,7 @@ static BIF_RETTYPE ets_select_delete_trap_1(BIF_ALIST_1)
ASSERT(arityval(*tptr) >= 1);
DB_TRAP_GET_TABLE(tb, tptr[1], DB_WRITE, kind,
- &ets_select_delete_continue_exp);
+ ets_select_delete_continue_exp);
cret = tb->common.meth->db_select_delete_continue(p,tb,a1,&ret,&safety);
@@ -3334,7 +3334,7 @@ static BIF_RETTYPE ets_select_trap_1(BIF_ALIST_1)
ASSERT(arityval(*tptr) >= 1);
DB_TRAP_GET_TABLE(tb, tptr[1], DB_READ, kind,
- &ets_select_continue_exp);
+ ets_select_continue_exp);
cret = tb->common.meth->db_select_continue(p, tb, a1, &ret, &safety);
@@ -3502,7 +3502,7 @@ static BIF_RETTYPE ets_select_count_1(BIF_ALIST_1)
ASSERT(arityval(*tptr) >= 1);
DB_TRAP_GET_TABLE(tb, tptr[1], DB_READ, kind,
- &ets_select_count_continue_exp);
+ ets_select_count_continue_exp);
cret = tb->common.meth->db_select_count_continue(p, tb, a1, &ret, &safety);
@@ -3593,7 +3593,7 @@ static BIF_RETTYPE ets_select_replace_1(BIF_ALIST_1)
ASSERT(arityval(*tptr) >= 1);
DB_TRAP_GET_TABLE(tb, tptr[1], DB_WRITE, kind,
- &ets_select_replace_continue_exp);
+ ets_select_replace_continue_exp);
cret = tb->common.meth->db_select_replace_continue(p,tb,a1,&ret,&safety);
@@ -3885,7 +3885,7 @@ BIF_RETTYPE ets_info_1(BIF_ALIST_1)
BIF_RET(am_undefined);
}
if (rp == ERTS_PROC_LOCK_BUSY) {
- ERTS_BIF_YIELD1(&bif_trap_export[BIF_ets_info_1], BIF_P, BIF_ARG_1);
+ ERTS_BIF_YIELD1(BIF_TRAP_EXPORT(BIF_ets_info_1), BIF_P, BIF_ARG_1);
}
if ((tb = db_get_table(BIF_P, BIF_ARG_1, DB_INFO, LCK_READ)) == NULL
|| tb->common.owner != owner) {
@@ -3906,10 +3906,10 @@ BIF_RETTYPE ets_info_1(BIF_ALIST_1)
db_unlock(tb, LCK_READ);
hp = HAlloc(BIF_P, 3);
tuple = TUPLE2(hp, res.trap_resume_state, table);
- BIF_TRAP1(&bif_trap_export[BIF_ets_info_1], BIF_P, tuple);
+ BIF_TRAP1(BIF_TRAP_EXPORT(BIF_ets_info_1), BIF_P, tuple);
} else if (res.type == ERTS_FLXCTR_TRY_AGAIN_AFTER_TRAP) {
db_unlock(tb, LCK_READ);
- BIF_TRAP1(&bif_trap_export[BIF_ets_info_1], BIF_P, table);
+ BIF_TRAP1(BIF_TRAP_EXPORT(BIF_ets_info_1), BIF_P, table);
} else {
size = res.result[ERTS_DB_TABLE_NITEMS_COUNTER_ID];
memory = res.result[ERTS_DB_TABLE_MEM_COUNTER_ID];
@@ -3980,10 +3980,10 @@ BIF_RETTYPE ets_info_2(BIF_ALIST_2)
erts_flxctr_snapshot(&tb->common.counters, ERTS_ALC_T_ETS_CTRS, BIF_P);
if (ERTS_FLXCTR_GET_RESULT_AFTER_TRAP == res.type) {
db_unlock(tb, LCK_READ);
- BIF_TRAP2(&bif_trap_export[BIF_ets_info_2], BIF_P, res.trap_resume_state, BIF_ARG_2);
+ BIF_TRAP2(BIF_TRAP_EXPORT(BIF_ets_info_2), BIF_P, res.trap_resume_state, BIF_ARG_2);
} else if (res.type == ERTS_FLXCTR_TRY_AGAIN_AFTER_TRAP) {
db_unlock(tb, LCK_READ);
- BIF_TRAP2(&bif_trap_export[BIF_ets_info_2], BIF_P, BIF_ARG_1, BIF_ARG_2);
+ BIF_TRAP2(BIF_TRAP_EXPORT(BIF_ets_info_2), BIF_P, BIF_ARG_1, BIF_ARG_2);
} else if (BIF_ARG_2 == am_size) {
ret = erts_make_integer(res.result[ERTS_DB_TABLE_NITEMS_COUNTER_ID], BIF_P);
} else { /* BIF_ARG_2 == am_memory */
@@ -4050,7 +4050,7 @@ BIF_RETTYPE ets_match_spec_run_r_3(BIF_ALIST_3)
for (lst = BIF_ARG_1; is_list(lst); lst = CDR(list_val(lst))) {
if (++i > CONTEXT_REDS) {
BUMP_ALL_REDS(BIF_P);
- BIF_TRAP3(&bif_trap_export[BIF_ets_match_spec_run_r_3],
+ BIF_TRAP3(BIF_TRAP_EXPORT(BIF_ets_match_spec_run_r_3),
BIF_P,lst,BIF_ARG_2,ret);
}
res = db_prog_match(BIF_P, BIF_P,
@@ -4800,7 +4800,7 @@ static BIF_RETTYPE ets_delete_trap(BIF_ALIST_1)
reds = free_table_continue(BIF_P, tb, reds);
if (reds < 0) {
BUMP_ALL_REDS(BIF_P);
- BIF_TRAP1(&ets_delete_continue_exp, BIF_P, cont);
+ BIF_TRAP1(ets_delete_continue_exp, BIF_P, cont);
}
else {
BUMP_REDS(BIF_P, (initial_reds - reds));
diff --git a/erts/emulator/beam/erl_db.h b/erts/emulator/beam/erl_db.h
index 139e3311b7..373e84dc06 100644
--- a/erts/emulator/beam/erl_db.h
+++ b/erts/emulator/beam/erl_db.h
@@ -125,10 +125,10 @@ extern int erts_ets_rwmtx_spin_count;
extern int user_requested_db_max_tabs; /* set in erl_init */
extern int erts_ets_realloc_always_moves; /* set in erl_init */
extern int erts_ets_always_compress; /* set in erl_init */
-extern Export ets_select_delete_continue_exp;
-extern Export ets_select_count_continue_exp;
-extern Export ets_select_replace_continue_exp;
-extern Export ets_select_continue_exp;
+extern Export *ets_select_delete_continue_exp;
+extern Export *ets_select_count_continue_exp;
+extern Export *ets_select_replace_continue_exp;
+extern Export *ets_select_continue_exp;
extern erts_atomic_t erts_ets_misc_mem_size;
Eterm erts_ets_colliding_names(Process*, Eterm name, Uint cnt);
diff --git a/erts/emulator/beam/erl_db_hash.c b/erts/emulator/beam/erl_db_hash.c
index 92ff7de268..0905a4efb9 100644
--- a/erts/emulator/beam/erl_db_hash.c
+++ b/erts/emulator/beam/erl_db_hash.c
@@ -1995,7 +1995,7 @@ static int select_chunk_on_trap(traverse_context_t* ctx_base,
make_small(got),
make_small(ctx->base.safety));
}
- ERTS_BIF_PREP_TRAP1(*ret, &ets_select_continue_exp, ctx->base.p,
+ ERTS_BIF_PREP_TRAP1(*ret, ets_select_continue_exp, ctx->base.p,
continuation);
return DB_ERROR_NONE;
}
@@ -2206,7 +2206,7 @@ static int select_count_on_trap(traverse_context_t* ctx,
Binary** mpp, Eterm* ret)
{
return on_simple_trap(
- &ets_select_count_continue_exp, ctx,
+ ets_select_count_continue_exp, ctx,
slot_ix, got, mpp, ret);
}
@@ -2390,7 +2390,7 @@ static int select_delete_on_trap(traverse_context_t* ctx_base,
free_term_list(ctx->base.tb, ctx->free_us);
ctx->free_us = NULL;
return on_simple_trap(
- &ets_select_delete_continue_exp, &ctx->base,
+ ets_select_delete_continue_exp, &ctx->base,
slot_ix, got, mpp, ret);
}
@@ -2527,7 +2527,7 @@ static int select_replace_on_trap(traverse_context_t* ctx,
Binary** mpp, Eterm* ret)
{
return on_simple_trap(
- &ets_select_replace_continue_exp, ctx,
+ ets_select_replace_continue_exp, ctx,
slot_ix, got, mpp, ret);
}
diff --git a/erts/emulator/beam/erl_db_tree.c b/erts/emulator/beam/erl_db_tree.c
index 131ec123b0..2e29df625e 100644
--- a/erts/emulator/beam/erl_db_tree.c
+++ b/erts/emulator/beam/erl_db_tree.c
@@ -481,7 +481,7 @@ static int db_put_dbterm_tree(DbTable* tbl, /* [in out] */
** Static variables
*/
-Export ets_select_reverse_exp;
+Export *ets_select_reverse_exp;
/*
** External interface
@@ -1142,7 +1142,7 @@ static BIF_RETTYPE ets_select_reverse(BIF_ALIST_3)
if (--max_iter == 0) {
BUMP_ALL_REDS(p);
HRelease(p, hend, hp);
- BIF_TRAP3(&ets_select_reverse_exp, p, list, result, a3);
+ BIF_TRAP3(ets_select_reverse_exp, p, list, result, a3);
}
if (hp == hend) {
hp = HAlloc(p, 64);
@@ -1267,7 +1267,7 @@ int db_select_continue_tree_common(Process *p,
if (!sc.got) {
RET_TO_BIF(am_EOT, DB_ERROR_NONE);
} else {
- RET_TO_BIF(bif_trap3(&ets_select_reverse_exp, p,
+ RET_TO_BIF(bif_trap3(ets_select_reverse_exp, p,
sc.accum, NIL, am_EOT),
DB_ERROR_NONE);
}
@@ -1287,7 +1287,7 @@ int db_select_continue_tree_common(Process *p,
NIL,
tptr[7],
make_small(0));
- RET_TO_BIF(bif_trap3(&ets_select_reverse_exp, p,
+ RET_TO_BIF(bif_trap3(ets_select_reverse_exp, p,
sc.accum, NIL, continuation),
DB_ERROR_NONE);
} else {
@@ -1303,7 +1303,7 @@ int db_select_continue_tree_common(Process *p,
if (!sc.got) {
RET_TO_BIF(am_EOT, DB_ERROR_NONE);
} else {
- RET_TO_BIF(bif_trap3(&ets_select_reverse_exp, p,
+ RET_TO_BIF(bif_trap3(ets_select_reverse_exp, p,
sc.accum, NIL, am_EOT),
DB_ERROR_NONE);
}
@@ -1330,7 +1330,7 @@ int db_select_continue_tree_common(Process *p,
sc.accum,
tptr[7],
make_small(sc.got));
- RET_TO_BIF(bif_trap1(&bif_trap_export[BIF_ets_select_1], p, continuation),
+ RET_TO_BIF(bif_trap1(BIF_TRAP_EXPORT(BIF_ets_select_1), p, continuation),
DB_ERROR_NONE);
#undef RET_TO_BIF
@@ -1475,7 +1475,7 @@ int db_select_tree_common(Process *p, DbTable *tb,
make_small(sc.got));
/* Don't free mpi.mp, so don't use macro */
- *ret = bif_trap1(&bif_trap_export[BIF_ets_select_1], p, continuation);
+ *ret = bif_trap1(BIF_TRAP_EXPORT(BIF_ets_select_1), p, continuation);
return DB_ERROR_NONE;
#undef RET_TO_BIF
@@ -1583,7 +1583,7 @@ int db_select_count_continue_tree_common(Process *p,
tptr[3],
tptr[4],
egot);
- RET_TO_BIF(bif_trap1(&ets_select_count_continue_exp, p, continuation),
+ RET_TO_BIF(bif_trap1(ets_select_count_continue_exp, p, continuation),
DB_ERROR_NONE);
#undef RET_TO_BIF
@@ -1707,7 +1707,7 @@ int db_select_count_tree_common(Process *p, DbTable *tb,
egot);
/* Don't free mpi.mp, so don't use macro */
- *ret = bif_trap1(&ets_select_count_continue_exp, p, continuation);
+ *ret = bif_trap1(ets_select_count_continue_exp, p, continuation);
return DB_ERROR_NONE;
#undef RET_TO_BIF
@@ -1837,7 +1837,7 @@ int db_select_chunk_tree_common(Process *p, DbTable *tb,
if (!sc.got) {
RET_TO_BIF(am_EOT, DB_ERROR_NONE);
} else {
- RET_TO_BIF(bif_trap3(&ets_select_reverse_exp, p,
+ RET_TO_BIF(bif_trap3(ets_select_reverse_exp, p,
sc.accum, NIL, am_EOT),
DB_ERROR_NONE);
}
@@ -1861,7 +1861,7 @@ int db_select_chunk_tree_common(Process *p, DbTable *tb,
make_small(reverse),
make_small(0));
/* Don't let RET_TO_BIF macro free mpi.mp*/
- *ret = bif_trap3(&ets_select_reverse_exp, p,
+ *ret = bif_trap3(ets_select_reverse_exp, p,
sc.accum, NIL, continuation);
return DB_ERROR_NONE;
}
@@ -1883,7 +1883,7 @@ int db_select_chunk_tree_common(Process *p, DbTable *tb,
make_small(reverse),
make_small(sc.got));
/* Don't let RET_TO_BIF macro free mpi.mp*/
- *ret = bif_trap1(&bif_trap_export[BIF_ets_select_1], p, continuation);
+ *ret = bif_trap1(BIF_TRAP_EXPORT(BIF_ets_select_1), p, continuation);
return DB_ERROR_NONE;
#undef RET_TO_BIF
@@ -1993,7 +1993,7 @@ int db_select_delete_continue_tree_common(Process *p,
tptr[3],
tptr[4],
eaccsum);
- RET_TO_BIF(bif_trap1(&ets_select_delete_continue_exp, p, continuation),
+ RET_TO_BIF(bif_trap1(ets_select_delete_continue_exp, p, continuation),
DB_ERROR_NONE);
#undef RET_TO_BIF
@@ -2124,7 +2124,7 @@ int db_select_delete_tree_common(Process *p, DbTable *tbl,
if (sc.erase_lastterm) {
free_term(tbl, sc.lastterm);
}
- *ret = bif_trap1(&ets_select_delete_continue_exp, p, continuation);
+ *ret = bif_trap1(ets_select_delete_continue_exp, p, continuation);
return DB_ERROR_NONE;
#undef RET_TO_BIF
@@ -2234,7 +2234,7 @@ int db_select_replace_continue_tree_common(Process *p,
tptr[3],
tptr[4],
ereplaced);
- RET_TO_BIF(bif_trap1(&ets_select_replace_continue_exp, p, continuation),
+ RET_TO_BIF(bif_trap1(ets_select_replace_continue_exp, p, continuation),
DB_ERROR_NONE);
#undef RET_TO_BIF
@@ -2361,7 +2361,7 @@ int db_select_replace_tree_common(Process *p, DbTable *tbl,
ereplaced);
/* Don't free mpi.mp, so don't use macro */
- *ret = bif_trap1(&ets_select_replace_continue_exp, p, continuation);
+ *ret = bif_trap1(ets_select_replace_continue_exp, p, continuation);
return DB_ERROR_NONE;
#undef RET_TO_BIF
diff --git a/erts/emulator/beam/erl_io_queue.c b/erts/emulator/beam/erl_io_queue.c
index c82d67f893..ef541eeff1 100644
--- a/erts/emulator/beam/erl_io_queue.c
+++ b/erts/emulator/beam/erl_io_queue.c
@@ -1078,7 +1078,7 @@ static BIF_RETTYPE iol2v_yield(iol2v_state_t *state) {
state = boxed_state;
}
- ERTS_BIF_YIELD1(&bif_trap_export[BIF_iolist_to_iovec_1],
+ ERTS_BIF_YIELD1(BIF_TRAP_EXPORT(BIF_iolist_to_iovec_1),
state->process, state->magic_reference);
}
diff --git a/erts/emulator/beam/erl_map.c b/erts/emulator/beam/erl_map.c
index aac1ff7bfd..58f4a899d0 100644
--- a/erts/emulator/beam/erl_map.c
+++ b/erts/emulator/beam/erl_map.c
@@ -90,7 +90,7 @@ static BIF_RETTYPE map_merge_mixed(Process *p, Eterm flat, Eterm tree, int swap_
struct HashmapMergeContext_;
static BIF_RETTYPE hashmap_merge(Process *p, Eterm nodeA, Eterm nodeB, int swap_args,
struct HashmapMergeContext_*);
-static Export hashmap_merge_trap_export;
+static Export *hashmap_merge_trap_export;
static BIF_RETTYPE maps_merge_trap_1(BIF_ALIST_1);
static Uint hashmap_subtree_size(Eterm node);
static Eterm hashmap_keys(Process *p, Eterm map);
@@ -1465,7 +1465,7 @@ trap: /* Yield */
PSTACK_SAVE(s, &ctx->pstack);
BUMP_ALL_REDS(p);
- ERTS_BIF_PREP_TRAP1(trap_ret, &hashmap_merge_trap_export,
+ ERTS_BIF_PREP_TRAP1(trap_ret, hashmap_merge_trap_export,
p, ctx->trap_bin);
UnUseTmpHeap(2,p);
return trap_ret;
diff --git a/erts/emulator/beam/erl_process.c b/erts/emulator/beam/erl_process.c
index b64c67c650..220deb7c47 100644
--- a/erts/emulator/beam/erl_process.c
+++ b/erts/emulator/beam/erl_process.c
@@ -14251,7 +14251,7 @@ static void print_current_process_info(fmtfn_t to, void *to_arg,
*
* A BIF that calls this should make sure to schedule out to never come back:
* erts_halt(code);
- * ERTS_BIF_YIELD1(&bif_trap_export[BIF_erlang_halt_1], BIF_P, NIL);
+ * ERTS_BIF_YIELD1(BIF_TRAP_EXPORT(BIF_erlang_halt_1), BIF_P, NIL);
*/
void erts_halt(int code)
{
diff --git a/erts/emulator/beam/erl_ptab.c b/erts/emulator/beam/erl_ptab.c
index 38c095fb4a..c1295755a2 100644
--- a/erts/emulator/beam/erl_ptab.c
+++ b/erts/emulator/beam/erl_ptab.c
@@ -237,7 +237,7 @@ struct ErtsPTabDeletedElement_ {
} u;
};
-static Export ptab_list_continue_export;
+static Export *ptab_list_continue_export;
typedef struct {
Uint64 interval;
@@ -780,7 +780,7 @@ erts_ptab_list(Process *c_p, ErtsPTab *ptab)
ERTS_PTAB_LIST_DBG_VERIFY_HEAP_ALLOC_USED(ptlbdp, hp);
ERTS_PTAB_LIST_DBG_TRACE(c_p->common.id, trap);
ERTS_BIF_PREP_YIELD2(ret_val,
- &ptab_list_continue_export,
+ ptab_list_continue_export,
c_p,
res_acc,
magic_ref);
@@ -1304,7 +1304,7 @@ static BIF_RETTYPE ptab_list_continue(BIF_ALIST_2)
}
else {
ERTS_PTAB_LIST_DBG_TRACE(BIF_P->common.id, trap);
- ERTS_BIF_YIELD2(&ptab_list_continue_export, BIF_P, res_acc, BIF_ARG_2);
+ ERTS_BIF_YIELD2(ptab_list_continue_export, BIF_P, res_acc, BIF_ARG_2);
}
}
diff --git a/erts/emulator/beam/erl_unicode.c b/erts/emulator/beam/erl_unicode.c
index aa25cd36ed..43163cebf6 100644
--- a/erts/emulator/beam/erl_unicode.c
+++ b/erts/emulator/beam/erl_unicode.c
@@ -64,12 +64,12 @@ static BIF_RETTYPE characters_to_list_trap_2(BIF_ALIST_3);
static BIF_RETTYPE characters_to_list_trap_3(BIF_ALIST_3);
static BIF_RETTYPE characters_to_list_trap_4(BIF_ALIST_1);
-static Export characters_to_utf8_trap_exp;
-static Export characters_to_list_trap_1_exp;
-static Export characters_to_list_trap_2_exp;
+static Export *characters_to_utf8_trap_exp;
+static Export *characters_to_list_trap_1_exp;
+static Export *characters_to_list_trap_2_exp;
-static Export characters_to_list_trap_3_exp;
-static Export characters_to_list_trap_4_exp;
+static Export *characters_to_list_trap_3_exp;
+static Export *characters_to_list_trap_4_exp;
static Export *c_to_b_int_trap_exportp = NULL;
static Export *c_to_l_int_trap_exportp = NULL;
@@ -873,7 +873,7 @@ static BIF_RETTYPE build_utf8_return(Process *p,Eterm bin,Uint pos,
rest_term = CONS(hp,rest_bin,rest_term);
}
BUMP_ALL_REDS(p);
- BIF_TRAP3(&characters_to_utf8_trap_exp, p, bin, rest_term, latin1);
+ BIF_TRAP3(characters_to_utf8_trap_exp, p, bin, rest_term, latin1);
} else { /* Success */
/*hp = HAlloc(p,5);
ret = TUPLE4(hp,mk_utf8_result_bin(p,bin),rest_term,make_small(pos),make_small(err));*/
@@ -1090,7 +1090,7 @@ static BIF_RETTYPE build_list_return(Process *p, byte *bytes, Uint pos, Uint cha
rc.num_bytes_to_process = pos;
rc.num_resulting_chars = characters;
rc.state = ERTS_UTF8_OK; /* not used */
- BIF_TRAP3(&characters_to_list_trap_1_exp, p, make_magic_bin_for_restart(p,&rc),
+ BIF_TRAP3(characters_to_list_trap_1_exp, p, make_magic_bin_for_restart(p,&rc),
rest_term, latin1);
} else { /* Success */
BIF_RET(finalize_list_to_list(p, bytes, NIL, 0U, pos, characters, ERTS_UTF8_OK, left, NIL));
@@ -1680,7 +1680,7 @@ static BIF_RETTYPE finalize_list_to_list(Process *p,
rc.state = state;
rc.bytes = bytes;
BUMP_ALL_REDS(p);
- BIF_TRAP3(&characters_to_list_trap_2_exp, p,
+ BIF_TRAP3(characters_to_list_trap_2_exp, p,
make_magic_bin_for_restart(p, &rc), rest, converted);
}
}
@@ -1789,7 +1789,7 @@ static BIF_RETTYPE do_bif_utf8_to_list(Process *p,
Eterm enumchar = erts_make_integer(num_resulting_chars,p);
erts_free_aligned_binary_bytes(temp_alloc);
BUMP_ALL_REDS(p);
- BIF_TRAP3(&characters_to_list_trap_3_exp, p, orig_bin, epos,
+ BIF_TRAP3(characters_to_list_trap_3_exp, p, orig_bin, epos,
enumchar);
}
}
@@ -1825,7 +1825,7 @@ static BIF_RETTYPE do_bif_utf8_to_list(Process *p,
converted);
BUMP_ALL_REDS(p);
erts_free_aligned_binary_bytes(temp_alloc);
- BIF_TRAP1(&characters_to_list_trap_4_exp,p,traptuple);
+ BIF_TRAP1(characters_to_list_trap_4_exp,p,traptuple);
}
}
diff --git a/erts/emulator/beam/external.c b/erts/emulator/beam/external.c
index 428f0ff66b..353e11ff9f 100644
--- a/erts/emulator/beam/external.c
+++ b/erts/emulator/beam/external.c
@@ -98,7 +98,7 @@
*/
#define IS_SSMALL32(x) (((Uint) (((x) >> (32-1)) + 1)) < 2)
-static Export term_to_binary_trap_export;
+static Export *term_to_binary_trap_export;
static byte* enc_term(ErtsAtomCacheMap *, Eterm, byte*, Uint64, struct erl_off_heap_header** off_heap);
struct TTBEncodeContext_;
@@ -122,7 +122,7 @@ static Uint encode_size_struct2(ErtsAtomCacheMap *, Eterm, Uint64);
static ErtsExtSzRes encode_size_struct_int(TTBSizeContext*, ErtsAtomCacheMap *acmp,
Eterm obj, Uint64 dflags, Sint *reds, Uint *res);
-static Export binary_to_term_trap_export;
+static Export *binary_to_term_trap_export;
static BIF_RETTYPE binary_to_term_trap_1(BIF_ALIST_1);
static Sint transcode_dist_obuf(ErtsDistOutputBuf*, DistEntry*, Uint64 dflags, Sint reds);
static byte *hopefull_bit_binary(TTBEncodeContext* ctx, byte **epp, Binary *pb_val, Eterm pb_term,
@@ -1361,14 +1361,14 @@ static BIF_RETTYPE term_to_binary_trap_1(BIF_ALIST_1)
}
if (Opts == am_undefined)
ERTS_BIF_ERROR_TRAPPED1(BIF_P, SYSTEM_LIMIT,
- &bif_trap_export[bif_ix], Term);
+ BIF_TRAP_EXPORT(bif_ix), Term);
else
ERTS_BIF_ERROR_TRAPPED2(BIF_P, SYSTEM_LIMIT,
- &bif_trap_export[bif_ix], Term, Opts);
+ BIF_TRAP_EXPORT(bif_ix), Term, Opts);
}
if (is_tuple(res)) {
ASSERT(BIF_P->flags & F_DISABLE_GC);
- BIF_TRAP1(&term_to_binary_trap_export,BIF_P,res);
+ BIF_TRAP1(term_to_binary_trap_export,BIF_P,res);
} else {
if (erts_set_gc_state(BIF_P, 1)
|| MSO(BIF_P).overhead > BIN_VHEAP_SZ(BIF_P))
@@ -1392,7 +1392,7 @@ BIF_RETTYPE term_to_binary_1(BIF_ALIST_1)
}
if (is_tuple(res)) {
erts_set_gc_state(BIF_P, 0);
- BIF_TRAP1(&term_to_binary_trap_export,BIF_P,res);
+ BIF_TRAP1(term_to_binary_trap_export,BIF_P,res);
} else {
ASSERT(!(BIF_P->flags & F_DISABLE_GC));
BIF_RET(res);
@@ -1413,7 +1413,7 @@ BIF_RETTYPE term_to_iovec_1(BIF_ALIST_1)
}
if (is_tuple(res)) {
erts_set_gc_state(BIF_P, 0);
- BIF_TRAP1(&term_to_binary_trap_export,BIF_P,res);
+ BIF_TRAP1(term_to_binary_trap_export,BIF_P,res);
} else {
ASSERT(!(BIF_P->flags & F_DISABLE_GC));
BIF_RET(res);
@@ -1509,7 +1509,7 @@ BIF_RETTYPE term_to_binary_2(BIF_ALIST_2)
}
if (is_tuple(res)) {
erts_set_gc_state(BIF_P, 0);
- BIF_TRAP1(&term_to_binary_trap_export,BIF_P,res);
+ BIF_TRAP1(term_to_binary_trap_export,BIF_P,res);
} else {
ASSERT(!(BIF_P->flags & F_DISABLE_GC));
BIF_RET(res);
@@ -1538,7 +1538,7 @@ BIF_RETTYPE term_to_iovec_2(BIF_ALIST_2)
}
if (is_tuple(res)) {
erts_set_gc_state(BIF_P, 0);
- BIF_TRAP1(&term_to_binary_trap_export,BIF_P,res);
+ BIF_TRAP1(term_to_binary_trap_export,BIF_P,res);
} else {
ASSERT(!(BIF_P->flags & F_DISABLE_GC));
BIF_RET(res);
@@ -1567,7 +1567,7 @@ erts_debug_term_to_binary(Process *p, Eterm term, Eterm opts)
}
else if (is_tuple(res)) {
erts_set_gc_state(p, 0);
- ERTS_BIF_PREP_TRAP1(ret, &term_to_binary_trap_export,p,res);
+ ERTS_BIF_PREP_TRAP1(ret, term_to_binary_trap_export,p,res);
}
else {
ASSERT(!(p->flags & F_DISABLE_GC));
@@ -1986,8 +1986,8 @@ static BIF_RETTYPE binary_to_term_int(Process* p, Eterm bin, B2TContext *ctx)
case B2TBadArg:
BUMP_REDS(p, (initial_reds - ctx->reds) / B2T_BYTES_PER_REDUCTION);
- ASSERT(ctx->bif == &bif_trap_export[BIF_binary_to_term_1]
- || ctx->bif == &bif_trap_export[BIF_binary_to_term_2]);
+ ASSERT(ctx->bif == BIF_TRAP_EXPORT(BIF_binary_to_term_1)
+ || ctx->bif == BIF_TRAP_EXPORT(BIF_binary_to_term_2));
if (is_first_call)
ERTS_BIF_PREP_ERROR(ret_val, p, BADARG);
@@ -2053,7 +2053,7 @@ static BIF_RETTYPE binary_to_term_int(Process* p, Eterm bin, B2TContext *ctx)
}
BUMP_ALL_REDS(p);
- ERTS_BIF_PREP_TRAP1(ret_val, &binary_to_term_trap_export,
+ ERTS_BIF_PREP_TRAP1(ret_val, binary_to_term_trap_export,
p, ctx->trap_bin);
return ret_val;
@@ -2068,7 +2068,7 @@ BIF_RETTYPE binary_to_term_1(BIF_ALIST_1)
ctx.flags = 0;
ctx.used_bytes = 0;
ctx.trap_bin = THE_NON_VALUE;
- ctx.bif = &bif_trap_export[BIF_binary_to_term_1];
+ ctx.bif = BIF_TRAP_EXPORT(BIF_binary_to_term_1);
ctx.arg[0] = BIF_ARG_1;
ctx.arg[1] = THE_NON_VALUE;
return binary_to_term_int(BIF_P, BIF_ARG_1, &ctx);
@@ -2103,7 +2103,7 @@ BIF_RETTYPE binary_to_term_2(BIF_ALIST_2)
goto error;
ctx.trap_bin = THE_NON_VALUE;
- ctx.bif = &bif_trap_export[BIF_binary_to_term_2];
+ ctx.bif = BIF_TRAP_EXPORT(BIF_binary_to_term_2);
ctx.arg[0] = BIF_ARG_1;
ctx.arg[1] = BIF_ARG_2;
return binary_to_term_int(BIF_P, BIF_ARG_1, &ctx);
diff --git a/erts/emulator/beam/global.h b/erts/emulator/beam/global.h
index 83d00564fa..26c1bc6c3d 100644
--- a/erts/emulator/beam/global.h
+++ b/erts/emulator/beam/global.h
@@ -897,7 +897,7 @@ void erts_queue_monitor_message(Process *,
Eterm,
Eterm,
Eterm);
-void erts_init_trap_export(Export* ep, Eterm m, Eterm f, Uint a,
+void erts_init_trap_export(Export** epp, Eterm m, Eterm f, Uint a,
Eterm (*bif)(Process*, Eterm*, BeamInstr*));
void erts_init_bif(void);
Eterm erl_send(Process *p, Eterm to, Eterm msg);
diff --git a/erts/emulator/beam/macros.tab b/erts/emulator/beam/macros.tab
index b7ec1f4805..fb09f2d47b 100644
--- a/erts/emulator/beam/macros.tab
+++ b/erts/emulator/beam/macros.tab
@@ -289,7 +289,7 @@ BIF_ERROR_ARITY_1(Fail, BIF, Op1) {
}
reg[0] = $Op1;
SWAPOUT;
- I = handle_error(c_p, I, reg, &bif_trap_export[$BIF].info.mfa);
+ I = handle_error(c_p, I, reg, &BIF_TRAP_EXPORT($BIF)->info.mfa);
goto post_error_handling;
}
@@ -301,6 +301,6 @@ BIF_ERROR_ARITY_2(Fail, BIF, Op1, Op2) {
reg[0] = $Op1;
reg[1] = $Op2;
SWAPOUT;
- I = handle_error(c_p, I, reg, &bif_trap_export[$BIF].info.mfa);
+ I = handle_error(c_p, I, reg, &BIF_TRAP_EXPORT($BIF)->info.mfa);
goto post_error_handling;
}
diff --git a/erts/emulator/beam/trace_instrs.tab b/erts/emulator/beam/trace_instrs.tab
index c128400637..95fb770f5e 100644
--- a/erts/emulator/beam/trace_instrs.tab
+++ b/erts/emulator/beam/trace_instrs.tab
@@ -107,7 +107,7 @@ i_hibernate() {
goto do_schedule;
} else {
HEAVY_SWAPIN;
- I = handle_error(c_p, I, reg, &bif_trap_export[BIF_hibernate_3].info.mfa);
+ I = handle_error(c_p, I, reg, &BIF_TRAP_EXPORT(BIF_hibernate_3)->info.mfa);
goto post_error_handling;
}
//| -no_next
diff --git a/erts/emulator/utils/make_tables b/erts/emulator/utils/make_tables
index f87472111f..b296130079 100755
--- a/erts/emulator/utils/make_tables
+++ b/erts/emulator/utils/make_tables
@@ -247,12 +247,14 @@ typedef struct erts_u_bif {
} ErtsUBif;
extern BifEntry bif_table[];
-extern Export bif_trap_export[];
extern const ErtsUBif erts_u_bifs[];
#define BIF_SIZE $bif_size
EOF
+print "#define BIF_TRAP_EXPORT(BIF_NAME) (bif_trap_exports[BIF_NAME])\n";
+print "extern Export *bif_trap_exports[];\n";
+print "\n";
my $i;
for ($i = 0; $i < @bif; $i++) {
@@ -287,7 +289,7 @@ my $i;
includes("export.h", "sys.h", "erl_vm.h", "erl_process.h", "bif.h",
"erl_bif_table.h", "erl_atom_table.h");
-print "\nExport bif_trap_export[BIF_SIZE];\n";
+print "\nExport *bif_trap_exports[BIF_SIZE];\n";
print "BifEntry bif_table[] = {\n";
for ($i = 0; $i < @bif; $i++) {
@@ -332,7 +334,8 @@ for ($i = 0; $i < @bif_info; $i++) {
print <<EOF;
Eterm $bif_info[$i]->[2](Process *c_p, Eterm *regs, BeamInstr *I)
{
- return erts_reschedule_bif(c_p, regs, I, $bif_info[$i]->[3], $dtype);
+ return erts_reschedule_bif(c_p, regs, I,
+ $bif_info[$i]->[3], $dtype);
}
EOF
@@ -378,7 +381,7 @@ EOF
print <<EOF;
Eterm nbif_impl_$bif[$i]->[4](Process *c_p, Eterm *regs)
{
- return $bif[$i]->[3](c_p, regs, (UWord *)&bif_trap_export\[BIF_$bif[$i]->[4]\]);
+ return $bif[$i]->[3](c_p, regs, (UWord *)&BIF_TRAP_EXPORT(BIF_$bif[$i]->[4])->info.mfa);
}
EOF