Add functions to save and restore the PrettyStackTrace state.

PrettyStackTraceHead is a LLVM_THREAD_LOCAL, which means it's just a global
in LLVM_ENABLE_THREADS=NO builds.  If a CrashRecoveryContext is used with
code that uses PrettyStackEntries, and a crash happens, PrettyStackTraceHead is
currently not reset to its pre-crash value.  These functions make it possible
to add a cleanup to such code that does this.

(Not reseting the value then causes the assert in ~PrettyStackTraceEntry() to
fire if the code outside of the CrashRecoveryContext also uses
PrettyStackEntries -- for example, clang when building a module.)

Part of PR11974.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@244338 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Nico Weber
2015-08-07 17:47:03 +00:00
parent 2fe3acd745
commit 6d6e4e4c1b
2 changed files with 26 additions and 0 deletions
+14
View File
@@ -154,6 +154,20 @@ void llvm::EnablePrettyStackTrace() {
#endif
}
const void* llvm::SavePrettyStackState() {
#if defined(HAVE_BACKTRACE) && defined(ENABLE_BACKTRACES)
return PrettyStackTraceHead;
#else
return nullptr;
#endif
}
void llvm::RestorePrettyStackState(const void* Top) {
#if defined(HAVE_BACKTRACE) && defined(ENABLE_BACKTRACES)
PrettyStackTraceHead = (const PrettyStackTraceEntry*)Top;
#endif
}
void LLVMEnablePrettyStackTrace() {
EnablePrettyStackTrace();
}