Add support for 'extern "C"'.
authorRafael Espindola <rafael.espindola@gmail.com>
Thu, 8 Dec 2016 17:26:53 +0000 (17:26 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Thu, 8 Dec 2016 17:26:53 +0000 (17:26 +0000)
It is used by Qt.

llvm-svn: 289074

lld/ELF/LinkerScript.cpp
lld/test/ELF/version-script-extern.s

index 8a0c39d..f62cdce 100644 (file)
@@ -1929,14 +1929,17 @@ std::vector<SymbolVersion> ScriptParser::readSymbols() {
 // Reads an "extern C++" directive, e.g.,
 // "extern "C++" { ns::*; "f(int, double)"; };"
 std::vector<SymbolVersion> ScriptParser::readVersionExtern() {
-  expect("\"C++\"");
+  StringRef Tok = next();
+  bool IsCXX = Tok == "\"C++\"";
+  if (!IsCXX && Tok != "\"C\"")
+    setError("Unknown Language");
   expect("{");
 
   std::vector<SymbolVersion> Ret;
   while (!Error && peek() != "}") {
     StringRef Tok = next();
     bool HasWildcard = !Tok.startswith("\"") && hasWildcard(Tok);
-    Ret.push_back({unquote(Tok), true, HasWildcard});
+    Ret.push_back({unquote(Tok), IsCXX, HasWildcard});
     expect(";");
   }
 
index 5703bca..2b89839 100644 (file)
@@ -5,7 +5,7 @@
 # RUN: echo '  extern "C++" { "foo(int)"; "zed(int)"; "abc::abc()"; };' >> %t.script
 # RUN: echo "};" >> %t.script
 # RUN: echo "LIBSAMPLE_2.0 { global:" >> %t.script
-# RUN: echo '  extern "C++" { "bar(int)"; };' >> %t.script
+# RUN: echo '  extern "C" { _Z3bari; };' >> %t.script
 # RUN: echo "};" >> %t.script
 # RUN: ld.lld --version-script %t.script -shared %t.o -o %t.so
 # RUN: llvm-readobj -V -dyn-symbols %t.so | FileCheck --check-prefix=DSO %s