Skip to content

Commit 0c39113

Browse files
DoDoENTvitalybuka
authored andcommitted
Fix registers for Windows on ARM64
Reviewed By: #sanitizers, vitalybuka Differential Revision: https://reviews.llvm.org/D116376
1 parent 36138d8 commit 0c39113

File tree

2 files changed

+25
-13
lines changed

2 files changed

+25
-13
lines changed

compiler-rt/lib/sanitizer_common/sanitizer_unwind_win.cpp

+17-10
Original file line numberDiff line numberDiff line change
@@ -57,30 +57,37 @@ void BufferedStackTrace::UnwindSlow(uptr pc, void *context, u32 max_depth) {
5757
InitializeDbgHelpIfNeeded();
5858

5959
size = 0;
60-
#if defined(_WIN64)
60+
# if SANITIZER_WINDOWS64
61+
# if SANITIZER_ARM64
62+
int machine_type = IMAGE_FILE_MACHINE_ARM64;
63+
stack_frame.AddrPC.Offset = ctx.Pc;
64+
stack_frame.AddrFrame.Offset = ctx.Fp;
65+
stack_frame.AddrStack.Offset = ctx.Sp;
66+
# else
6167
int machine_type = IMAGE_FILE_MACHINE_AMD64;
6268
stack_frame.AddrPC.Offset = ctx.Rip;
6369
stack_frame.AddrFrame.Offset = ctx.Rbp;
6470
stack_frame.AddrStack.Offset = ctx.Rsp;
65-
#else
71+
# endif
72+
# else
6673
int machine_type = IMAGE_FILE_MACHINE_I386;
6774
stack_frame.AddrPC.Offset = ctx.Eip;
6875
stack_frame.AddrFrame.Offset = ctx.Ebp;
6976
stack_frame.AddrStack.Offset = ctx.Esp;
70-
#endif
77+
# endif
7178
stack_frame.AddrPC.Mode = AddrModeFlat;
7279
stack_frame.AddrFrame.Mode = AddrModeFlat;
7380
stack_frame.AddrStack.Mode = AddrModeFlat;
7481
while (StackWalk64(machine_type, GetCurrentProcess(), GetCurrentThread(),
75-
&stack_frame, &ctx, NULL, SymFunctionTableAccess64,
76-
SymGetModuleBase64, NULL) &&
77-
size < Min(max_depth, kStackTraceMax)) {
82+
&stack_frame, &ctx, NULL, SymFunctionTableAccess64,
83+
SymGetModuleBase64, NULL) &&
84+
size < Min(max_depth, kStackTraceMax)) {
7885
trace_buffer[size++] = (uptr)stack_frame.AddrPC.Offset;
7986
}
8087
}
81-
#ifdef __clang__
82-
#pragma clang diagnostic pop
83-
#endif
84-
#endif // #if !SANITIZER_GO
88+
# ifdef __clang__
89+
# pragma clang diagnostic pop
90+
# endif
91+
# endif // #if !SANITIZER_GO
8592

8693
#endif // SANITIZER_WINDOWS

compiler-rt/lib/sanitizer_common/sanitizer_win.cpp

+8-3
Original file line numberDiff line numberDiff line change
@@ -950,13 +950,18 @@ void SignalContext::InitPcSpBp() {
950950
CONTEXT *context_record = (CONTEXT *)context;
951951

952952
pc = (uptr)exception_record->ExceptionAddress;
953-
#ifdef _WIN64
953+
# if SANITIZER_WINDOWS64
954+
# if SANITIZER_ARM64
955+
bp = (uptr)context_record->Fp;
956+
sp = (uptr)context_record->Sp;
957+
# else
954958
bp = (uptr)context_record->Rbp;
955959
sp = (uptr)context_record->Rsp;
956-
#else
960+
# endif
961+
# else
957962
bp = (uptr)context_record->Ebp;
958963
sp = (uptr)context_record->Esp;
959-
#endif
964+
# endif
960965
}
961966

962967
uptr SignalContext::GetAddress() const {

0 commit comments

Comments
 (0)