summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorReid Kleckner <rnk@google.com>2020-01-31 14:39:14 -0800
committerHans Wennborg <hans@chromium.org>2020-02-11 11:03:58 +0100
commitdbe9c3a82dd7db8e50acb008f21a273c55fa5c82 (patch)
tree946ccabd5e3fda738ac5f38306324ff510671cd9
parent4e6ec0fff658cbe29e70f46491917202baa061c0 (diff)
downloadbcm5719-llvm-dbe9c3a82dd7db8e50acb008f21a273c55fa5c82.tar.gz
bcm5719-llvm-dbe9c3a82dd7db8e50acb008f21a273c55fa5c82.zip
[Support] Don't modify the current EH context during stack unwinding
Copy it instead. Otherwise, key registers (such as RBP) may get zeroed out by the stack unwinder. Fixes CrashRecoveryTest.DumpStackCleanup with MSVC in release builds. Reviewed By: stella.stamenova Differential Revision: https://reviews.llvm.org/D73809 (cherry picked from commit b074acb82f7e75a189fa7933b09627241b166121)
-rw-r--r--llvm/lib/Support/Windows/Signals.inc8
1 files changed, 7 insertions, 1 deletions
diff --git a/llvm/lib/Support/Windows/Signals.inc b/llvm/lib/Support/Windows/Signals.inc
index 8b525f1bd4a..09e19ae41f1 100644
--- a/llvm/lib/Support/Windows/Signals.inc
+++ b/llvm/lib/Support/Windows/Signals.inc
@@ -820,7 +820,13 @@ static LONG WINAPI LLVMUnhandledExceptionFilter(LPEXCEPTION_POINTERS ep) {
<< "\n";
}
- LocalPrintStackTrace(llvm::errs(), ep ? ep->ContextRecord : nullptr);
+ // Stack unwinding appears to modify the context. Copy it to preserve the
+ // caller's context.
+ CONTEXT ContextCopy;
+ if (ep)
+ memcpy(&ContextCopy, ep->ContextRecord, sizeof(ContextCopy));
+
+ LocalPrintStackTrace(llvm::errs(), ep ? &ContextCopy : nullptr);
return EXCEPTION_EXECUTE_HANDLER;
}
OpenPOWER on IntegriCloud