[lld] r259481 - [ELF] Implemented -Bsymbolic-functions command line option

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Tue Feb 2 01:28:54 PST 2016


Author: grimar
Date: Tue Feb  2 03:28:53 2016
New Revision: 259481

URL: http://llvm.org/viewvc/llvm-project?rev=259481&view=rev
Log:
[ELF] Implemented -Bsymbolic-functions command line option

-Bsymbolic-functions: 
When creating a shared library, bind references to global 
function symbols to the definition within the shared library, if any.

This patch also fixed behavior of already existent -Bsymbolic:
previously PLT entries were created even if -Bsymbolic was specified.

Differential revision: http://reviews.llvm.org/D16411

Added:
    lld/trunk/test/ELF/bsymbolic.s
Modified:
    lld/trunk/ELF/Config.h
    lld/trunk/ELF/Driver.cpp
    lld/trunk/ELF/Options.td
    lld/trunk/ELF/OutputSections.cpp
    lld/trunk/ELF/Symbols.cpp
    lld/trunk/ELF/Symbols.h

Modified: lld/trunk/ELF/Config.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Config.h?rev=259481&r1=259480&r2=259481&view=diff
==============================================================================
--- lld/trunk/ELF/Config.h (original)
+++ lld/trunk/ELF/Config.h Tue Feb  2 03:28:53 2016
@@ -53,6 +53,7 @@ struct Configuration {
   bool AllowMultipleDefinition;
   bool AsNeeded = false;
   bool Bsymbolic;
+  bool BsymbolicFunctions;
   bool Demangle = true;
   bool DiscardAll;
   bool DiscardLocals;

Modified: lld/trunk/ELF/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Driver.cpp?rev=259481&r1=259480&r2=259481&view=diff
==============================================================================
--- lld/trunk/ELF/Driver.cpp (original)
+++ lld/trunk/ELF/Driver.cpp Tue Feb  2 03:28:53 2016
@@ -188,6 +188,7 @@ void LinkerDriver::readConfigs(opt::Inpu
 
   Config->AllowMultipleDefinition = Args.hasArg(OPT_allow_multiple_definition);
   Config->Bsymbolic = Args.hasArg(OPT_Bsymbolic);
+  Config->BsymbolicFunctions = Args.hasArg(OPT_Bsymbolic_functions);
   Config->Demangle = !Args.hasArg(OPT_no_demangle);
   Config->DiscardAll = Args.hasArg(OPT_discard_all);
   Config->DiscardLocals = Args.hasArg(OPT_discard_locals);

Modified: lld/trunk/ELF/Options.td
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Options.td?rev=259481&r1=259480&r2=259481&view=diff
==============================================================================
--- lld/trunk/ELF/Options.td (original)
+++ lld/trunk/ELF/Options.td Tue Feb  2 03:28:53 2016
@@ -3,6 +3,9 @@ include "llvm/Option/OptParser.td"
 def Bsymbolic: Flag<["-"], "Bsymbolic">,
   HelpText<"Bind defined symbols locally">;
 
+def Bsymbolic_functions: Flag<["-"], "Bsymbolic-functions">,
+  HelpText<"Bind defined function symbols locally">;
+
 def Bdynamic: Flag<["-"], "Bdynamic">,
   HelpText<"Link against shared libraries">;
 

Modified: lld/trunk/ELF/OutputSections.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/OutputSections.cpp?rev=259481&r1=259480&r2=259481&view=diff
==============================================================================
--- lld/trunk/ELF/OutputSections.cpp (original)
+++ lld/trunk/ELF/OutputSections.cpp Tue Feb  2 03:28:53 2016
@@ -895,7 +895,11 @@ bool elf2::canBePreempted(const SymbolBo
   }
   if (!Config->Shared)
     return false;
-  return Body->getVisibility() == STV_DEFAULT;
+  if (Body->getVisibility() != STV_DEFAULT)
+    return false;
+  if (Config->Bsymbolic || (Config->BsymbolicFunctions && Body->isFunc()))
+    return false;
+  return true;
 }
 
 template <class ELFT> void OutputSection<ELFT>::writeTo(uint8_t *Buf) {

Modified: lld/trunk/ELF/Symbols.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.cpp?rev=259481&r1=259480&r2=259481&view=diff
==============================================================================
--- lld/trunk/ELF/Symbols.cpp (original)
+++ lld/trunk/ELF/Symbols.cpp Tue Feb  2 03:28:53 2016
@@ -146,12 +146,13 @@ template <class ELFT> int SymbolBody::co
 }
 
 Defined::Defined(Kind K, StringRef Name, bool IsWeak, uint8_t Visibility,
-                 bool IsTls)
-    : SymbolBody(K, Name, IsWeak, Visibility, IsTls) {}
+                 bool IsTls, bool IsFunction)
+    : SymbolBody(K, Name, IsWeak, Visibility, IsTls, IsFunction) {}
 
 Undefined::Undefined(SymbolBody::Kind K, StringRef N, bool IsWeak,
                      uint8_t Visibility, bool IsTls)
-    : SymbolBody(K, N, IsWeak, Visibility, IsTls), CanKeepUndefined(false) {}
+    : SymbolBody(K, N, IsWeak, Visibility, IsTls, /*IsFunction*/ false),
+      CanKeepUndefined(false) {}
 
 Undefined::Undefined(StringRef N, bool IsWeak, uint8_t Visibility,
                      bool CanKeepUndefined)
