From 7e71415cb3f810e0d91537fe0997535a818236ac Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Thu, 8 Dec 2016 17:26:53 +0000 Subject: [PATCH] Add support for 'extern "C"'. It is used by Qt. llvm-svn: 289074 --- lld/ELF/LinkerScript.cpp | 7 +++++-- lld/test/ELF/version-script-extern.s | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp index 8a0c39d..f62cdce 100644 --- a/lld/ELF/LinkerScript.cpp +++ b/lld/ELF/LinkerScript.cpp @@ -1929,14 +1929,17 @@ std::vector ScriptParser::readSymbols() { // Reads an "extern C++" directive, e.g., // "extern "C++" { ns::*; "f(int, double)"; };" std::vector ScriptParser::readVersionExtern() { - expect("\"C++\""); + StringRef Tok = next(); + bool IsCXX = Tok == "\"C++\""; + if (!IsCXX && Tok != "\"C\"") + setError("Unknown Language"); expect("{"); std::vector 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(";"); } diff --git a/lld/test/ELF/version-script-extern.s b/lld/test/ELF/version-script-extern.s index 5703bca..2b89839 100644 --- a/lld/test/ELF/version-script-extern.s +++ b/lld/test/ELF/version-script-extern.s @@ -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 -- 2.7.4