forked from OSchip/llvm-project
Fix registers for Windows on ARM64
Reviewed By: #sanitizers, vitalybuka Differential Revision: https://reviews.llvm.org/D116376
This commit is contained in:
parent
36138d8252
commit
0c391133c9
|
@ -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
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue