summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuis Rascao <luis.rascao@miniclip.com>2019-09-13 14:51:33 +0100
committerLuis Rascao <luis.rascao@miniclip.com>2019-09-17 08:49:33 +0100
commitcf766a6e82e07e520c98f087965f024e76dac0dd (patch)
tree8a60090007bf64b2f77ce574c9feb813cf79a954
parent40323104481d0813da9286e786af7f43a336b916 (diff)
downloaderlang-cf766a6e82e07e520c98f087965f024e76dac0dd.tar.gz
Add missing dtrace return invocations
Some return paths were not going through dtrace hooks so no function-return probes were being triggered on dtrace/systemtap. The return probe will now inform the user of which function it returns *from* as opposed the previous behaviour of informing where it returns *to*.
-rw-r--r--erts/emulator/beam/beam_emu.c6
-rw-r--r--erts/emulator/beam/instrs.tab5
2 files changed, 6 insertions, 5 deletions
diff --git a/erts/emulator/beam/beam_emu.c b/erts/emulator/beam/beam_emu.c
index e8a0c666e3..ee70b138e5 100644
--- a/erts/emulator/beam/beam_emu.c
+++ b/erts/emulator/beam/beam_emu.c
@@ -437,10 +437,10 @@ init_emulator(void)
} \
} while(0)
-#define DTRACE_RETURN_FROM_PC(p) \
+#define DTRACE_RETURN_FROM_PC(p, i) \
do { \
ErtsCodeMFA* cmfa; \
- if (DTRACE_ENABLED(function_return) && (cmfa = find_function_from_pc(cp_val((p)->stop[0])))) { \
+ if (DTRACE_ENABLED(function_return) && (cmfa = find_function_from_pc(i))) { \
DTRACE_RETURN((p), cmfa); \
} \
} while(0)
@@ -450,7 +450,7 @@ init_emulator(void)
#define DTRACE_GLOBAL_CALL(p, mfa) do {} while (0)
#define DTRACE_GLOBAL_CALL_FROM_EXPORT(p, e) do {} while (0)
#define DTRACE_RETURN(p, mfa) do {} while (0)
-#define DTRACE_RETURN_FROM_PC(p) do {} while (0)
+#define DTRACE_RETURN_FROM_PC(p, i) do {} while (0)
#define DTRACE_BIF_ENTRY(p, mfa) do {} while (0)
#define DTRACE_BIF_RETURN(p, mfa) do {} while (0)
#define DTRACE_NIF_ENTRY(p, mfa) do {} while (0)
diff --git a/erts/emulator/beam/instrs.tab b/erts/emulator/beam/instrs.tab
index 9396c09182..f53d60a5db 100644
--- a/erts/emulator/beam/instrs.tab
+++ b/erts/emulator/beam/instrs.tab
@@ -135,6 +135,7 @@ move_deallocate_return(Src, Deallocate) {
Eterm src = $Src;
E = ADD_BYTE_OFFSET(E, bytes_to_pop);
x(0) = src;
+ DTRACE_RETURN_FROM_PC(c_p, I);
$RETURN();
CHECK_TERM(x(0));
$DISPATCH_RETURN();
@@ -374,9 +375,8 @@ i_call_fun_last(Fun, Deallocate) {
return() {
//| -no_next
+ DTRACE_RETURN_FROM_PC(c_p, I);
$RETURN();
-
- DTRACE_RETURN_FROM_PC(c_p);
CHECK_TERM(r(0));
HEAP_SPACE_VERIFIED(0);
@@ -672,6 +672,7 @@ move_window5(S1, S2, S3, S4, S5, D) {
move_return(Src) {
//| -no_next
x(0) = $Src;
+ DTRACE_RETURN_FROM_PC(c_p, I);
$RETURN();
$DISPATCH_RETURN();
}