File tree Expand file tree Collapse file tree 2 files changed +28
-5
lines changed Expand file tree Collapse file tree 2 files changed +28
-5
lines changed Original file line number Diff line number Diff line change @@ -51,13 +51,15 @@ class PrettyStackTraceSwiftVersion : public llvm::PrettyStackTraceEntry {
51
51
};
52
52
53
53
// / Aborts the program, printing a given message to a PrettyStackTrace frame
54
- // / before exiting.
54
+ // / before exiting. This should be preferred over manually logging to stderr and
55
+ // / aborting since that won't be picked up by the crash reporter.
55
56
[[noreturn]]
56
57
void abortWithPrettyStackTraceMessage (
57
58
llvm::function_ref<void (llvm::raw_ostream &)> message);
58
59
59
60
// / Aborts the program, printing a given message to a PrettyStackTrace frame
60
- // / before exiting.
61
+ // / before exiting. This should be preferred over manually logging to stderr and
62
+ // / aborting since that won't be picked up by the crash reporter.
61
63
[[noreturn]]
62
64
void abortWithPrettyStackTraceMessage (llvm::StringRef message);
63
65
Original file line number Diff line number Diff line change @@ -40,17 +40,38 @@ void PrettyStackTraceSwiftVersion::print(llvm::raw_ostream &out) const {
40
40
out << version::getSwiftFullVersion () << ' \n ' ;
41
41
}
42
42
43
+ namespace {
44
+ // / Similar to PrettyStackTraceString, but formats multi-line strings for
45
+ // / the stack trace.
46
+ class PrettyStackTraceMultilineString : public llvm ::PrettyStackTraceEntry {
47
+ StringRef Str;
48
+
49
+ public:
50
+ PrettyStackTraceMultilineString (StringRef str) : Str(str) {}
51
+ void print (raw_ostream &OS) const override {
52
+ // For each line, add a leading character and indentation to better match
53
+ // the formatting of the stack trace.
54
+ for (auto c : Str.rtrim (' \n ' )) {
55
+ OS << c;
56
+ if (c == ' \n ' )
57
+ OS << " | \t " ;
58
+ }
59
+ OS << ' \n ' ;
60
+ }
61
+ };
62
+ } // end anonymous namespace
63
+
43
64
void swift::abortWithPrettyStackTraceMessage (
44
65
llvm::function_ref<void (llvm::raw_ostream &)> message) {
45
66
llvm::SmallString<0 > errorStr;
46
67
llvm::raw_svector_ostream out (errorStr);
47
68
message (out);
48
- llvm::PrettyStackTraceString trace (errorStr.c_str ());
69
+
70
+ PrettyStackTraceMultilineString trace (errorStr);
49
71
abort ();
50
72
}
51
73
52
74
void swift::abortWithPrettyStackTraceMessage (StringRef message) {
53
- auto messageStr = message.str ();
54
- llvm::PrettyStackTraceString trace (messageStr.c_str ());
75
+ PrettyStackTraceMultilineString trace (message);
55
76
abort ();
56
77
}
You can’t perform that action at this time.
0 commit comments