summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Högberg <john@erlang.org>2019-09-10 16:42:49 +0200
committerJohn Högberg <john@erlang.org>2019-09-16 14:21:25 +0200
commit1c49fba50b7536865a340664f4004f501c3a2109 (patch)
treebcc9885ba74af299627dcf6eb45ec8f0b9aa6228
parentc42be1bb5540ed0ffafdc46b506a1bbe0cbaa2df (diff)
downloaderlang-1c49fba50b7536865a340664f4004f501c3a2109.tar.gz
erts: Share printable_return_address with erl_bif_info
-rw-r--r--erts/emulator/beam/beam_emu.c20
-rw-r--r--erts/emulator/beam/bif_instrs.tab2
-rw-r--r--erts/emulator/beam/erl_bif_info.c23
-rw-r--r--erts/emulator/beam/global.h1
4 files changed, 9 insertions, 37 deletions
diff --git a/erts/emulator/beam/beam_emu.c b/erts/emulator/beam/beam_emu.c
index 20c4f83a81..e8a0c666e3 100644
--- a/erts/emulator/beam/beam_emu.c
+++ b/erts/emulator/beam/beam_emu.c
@@ -295,7 +295,6 @@ do { \
*/
static void init_emulator_finish(void) ERTS_NOINLINE;
static ErtsCodeMFA *ubif2mfa(void* uf) ERTS_NOINLINE;
-static BeamInstr *printable_return_address(Process* p, Eterm *E) ERTS_NOINLINE;
static BeamInstr* handle_error(Process* c_p, BeamInstr* pc,
Eterm* reg, ErtsCodeMFA* bif_mfa) ERTS_NOINLINE;
static BeamInstr* call_error_handler(Process* p, ErtsCodeMFA* mfa,
@@ -1259,7 +1258,7 @@ Eterm error_atom[NUMBER_EXIT_CODES] = {
*
* This is needed to generate correct stacktraces when throwing errors from
* instructions that return like an ordinary function, such as call_nif. */
-static BeamInstr *printable_return_address(Process* p, Eterm *E) {
+BeamInstr *erts_printable_return_address(Process* p, Eterm *E) {
Eterm *ptr = E;
ASSERT(is_CP(*ptr));
@@ -1576,9 +1575,6 @@ expand_error_value(Process* c_p, Uint freason, Eterm Value) {
static void
gather_stacktrace(Process* p, struct StackTrace* s, int depth)
{
- BeamInstr i_return_time_trace;
- BeamInstr i_return_to_trace;
- BeamInstr i_return_trace;
BeamInstr *prev;
Eterm *ptr;
@@ -1586,11 +1582,7 @@ gather_stacktrace(Process* p, struct StackTrace* s, int depth)
return;
}
- i_return_time_trace = beam_return_time_trace[0];
- i_return_to_trace = beam_return_to_trace[0];
- i_return_trace = beam_return_trace[0];
-
- prev = s->depth ? s->trace[s->depth-1] : s->pc;
+ prev = s->depth ? s->trace[s->depth - 1] : s->pc;
ptr = p->stop;
/*
@@ -1606,12 +1598,12 @@ gather_stacktrace(Process* p, struct StackTrace* s, int depth)
if (is_CP(*ptr)) {
BeamInstr *cp = cp_val(*ptr);
- if (*cp == i_return_time_trace) {
+ if (cp == beam_exception_trace || cp == beam_return_trace) {
+ ptr += 3;
+ } else if (cp == beam_return_time_trace) {
ptr += 2;
- } else if (*cp == i_return_to_trace) {
+ } else if (cp == beam_return_to_trace) {
ptr += 1;
- } else if (*cp == i_return_trace) {
- ptr += 3;
} else {
if (cp != prev) {
/* Record non-duplicates only */
diff --git a/erts/emulator/beam/bif_instrs.tab b/erts/emulator/beam/bif_instrs.tab
index 42abd4b6c6..de5305bde4 100644
--- a/erts/emulator/beam/bif_instrs.tab
+++ b/erts/emulator/beam/bif_instrs.tab
@@ -606,7 +606,7 @@ nif_bif.epilogue() {
$DISPATCH();
}
{
- BeamInstr *cp = printable_return_address(c_p, E);
+ BeamInstr *cp = erts_printable_return_address(c_p, E);
ASSERT(VALID_INSTR(*cp));
I = handle_error(c_p, cp, reg, c_p->current);
}
diff --git a/erts/emulator/beam/erl_bif_info.c b/erts/emulator/beam/erl_bif_info.c
index 946fefa14f..21e8585e83 100644
--- a/erts/emulator/beam/erl_bif_info.c
+++ b/erts/emulator/beam/erl_bif_info.c
@@ -2024,7 +2024,6 @@ current_function(Process *c_p, ErtsHeapFactory *hfact, Process* rp,
if (c_p == rp && !(flags & ERTS_PI_FLAG_REQUEST_FOR_OTHER)) {
BeamInstr* return_address;
FunctionInfo caller_fi;
- Eterm *ptr;
/*
* The current function is erlang:process_info/{1,2}, and we've
@@ -2033,27 +2032,7 @@ current_function(Process *c_p, ErtsHeapFactory *hfact, Process* rp,
* stack instead, which is safe since process_info is a "heavy" BIF
* that is only called through its export entry.
*/
-
- return_address = NULL;
- ptr = STACK_TOP(rp);
- ASSERT(is_CP(*ptr));
-
- while (ptr < STACK_START(rp)) {
- BeamInstr *cp = cp_val(*ptr);
-
- if (*cp == BeamOpCodeAddr(op_return_trace)) {
- ptr += 3;
- } else if (*cp == BeamOpCodeAddr(op_i_return_time_trace)) {
- ptr += 2;
- } else if (*cp == BeamOpCodeAddr(op_i_return_to_trace)) {
- ptr += 1;
- } else {
- return_address = cp;
- break;
- }
- }
-
- ASSERT(return_address != NULL);
+ return_address = erts_printable_return_address(rp, STACK_TOP(rp));
erts_lookup_function_info(&caller_fi, return_address, full_info);
if (caller_fi.mfa) {
diff --git a/erts/emulator/beam/global.h b/erts/emulator/beam/global.h
index 5bd0882834..b86709b093 100644
--- a/erts/emulator/beam/global.h
+++ b/erts/emulator/beam/global.h
@@ -1156,6 +1156,7 @@ void erts_dirty_process_main(ErtsSchedulerData *);
Eterm build_stacktrace(Process* c_p, Eterm exc);
Eterm expand_error_value(Process* c_p, Uint freason, Eterm Value);
void erts_save_stacktrace(Process* p, struct StackTrace* s, int depth);
+BeamInstr *erts_printable_return_address(Process* p, Eterm *E) ERTS_NOINLINE;
/* erl_init.c */