summaryrefslogtreecommitdiffstats
path: root/clang/lib/Frontend/TextDiagnostic.cpp
diff options
context:
space:
mode:
authorJordan Rose <jordan_rose@apple.com>2013-01-30 21:41:07 +0000
committerJordan Rose <jordan_rose@apple.com>2013-01-30 21:41:07 +0000
commit2da0d1cfd3b0068c2a5b84364a452a8768fdc6b3 (patch)
tree4c2cb79f944f0591a4eaeff7a8d3d4b12fb91c64 /clang/lib/Frontend/TextDiagnostic.cpp
parent6f18ae1ec89966997e5435673842bd8910b4c3dd (diff)
downloadbcm5719-llvm-2da0d1cfd3b0068c2a5b84364a452a8768fdc6b3.tar.gz
bcm5719-llvm-2da0d1cfd3b0068c2a5b84364a452a8768fdc6b3.zip
Diagnostics: if a line is longer than 4096 characters, don't print it.
Specifically, don't print snippets, caret diagnostics, or ranges for lines over 4096 characters. We copy the line around a few times in our diagnostics machinery, and we have to print a caret line that's just as long. This uses a lot of memory just to create a poor user experience as we print out a line much too long for anyone to read...or spend extra energy trying to fit it to -fmessage-length. <rdar://problem/13106850> llvm-svn: 173976
Diffstat (limited to 'clang/lib/Frontend/TextDiagnostic.cpp')
-rw-r--r--clang/lib/Frontend/TextDiagnostic.cpp10
1 files changed, 9 insertions, 1 deletions
diff --git a/clang/lib/Frontend/TextDiagnostic.cpp b/clang/lib/Frontend/TextDiagnostic.cpp
index f7c0d60ae43..c2562eb5fc8 100644
--- a/clang/lib/Frontend/TextDiagnostic.cpp
+++ b/clang/lib/Frontend/TextDiagnostic.cpp
@@ -1096,18 +1096,26 @@ void TextDiagnostic::emitSnippetAndCaret(
unsigned LineNo = SM.getLineNumber(FID, FileOffset);
unsigned ColNo = SM.getColumnNumber(FID, FileOffset);
+
+ // Arbitrarily stop showing snippets when the line is too long.
+ static const unsigned MaxLineLength = 4096;
+ if (ColNo > MaxLineLength)
+ return;
// Rewind from the current position to the start of the line.
const char *TokPtr = BufStart+FileOffset;
const char *LineStart = TokPtr-ColNo+1; // Column # is 1-based.
-
// Compute the line end. Scan forward from the error position to the end of
// the line.
const char *LineEnd = TokPtr;
while (*LineEnd != '\n' && *LineEnd != '\r' && *LineEnd != '\0')
++LineEnd;
+ // Arbitrarily stop showing snippets when the line is too long.
+ if (LineEnd - LineStart > MaxLineLength)
+ return;
+
// Copy the line of code into an std::string for ease of manipulation.
std::string SourceLine(LineStart, LineEnd);
OpenPOWER on IntegriCloud