Fix ELFObjectWriter::isLocal for signature symbols.
authorRafael Espindola <rafael.espindola@gmail.com>
Fri, 29 May 2015 14:20:40 +0000 (14:20 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Fri, 29 May 2015 14:20:40 +0000 (14:20 +0000)
And with that simplify the logic for inserting them in ExternalSymbolData or
LocalSymbolData.

No functionality change overall since the old code avoided the isLocal bug.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@238555 91177308-0d34-0410-b5e6-96231b3b80d8

lib/MC/ELFObjectWriter.cpp

index 9bfe679b4497dd54d991dce9d0be2bca5382aede..827a1e3b6d79b18c42e6f61f49508e28cf6e07a7 100644 (file)
@@ -74,7 +74,8 @@ class ELFObjectWriter : public MCObjectWriter {
     static uint64_t SymbolValue(const MCSymbol &Sym, const MCAsmLayout &Layout);
     static bool isInSymtab(const MCAsmLayout &Layout, const MCSymbol &Symbol,
                            bool Used, bool Renamed);
-    static bool isLocal(const MCSymbol &Symbol, bool isUsedInReloc);
+    static bool isLocal(const MCSymbol &Symbol, bool IsUsedInReloc,
+                        bool IsSignature);
 
     /// Helper struct for containing some precomputed information on symbols.
     struct ELFSymbolData {
@@ -766,7 +767,8 @@ bool ELFObjectWriter::isInSymtab(const MCAsmLayout &Layout,
   return true;
 }
 
-bool ELFObjectWriter::isLocal(const MCSymbol &Symbol, bool isUsedInReloc) {
+bool ELFObjectWriter::isLocal(const MCSymbol &Symbol, bool IsUsedInReloc,
+                              bool IsSignature) {
   const MCSymbolData &Data = Symbol.getData();
   if (Data.isExternal())
     return false;
@@ -774,10 +776,10 @@ bool ELFObjectWriter::isLocal(const MCSymbol &Symbol, bool isUsedInReloc) {
   if (Symbol.isDefined())
     return true;
 
-  if (isUsedInReloc)
+  if (IsUsedInReloc)
     return false;
 
-  return true;
+  return IsSignature;
 }
 
 void ELFObjectWriter::computeSymbolTable(
@@ -825,7 +827,7 @@ void ELFObjectWriter::computeSymbolTable(
 
     // Undefined symbols are global, but this is the first place we
     // are able to set it.
-    bool Local = isLocal(Symbol, Used);
+    bool Local = isLocal(Symbol, Used, isSignature);
     if (!Local && MCELF::GetBinding(SD) == ELF::STB_LOCAL) {
       assert(BaseSymbol);
       MCSymbolData &BaseData = BaseSymbol->getData();
@@ -900,9 +902,7 @@ void ELFObjectWriter::computeSymbolTable(
     if (MCELF::GetType(SD) != ELF::STT_SECTION)
       MSD.Name = StrTabBuilder.add(Name);
 
-    if (MSD.SectionIndex == ELF::SHN_UNDEF)
-      ExternalSymbolData.push_back(MSD);
-    else if (Local)
+    if (Local)
       LocalSymbolData.push_back(MSD);
     else
       ExternalSymbolData.push_back(MSD);