diff options
author | Lukas Larsson <lukas@erlang.org> | 2020-07-08 17:18:53 +0200 |
---|---|---|
committer | Lukas Larsson <lukas@erlang.org> | 2020-09-21 16:40:30 +0200 |
commit | 2c251b21dc53b2105be33b0237986880957e3ed3 (patch) | |
tree | 3a89c950e35783e888543fc66f7745766eaf5351 /erts/emulator | |
parent | 8c3b8f05798ba6feca3804a6b54c328e75db89d7 (diff) | |
download | erlang-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')
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 |