@@ -170,12 +171,14 @@ UndefinedElf<ELFT>::UndefinedElf(StringR
 template <typename ELFT>
 DefinedSynthetic<ELFT>::DefinedSynthetic(StringRef N, uintX_t Value,
                                          OutputSectionBase<ELFT> &Section)
-    : Defined(SymbolBody::DefinedSyntheticKind, N, false, STV_DEFAULT, false),
+    : Defined(SymbolBody::DefinedSyntheticKind, N, false, STV_DEFAULT,
+              /*IsTls*/ false, /*IsFunction*/ false),
       Value(Value), Section(Section) {}
 
 DefinedCommon::DefinedCommon(StringRef N, uint64_t Size, uint64_t Alignment,
                              bool IsWeak, uint8_t Visibility)
-    : Defined(SymbolBody::DefinedCommonKind, N, IsWeak, Visibility, false) {
+    : Defined(SymbolBody::DefinedCommonKind, N, IsWeak, Visibility,
+              /*IsTls*/ false, /*IsFunction*/ false) {
   MaxAlignment = Alignment;
   this->Size = Size;
 }

Modified: lld/trunk/ELF/Symbols.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.h?rev=259481&r1=259480&r2=259481&view=diff
==============================================================================
--- lld/trunk/ELF/Symbols.h (original)
+++ lld/trunk/ELF/Symbols.h Tue Feb  2 03:28:53 2016
@@ -86,6 +86,7 @@ public:
   bool isUsedInDynamicReloc() const { return IsUsedInDynamicReloc; }
   void setUsedInDynamicReloc() { IsUsedInDynamicReloc = true; }
   bool isTls() const { return IsTls; }
+  bool isFunc() const { return IsFunc; }
 
   // Returns the symbol name.
   StringRef getName() const { return Name; }
@@ -127,9 +128,9 @@ public:
 
 protected:
   SymbolBody(Kind K, StringRef Name, bool IsWeak, uint8_t Visibility,
-             bool IsTls)
+             bool IsTls, bool IsFunc)
       : SymbolKind(K), IsWeak(IsWeak), Visibility(Visibility), IsTls(IsTls),
-        Name(Name) {
+        IsFunc(IsFunc), Name(Name) {
     IsUsedInRegularObj = K != SharedKind && K != LazyKind;
     IsUsedInDynamicReloc = 0;
   }
@@ -148,6 +149,7 @@ protected:
   unsigned IsUsedInDynamicReloc : 1;
 
   unsigned IsTls : 1;
+  unsigned IsFunc : 1;
   StringRef Name;
   Symbol *Backref = nullptr;
 };
@@ -155,7 +157,8 @@ protected:
 // The base class for any defined symbols.
 class Defined : public SymbolBody {
 public:
-  Defined(Kind K, StringRef Name, bool IsWeak, uint8_t Visibility, bool IsTls);
+  Defined(Kind K, StringRef Name, bool IsWeak, uint8_t Visibility, bool IsTls,
+          bool IsFunction);
   static bool classof(const SymbolBody *S) { return S->isDefined(); }
 };
 
@@ -167,7 +170,8 @@ protected:
 public:
   DefinedElf(Kind K, StringRef N, const Elf_Sym &Sym)
       : Defined(K, N, Sym.getBinding() == llvm::ELF::STB_WEAK,
-                Sym.getVisibility(), Sym.getType() == llvm::ELF::STT_TLS),
+                Sym.getVisibility(), Sym.getType() == llvm::ELF::STT_TLS,
+                Sym.getType() == llvm::ELF::STT_FUNC),
         Sym(Sym) {}
 
   const Elf_Sym &Sym;
@@ -289,7 +293,8 @@ public:
 class Lazy : public SymbolBody {
 public:
   Lazy(ArchiveFile *F, const llvm::object::Archive::Symbol S)
-      : SymbolBody(LazyKind, S.getName(), false, llvm::ELF::STV_DEFAULT, false),
+      : SymbolBody(LazyKind, S.getName(), false, llvm::ELF::STV_DEFAULT,
+                   /*IsTls*/ false, /*IsFunction*/ false),
         File(F), Sym(S) {}
 
   static bool classof(const SymbolBody *S) { return S->kind() == LazyKind; }

Added: lld/trunk/test/ELF/bsymbolic.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/bsymbolic.s?rev=259481&view=auto
==============================================================================
--- lld/trunk/test/ELF/bsymbolic.s (added)
+++ lld/trunk/test/ELF/bsymbolic.s Tue Feb  2 03:28:53 2016
@@ -0,0 +1,30 @@
+// RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o
+// RUN: ld.lld -shared %t.o -o %t0.so
+// RUN: ld.lld -shared -Bsymbolic %t.o -o %t1.so
+// RUN: ld.lld -shared -Bsymbolic-functions %t.o -o %t2.so
+// RUN: llvm-readobj -s %t0.so | FileCheck -check-prefix=NOOPTION %s
+// RUN: llvm-readobj -s %t1.so | FileCheck -check-prefix=SYMBOLIC %s
+// RUN: llvm-readobj -s %t2.so | FileCheck -check-prefix=SYMBOLIC %s
+
+// NOOPTION:     Section {
+// NOOPTION:       Name: .plt
+
+// SYMBOLIC: Section {
+// SYMBOLIC-NOT: Name: .plt
+
+.text
+.globl foo
+.type foo, at function
+foo:
+nop
+
+.globl bar
+.type bar, at function
+bar:
+nop
+
+.globl do
+.type do, at function
+do: 
+callq foo at PLT
+callq bar at PLT




More information about the llvm-commits mailing list