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,28 @@ 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()); + Expected Pat2 = GlobPattern::create("a*"); + EXPECT_TRUE((bool)Pat2); + EXPECT_FALSE(Pat2->isTrivialMatchAll()); + Expected Pat3 = GlobPattern::create("*a"); + EXPECT_TRUE((bool)Pat3); + EXPECT_FALSE(Pat3->isTrivialMatchAll()); + Expected Pat4 = GlobPattern::create("**"); + EXPECT_TRUE((bool)Pat4); + EXPECT_FALSE(Pat4->isTrivialMatchAll()); + Expected Pat5 = GlobPattern::create("?*"); + EXPECT_TRUE((bool)Pat5); + EXPECT_FALSE(Pat5->isTrivialMatchAll()); + Expected Pat6 = GlobPattern::create("*?"); + EXPECT_TRUE((bool)Pat6); + EXPECT_FALSE(Pat6->isTrivialMatchAll()); + Expected Pat7 = GlobPattern::create("\\*"); + EXPECT_TRUE((bool)Pat7); + EXPECT_FALSE(Pat7->isTrivialMatchAll()); +} }