[ELF] - Fix for: PR29093 - version script does not support [chars] wildcards
GNU ld supports [chars] wildcards in version scripts, to match a single instance of any of the chars.
Here is an extern example from libstdc++'s version script in FreeBSD:
extern "C++"
{
...
std::locale::_[T-Za-z]*;
std::[A-Zm]*;
std::n[^u]*;
std::nu[^m]*;
std::num[^e]*;
...
}
Patch adds support for scripts above. This is PR29093.
Differential revision: https://reviews.llvm.org/D23803
llvm-svn: 280799
diff --git a/lld/ELF/Strings.cpp b/lld/ELF/Strings.cpp
index b4eed45..fec7bd4 100644
--- a/lld/ELF/Strings.cpp
+++ b/lld/ELF/Strings.cpp
@@ -21,25 +21,32 @@
using namespace lld::elf;
bool elf::hasWildcard(StringRef S) {
- return S.find_first_of("?*") != StringRef::npos;
+ return S.find_first_of("?*[") != StringRef::npos;
}
// Converts a glob pattern to a regular expression.
static std::string toRegex(StringRef S) {
- if (S.find_first_of("[]") != StringRef::npos)
- warning("unsupported wildcard: " + S);
-
std::string T;
+ bool InBracket = false;
while (!S.empty()) {
char C = S.front();
+ if (InBracket) {
+ InBracket = C != ']';
+ T += C;
+ S = S.drop_front();
+ continue;
+ }
+
if (C == '*')
T += ".*";
else if (C == '?')
T += '.';
- else if (StringRef(".+^${}()|/\\[]").find_first_of(C) != StringRef::npos)
+ else if (StringRef(".+^${}()|/\\").find_first_of(C) != StringRef::npos)
T += std::string("\\") + C;
else
T += C;
+
+ InBracket = C == '[';
S = S.substr(1);
}
return T;