<div dir="ltr">test case (possibly a unit test) for <span style="color:rgb(33,33,33)">Prett</span><span style="color:rgb(33,33,33)">yStackTraceFormat::</span><span style="color:rgb(33,33,33)">Prett</span><span style="color:rgb(33,33,33)">yStackTraceFormat?</span></div><br><div class="gmail_quote"><div dir="ltr">On Wed, Dec 14, 2016 at 11:20 AM Sean Callanan via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: spyffe<br class="gmail_msg">
Date: Wed Dec 14 13:09:43 2016<br class="gmail_msg">
New Revision: 289689<br class="gmail_msg">
<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=289689&view=rev" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project?rev=289689&view=rev</a><br class="gmail_msg">
Log:<br class="gmail_msg">
Prepare PrettyStackTrace for LLDB adoption<br class="gmail_msg">
<br class="gmail_msg">
This patch fixes the linkage for __crashtracer_info__, making it have the proper mangling (extern "C") and linkage (private extern).<br class="gmail_msg">
It also adds a new PrettyStackTrace type, allowing LLDB to adopt this instead of Host::SetCrashDescriptionWithFormat().<br class="gmail_msg">
<br class="gmail_msg">
Without this patch, CrashTracer on macOS won't pick up pretty stack traces from any LLVM client.<br class="gmail_msg">
An LLDB commit adopting this API will follow shortly.<br class="gmail_msg">
<br class="gmail_msg">
Differential Revision: <a href="https://reviews.llvm.org/D27683" rel="noreferrer" class="gmail_msg" target="_blank">https://reviews.llvm.org/D27683</a><br class="gmail_msg">
<br class="gmail_msg">
Modified:<br class="gmail_msg">
    llvm/trunk/include/llvm/Support/PrettyStackTrace.h<br class="gmail_msg">
    llvm/trunk/lib/Support/PrettyStackTrace.cpp<br class="gmail_msg">
<br class="gmail_msg">
Modified: llvm/trunk/include/llvm/Support/PrettyStackTrace.h<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/PrettyStackTrace.h?rev=289689&r1=289688&r2=289689&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/PrettyStackTrace.h?rev=289689&r1=289688&r2=289689&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- llvm/trunk/include/llvm/Support/PrettyStackTrace.h (original)<br class="gmail_msg">
+++ llvm/trunk/include/llvm/Support/PrettyStackTrace.h Wed Dec 14 13:09:43 2016<br class="gmail_msg">
@@ -16,6 +16,7 @@<br class="gmail_msg">
 #ifndef LLVM_SUPPORT_PRETTYSTACKTRACE_H<br class="gmail_msg">
 #define LLVM_SUPPORT_PRETTYSTACKTRACE_H<br class="gmail_msg">
<br class="gmail_msg">
+#include "llvm/ADT/SmallVector.h"<br class="gmail_msg">
 #include "llvm/Support/Compiler.h"<br class="gmail_msg">
