summaryrefslogtreecommitdiff
path: root/erts/emulator/beam/jit/arm/instr_trace.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'erts/emulator/beam/jit/arm/instr_trace.cpp')
-rw-r--r--erts/emulator/beam/jit/arm/instr_trace.cpp43
1 files changed, 22 insertions, 21 deletions
diff --git a/erts/emulator/beam/jit/arm/instr_trace.cpp b/erts/emulator/beam/jit/arm/instr_trace.cpp
index b8a64d2628..1db21b7446 100644
--- a/erts/emulator/beam/jit/arm/instr_trace.cpp
+++ b/erts/emulator/beam/jit/arm/instr_trace.cpp
@@ -37,7 +37,7 @@ void BeamGlobalAssembler::emit_generic_bp_global() {
lea(ARG2, arm::Mem(ARG1, offsetof(Export, info)));
- emit_enter_runtime<Update::eStack | Update::eHeap | Update::eXRegs |
+ emit_enter_runtime<Update::eHeapAlloc | Update::eXRegs |
Update::eReductions>();
a.mov(ARG1, c_p);
@@ -45,7 +45,7 @@ void BeamGlobalAssembler::emit_generic_bp_global() {
load_x_reg_array(ARG3);
runtime_call<3>(erts_generic_breakpoint);
- emit_leave_runtime<Update::eStack | Update::eHeap | Update::eXRegs |
+ emit_leave_runtime<Update::eHeapAlloc | Update::eXRegs |
Update::eReductions>();
/* This is technically a tail call so we must leave the current frame
@@ -72,7 +72,7 @@ void BeamGlobalAssembler::emit_generic_bp_local() {
a.sub(ARG2, ARG2, imm(BEAM_ASM_FUNC_PROLOGUE_SIZE + sizeof(ErtsCodeInfo)));
emit_enter_runtime_frame();
- emit_enter_runtime<Update::eStack | Update::eHeap | Update::eXRegs |
+ emit_enter_runtime<Update::eHeapAlloc | Update::eXRegs |
Update::eReductions>();
a.mov(ARG1, c_p);
@@ -80,7 +80,7 @@ void BeamGlobalAssembler::emit_generic_bp_local() {
load_x_reg_array(ARG3);
runtime_call<3>(erts_generic_breakpoint);
- emit_leave_runtime<Update::eStack | Update::eHeap | Update::eXRegs |
+ emit_leave_runtime<Update::eHeapAlloc | Update::eXRegs |
Update::eReductions>();
a.cmp(ARG1, imm(BeamOpCodeAddr(op_i_debug_breakpoint)));
@@ -101,7 +101,7 @@ void BeamGlobalAssembler::emit_debug_bp() {
a.ldr(ARG2, TMP_MEM1q);
a.sub(ARG2, ARG2, imm(BEAM_ASM_FUNC_PROLOGUE_SIZE + sizeof(ErtsCodeMFA)));
- emit_enter_runtime<Update::eStack | Update::eHeap | Update::eXRegs |
+ emit_enter_runtime<Update::eHeapAlloc | Update::eXRegs |
Update::eReductions>();
a.mov(ARG1, c_p);
@@ -109,7 +109,7 @@ void BeamGlobalAssembler::emit_debug_bp() {
a.mov(ARG4, imm(am_breakpoint));
runtime_call<4>(call_error_handler);
- emit_leave_runtime<Update::eStack | Update::eHeap | Update::eXRegs |
+ emit_leave_runtime<Update::eHeapAlloc | Update::eXRegs |
Update::eReductions>();
/* We skip two runtime frames (ours and the one entered in the module
@@ -147,62 +147,63 @@ void BeamModuleAssembler::emit_return_trace() {
lea(ARG4, getYRef(1));
ERTS_CT_ASSERT(ERTS_HIGHEST_CALLEE_SAVE_XREG >= 1);
- emit_enter_runtime<Update::eStack | Update::eHeap>(1);
+ emit_enter_runtime<Update::eHeapAlloc>(1);
a.mov(ARG1, c_p);
runtime_call<4>(return_trace);
- emit_leave_runtime<Update::eStack | Update::eHeap>(1);
+ emit_leave_runtime<Update::eHeapAlloc>(1);
- emit_deallocate(ArgVal(ArgVal::Word, 2));
+ emit_deallocate(ArgVal(ArgVal::Word, BEAM_RETURN_TRACE_FRAME_SZ));
emit_return();
}
-void BeamModuleAssembler::emit_i_return_time_trace() {
+void BeamModuleAssembler::emit_i_call_trace_return() {
/* Pass prev_info if present (is a CP), otherwise null. */
a.ldr(ARG2, getYRef(0));
- mov_imm(ARG3, 0);
+ mov_imm(ARG4, 0);
a.tst(ARG2, imm(_CPMASK));
a.sub(ARG2, ARG2, imm(sizeof(ErtsCodeInfo)));
- a.csel(ARG2, ARG2, ARG3, arm::CondCode::kEQ);
+ a.csel(ARG2, ARG2, ARG4, arm::CondCode::kEQ);
+ a.ldr(ARG3, getYRef(1));
ERTS_CT_ASSERT(ERTS_HIGHEST_CALLEE_SAVE_XREG >= 1);
- emit_enter_runtime<Update::eStack | Update::eHeap>(1);
+ emit_enter_runtime<Update::eHeapAlloc>(1);
a.mov(ARG1, c_p);
- runtime_call<2>(erts_trace_time_return);
+ runtime_call<3>(erts_call_trace_return);
- emit_leave_runtime<Update::eStack | Update::eHeap>(1);
+ emit_leave_runtime<Update::eHeapAlloc>(1);
- emit_deallocate(ArgVal(ArgVal::Word, 1));
+ emit_deallocate(ArgVal(ArgVal::Word, BEAM_RETURN_CALL_ACC_TRACE_FRAME_SZ));
emit_return();
}
void BeamModuleAssembler::emit_i_return_to_trace() {
ERTS_CT_ASSERT(ERTS_HIGHEST_CALLEE_SAVE_XREG >= 1);
- emit_enter_runtime<Update::eStack | Update::eHeap>(1);
+ emit_enter_runtime<Update::eHeapAlloc>(1);
a.mov(ARG1, c_p);
runtime_call<1>(beam_jit_return_to_trace);
- emit_leave_runtime<Update::eStack | Update::eHeap>(1);
+ emit_leave_runtime<Update::eHeapAlloc>(1);
- emit_deallocate(ArgVal(ArgVal::Word, 0));
+ emit_deallocate(ArgVal(ArgVal::Word, BEAM_RETURN_TO_TRACE_FRAME_SZ));
emit_return();
}
void BeamModuleAssembler::emit_i_hibernate() {
Label error = a.newLabel();
- emit_enter_runtime<Update::eStack | Update::eHeap | Update::eXRegs |
+ emit_enter_runtime<Update::eHeapAlloc | Update::eXRegs |
Update::eReductions>(3);
a.mov(ARG1, c_p);
load_x_reg_array(ARG2);
runtime_call<2>(erts_hibernate);
- emit_leave_runtime<Update::eStack | Update::eHeap | Update::eXRegs |
+ emit_leave_runtime<Update::eHeapAlloc | Update::eXRegs |
Update::eReductions>(3);
a.cbz(ARG1, error);