Daniel wanted the stack printed upside down. Perhaps he
authorChris Lattner <sabre@nondot.org>
Thu, 5 Mar 2009 07:03:49 +0000 (07:03 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 5 Mar 2009 07:03:49 +0000 (07:03 +0000)
feels a kinship to machine stacks that grow down.  Now we get
stuff like this:

Stack dump:
0. Program arguments: clang clang_crash_Iw2Osj.mi
1. /Developer/SDKs/MacOSX10.5.sdk/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/xmmintrin.h:624:1: parsing function body '_mm_cvtpi16_ps'
2. /Developer/SDKs/MacOSX10.5.sdk/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/xmmintrin.h:624:1: in compound statement ('{}')
Abort

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@66145 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Support/PrettyStackTrace.cpp

index 0a514045855860067fd8a84b7a4115d0bb8a56cc..1462ef0eb813e58643b6a85e50fcf1ec0fb0a893 100644 (file)
@@ -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();
 }