1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-23 03:02:36 +01:00

[FileCheck] Remove implementation types from API

Summary:
Remove use of FileCheckPatternContext and FileCheckString concrete types
from FileCheck API to allow moving it and the other implementation only
only declarations into a private header file.

Reviewers: jhenderson, chandlerc, jdenny, probinson, grimar, arichardson, rnk

Subscribers: hiraditya, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D68186

llvm-svn: 373211
This commit is contained in:
Thomas Preud'homme 2019-09-30 14:12:03 +00:00
parent 2790dd8d16
commit 6057227852
4 changed files with 37 additions and 34 deletions

View File

@ -728,10 +728,13 @@ struct FileCheckString {
/// use information from the request. /// use information from the request.
class FileCheck { class FileCheck {
FileCheckRequest Req; FileCheckRequest Req;
FileCheckPatternContext PatternContext; std::unique_ptr<FileCheckPatternContext> PatternContext;
// C++17 TODO: make this a plain std::vector.
std::unique_ptr<std::vector<FileCheckString>> CheckStrings;
public: public:
FileCheck(FileCheckRequest Req) : Req(Req) {} explicit FileCheck(FileCheckRequest Req);
~FileCheck();
// Combines the check prefixes into a single regex so that we can efficiently // Combines the check prefixes into a single regex so that we can efficiently
// scan for any of the set. // scan for any of the set.
@ -741,13 +744,11 @@ public:
Regex buildCheckPrefixRegex(); Regex buildCheckPrefixRegex();
/// Reads the check file from \p Buffer and records the expected strings it /// Reads the check file from \p Buffer and records the expected strings it
/// contains in the \p CheckStrings vector. Errors are reported against /// contains. Errors are reported against \p SM.
/// \p SM.
/// ///
/// Only expected strings whose prefix is one of those listed in \p PrefixRE /// Only expected strings whose prefix is one of those listed in \p PrefixRE
/// are recorded. \returns true in case of an error, false otherwise. /// are recorded. \returns true in case of an error, false otherwise.
bool ReadCheckFile(SourceMgr &SM, StringRef Buffer, Regex &PrefixRE, bool readCheckFile(SourceMgr &SM, StringRef Buffer, Regex &PrefixRE);
std::vector<FileCheckString> &CheckStrings);
bool ValidateCheckPrefixes(); bool ValidateCheckPrefixes();
@ -757,12 +758,11 @@ public:
SmallVectorImpl<char> &OutputBuffer); SmallVectorImpl<char> &OutputBuffer);
/// Checks the input to FileCheck provided in the \p Buffer against the /// Checks the input to FileCheck provided in the \p Buffer against the
/// \p CheckStrings read from the check file and record diagnostics emitted /// expected strings read from the check file and record diagnostics emitted
/// in \p Diags. Errors are recorded against \p SM. /// in \p Diags. Errors are recorded against \p SM.
/// ///
/// \returns false if the input fails to satisfy the checks. /// \returns false if the input fails to satisfy the checks.
bool CheckInput(SourceMgr &SM, StringRef Buffer, bool checkInput(SourceMgr &SM, StringRef Buffer,
ArrayRef<FileCheckString> CheckStrings,
std::vector<FileCheckDiag> *Diags = nullptr); std::vector<FileCheckDiag> *Diags = nullptr);
}; };
} // namespace llvm } // namespace llvm

View File

