Index: include/llvm/Support/PrettyStackTrace.h =================================================================== --- include/llvm/Support/PrettyStackTrace.h +++ include/llvm/Support/PrettyStackTrace.h @@ -16,6 +16,7 @@ #ifndef LLVM_SUPPORT_PRETTYSTACKTRACE_H #define LLVM_SUPPORT_PRETTYSTACKTRACE_H +#include "llvm/ADT/SmallVector.h" #include "llvm/Support/Compiler.h" namespace llvm { @@ -55,6 +56,16 @@ void print(raw_ostream &OS) const override; }; + /// PrettyStackTraceFormat - This object prints a string (which may use + /// printf-style formatting but should not contain newlines) to the stream + /// as the stack trace when a crash occurs. + class PrettyStackTraceFormat : public PrettyStackTraceEntry { + llvm::SmallVector Str; + public: + PrettyStackTraceFormat(const char *format, ...); + void print(raw_ostream &OS) const override; + }; + /// PrettyStackTraceProgram - This object prints a specified program arguments /// to the stream as the stack trace when a crash occurs. class PrettyStackTraceProgram : public PrettyStackTraceEntry { Index: lib/Support/PrettyStackTrace.cpp =================================================================== --- lib/Support/PrettyStackTrace.cpp +++ lib/Support/PrettyStackTrace.cpp @@ -89,7 +89,7 @@ = { CRASHREPORTER_ANNOTATIONS_VERSION, 0, 0, 0, 0, 0, 0 }; } #elif defined (__APPLE__) && HAVE_CRASHREPORTER_INFO -static const char *__crashreporter_info__ = 0; +extern "C" const char *__crashreporter_info__ __attribute__((visibility("hidden"))) = 0; asm(".desc ___crashreporter_info__, 0x10"); #endif @@ -145,6 +145,28 @@ OS << Str << "\n"; } +PrettyStackTraceFormat::PrettyStackTraceFormat(const char *format, ...) { + va_list ap; + + va_start(ap, format); + const int size_or_error = vsnprintf(nullptr, 0, format, ap); + va_end(ap); + + if (size_or_error < 0) { + return; + } + + const int size = size_or_error + 1; // '\0' + + Str.resize(size); + + va_start(ap, format); + vsnprintf(Str.data(), size, format, ap); + va_end(ap); +} + +void PrettyStackTraceFormat::print(raw_ostream &OS) const { OS << Str << "\n"; } + void PrettyStackTraceProgram::print(raw_ostream &OS) const { OS << "Program arguments: "; // Print the argument list.