mirror of
https://github.com/RPCS3/llvm.git
synced 2026-07-19 23:23:38 -04:00
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:
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user