diff options
author | John Högberg <john@erlang.org> | 2019-09-17 09:41:25 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-09-17 09:41:25 +0200 |
commit | 40323104481d0813da9286e786af7f43a336b916 (patch) | |
tree | 5509214c8e21016076776919f25e3eb56e30a81a /erts/emulator/beam/export.c | |
parent | da04cc20cc1527d142ab1890a44c277f450bfe7f (diff) | |
parent | 1c49fba50b7536865a340664f4004f501c3a2109 (diff) | |
download | erlang-40323104481d0813da9286e786af7f43a336b916.tar.gz |
Merge pull request #2381 from jhogberg/john/erts/refactor-cif-tracing/OTP-14734
Refactor BIF tracing
Diffstat (limited to 'erts/emulator/beam/export.c')
-rw-r--r-- | erts/emulator/beam/export.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/erts/emulator/beam/export.c b/erts/emulator/beam/export.c index b928f03b2f..ca16bfd20e 100644 --- a/erts/emulator/beam/export.c +++ b/erts/emulator/beam/export.c @@ -129,14 +129,17 @@ export_alloc(struct export_entry* tmpl_e) obj->info.mfa.module = tmpl->info.mfa.module; obj->info.mfa.function = tmpl->info.mfa.function; obj->info.mfa.arity = tmpl->info.mfa.arity; - obj->beam[0] = 0; + obj->bif_table_index = -1; + obj->is_bif_traced = 0; + + memset(&obj->trampoline, 0, sizeof(obj->trampoline)); + if (BeamOpsAreInitialized()) { - obj->beam[0] = BeamOpCodeAddr(op_call_error_handler); + obj->trampoline.op = BeamOpCodeAddr(op_call_error_handler); } - obj->beam[1] = 0; for (ix=0; ix<ERTS_NUM_CODE_IX; ix++) { - obj->addressv[ix] = obj->beam; + obj->addressv[ix] = obj->trampoline.raw; blob->entryv[ix].slot.index = -1; blob->entryv[ix].ep = &blob->exp; @@ -204,6 +207,8 @@ static struct export_entry* init_template(struct export_templ* templ, templ->exp.info.mfa.module = m; templ->exp.info.mfa.function = f; templ->exp.info.mfa.arity = a; + templ->exp.bif_table_index = -1; + templ->exp.is_bif_traced = 0; return &templ->entry; } @@ -253,8 +258,8 @@ erts_find_function(Eterm m, Eterm f, unsigned int a, ErtsCodeIndex code_ix) ee = hash_get(&export_tables[code_ix].htable, init_template(&templ, m, f, a)); if (ee == NULL || - (ee->ep->addressv[code_ix] == ee->ep->beam && - ! BeamIsOpCode(ee->ep->beam[0], op_i_generic_breakpoint))) { + (ee->ep->addressv[code_ix] == ee->ep->trampoline.raw && + ! BeamIsOpCode(ee->ep->trampoline.op, op_i_generic_breakpoint))) { return NULL; } return ee->ep; |