<br class="gmail_msg">
 namespace llvm {<br class="gmail_msg">
@@ -55,6 +56,16 @@ namespace llvm {<br class="gmail_msg">
     void print(raw_ostream &OS) const override;<br class="gmail_msg">
   };<br class="gmail_msg">
<br class="gmail_msg">
+  /// PrettyStackTraceFormat - This object prints a string (which may use<br class="gmail_msg">
+  /// printf-style formatting but should not contain newlines) to the stream<br class="gmail_msg">
+  /// as the stack trace when a crash occurs.<br class="gmail_msg">
+  class PrettyStackTraceFormat : public PrettyStackTraceEntry {<br class="gmail_msg">
+    llvm::SmallVector<char, 32> Str;<br class="gmail_msg">
+  public:<br class="gmail_msg">
+    PrettyStackTraceFormat(const char *Format, ...);<br class="gmail_msg">
+    void print(raw_ostream &OS) const override;<br class="gmail_msg">
+  };<br class="gmail_msg">
+<br class="gmail_msg">
   /// PrettyStackTraceProgram - This object prints a specified program arguments<br class="gmail_msg">
   /// to the stream as the stack trace when a crash occurs.<br class="gmail_msg">
   class PrettyStackTraceProgram : public PrettyStackTraceEntry {<br class="gmail_msg">
<br class="gmail_msg">
Modified: llvm/trunk/lib/Support/PrettyStackTrace.cpp<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/PrettyStackTrace.cpp?rev=289689&r1=289688&r2=289689&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/PrettyStackTrace.cpp?rev=289689&r1=289688&r2=289689&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- llvm/trunk/lib/Support/PrettyStackTrace.cpp (original)<br class="gmail_msg">
+++ llvm/trunk/lib/Support/PrettyStackTrace.cpp Wed Dec 14 13:09:43 2016<br class="gmail_msg">
@@ -88,12 +88,12 @@ struct crashreporter_annotations_t gCRAn<br class="gmail_msg">
         __attribute__((section("__DATA," CRASHREPORTER_ANNOTATIONS_SECTION)))<br class="gmail_msg">
         = { CRASHREPORTER_ANNOTATIONS_VERSION, 0, 0, 0, 0, 0, 0 };<br class="gmail_msg">
 }<br class="gmail_msg">
-#elif defined (__APPLE__) && HAVE_CRASHREPORTER_INFO<br class="gmail_msg">
-static const char *__crashreporter_info__ = 0;<br class="gmail_msg">
+#elif defined(__APPLE__) && HAVE_CRASHREPORTER_INFO<br class="gmail_msg">
+extern "C" const char *__crashreporter_info__<br class="gmail_msg">
+    __attribute__((visibility("hidden"))) = 0;<br class="gmail_msg">
 asm(".desc ___crashreporter_info__, 0x10");<br class="gmail_msg">
 #endif<br class="gmail_msg">
<br class="gmail_msg">
-<br class="gmail_msg">
 /// CrashHandler - This callback is run if a fatal signal is delivered to the<br class="gmail_msg">
 /// process, it prints the pretty stack trace.<br class="gmail_msg">
 static void CrashHandler(void *) {<br class="gmail_msg">
@@ -141,10 +141,26 @@ PrettyStackTraceEntry::~PrettyStackTrace<br class="gmail_msg">
 #endif<br class="gmail_msg">
 }<br class="gmail_msg">
<br class="gmail_msg">
-void PrettyStackTraceString::print(raw_ostream &OS) const {<br class="gmail_msg">
-  OS << Str << "\n";<br class="gmail_msg">
+void PrettyStackTraceString::print(raw_ostream &OS) const { OS << Str << "\n"; }<br class="gmail_msg">
+<br class="gmail_msg">
+PrettyStackTraceFormat::PrettyStackTraceFormat(const char *Format, ...) {<br class="gmail_msg">
+  va_list AP;<br class="gmail_msg">
+  va_start(AP, Format);<br class="gmail_msg">
+  const int SizeOrError = vsnprintf(nullptr, 0, Format, AP);<br class="gmail_msg">
+  va_end(AP);<br class="gmail_msg">
+  if (SizeOrError < 0) {<br class="gmail_msg">
+    return;<br class="gmail_msg">
+  }<br class="gmail_msg">
+<br class="gmail_msg">
+  const int Size = SizeOrError + 1; // '\0'<br class="gmail_msg">
+  Str.resize(Size);<br class="gmail_msg">
+  va_start(AP, Format);<br class="gmail_msg">
+  vsnprintf(Str.data(), Size, Format, AP);<br class="gmail_msg">
+  va_end(AP);<br class="gmail_msg">
 }<br class="gmail_msg">
<br class="gmail_msg">
+void PrettyStackTraceFormat::print(raw_ostream &OS) const { OS << Str << "\n"; }<br class="gmail_msg">
+<br class="gmail_msg">
 void PrettyStackTraceProgram::print(raw_ostream &OS) const {<br class="gmail_msg">
   OS << "Program arguments: ";<br class="gmail_msg">
   // Print the argument list.<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
_______________________________________________<br class="gmail_msg">
llvm-commits mailing list<br class="gmail_msg">
<a href="mailto:llvm-commits@lists.llvm.org" class="gmail_msg" target="_blank">llvm-commits@lists.llvm.org</a><br class="gmail_msg">
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" class="gmail_msg" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br class="gmail_msg">
</blockquote></div>