mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-07-21 02:29:22 +00:00
on apple systems, integrate nicely with crash reporter.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@66264 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
00e389c8c8
commit
49155ffaba
@ -15,6 +15,7 @@
|
|||||||
#include "llvm/Support/PrettyStackTrace.h"
|
#include "llvm/Support/PrettyStackTrace.h"
|
||||||
#include "llvm/Support/raw_ostream.h"
|
#include "llvm/Support/raw_ostream.h"
|
||||||
#include "llvm/System/Signals.h"
|
#include "llvm/System/Signals.h"
|
||||||
|
#include "llvm/ADT/SmallString.h"
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
||||||
// FIXME: This should be thread local when llvm supports threads.
|
// FIXME: This should be thread local when llvm supports threads.
|
||||||
@ -30,20 +31,49 @@ static unsigned PrintStack(const PrettyStackTraceEntry *Entry, raw_ostream &OS){
|
|||||||
return NextID+1;
|
return NextID+1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// CrashHandler - This callback is run if a fatal signal is delivered to the
|
/// PrintCurStackTrace - Print the current stack trace to the specified stream.
|
||||||
/// process, it prints the pretty stack trace.
|
static void PrintCurStackTrace(raw_ostream &OS) {
|
||||||
static void CrashHandler(void *Cookie) {
|
|
||||||
// Don't print an empty trace.
|
// Don't print an empty trace.
|
||||||
if (PrettyStackTraceHead == 0) return;
|
if (PrettyStackTraceHead == 0) return;
|
||||||
|
|
||||||
// If there are pretty stack frames registered, walk and emit them.
|
// If there are pretty stack frames registered, walk and emit them.
|
||||||
raw_ostream &OS = errs();
|
|
||||||
OS << "Stack dump:\n";
|
OS << "Stack dump:\n";
|
||||||
|
|
||||||
PrintStack(PrettyStackTraceHead, OS);
|
PrintStack(PrettyStackTraceHead, OS);
|
||||||
OS.flush();
|
OS.flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Integrate with crash reporter.
|
||||||
|
#ifdef __APPLE__
|
||||||
|
extern "C" const char *__crashreporter_info__;
|
||||||
|
const char *__crashreporter_info__ = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/// CrashHandler - This callback is run if a fatal signal is delivered to the
|
||||||
|
/// process, it prints the pretty stack trace.
|
||||||
|
static void CrashHandler(void *Cookie) {
|
||||||
|
#ifndef __APPLE__
|
||||||
|
// On non-apple systems, just emit the crash stack trace to stderr.
|
||||||
|
PrintCurStackTrace(errs());
|
||||||
|
#else
|
||||||
|
// Otherwise, emit to a smallvector of chars, send *that* to stderr, but also
|
||||||
|
// put it into __crashreporter_info__.
|
||||||
|
SmallString<2048> TmpStr;
|
||||||
|
{
|
||||||
|
raw_svector_ostream Stream(TmpStr);
|
||||||
|
PrintCurStackTrace(Stream);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!TmpStr.empty()) {
|
||||||
|
__crashreporter_info__ = strdup(&TmpStr[0]);
|
||||||
|
errs() << __crashreporter_info__;
|
||||||
|
errs().flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
static bool RegisterCrashPrinter() {
|
static bool RegisterCrashPrinter() {
|
||||||
sys::AddSignalHandler(CrashHandler, 0);
|
sys::AddSignalHandler(CrashHandler, 0);
|
||||||
return false;
|
return false;
|
||||||
|
Loading…
Reference in New Issue
Block a user