diff --git a/llvm/lib/Support/PrettyStackTrace.cpp b/llvm/lib/Support/PrettyStackTrace.cpp index 0a514045855860067fd8a84b7a4115d0bb8a56cc..1462ef0eb813e58643b6a85e50fcf1ec0fb0a893 100644 --- a/llvm/lib/Support/PrettyStackTrace.cpp +++ b/llvm/lib/Support/PrettyStackTrace.cpp @@ -20,19 +20,27 @@ using namespace llvm; // FIXME: This should be thread local when llvm supports threads. static const PrettyStackTraceEntry *PrettyStackTraceHead = 0; +static unsigned PrintStack(const PrettyStackTraceEntry *Entry, raw_ostream &OS){ + unsigned NextID = 0; + if (Entry->getNextEntry()) + NextID = PrintStack(Entry->getNextEntry(), OS); + OS << NextID << ".\t"; + Entry->print(OS); + + return NextID+1; +} + /// 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) { + // Don't print an empty trace. + if (PrettyStackTraceHead == 0) return; + // If there are pretty stack frames registered, walk and emit them. raw_ostream &OS = errs(); OS << "Stack dump:\n"; - unsigned i = 0; - for (const PrettyStackTraceEntry *Entry = PrettyStackTraceHead; Entry; - Entry = Entry->getNextEntry(), ++i) { - OS << i << ".\t"; - Entry->print(OS); - } + PrintStack(PrettyStackTraceHead, OS); OS.flush(); }