Fix registers for Windows on ARM64

Reviewed By: #sanitizers, vitalybuka

Differential Revision: https://reviews.llvm.org/D116376
This commit is contained in:
Nenad Mikša 2022-01-13 21:36:57 -08:00 committed by Vitaly Buka
parent 36138d8252
commit 0c391133c9
2 changed files with 25 additions and 13 deletions

View File

@ -57,30 +57,37 @@ void BufferedStackTrace::UnwindSlow(uptr pc, void *context, u32 max_depth) {
InitializeDbgHelpIfNeeded();
size = 0;
#if defined(_WIN64)
# if SANITIZER_WINDOWS64
# if SANITIZER_ARM64
int machine_type = IMAGE_FILE_MACHINE_ARM64;
stack_frame.AddrPC.Offset = ctx.Pc;
stack_frame.AddrFrame.Offset = ctx.Fp;
stack_frame.AddrStack.Offset = ctx.Sp;
# else
int machine_type = IMAGE_FILE_MACHINE_AMD64;
stack_frame.AddrPC.Offset = ctx.Rip;
stack_frame.AddrFrame.Offset = ctx.Rbp;
stack_frame.AddrStack.Offset = ctx.Rsp;
#else
# endif
# else
int machine_type = IMAGE_FILE_MACHINE_I386;
stack_frame.AddrPC.Offset = ctx.Eip;
stack_frame.AddrFrame.Offset = ctx.Ebp;
stack_frame.AddrStack.Offset = ctx.Esp;
#endif
# endif
stack_frame.AddrPC.Mode = AddrModeFlat;
stack_frame.AddrFrame.Mode = AddrModeFlat;
stack_frame.AddrStack.Mode = AddrModeFlat;
while (StackWalk64(machine_type, GetCurrentProcess(), GetCurrentThread(),
&stack_frame, &ctx, NULL, SymFunctionTableAccess64,
SymGetModuleBase64, NULL) &&
size < Min(max_depth, kStackTraceMax)) {
&stack_frame, &ctx, NULL, SymFunctionTableAccess64,
SymGetModuleBase64, NULL) &&
size < Min(max_depth, kStackTraceMax)) {
trace_buffer[size++] = (uptr)stack_frame.AddrPC.Offset;
}
}
#ifdef __clang__
#pragma clang diagnostic pop
#endif
#endif // #if !SANITIZER_GO
# ifdef __clang__
# pragma clang diagnostic pop
# endif
# endif // #if !SANITIZER_GO
#endif // SANITIZER_WINDOWS

View File

@ -950,13 +950,18 @@ void SignalContext::InitPcSpBp() {
CONTEXT *context_record = (CONTEXT *)context;
pc = (uptr)exception_record->ExceptionAddress;
#ifdef _WIN64
# if SANITIZER_WINDOWS64
# if SANITIZER_ARM64
bp = (uptr)context_record->Fp;
sp = (uptr)context_record->Sp;
# else
bp = (uptr)context_record->Rbp;
sp = (uptr)context_record->Rsp;
#else
# endif
# else
bp = (uptr)context_record->Ebp;
sp = (uptr)context_record->Esp;
#endif
# endif
}
uptr SignalContext::GetAddress() const {