summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Högberg <john@erlang.org>2023-05-11 16:46:49 +0200
committerJohn Högberg <john@erlang.org>2023-05-11 16:46:49 +0200
commited1e2d2f70b80fbc7c17511e94ee00c90b67859f (patch)
tree0363e04ee8a91af2274803cfe10d2c38e539e6f0
parent911461e585a1ab82857b501ca6c9ffb31c2efd8c (diff)
parent4a6fcd75289130da6752195a013d0699ce154ce3 (diff)
downloaderlang-ed1e2d2f70b80fbc7c17511e94ee00c90b67859f.tar.gz
Merge branch 'john/jit/fix-tracing-non-native-stack/OTP-18561'
* john/jit/fix-tracing-non-native-stack/OTP-18561: jit: Fix tracing for non-native stack
-rw-r--r--erts/emulator/beam/jit/x86/instr_trace.cpp21
1 files changed, 15 insertions, 6 deletions
diff --git a/erts/emulator/beam/jit/x86/instr_trace.cpp b/erts/emulator/beam/jit/x86/instr_trace.cpp
index 359d0d8a6d..f6d7937f4e 100644
--- a/erts/emulator/beam/jit/x86/instr_trace.cpp
+++ b/erts/emulator/beam/jit/x86/instr_trace.cpp
@@ -109,10 +109,10 @@ void BeamGlobalAssembler::emit_generic_bp_local() {
a.cmp(RET, imm(BeamOpCodeAddr(op_i_debug_breakpoint)));
a.je(labels[debug_bp]);
+#ifdef NATIVE_ERLANG_STACK
/* Note that we don't restore our return addresses in the `debug_bp` case
* above, since it tail calls the error handler and thus never returns to
* module code or `call_nif_early`. */
-#ifdef NATIVE_ERLANG_STACK
a.push(TMP_MEM1q);
a.push(TMP_MEM2q);
#endif
@@ -127,6 +127,12 @@ void BeamGlobalAssembler::emit_generic_bp_local() {
void BeamGlobalAssembler::emit_debug_bp() {
Label error = a.newLabel();
+#ifndef NATIVE_ERLANG_STACK
+ /* We're never going to return to module code, so we have to discard the
+ * return addresses added by the breakpoint trampoline. */
+ a.add(x86::rsp, imm(sizeof(ErtsCodePtr[2])));
+#endif
+
emit_assert_erlang_stack();
emit_enter_frame();
@@ -204,16 +210,19 @@ void BeamModuleAssembler::emit_i_call_trace_return() {
}
void BeamModuleAssembler::emit_i_return_to_trace() {
- emit_enter_runtime<Update::eHeapAlloc>();
+ /* Remove our stack frame so that `beam_jit_return_to_trace` can inspect
+ * the next one.
+ *
+ * (This doesn't do anything if the native stack is used.) */
+ emit_deallocate(ArgWord(BEAM_RETURN_TO_TRACE_FRAME_SZ));
+
+ emit_enter_runtime<Update::eReductions | Update::eHeapAlloc>();
a.mov(ARG1, c_p);
runtime_call<1>(beam_jit_return_to_trace);
- emit_leave_runtime<Update::eHeapAlloc>();
+ emit_leave_runtime<Update::eReductions | Update::eHeapAlloc>();
- /* Remove the zero-sized stack frame. (Will actually do nothing if
- * the native stack is used.) */
- emit_deallocate(ArgWord(BEAM_RETURN_TO_TRACE_FRAME_SZ));
emit_return();
}