mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-09-17 05:25:47 +00:00
Trailing whitespace.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@111656 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -24,10 +24,10 @@ namespace llvm {
|
|||||||
/// handlers which conflict with the ones installed by this module.
|
/// handlers which conflict with the ones installed by this module.
|
||||||
/// Defaults to false.
|
/// Defaults to false.
|
||||||
extern bool DisablePrettyStackTrace;
|
extern bool DisablePrettyStackTrace;
|
||||||
|
|
||||||
/// PrettyStackTraceEntry - This class is used to represent a frame of the
|
/// PrettyStackTraceEntry - This class is used to represent a frame of the
|
||||||
/// "pretty" stack trace that is dumped when a program crashes. You can define
|
/// "pretty" stack trace that is dumped when a program crashes. You can define
|
||||||
/// subclasses of this and declare them on the program stack: when they are
|
/// subclasses of this and declare them on the program stack: when they are
|
||||||
/// constructed and destructed, they will add their symbolic frames to a
|
/// constructed and destructed, they will add their symbolic frames to a
|
||||||
/// virtual stack trace. This gets dumped out if the program crashes.
|
/// virtual stack trace. This gets dumped out if the program crashes.
|
||||||
class PrettyStackTraceEntry {
|
class PrettyStackTraceEntry {
|
||||||
@@ -37,14 +37,14 @@ namespace llvm {
|
|||||||
public:
|
public:
|
||||||
PrettyStackTraceEntry();
|
PrettyStackTraceEntry();
|
||||||
virtual ~PrettyStackTraceEntry();
|
virtual ~PrettyStackTraceEntry();
|
||||||
|
|
||||||
/// print - Emit information about this stack frame to OS.
|
/// print - Emit information about this stack frame to OS.
|
||||||
virtual void print(raw_ostream &OS) const = 0;
|
virtual void print(raw_ostream &OS) const = 0;
|
||||||
|
|
||||||
/// getNextEntry - Return the next entry in the list of frames.
|
/// getNextEntry - Return the next entry in the list of frames.
|
||||||
const PrettyStackTraceEntry *getNextEntry() const { return NextEntry; }
|
const PrettyStackTraceEntry *getNextEntry() const { return NextEntry; }
|
||||||
};
|
};
|
||||||
|
|
||||||
/// PrettyStackTraceString - This object prints a specified string (which
|
/// PrettyStackTraceString - This object prints a specified string (which
|
||||||
/// should not contain newlines) to the stream as the stack trace when a crash
|
/// should not contain newlines) to the stream as the stack trace when a crash
|
||||||
/// occurs.
|
/// occurs.
|
||||||
@@ -54,7 +54,7 @@ namespace llvm {
|
|||||||
PrettyStackTraceString(const char *str) : Str(str) {}
|
PrettyStackTraceString(const char *str) : Str(str) {}
|
||||||
virtual void print(raw_ostream &OS) const;
|
virtual void print(raw_ostream &OS) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
/// PrettyStackTraceProgram - This object prints a specified program arguments
|
/// PrettyStackTraceProgram - This object prints a specified program arguments
|
||||||
/// to the stream as the stack trace when a crash occurs.
|
/// to the stream as the stack trace when a crash occurs.
|
||||||
class PrettyStackTraceProgram : public PrettyStackTraceEntry {
|
class PrettyStackTraceProgram : public PrettyStackTraceEntry {
|
||||||
@@ -65,7 +65,7 @@ namespace llvm {
|
|||||||
: ArgC(argc), ArgV(argv) {}
|
: ArgC(argc), ArgV(argv) {}
|
||||||
virtual void print(raw_ostream &OS) const;
|
virtual void print(raw_ostream &OS) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // end namespace llvm
|
} // end namespace llvm
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -18,7 +18,7 @@ struct llvm_regex;
|
|||||||
namespace llvm {
|
namespace llvm {
|
||||||
class StringRef;
|
class StringRef;
|
||||||
template<typename T> class SmallVectorImpl;
|
template<typename T> class SmallVectorImpl;
|
||||||
|
|
||||||
class Regex {
|
class Regex {
|
||||||
public:
|
public:
|
||||||
enum {
|
enum {
|
||||||
@@ -26,9 +26,9 @@ namespace llvm {
|
|||||||
/// Compile for matching that ignores upper/lower case distinctions.
|
/// Compile for matching that ignores upper/lower case distinctions.
|
||||||
IgnoreCase=1,
|
IgnoreCase=1,
|
||||||
/// Compile for newline-sensitive matching. With this flag '[^' bracket
|
/// Compile for newline-sensitive matching. With this flag '[^' bracket
|
||||||
/// expressions and '.' never match newline. A ^ anchor matches the
|
/// expressions and '.' never match newline. A ^ anchor matches the
|
||||||
/// null string after any newline in the string in addition to its normal
|
/// null string after any newline in the string in addition to its normal
|
||||||
/// function, and the $ anchor matches the null string before any
|
/// function, and the $ anchor matches the null string before any
|
||||||
/// newline in the string in addition to its normal function.
|
/// newline in the string in addition to its normal function.
|
||||||
Newline=2
|
Newline=2
|
||||||
};
|
};
|
||||||
@@ -47,7 +47,7 @@ namespace llvm {
|
|||||||
/// matches it contains. The number filled in by match will include this
|
/// matches it contains. The number filled in by match will include this
|
||||||
/// many entries plus one for the whole regex (as element 0).
|
/// many entries plus one for the whole regex (as element 0).
|
||||||
unsigned getNumMatches() const;
|
unsigned getNumMatches() const;
|
||||||
|
|
||||||
/// matches - Match the regex against a given \arg String.
|
/// matches - Match the regex against a given \arg String.
|
||||||
///
|
///
|
||||||
/// \param Matches - If given, on a succesful match this will be filled in
|
/// \param Matches - If given, on a succesful match this will be filled in
|
||||||
|
@@ -49,32 +49,32 @@ NoCanonicalizeWhiteSpace("strict-whitespace",
|
|||||||
|
|
||||||
class Pattern {
|
class Pattern {
|
||||||
SMLoc PatternLoc;
|
SMLoc PatternLoc;
|
||||||
|
|
||||||
/// FixedStr - If non-empty, this pattern is a fixed string match with the
|
/// FixedStr - If non-empty, this pattern is a fixed string match with the
|
||||||
/// specified fixed string.
|
/// specified fixed string.
|
||||||
StringRef FixedStr;
|
StringRef FixedStr;
|
||||||
|
|
||||||
/// RegEx - If non-empty, this is a regex pattern.
|
/// RegEx - If non-empty, this is a regex pattern.
|
||||||
std::string RegExStr;
|
std::string RegExStr;
|
||||||
|
|
||||||
/// VariableUses - Entries in this vector map to uses of a variable in the
|
/// VariableUses - Entries in this vector map to uses of a variable in the
|
||||||
/// pattern, e.g. "foo[[bar]]baz". In this case, the RegExStr will contain
|
/// pattern, e.g. "foo[[bar]]baz". In this case, the RegExStr will contain
|
||||||
/// "foobaz" and we'll get an entry in this vector that tells us to insert the
|
/// "foobaz" and we'll get an entry in this vector that tells us to insert the
|
||||||
/// value of bar at offset 3.
|
/// value of bar at offset 3.
|
||||||
std::vector<std::pair<StringRef, unsigned> > VariableUses;
|
std::vector<std::pair<StringRef, unsigned> > VariableUses;
|
||||||
|
|
||||||
/// VariableDefs - Entries in this vector map to definitions of a variable in
|
/// VariableDefs - Entries in this vector map to definitions of a variable in
|
||||||
/// the pattern, e.g. "foo[[bar:.*]]baz". In this case, the RegExStr will
|
/// the pattern, e.g. "foo[[bar:.*]]baz". In this case, the RegExStr will
|
||||||
/// contain "foo(.*)baz" and VariableDefs will contain the pair "bar",1. The
|
/// contain "foo(.*)baz" and VariableDefs will contain the pair "bar",1. The
|
||||||
/// index indicates what parenthesized value captures the variable value.
|
/// index indicates what parenthesized value captures the variable value.
|
||||||
std::vector<std::pair<StringRef, unsigned> > VariableDefs;
|
std::vector<std::pair<StringRef, unsigned> > VariableDefs;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Pattern() { }
|
Pattern() { }
|
||||||
|
|
||||||
bool ParsePattern(StringRef PatternStr, SourceMgr &SM);
|
bool ParsePattern(StringRef PatternStr, SourceMgr &SM);
|
||||||
|
|
||||||
/// Match - Match the pattern string against the input buffer Buffer. This
|
/// Match - Match the pattern string against the input buffer Buffer. This
|
||||||
/// returns the position that is matched or npos if there is no match. If
|
/// returns the position that is matched or npos if there is no match. If
|
||||||
/// there is a match, the size of the matched string is returned in MatchLen.
|
/// there is a match, the size of the matched string is returned in MatchLen.
|
||||||
@@ -103,19 +103,19 @@ private:
|
|||||||
|
|
||||||
bool Pattern::ParsePattern(StringRef PatternStr, SourceMgr &SM) {
|
bool Pattern::ParsePattern(StringRef PatternStr, SourceMgr &SM) {
|
||||||
PatternLoc = SMLoc::getFromPointer(PatternStr.data());
|
PatternLoc = SMLoc::getFromPointer(PatternStr.data());
|
||||||
|
|
||||||
// Ignore trailing whitespace.
|
// Ignore trailing whitespace.
|
||||||
while (!PatternStr.empty() &&
|
while (!PatternStr.empty() &&
|
||||||
(PatternStr.back() == ' ' || PatternStr.back() == '\t'))
|
(PatternStr.back() == ' ' || PatternStr.back() == '\t'))
|
||||||
PatternStr = PatternStr.substr(0, PatternStr.size()-1);
|
PatternStr = PatternStr.substr(0, PatternStr.size()-1);
|
||||||
|
|
||||||
// Check that there is something on the line.
|
// Check that there is something on the line.
|
||||||
if (PatternStr.empty()) {
|
if (PatternStr.empty()) {
|
||||||
SM.PrintMessage(PatternLoc, "found empty check string with prefix '" +
|
SM.PrintMessage(PatternLoc, "found empty check string with prefix '" +
|
||||||
CheckPrefix+":'", "error");
|
CheckPrefix+":'", "error");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check to see if this is a fixed string, or if it has regex pieces.
|
// Check to see if this is a fixed string, or if it has regex pieces.
|
||||||
if (PatternStr.size() < 2 ||
|
if (PatternStr.size() < 2 ||
|
||||||
(PatternStr.find("{{") == StringRef::npos &&
|
(PatternStr.find("{{") == StringRef::npos &&
|
||||||
@@ -123,18 +123,18 @@ bool Pattern::ParsePattern(StringRef PatternStr, SourceMgr &SM) {
|
|||||||
FixedStr = PatternStr;
|
FixedStr = PatternStr;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Paren value #0 is for the fully matched string. Any new parenthesized
|
// Paren value #0 is for the fully matched string. Any new parenthesized
|
||||||
// values add from their.
|
// values add from their.
|
||||||
unsigned CurParen = 1;
|
unsigned CurParen = 1;
|
||||||
|
|
||||||
// Otherwise, there is at least one regex piece. Build up the regex pattern
|
// Otherwise, there is at least one regex piece. Build up the regex pattern
|
||||||
// by escaping scary characters in fixed strings, building up one big regex.
|
// by escaping scary characters in fixed strings, building up one big regex.
|
||||||
while (!PatternStr.empty()) {
|
while (!PatternStr.empty()) {
|
||||||
// RegEx matches.
|
// RegEx matches.
|
||||||
if (PatternStr.size() >= 2 &&
|
if (PatternStr.size() >= 2 &&
|
||||||
PatternStr[0] == '{' && PatternStr[1] == '{') {
|
PatternStr[0] == '{' && PatternStr[1] == '{') {
|
||||||
|
|
||||||
// Otherwise, this is the start of a regex match. Scan for the }}.
|
// Otherwise, this is the start of a regex match. Scan for the }}.
|
||||||
size_t End = PatternStr.find("}}");
|
size_t End = PatternStr.find("}}");
|
||||||
if (End == StringRef::npos) {
|
if (End == StringRef::npos) {
|
||||||
@@ -142,13 +142,13 @@ bool Pattern::ParsePattern(StringRef PatternStr, SourceMgr &SM) {
|
|||||||
"found start of regex string with no end '}}'", "error");
|
"found start of regex string with no end '}}'", "error");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (AddRegExToRegEx(PatternStr.substr(2, End-2), CurParen, SM))
|
if (AddRegExToRegEx(PatternStr.substr(2, End-2), CurParen, SM))
|
||||||
return true;
|
return true;
|
||||||
PatternStr = PatternStr.substr(End+2);
|
PatternStr = PatternStr.substr(End+2);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Named RegEx matches. These are of two forms: [[foo:.*]] which matches .*
|
// Named RegEx matches. These are of two forms: [[foo:.*]] which matches .*
|
||||||
// (or some other regex) and assigns it to the FileCheck variable 'foo'. The
|
// (or some other regex) and assigns it to the FileCheck variable 'foo'. The
|
||||||
// second form is [[foo]] which is a reference to foo. The variable name
|
// second form is [[foo]] which is a reference to foo. The variable name
|
||||||
@@ -163,14 +163,14 @@ bool Pattern::ParsePattern(StringRef PatternStr, SourceMgr &SM) {
|
|||||||
"invalid named regex reference, no ]] found", "error");
|
"invalid named regex reference, no ]] found", "error");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
StringRef MatchStr = PatternStr.substr(2, End-2);
|
StringRef MatchStr = PatternStr.substr(2, End-2);
|
||||||
PatternStr = PatternStr.substr(End+2);
|
PatternStr = PatternStr.substr(End+2);
|
||||||
|
|
||||||
// Get the regex name (e.g. "foo").
|
// Get the regex name (e.g. "foo").
|
||||||
size_t NameEnd = MatchStr.find(':');
|
size_t NameEnd = MatchStr.find(':');
|
||||||
StringRef Name = MatchStr.substr(0, NameEnd);
|
StringRef Name = MatchStr.substr(0, NameEnd);
|
||||||
|
|
||||||
if (Name.empty()) {
|
if (Name.empty()) {
|
||||||
SM.PrintMessage(SMLoc::getFromPointer(Name.data()),
|
SM.PrintMessage(SMLoc::getFromPointer(Name.data()),
|
||||||
"invalid name in named regex: empty name", "error");
|
"invalid name in named regex: empty name", "error");
|
||||||
@@ -187,31 +187,31 @@ bool Pattern::ParsePattern(StringRef PatternStr, SourceMgr &SM) {
|
|||||||
"invalid name in named regex", "error");
|
"invalid name in named regex", "error");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Name can't start with a digit.
|
// Name can't start with a digit.
|
||||||
if (isdigit(Name[0])) {
|
if (isdigit(Name[0])) {
|
||||||
SM.PrintMessage(SMLoc::getFromPointer(Name.data()),
|
SM.PrintMessage(SMLoc::getFromPointer(Name.data()),
|
||||||
"invalid name in named regex", "error");
|
"invalid name in named regex", "error");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle [[foo]].
|
// Handle [[foo]].
|
||||||
if (NameEnd == StringRef::npos) {
|
if (NameEnd == StringRef::npos) {
|
||||||
VariableUses.push_back(std::make_pair(Name, RegExStr.size()));
|
VariableUses.push_back(std::make_pair(Name, RegExStr.size()));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle [[foo:.*]].
|
// Handle [[foo:.*]].
|
||||||
VariableDefs.push_back(std::make_pair(Name, CurParen));
|
VariableDefs.push_back(std::make_pair(Name, CurParen));
|
||||||
RegExStr += '(';
|
RegExStr += '(';
|
||||||
++CurParen;
|
++CurParen;
|
||||||
|
|
||||||
if (AddRegExToRegEx(MatchStr.substr(NameEnd+1), CurParen, SM))
|
if (AddRegExToRegEx(MatchStr.substr(NameEnd+1), CurParen, SM))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
RegExStr += ')';
|
RegExStr += ')';
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle fixed string matches.
|
// Handle fixed string matches.
|
||||||
// Find the end, which is the start of the next regex.
|
// Find the end, which is the start of the next regex.
|
||||||
size_t FixedMatchEnd = PatternStr.find("{{");
|
size_t FixedMatchEnd = PatternStr.find("{{");
|
||||||
@@ -260,7 +260,7 @@ bool Pattern::AddRegExToRegEx(StringRef RegexStr, unsigned &CurParen,
|
|||||||
"invalid regex: " + Error, "error");
|
"invalid regex: " + Error, "error");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
RegExStr += RegexStr.str();
|
RegExStr += RegexStr.str();
|
||||||
CurParen += R.getNumMatches();
|
CurParen += R.getNumMatches();
|
||||||
return false;
|
return false;
|
||||||
@@ -278,14 +278,14 @@ size_t Pattern::Match(StringRef Buffer, size_t &MatchLen,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Regex match.
|
// Regex match.
|
||||||
|
|
||||||
// If there are variable uses, we need to create a temporary string with the
|
// If there are variable uses, we need to create a temporary string with the
|
||||||
// actual value.
|
// actual value.
|
||||||
StringRef RegExToMatch = RegExStr;
|
StringRef RegExToMatch = RegExStr;
|
||||||
std::string TmpStr;
|
std::string TmpStr;
|
||||||
if (!VariableUses.empty()) {
|
if (!VariableUses.empty()) {
|
||||||
TmpStr = RegExStr;
|
TmpStr = RegExStr;
|
||||||
|
|
||||||
unsigned InsertOffset = 0;
|
unsigned InsertOffset = 0;
|
||||||
for (unsigned i = 0, e = VariableUses.size(); i != e; ++i) {
|
for (unsigned i = 0, e = VariableUses.size(); i != e; ++i) {
|
||||||
StringMap<StringRef>::iterator it =
|
StringMap<StringRef>::iterator it =
|
||||||
@@ -297,33 +297,33 @@ size_t Pattern::Match(StringRef Buffer, size_t &MatchLen,
|
|||||||
// Look up the value and escape it so that we can plop it into the regex.
|
// Look up the value and escape it so that we can plop it into the regex.
|
||||||
std::string Value;
|
std::string Value;
|
||||||
AddFixedStringToRegEx(it->second, Value);
|
AddFixedStringToRegEx(it->second, Value);
|
||||||
|
|
||||||
// Plop it into the regex at the adjusted offset.
|
// Plop it into the regex at the adjusted offset.
|
||||||
TmpStr.insert(TmpStr.begin()+VariableUses[i].second+InsertOffset,
|
TmpStr.insert(TmpStr.begin()+VariableUses[i].second+InsertOffset,
|
||||||
Value.begin(), Value.end());
|
Value.begin(), Value.end());
|
||||||
InsertOffset += Value.size();
|
InsertOffset += Value.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Match the newly constructed regex.
|
// Match the newly constructed regex.
|
||||||
RegExToMatch = TmpStr;
|
RegExToMatch = TmpStr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
SmallVector<StringRef, 4> MatchInfo;
|
SmallVector<StringRef, 4> MatchInfo;
|
||||||
if (!Regex(RegExToMatch, Regex::Newline).match(Buffer, &MatchInfo))
|
if (!Regex(RegExToMatch, Regex::Newline).match(Buffer, &MatchInfo))
|
||||||
return StringRef::npos;
|
return StringRef::npos;
|
||||||
|
|
||||||
// Successful regex match.
|
// Successful regex match.
|
||||||
assert(!MatchInfo.empty() && "Didn't get any match");
|
assert(!MatchInfo.empty() && "Didn't get any match");
|
||||||
StringRef FullMatch = MatchInfo[0];
|
StringRef FullMatch = MatchInfo[0];
|
||||||
|
|
||||||
// If this defines any variables, remember their values.
|
// If this defines any variables, remember their values.
|
||||||
for (unsigned i = 0, e = VariableDefs.size(); i != e; ++i) {
|
for (unsigned i = 0, e = VariableDefs.size(); i != e; ++i) {
|
||||||
assert(VariableDefs[i].second < MatchInfo.size() &&
|
assert(VariableDefs[i].second < MatchInfo.size() &&
|
||||||
"Internal paren error");
|
"Internal paren error");
|
||||||
VariableTable[VariableDefs[i].first] = MatchInfo[VariableDefs[i].second];
|
VariableTable[VariableDefs[i].first] = MatchInfo[VariableDefs[i].second];
|
||||||
}
|
}
|
||||||
|
|
||||||
MatchLen = FullMatch.size();
|
MatchLen = FullMatch.size();
|
||||||
return FullMatch.data()-Buffer.data();
|
return FullMatch.data()-Buffer.data();
|
||||||
}
|
}
|
||||||
@@ -421,19 +421,19 @@ void Pattern::PrintFailureInfo(const SourceMgr &SM, StringRef Buffer,
|
|||||||
struct CheckString {
|
struct CheckString {
|
||||||
/// Pat - The pattern to match.
|
/// Pat - The pattern to match.
|
||||||
Pattern Pat;
|
Pattern Pat;
|
||||||
|
|
||||||
/// Loc - The location in the match file that the check string was specified.
|
/// Loc - The location in the match file that the check string was specified.
|
||||||
SMLoc Loc;
|
SMLoc Loc;
|
||||||
|
|
||||||
/// IsCheckNext - This is true if this is a CHECK-NEXT: directive (as opposed
|
/// IsCheckNext - This is true if this is a CHECK-NEXT: directive (as opposed
|
||||||
/// to a CHECK: directive.
|
/// to a CHECK: directive.
|
||||||
bool IsCheckNext;
|
bool IsCheckNext;
|
||||||
|
|
||||||
/// NotStrings - These are all of the strings that are disallowed from
|
/// NotStrings - These are all of the strings that are disallowed from
|
||||||
/// occurring between this match string and the previous one (or start of
|
/// occurring between this match string and the previous one (or start of
|
||||||
/// file).
|
/// file).
|
||||||
std::vector<std::pair<SMLoc, Pattern> > NotStrings;
|
std::vector<std::pair<SMLoc, Pattern> > NotStrings;
|
||||||
|
|
||||||
CheckString(const Pattern &P, SMLoc L, bool isCheckNext)
|
CheckString(const Pattern &P, SMLoc L, bool isCheckNext)
|
||||||
: Pat(P), Loc(L), IsCheckNext(isCheckNext) {}
|
: Pat(P), Loc(L), IsCheckNext(isCheckNext) {}
|
||||||
};
|
};
|
||||||
@@ -443,7 +443,7 @@ struct CheckString {
|
|||||||
static MemoryBuffer *CanonicalizeInputFile(MemoryBuffer *MB) {
|
static MemoryBuffer *CanonicalizeInputFile(MemoryBuffer *MB) {
|
||||||
SmallString<128> NewFile;
|
SmallString<128> NewFile;
|
||||||
NewFile.reserve(MB->getBufferSize());
|
NewFile.reserve(MB->getBufferSize());
|
||||||
|
|
||||||
for (const char *Ptr = MB->getBufferStart(), *End = MB->getBufferEnd();
|
for (const char *Ptr = MB->getBufferStart(), *End = MB->getBufferEnd();
|
||||||
Ptr != End; ++Ptr) {
|
Ptr != End; ++Ptr) {
|
||||||
// If C is not a horizontal whitespace, skip it.
|
// If C is not a horizontal whitespace, skip it.
|
||||||
@@ -451,18 +451,18 @@ static MemoryBuffer *CanonicalizeInputFile(MemoryBuffer *MB) {
|
|||||||
NewFile.push_back(*Ptr);
|
NewFile.push_back(*Ptr);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Otherwise, add one space and advance over neighboring space.
|
// Otherwise, add one space and advance over neighboring space.
|
||||||
NewFile.push_back(' ');
|
NewFile.push_back(' ');
|
||||||
while (Ptr+1 != End &&
|
while (Ptr+1 != End &&
|
||||||
(Ptr[1] == ' ' || Ptr[1] == '\t'))
|
(Ptr[1] == ' ' || Ptr[1] == '\t'))
|
||||||
++Ptr;
|
++Ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Free the old buffer and return a new one.
|
// Free the old buffer and return a new one.
|
||||||
MemoryBuffer *MB2 =
|
MemoryBuffer *MB2 =
|
||||||
MemoryBuffer::getMemBufferCopy(NewFile.str(), MB->getBufferIdentifier());
|
MemoryBuffer::getMemBufferCopy(NewFile.str(), MB->getBufferIdentifier());
|
||||||
|
|
||||||
delete MB;
|
delete MB;
|
||||||
return MB2;
|
return MB2;
|
||||||
}
|
}
|
||||||
@@ -477,37 +477,37 @@ static bool ReadCheckFile(SourceMgr &SM,
|
|||||||
MemoryBuffer *F =
|
MemoryBuffer *F =
|
||||||
MemoryBuffer::getFileOrSTDIN(CheckFilename.c_str(), &ErrorStr);
|
MemoryBuffer::getFileOrSTDIN(CheckFilename.c_str(), &ErrorStr);
|
||||||
if (F == 0) {
|
if (F == 0) {
|
||||||
errs() << "Could not open check file '" << CheckFilename << "': "
|
errs() << "Could not open check file '" << CheckFilename << "': "
|
||||||
<< ErrorStr << '\n';
|
<< ErrorStr << '\n';
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we want to canonicalize whitespace, strip excess whitespace from the
|
// If we want to canonicalize whitespace, strip excess whitespace from the
|
||||||
// buffer containing the CHECK lines.
|
// buffer containing the CHECK lines.
|
||||||
if (!NoCanonicalizeWhiteSpace)
|
if (!NoCanonicalizeWhiteSpace)
|
||||||
F = CanonicalizeInputFile(F);
|
F = CanonicalizeInputFile(F);
|
||||||
|
|
||||||
SM.AddNewSourceBuffer(F, SMLoc());
|
SM.AddNewSourceBuffer(F, SMLoc());
|
||||||
|
|
||||||
// Find all instances of CheckPrefix followed by : in the file.
|
// Find all instances of CheckPrefix followed by : in the file.
|
||||||
StringRef Buffer = F->getBuffer();
|
StringRef Buffer = F->getBuffer();
|
||||||
|
|
||||||
std::vector<std::pair<SMLoc, Pattern> > NotMatches;
|
std::vector<std::pair<SMLoc, Pattern> > NotMatches;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
// See if Prefix occurs in the memory buffer.
|
// See if Prefix occurs in the memory buffer.
|
||||||
Buffer = Buffer.substr(Buffer.find(CheckPrefix));
|
Buffer = Buffer.substr(Buffer.find(CheckPrefix));
|
||||||
|
|
||||||
// If we didn't find a match, we're done.
|
// If we didn't find a match, we're done.
|
||||||
if (Buffer.empty())
|
if (Buffer.empty())
|
||||||
break;
|
break;
|
||||||
|
|
||||||
const char *CheckPrefixStart = Buffer.data();
|
const char *CheckPrefixStart = Buffer.data();
|
||||||
|
|
||||||
// When we find a check prefix, keep track of whether we find CHECK: or
|
// When we find a check prefix, keep track of whether we find CHECK: or
|
||||||
// CHECK-NEXT:
|
// CHECK-NEXT:
|
||||||
bool IsCheckNext = false, IsCheckNot = false;
|
bool IsCheckNext = false, IsCheckNot = false;
|
||||||
|
|
||||||
// Verify that the : is present after the prefix.
|
// Verify that the : is present after the prefix.
|
||||||
if (Buffer[CheckPrefix.size()] == ':') {
|
if (Buffer[CheckPrefix.size()] == ':') {
|
||||||
Buffer = Buffer.substr(CheckPrefix.size()+1);
|
Buffer = Buffer.substr(CheckPrefix.size()+1);
|
||||||
@@ -523,11 +523,11 @@ static bool ReadCheckFile(SourceMgr &SM,
|
|||||||
Buffer = Buffer.substr(1);
|
Buffer = Buffer.substr(1);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Okay, we found the prefix, yay. Remember the rest of the line, but
|
// Okay, we found the prefix, yay. Remember the rest of the line, but
|
||||||
// ignore leading and trailing whitespace.
|
// ignore leading and trailing whitespace.
|
||||||
Buffer = Buffer.substr(Buffer.find_first_not_of(" \t"));
|
Buffer = Buffer.substr(Buffer.find_first_not_of(" \t"));
|
||||||
|
|
||||||
// Scan ahead to the end of line.
|
// Scan ahead to the end of line.
|
||||||
size_t EOL = Buffer.find_first_of("\n\r");
|
size_t EOL = Buffer.find_first_of("\n\r");
|
||||||
|
|
||||||
@@ -538,10 +538,10 @@ static bool ReadCheckFile(SourceMgr &SM,
|
|||||||
Pattern P;
|
Pattern P;
|
||||||
if (P.ParsePattern(Buffer.substr(0, EOL), SM))
|
if (P.ParsePattern(Buffer.substr(0, EOL), SM))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
Buffer = Buffer.substr(EOL);
|
Buffer = Buffer.substr(EOL);
|
||||||
|
|
||||||
|
|
||||||
// Verify that CHECK-NEXT lines have at least one CHECK line before them.
|
// Verify that CHECK-NEXT lines have at least one CHECK line before them.
|
||||||
if (IsCheckNext && CheckStrings.empty()) {
|
if (IsCheckNext && CheckStrings.empty()) {
|
||||||
SM.PrintMessage(SMLoc::getFromPointer(CheckPrefixStart),
|
SM.PrintMessage(SMLoc::getFromPointer(CheckPrefixStart),
|
||||||
@@ -549,34 +549,34 @@ static bool ReadCheckFile(SourceMgr &SM,
|
|||||||
CheckPrefix+ ": line", "error");
|
CheckPrefix+ ": line", "error");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle CHECK-NOT.
|
// Handle CHECK-NOT.
|
||||||
if (IsCheckNot) {
|
if (IsCheckNot) {
|
||||||
NotMatches.push_back(std::make_pair(SMLoc::getFromPointer(Buffer.data()),
|
NotMatches.push_back(std::make_pair(SMLoc::getFromPointer(Buffer.data()),
|
||||||
P));
|
P));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Okay, add the string we captured to the output vector and move on.
|
// Okay, add the string we captured to the output vector and move on.
|
||||||
CheckStrings.push_back(CheckString(P,
|
CheckStrings.push_back(CheckString(P,
|
||||||
PatternLoc,
|
PatternLoc,
|
||||||
IsCheckNext));
|
IsCheckNext));
|
||||||
std::swap(NotMatches, CheckStrings.back().NotStrings);
|
std::swap(NotMatches, CheckStrings.back().NotStrings);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (CheckStrings.empty()) {
|
if (CheckStrings.empty()) {
|
||||||
errs() << "error: no check strings found with prefix '" << CheckPrefix
|
errs() << "error: no check strings found with prefix '" << CheckPrefix
|
||||||
<< ":'\n";
|
<< ":'\n";
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!NotMatches.empty()) {
|
if (!NotMatches.empty()) {
|
||||||
errs() << "error: '" << CheckPrefix
|
errs() << "error: '" << CheckPrefix
|
||||||
<< "-NOT:' not supported after last check line.\n";
|
<< "-NOT:' not supported after last check line.\n";
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -586,11 +586,11 @@ static void PrintCheckFailed(const SourceMgr &SM, const CheckString &CheckStr,
|
|||||||
// Otherwise, we have an error, emit an error message.
|
// Otherwise, we have an error, emit an error message.
|
||||||
SM.PrintMessage(CheckStr.Loc, "expected string not found in input",
|
SM.PrintMessage(CheckStr.Loc, "expected string not found in input",
|
||||||
"error");
|
"error");
|
||||||
|
|
||||||
// Print the "scanning from here" line. If the current position is at the
|
// Print the "scanning from here" line. If the current position is at the
|
||||||
// end of a line, advance to the start of the next line.
|
// end of a line, advance to the start of the next line.
|
||||||
Buffer = Buffer.substr(Buffer.find_first_not_of(" \t\n\r"));
|
Buffer = Buffer.substr(Buffer.find_first_not_of(" \t\n\r"));
|
||||||
|
|
||||||
SM.PrintMessage(SMLoc::getFromPointer(Buffer.data()), "scanning from here",
|
SM.PrintMessage(SMLoc::getFromPointer(Buffer.data()), "scanning from here",
|
||||||
"note");
|
"note");
|
||||||
|
|
||||||
@@ -606,9 +606,9 @@ static unsigned CountNumNewlinesBetween(StringRef Range) {
|
|||||||
// Scan for newline.
|
// Scan for newline.
|
||||||
Range = Range.substr(Range.find_first_of("\n\r"));
|
Range = Range.substr(Range.find_first_of("\n\r"));
|
||||||
if (Range.empty()) return NumNewLines;
|
if (Range.empty()) return NumNewLines;
|
||||||
|
|
||||||
++NumNewLines;
|
++NumNewLines;
|
||||||
|
|
||||||
// Handle \n\r and \r\n as a single newline.
|
// Handle \n\r and \r\n as a single newline.
|
||||||
if (Range.size() > 1 &&
|
if (Range.size() > 1 &&
|
||||||
(Range[1] == '\n' || Range[1] == '\r') &&
|
(Range[1] == '\n' || Range[1] == '\r') &&
|
||||||
@@ -624,7 +624,7 @@ int main(int argc, char **argv) {
|
|||||||
cl::ParseCommandLineOptions(argc, argv);
|
cl::ParseCommandLineOptions(argc, argv);
|
||||||
|
|
||||||
SourceMgr SM;
|
SourceMgr SM;
|
||||||
|
|
||||||
// Read the expected strings from the check file.
|
// Read the expected strings from the check file.
|
||||||
std::vector<CheckString> CheckStrings;
|
std::vector<CheckString> CheckStrings;
|
||||||
if (ReadCheckFile(SM, CheckStrings))
|
if (ReadCheckFile(SM, CheckStrings))
|
||||||
@@ -635,35 +635,35 @@ int main(int argc, char **argv) {
|
|||||||
MemoryBuffer *F =
|
MemoryBuffer *F =
|
||||||
MemoryBuffer::getFileOrSTDIN(InputFilename.c_str(), &ErrorStr);
|
MemoryBuffer::getFileOrSTDIN(InputFilename.c_str(), &ErrorStr);
|
||||||
if (F == 0) {
|
if (F == 0) {
|
||||||
errs() << "Could not open input file '" << InputFilename << "': "
|
errs() << "Could not open input file '" << InputFilename << "': "
|
||||||
<< ErrorStr << '\n';
|
<< ErrorStr << '\n';
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove duplicate spaces in the input file if requested.
|
// Remove duplicate spaces in the input file if requested.
|
||||||
if (!NoCanonicalizeWhiteSpace)
|
if (!NoCanonicalizeWhiteSpace)
|
||||||
F = CanonicalizeInputFile(F);
|
F = CanonicalizeInputFile(F);
|
||||||
|
|
||||||
SM.AddNewSourceBuffer(F, SMLoc());
|
SM.AddNewSourceBuffer(F, SMLoc());
|
||||||
|
|
||||||
/// VariableTable - This holds all the current filecheck variables.
|
/// VariableTable - This holds all the current filecheck variables.
|
||||||
StringMap<StringRef> VariableTable;
|
StringMap<StringRef> VariableTable;
|
||||||
|
|
||||||
// Check that we have all of the expected strings, in order, in the input
|
// Check that we have all of the expected strings, in order, in the input
|
||||||
// file.
|
// file.
|
||||||
StringRef Buffer = F->getBuffer();
|
StringRef Buffer = F->getBuffer();
|
||||||
|
|
||||||
const char *LastMatch = Buffer.data();
|
const char *LastMatch = Buffer.data();
|
||||||
|
|
||||||
for (unsigned StrNo = 0, e = CheckStrings.size(); StrNo != e; ++StrNo) {
|
for (unsigned StrNo = 0, e = CheckStrings.size(); StrNo != e; ++StrNo) {
|
||||||
const CheckString &CheckStr = CheckStrings[StrNo];
|
const CheckString &CheckStr = CheckStrings[StrNo];
|
||||||
|
|
||||||
StringRef SearchFrom = Buffer;
|
StringRef SearchFrom = Buffer;
|
||||||
|
|
||||||
// Find StrNo in the file.
|
// Find StrNo in the file.
|
||||||
size_t MatchLen = 0;
|
size_t MatchLen = 0;
|
||||||
Buffer = Buffer.substr(CheckStr.Pat.Match(Buffer, MatchLen, VariableTable));
|
Buffer = Buffer.substr(CheckStr.Pat.Match(Buffer, MatchLen, VariableTable));
|
||||||
|
|
||||||
// If we didn't find a match, reject the input.
|
// If we didn't find a match, reject the input.
|
||||||
if (Buffer.empty()) {
|
if (Buffer.empty()) {
|
||||||
PrintCheckFailed(SM, CheckStr, SearchFrom, VariableTable);
|
PrintCheckFailed(SM, CheckStr, SearchFrom, VariableTable);
|
||||||
@@ -690,7 +690,7 @@ int main(int argc, char **argv) {
|
|||||||
"previous match was here", "note");
|
"previous match was here", "note");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (NumNewLines != 1) {
|
if (NumNewLines != 1) {
|
||||||
SM.PrintMessage(CheckStr.Loc,
|
SM.PrintMessage(CheckStr.Loc,
|
||||||
CheckPrefix+
|
CheckPrefix+
|
||||||
@@ -703,7 +703,7 @@ int main(int argc, char **argv) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If this match had "not strings", verify that they don't exist in the
|
// If this match had "not strings", verify that they don't exist in the
|
||||||
// skipped region.
|
// skipped region.
|
||||||
for (unsigned ChunkNo = 0, e = CheckStr.NotStrings.size();
|
for (unsigned ChunkNo = 0, e = CheckStr.NotStrings.size();
|
||||||
@@ -713,20 +713,20 @@ int main(int argc, char **argv) {
|
|||||||
MatchLen,
|
MatchLen,
|
||||||
VariableTable);
|
VariableTable);
|
||||||
if (Pos == StringRef::npos) continue;
|
if (Pos == StringRef::npos) continue;
|
||||||
|
|
||||||
SM.PrintMessage(SMLoc::getFromPointer(LastMatch+Pos),
|
SM.PrintMessage(SMLoc::getFromPointer(LastMatch+Pos),
|
||||||
CheckPrefix+"-NOT: string occurred!", "error");
|
CheckPrefix+"-NOT: string occurred!", "error");
|
||||||
SM.PrintMessage(CheckStr.NotStrings[ChunkNo].first,
|
SM.PrintMessage(CheckStr.NotStrings[ChunkNo].first,
|
||||||
CheckPrefix+"-NOT: pattern specified here", "note");
|
CheckPrefix+"-NOT: pattern specified here", "note");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Otherwise, everything is good. Step over the matched text and remember
|
// Otherwise, everything is good. Step over the matched text and remember
|
||||||
// the position after the match as the end of the last match.
|
// the position after the match as the end of the last match.
|
||||||
Buffer = Buffer.substr(MatchLen);
|
Buffer = Buffer.substr(MatchLen);
|
||||||
LastMatch = Buffer.data();
|
LastMatch = Buffer.data();
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user