Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:Ledest:erlang:25
erlang
1161-Annotate-BIF-calls-with-the-name-of-the-BI...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 1161-Annotate-BIF-calls-with-the-name-of-the-BIF.patch of Package erlang
From bd776308c1f491364257095d4f36f56dc8f9ec53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= <bjorn@erlang.org> Date: Mon, 4 Jul 2022 06:22:59 +0200 Subject: [PATCH 1/7] Annotate BIF calls with the name of the BIF --- erts/emulator/beam/jit/arm/beam_asm.hpp | 2 ++ erts/emulator/beam/jit/arm/instr_bif.cpp | 22 ++++++++++++++++++++++ erts/emulator/beam/jit/x86/instr_bif.cpp | 18 ++++++++++++++++-- 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/erts/emulator/beam/jit/arm/beam_asm.hpp b/erts/emulator/beam/jit/arm/beam_asm.hpp index e2946fdbc7..15964e8190 100644 --- a/erts/emulator/beam/jit/arm/beam_asm.hpp +++ b/erts/emulator/beam/jit/arm/beam_asm.hpp @@ -1353,6 +1353,8 @@ protected: void emit_validate_unicode(Label next, Label fail, arm::Gp value); + void ubif_comment(const ArgWord &Bif); + void emit_bif_is_eq_ne_exact_immed(const ArgSource &LHS, const ArgSource &RHS, const ArgRegister &Dst, diff --git a/erts/emulator/beam/jit/arm/instr_bif.cpp b/erts/emulator/beam/jit/arm/instr_bif.cpp index 186343374a..66efc4beba 100644 --- a/erts/emulator/beam/jit/arm/instr_bif.cpp +++ b/erts/emulator/beam/jit/arm/instr_bif.cpp @@ -30,6 +30,15 @@ extern "C" #include "erl_msacc.h" } +void BeamModuleAssembler::ubif_comment(const ArgWord &Bif) { + if (logger.file()) { + ErtsCodeMFA *mfa = ubif2mfa((void *)Bif.get()); + if (mfa) { + comment("UBIF: %T/%d", mfa->function, mfa->arity); + } + } +} + /* ARG2 = argument vector, ARG4 (!) = bif function pointer * * Result is returned in ARG1 (will be THE_NON_VALUE if the BIF call failed). */ @@ -104,6 +113,7 @@ void BeamModuleAssembler::emit_i_bif1(const ArgSource &Src1, a.str(src1.reg, getXRef(0)); + ubif_comment(Bif); emit_i_bif(Fail, Bif, Dst); } @@ -116,6 +126,7 @@ void BeamModuleAssembler::emit_i_bif2(const ArgSource &Src1, a.stp(src1.reg, src2.reg, getXRef(0)); + ubif_comment(Bif); emit_i_bif(Fail, Bif, Dst); } @@ -131,6 +142,7 @@ void BeamModuleAssembler::emit_i_bif3(const ArgSource &Src1, a.stp(src1.reg, src2.reg, getXRef(0)); a.str(src3.reg, getXRef(2)); + ubif_comment(Bif); emit_i_bif(Fail, Bif, Dst); } @@ -161,6 +173,7 @@ void BeamModuleAssembler::emit_nofail_bif1(const ArgSource &Src1, a.str(src1.reg, getXRef(0)); + ubif_comment(Bif); mov_arg(ARG4, Bif); fragment_call(ga->get_i_bif_guard_shared()); mov_arg(Dst, ARG1); @@ -174,6 +187,7 @@ void BeamModuleAssembler::emit_nofail_bif2(const ArgSource &Src1, a.stp(src1.reg, src2.reg, getXRef(0)); + ubif_comment(Bif); mov_arg(ARG4, Bif); fragment_call(ga->get_i_bif_guard_shared()); mov_arg(Dst, ARG1); @@ -564,6 +578,10 @@ void BeamModuleAssembler::emit_call_light_bif(const ArgWord &Bif, mov_arg(ARG8, Bif); a.adr(ARG3, entry); + if (logger.file()) { + BeamFile_ImportEntry *e = &beam->imports.entries[Exp.get()]; + comment("BIF: %T:%T/%d", e->module, e->function, e->arity); + } fragment_call(ga->get_call_light_bif_shared()); } @@ -776,6 +794,10 @@ void BeamModuleAssembler::emit_call_bif_mfa(const ArgAtom &M, a.adr(ARG3, current_label); a.sub(ARG2, ARG3, imm(sizeof(ErtsCodeMFA))); + comment("HBIF: %T:%T/%d", + e->info.mfa.module, + e->info.mfa.function, + A.get()); a.mov(ARG4, imm(func)); a.b(resolve_fragment(ga->get_call_bif_shared(), disp128MB)); diff --git a/erts/emulator/beam/jit/x86/instr_bif.cpp b/erts/emulator/beam/jit/x86/instr_bif.cpp index 470c9a5a02..33e80c6b90 100644 --- a/erts/emulator/beam/jit/x86/instr_bif.cpp +++ b/erts/emulator/beam/jit/x86/instr_bif.cpp @@ -99,7 +99,7 @@ void BeamGlobalAssembler::emit_i_bif_body_shared() { } void BeamModuleAssembler::emit_setup_guard_bif(const std::vector<ArgVal> &args, - const ArgWord &bif) { + const ArgWord &Bif) { bool is_contiguous_mem = false; ASSERT(args.size() > 0 && args.size() <= 3); @@ -125,7 +125,13 @@ void BeamModuleAssembler::emit_setup_guard_bif(const std::vector<ArgVal> &args, } } - mov_arg(ARG4, bif); + if (logger.file()) { + ErtsCodeMFA *mfa = ubif2mfa((void *)Bif.get()); + if (mfa) { + comment("UBIF: %T/%d", mfa->function, mfa->arity); + } + } + mov_arg(ARG4, Bif); } void BeamModuleAssembler::emit_i_bif1(const ArgSource &Src1, @@ -626,6 +632,10 @@ void BeamModuleAssembler::emit_call_light_bif(const ArgWord &Bif, a.mov(RET, imm(Bif.get())); a.lea(ARG3, x86::qword_ptr(entry)); + if (logger.file()) { + BeamFile_ImportEntry *e = &beam->imports.entries[Exp.get()]; + comment("BIF: %T:%T/%d", e->module, e->function, e->arity); + } fragment_call(ga->get_call_light_bif_shared()); } @@ -842,6 +852,10 @@ void BeamModuleAssembler::emit_call_bif_mfa(const ArgAtom &M, e = erts_active_export_entry(M.get(), F.get(), A.get()); ASSERT(e != NULL && e->bif_number != -1); + comment("HBIF: %T:%T/%d", + e->info.mfa.module, + e->info.mfa.function, + A.get()); func = (BeamInstr)bif_table[e->bif_number].f; emit_call_bif(ArgWord(func)); } -- 2.35.3
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor