[ELF] - Added support for extern "c++" local symbols in version script.

Previously we did not support them,
patch implements this functionality

Differential revision: https://reviews.llvm.org/D26604

llvm-svn: 287124
diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp
index 5bf3692..eae491d 100644
--- a/lld/ELF/LinkerScript.cpp
+++ b/lld/ELF/LinkerScript.cpp
@@ -992,6 +992,7 @@
   void readVersionDeclaration(StringRef VerStr);
   void readGlobal(StringRef VerStr);
   void readLocal(StringRef VerStr);
+  void readSymbols(std::vector<SymbolVersion> &V);
 
   ScriptConfiguration &Opt = *ScriptConfig;
   bool IsUnderSysroot;
@@ -1819,6 +1820,20 @@
   expect(";");
 }
 
+void ScriptParser::readSymbols(std::vector<SymbolVersion> &V) {
+  for (;;) {
+    if (consume("extern"))
+      readVersionExtern(&V);
+
+    StringRef Cur = peek();
+    if (Cur == "}" || Cur == "local:" || Error)
+      return;
+    skip();
+    V.push_back({unquote(Cur), false, hasWildcard(Cur)});
+    expect(";");
+  }
+}
+
 void ScriptParser::readLocal(StringRef VerStr) {
   if (consume("*")) {
     Config->DefaultSymbolVersion = VER_NDX_LOCAL;
@@ -1829,15 +1844,10 @@
   if (VerStr.empty())
     setError("locals list for anonymous version is not supported");
 
-  std::vector<SymbolVersion> &Locals = Config->VersionDefinitions.back().Locals;
-  while (!Error && peek() != "}") {
-    StringRef Tok = next();
-    Locals.push_back({unquote(Tok), false, hasWildcard(Tok)});
-    expect(";");
-  }
+  readSymbols(Config->VersionDefinitions.back().Locals);
 }
 
-void ScriptParser::readVersionExtern(std::vector<SymbolVersion> *Globals) {
+void ScriptParser::readVersionExtern(std::vector<SymbolVersion> *V) {
   expect("\"C++\"");
   expect("{");
 
@@ -1845,7 +1855,7 @@
     if (peek() == "}" || Error)
       break;
     bool HasWildcard = !peek().startswith("\"") && hasWildcard(peek());
-    Globals->push_back({unquote(next()), true, HasWildcard});
+    V->push_back({unquote(next()), true, HasWildcard});
     expect(";");
   }
 
@@ -1854,23 +1864,10 @@
 }
 
 void ScriptParser::readGlobal(StringRef VerStr) {
-  std::vector<SymbolVersion> *Globals;
   if (VerStr.empty())
-    Globals = &Config->VersionScriptGlobals;
+    readSymbols(Config->VersionScriptGlobals);
   else
-    Globals = &Config->VersionDefinitions.back().Globals;
-
-  for (;;) {
-    if (consume("extern"))
-      readVersionExtern(Globals);
-
-    StringRef Cur = peek();
-    if (Cur == "}" || Cur == "local:" || Error)
-      return;
-    skip();
-    Globals->push_back({unquote(Cur), false, hasWildcard(Cur)});
-    expect(";");
-  }
+    readSymbols(Config->VersionDefinitions.back().Globals);
 }
 
 static bool isUnderSysroot(StringRef Path) {