diff options
author | Chris Lattner <sabre@nondot.org> | 2009-09-24 20:45:07 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-09-24 20:45:07 +0000 |
commit | adea46ed617982ea07fc3266d52717496c0076ce (patch) | |
tree | ccf3c938802a76138e0ca4b5cb746d67d5ec6528 /utils/FileCheck | |
parent | a29703e8426763fa5232f9a91e6a5fce4d4244d6 (diff) | |
download | external_llvm-adea46ed617982ea07fc3266d52717496c0076ce.zip external_llvm-adea46ed617982ea07fc3266d52717496c0076ce.tar.gz external_llvm-adea46ed617982ea07fc3266d52717496c0076ce.tar.bz2 |
Use CanonicalizeInputFile to canonicalize the entire buffer containing the
CHECK strings, instead of canonicalizing the patterns directly. This allows
Pattern to just contain a StringRef instead of std::string.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@82713 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils/FileCheck')
-rw-r--r-- | utils/FileCheck/FileCheck.cpp | 97 |
1 files changed, 40 insertions, 57 deletions
diff --git a/utils/FileCheck/FileCheck.cpp b/utils/FileCheck/FileCheck.cpp index cab37fb..cd62870 100644 --- a/utils/FileCheck/FileCheck.cpp +++ b/utils/FileCheck/FileCheck.cpp @@ -45,7 +45,7 @@ NoCanonicalizeWhiteSpace("strict-whitespace", class Pattern { /// Str - The string to match. - std::string Str; + StringRef Str; public: Pattern() { } @@ -59,25 +59,6 @@ public: MatchLen = Str.size(); return Buffer.find(Str); } - -private: - /// CanonicalizeCheckString - Replace all sequences of horizontal whitespace - /// in the check strings with a single space. - void CanonicalizeCheckString() { - for (unsigned C = 0; C != Str.size(); ++C) { - // If C is not a horizontal whitespace, skip it. - if (Str[C] != ' ' && Str[C] != '\t') - continue; - - // Replace the character with space, then remove any other space - // characters after it. - Str[C] = ' '; - - while (C+1 != Str.size() && - (Str[C+1] == ' ' || Str[C+1] == '\t')) - Str.erase(Str.begin()+C+1); - } - } }; bool Pattern::ParsePattern(StringRef PatternStr, SourceMgr &SM) { @@ -93,13 +74,10 @@ bool Pattern::ParsePattern(StringRef PatternStr, SourceMgr &SM) { "error"); return true; } + - Str = PatternStr.str(); - - // Remove duplicate spaces in the check strings if requested. - if (!NoCanonicalizeWhiteSpace) - CanonicalizeCheckString(); + Str = PatternStr; return false; } @@ -129,6 +107,37 @@ struct CheckString { : Pat(P), Loc(L), IsCheckNext(isCheckNext) {} }; +/// CanonicalizeInputFile - Remove duplicate horizontal space from the specified +/// memory buffer, free it, and return a new one. +static MemoryBuffer *CanonicalizeInputFile(MemoryBuffer *MB) { + SmallVector<char, 16> NewFile; + NewFile.reserve(MB->getBufferSize()); + + for (const char *Ptr = MB->getBufferStart(), *End = MB->getBufferEnd(); + Ptr != End; ++Ptr) { + // If C is not a horizontal whitespace, skip it. + if (*Ptr != ' ' && *Ptr != '\t') { + NewFile.push_back(*Ptr); + continue; + } + + // Otherwise, add one space and advance over neighboring space. + NewFile.push_back(' '); + while (Ptr+1 != End && + (Ptr[1] == ' ' || Ptr[1] == '\t')) + ++Ptr; + } + + // Free the old buffer and return a new one. + MemoryBuffer *MB2 = + MemoryBuffer::getMemBufferCopy(NewFile.data(), + NewFile.data() + NewFile.size(), + MB->getBufferIdentifier()); + + delete MB; + return MB2; +} + /// ReadCheckFile - Read the check file, which specifies the sequence of /// expected strings. The strings are added to the CheckStrings vector. @@ -143,6 +152,12 @@ static bool ReadCheckFile(SourceMgr &SM, << ErrorStr << '\n'; return true; } + + // If we want to canonicalize whitespace, strip excess whitespace from the + // buffer containing the CHECK lines. + if (!NoCanonicalizeWhiteSpace) + F = CanonicalizeInputFile(F); + SM.AddNewSourceBuffer(F, SMLoc()); // Find all instances of CheckPrefix followed by : in the file. @@ -233,38 +248,6 @@ static bool ReadCheckFile(SourceMgr &SM, return false; } -/// CanonicalizeInputFile - Remove duplicate horizontal space from the specified -/// memory buffer, free it, and return a new one. -static MemoryBuffer *CanonicalizeInputFile(MemoryBuffer *MB) { - SmallVector<char, 16> NewFile; - NewFile.reserve(MB->getBufferSize()); - - for (const char *Ptr = MB->getBufferStart(), *End = MB->getBufferEnd(); - Ptr != End; ++Ptr) { - // If C is not a horizontal whitespace, skip it. - if (*Ptr != ' ' && *Ptr != '\t') { - NewFile.push_back(*Ptr); - continue; - } - - // Otherwise, add one space and advance over neighboring space. - NewFile.push_back(' '); - while (Ptr+1 != End && - (Ptr[1] == ' ' || Ptr[1] == '\t')) - ++Ptr; - } - - // Free the old buffer and return a new one. - MemoryBuffer *MB2 = - MemoryBuffer::getMemBufferCopy(NewFile.data(), - NewFile.data() + NewFile.size(), - MB->getBufferIdentifier()); - - delete MB; - return MB2; -} - - static void PrintCheckFailed(const SourceMgr &SM, const CheckString &CheckStr, StringRef Buffer) { // Otherwise, we have an error, emit an error message. |