Skip to content

Commit d12c48c

Browse files
authored
[lldb/aarch64] Allow unaligned PC addresses below a trap handler (#92093)
The stack validation heuristic is counter-productive in this case, as the unaligned address is most likely the thing that caused the signal in the first place.
1 parent 7f3ac51 commit d12c48c

File tree

3 files changed

+58
-1
lines changed

3 files changed

+58
-1
lines changed

lldb/source/Target/UnwindLLDB.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,12 @@ UnwindLLDB::CursorSP UnwindLLDB::GetOneMoreFrame(ABI *abi) {
261261
cur_idx < 100 ? cur_idx : 100, "", cur_idx);
262262
return nullptr;
263263
}
264-
if (abi && !abi->CodeAddressIsValid(cursor_sp->start_pc)) {
264+
265+
// Invalid code addresses should not appear on the stack *unless* we're
266+
// directly below a trap handler frame (in this case, the invalid address is
267+
// likely the cause of the trap).
268+
if (abi && !abi->CodeAddressIsValid(cursor_sp->start_pc) &&
269+
!prev_frame->reg_ctx_lldb_sp->IsTrapHandlerFrame()) {
265270
// If the RegisterContextUnwind has a fallback UnwindPlan, it will switch to
266271
// that and return true. Subsequent calls to TryFallbackUnwindPlan() will
267272
// return false.
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#include <signal.h>
2+
#include <stdint.h>
3+
#include <unistd.h>
4+
5+
void sigbus_handler(int signo) { _exit(47); }
6+
7+
int target_function() { return 47; }
8+
9+
int main() {
10+
signal(SIGBUS, sigbus_handler);
11+
12+
// Generate a SIGBUS by deliverately calling through an unaligned function
13+
// pointer.
14+
union {
15+
int (*t)();
16+
uintptr_t p;
17+
} u;
18+
u.t = target_function;
19+
u.p |= 1;
20+
return u.t();
21+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# REQUIRES: (target-aarch64 || target-arm) && native
2+
# UNSUPPORTED: system-windows
3+
# llvm.org/pr91610, rdar://128031075
4+
# XFAIL: system-darwin
5+
6+
# RUN: %clang_host %S/Inputs/unaligned-pc-sigbus.c -o %t
7+
# RUN: %lldb -s %s -o exit %t | FileCheck %s
8+
9+
# Convert EXC_BAD_ACCESS into SIGBUS on darwin.
10+
settings set platform.plugin.darwin.ignored-exceptions EXC_BAD_ACCESS
11+
12+
breakpoint set -n sigbus_handler
13+
# CHECK: Breakpoint 1: where = {{.*}}`sigbus_handler
14+
15+
run
16+
# CHECK: thread #1, {{.*}} stop reason = signal SIGBUS
17+
18+
thread backtrace
19+
# CHECK: (lldb) thread backtrace
20+
# CHECK: frame #0: [[TARGET:0x[0-9a-fA-F]*]] {{.*}}`target_function
21+
22+
continue
23+
# CHECK: thread #1, {{.*}} stop reason = breakpoint 1
24+
25+
26+
thread backtrace
27+
# CHECK: (lldb) thread backtrace
28+
# CHECK: frame #0: {{.*}}`sigbus_handler
29+
# Unknown number of signal trampoline frames
30+
# CHECK: frame #{{[0-9]+}}: [[TARGET]] {{.*}}`target_function
31+

0 commit comments

Comments
 (0)