diff --git a/llvm/include/llvm/Support/GlobPattern.h b/llvm/include/llvm/Support/GlobPattern.h --- a/llvm/include/llvm/Support/GlobPattern.h +++ b/llvm/include/llvm/Support/GlobPattern.h @@ -31,6 +31,16 @@ static Expected create(StringRef Pat); bool match(StringRef S) const; + // Returns true for glob pattern "*". Can be used to avoid expensive + // preparation/acquisition of the input for match(). + bool isTrivialMatchAll() const { + if (Prefix && Prefix->empty()) { + assert(!Suffix); + return true; + } + return false; + } + private: bool matchOne(ArrayRef Pat, StringRef S) const; diff --git a/llvm/unittests/Support/GlobPatternTest.cpp b/llvm/unittests/Support/GlobPatternTest.cpp --- a/llvm/unittests/Support/GlobPatternTest.cpp +++ b/llvm/unittests/Support/GlobPatternTest.cpp @@ -133,4 +133,17 @@ EXPECT_TRUE((bool)Pat2); EXPECT_TRUE(Pat2->match("\xFF")); } + +TEST_F(GlobPatternTest, IsTrivialMatchAll) { + Expected Pat1 = GlobPattern::create("*"); + EXPECT_TRUE((bool)Pat1); + EXPECT_TRUE(Pat1->isTrivialMatchAll()); + + const char *NegativeCases[] = {"a*", "*a", "?*", "*?", "**", "\\*"}; + for (auto *P : NegativeCases) { + Expected Pat2 = GlobPattern::create(P); + EXPECT_TRUE((bool)Pat2); + EXPECT_FALSE(Pat2->isTrivialMatchAll()); + } +} }