Index: llvm/include/llvm/Support/GlobPattern.h =================================================================== --- llvm/include/llvm/Support/GlobPattern.h +++ 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; Index: llvm/unittests/Support/GlobPatternTest.cpp =================================================================== --- llvm/unittests/Support/GlobPatternTest.cpp +++ 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 (unsigned i = 0; i < array_lengthof(NegativeCases); ++i) { + Expected Pat2 = GlobPattern::create(NegativeCases[i]); + EXPECT_TRUE((bool)Pat2); + EXPECT_FALSE(Pat2->isTrivialMatchAll()); + } +} }