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
+12
View File
@@ -66,6 +66,18 @@ namespace llvm {
void print(raw_ostream &OS) const override;
};
/// Returns the topmost element of the "pretty" stack state.
const void* SavePrettyStackState();
/// Restores the topmost element of the "pretty" stack state to State, which
/// should come from a previous call to SavePrettyStackState(). This is
/// useful when using a CrashRecoveryContext in code that also uses
/// PrettyStackTraceEntries, to make sure the stack that's printed if a crash
/// happens after a crash that's been recovered by CrashRecoveryContext
/// doesn't have frames on it that were added in code unwound by the
/// CrashRecoveryContext.
void RestorePrettyStackState(const void* State);
} // end namespace llvm
#endif
+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();
}