[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;