@ -1116,16 +1116,22 @@ void FileCheckPatternContext::createLineVariable() {
GlobalNumericVariableTable[LineName] = LineVariable; GlobalNumericVariableTable[LineName] = LineVariable;
} }
bool FileCheck::ReadCheckFile(SourceMgr &SM, StringRef Buffer, Regex &PrefixRE, FileCheck::FileCheck(FileCheckRequest Req)
std::vector<FileCheckString> &CheckStrings) { : Req(Req), PatternContext(std::make_unique<FileCheckPatternContext>()),
CheckStrings(std::make_unique<std::vector<FileCheckString>>()) {}
FileCheck::~FileCheck() = default;
bool FileCheck::readCheckFile(SourceMgr &SM, StringRef Buffer,
Regex &PrefixRE) {
Error DefineError = Error DefineError =
PatternContext.defineCmdlineVariables(Req.GlobalDefines, SM); PatternContext->defineCmdlineVariables(Req.GlobalDefines, SM);
if (DefineError) { if (DefineError) {
logAllUnhandledErrors(std::move(DefineError), errs()); logAllUnhandledErrors(std::move(DefineError), errs());
return true; return true;
} }
PatternContext.createLineVariable(); PatternContext->createLineVariable();
std::vector<FileCheckPattern> ImplicitNegativeChecks; std::vector<FileCheckPattern> ImplicitNegativeChecks;
for (const auto &PatternString : Req.ImplicitCheckNot) { for (const auto &PatternString : Req.ImplicitCheckNot) {
@ -1141,7 +1147,7 @@ bool FileCheck::ReadCheckFile(SourceMgr &SM, StringRef Buffer, Regex &PrefixRE,
SM.AddNewSourceBuffer(std::move(CmdLine), SMLoc()); SM.AddNewSourceBuffer(std::move(CmdLine), SMLoc());
ImplicitNegativeChecks.push_back( ImplicitNegativeChecks.push_back(
FileCheckPattern(Check::CheckNot, &PatternContext)); FileCheckPattern(Check::CheckNot, PatternContext.get()));
ImplicitNegativeChecks.back().parsePattern(PatternInBuffer, ImplicitNegativeChecks.back().parsePattern(PatternInBuffer,
"IMPLICIT-CHECK", SM, Req); "IMPLICIT-CHECK", SM, Req);
} }
@ -1204,7 +1210,7 @@ bool FileCheck::ReadCheckFile(SourceMgr &SM, StringRef Buffer, Regex &PrefixRE,
SMLoc PatternLoc = SMLoc::getFromPointer(Buffer.data()); SMLoc PatternLoc = SMLoc::getFromPointer(Buffer.data());
// Parse the pattern. // Parse the pattern.
FileCheckPattern P(CheckTy, &PatternContext, LineNumber); FileCheckPattern P(CheckTy, PatternContext.get(), LineNumber);
if (P.parsePattern(Buffer.substr(0, EOL), UsedPrefix, SM, Req)) if (P.parsePattern(Buffer.substr(0, EOL), UsedPrefix, SM, Req))
return true; return true;
@ -1222,7 +1228,7 @@ bool FileCheck::ReadCheckFile(SourceMgr &SM, StringRef Buffer, Regex &PrefixRE,
// Verify that CHECK-NEXT/SAME/EMPTY lines have at least one CHECK line before them. // Verify that CHECK-NEXT/SAME/EMPTY lines have at least one CHECK line before them.
if ((CheckTy == Check::CheckNext || CheckTy == Check::CheckSame || if ((CheckTy == Check::CheckNext || CheckTy == Check::CheckSame ||
CheckTy == Check::CheckEmpty) && CheckTy == Check::CheckEmpty) &&
CheckStrings.empty()) { CheckStrings->empty()) {
StringRef Type = CheckTy == Check::CheckNext StringRef Type = CheckTy == Check::CheckNext
? "NEXT" ? "NEXT"
: CheckTy == Check::CheckEmpty ? "EMPTY" : "SAME"; : CheckTy == Check::CheckEmpty ? "EMPTY" : "SAME";
@ -1240,21 +1246,21 @@ bool FileCheck::ReadCheckFile(SourceMgr &SM, StringRef Buffer, Regex &PrefixRE,
} }
// 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.emplace_back(P, UsedPrefix, PatternLoc); CheckStrings->emplace_back(P, UsedPrefix, PatternLoc);
std::swap(DagNotMatches, CheckStrings.back().DagNotStrings); std::swap(DagNotMatches, CheckStrings->back().DagNotStrings);
DagNotMatches = ImplicitNegativeChecks; DagNotMatches = ImplicitNegativeChecks;
} }
// Add an EOF pattern for any trailing CHECK-DAG/-NOTs, and use the first // Add an EOF pattern for any trailing CHECK-DAG/-NOTs, and use the first
// prefix as a filler for the error message. // prefix as a filler for the error message.
if (!DagNotMatches.empty()) { if (!DagNotMatches.empty()) {
CheckStrings.emplace_back( CheckStrings->emplace_back(
FileCheckPattern(Check::CheckEOF, &PatternContext, LineNumber + 1), FileCheckPattern(Check::CheckEOF, PatternContext.get(), LineNumber + 1),
*Req.CheckPrefixes.begin(), SMLoc::getFromPointer(Buffer.data())); *Req.CheckPrefixes.begin(), SMLoc::getFromPointer(Buffer.data()));
std::swap(DagNotMatches, CheckStrings.back().DagNotStrings); std::swap(DagNotMatches, CheckStrings->back().DagNotStrings);
} }
if (CheckStrings.empty()) { if (CheckStrings->empty()) {
errs() << "error: no check strings found with prefix" errs() << "error: no check strings found with prefix"
<< (Req.CheckPrefixes.size() > 1 ? "es " : " "); << (Req.CheckPrefixes.size() > 1 ? "es " : " ");
auto I = Req.CheckPrefixes.begin(); auto I = Req.CheckPrefixes.begin();
@ -1916,18 +1922,17 @@ void FileCheckPatternContext::clearLocalVars() {
GlobalNumericVariableTable.erase(Var); GlobalNumericVariableTable.erase(Var);
} }
bool FileCheck::CheckInput(SourceMgr &SM, StringRef Buffer, bool FileCheck::checkInput(SourceMgr &SM, StringRef Buffer,
ArrayRef<FileCheckString> CheckStrings,
std::vector<FileCheckDiag> *Diags) { std::vector<FileCheckDiag> *Diags) {
bool ChecksFailed = false; bool ChecksFailed = false;
unsigned i = 0, j = 0, e = CheckStrings.size(); unsigned i = 0, j = 0, e = CheckStrings->size();
while (true) { while (true) {
StringRef CheckRegion; StringRef CheckRegion;
if (j == e) { if (j == e) {
CheckRegion = Buffer; CheckRegion = Buffer;
} else { } else {
const FileCheckString &CheckLabelStr = CheckStrings[j]; const FileCheckString &CheckLabelStr = (*CheckStrings)[j];
if (CheckLabelStr.Pat.getCheckTy() != Check::CheckLabel) { if (CheckLabelStr.Pat.getCheckTy() != Check::CheckLabel) {
++j; ++j;
continue; continue;
@ -1950,10 +1955,10 @@ bool FileCheck::CheckInput(SourceMgr &SM, StringRef Buffer,
// CHECK-LABEL and it would clear variables defined on the command-line // CHECK-LABEL and it would clear variables defined on the command-line
// before they get used. // before they get used.
if (i != 0 && Req.EnableVarScope) if (i != 0 && Req.EnableVarScope)
PatternContext.clearLocalVars(); PatternContext->clearLocalVars();
for (; i != j; ++i) { for (; i != j; ++i) {
const FileCheckString &CheckStr = CheckStrings[i]; const FileCheckString &CheckStr = (*CheckStrings)[i];
// Check each string within the scanned region, including a second check // Check each string within the scanned region, including a second check
// of any final CHECK-LABEL (to verify CHECK-NOT and CHECK-DAG) // of any final CHECK-LABEL (to verify CHECK-NOT and CHECK-DAG)

View File

@ -195,12 +195,11 @@ static inline bool CheckMachineFunction(const MachineFunction &MF,
SM.AddNewSourceBuffer(MemoryBuffer::getMemBuffer(CheckFileText, "CheckFile"), SM.AddNewSourceBuffer(MemoryBuffer::getMemBuffer(CheckFileText, "CheckFile"),
SMLoc()); SMLoc());
Regex PrefixRE = FC.buildCheckPrefixRegex(); Regex PrefixRE = FC.buildCheckPrefixRegex();
std::vector<FileCheckString> CheckStrings; if (FC.readCheckFile(SM, CheckFileText, PrefixRE))
if (FC.ReadCheckFile(SM, CheckFileText, PrefixRE, CheckStrings))
return false; return false;
auto OutBuffer = OutputBuf->getBuffer(); auto OutBuffer = OutputBuf->getBuffer();
SM.AddNewSourceBuffer(std::move(OutputBuf), SMLoc()); SM.AddNewSourceBuffer(std::move(OutputBuf), SMLoc());
return FC.CheckInput(SM, OutBuffer, CheckStrings); return FC.checkInput(SM, OutBuffer);
} }
#endif #endif

View File

@ -597,8 +597,7 @@ int main(int argc, char **argv) {
CheckFileText, CheckFile.getBufferIdentifier()), CheckFileText, CheckFile.getBufferIdentifier()),
SMLoc()); SMLoc());
std::vector<FileCheckString> CheckStrings; if (FC.readCheckFile(SM, CheckFileText, PrefixRE))
if (FC.ReadCheckFile(SM, CheckFileText, PrefixRE, CheckStrings))
return 2; return 2;
// Open the file to check and add it to SourceMgr. // Open the file to check and add it to SourceMgr.
@ -628,7 +627,7 @@ int main(int argc, char **argv) {
DumpInput = DumpInputOnFailure ? DumpInputFail : DumpInputNever; DumpInput = DumpInputOnFailure ? DumpInputFail : DumpInputNever;
std::vector<FileCheckDiag> Diags; std::vector<FileCheckDiag> Diags;
int ExitCode = FC.CheckInput(SM, InputFileText, CheckStrings, int ExitCode = FC.checkInput(SM, InputFileText,
DumpInput == DumpInputNever ? nullptr : &Diags) DumpInput == DumpInputNever ? nullptr : &Diags)
? EXIT_SUCCESS ? EXIT_SUCCESS
: 1; : 1;