Skip to content

Commit

Permalink
Add functions to save and restore the PrettyStackTrace state.
Browse files Browse the repository at this point in the history
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
  • Loading branch information
nico committed Aug 7, 2015
1 parent 2fe3acd commit 6d6e4e4
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 0 deletions.
12 changes: 12 additions & 0 deletions include/llvm/Support/PrettyStackTrace.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 changes: 14 additions & 0 deletions lib/Support/PrettyStackTrace.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}

0 comments on commit 6d6e4e4

Please sign in to comment.