ELF_STB_Local is 0 so setting and checking it must be done specially
authorRoman Divacky <rdivacky@freebsd.org>
Wed, 8 Sep 2010 18:08:40 +0000 (18:08 +0000)
committerRoman Divacky <rdivacky@freebsd.org>
Wed, 8 Sep 2010 18:08:40 +0000 (18:08 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@113375 91177308-0d34-0410-b5e6-96231b3b80d8

lib/MC/ELFObjectWriter.cpp
lib/MC/MCELFStreamer.cpp

index ed4f972be59e82af72a00269dea52e0730a1ce8f..5713f47026008d9d97e0e1a603ebb167ea031da0 100644 (file)
@@ -439,7 +439,7 @@ void ELFObjectWriterImpl::WriteSymbolTable(MCDataFragment *F,
     assert((Data.getFlags() & ELF_STB_Global) &&
            "External symbol requires STB_GLOBAL flag");
     WriteSymbol(F, MSD, Layout);
-    if (Data.getFlags() & ELF_STB_Local)
+    if ((Data.getFlags() & (0xf << ELF_STB_Shift)) == ELF_STB_Local)
       LastLocalSymbolIndex++;
   }
 
@@ -448,7 +448,7 @@ void ELFObjectWriterImpl::WriteSymbolTable(MCDataFragment *F,
     MCSymbolData &Data = *MSD.SymbolData;
     Data.setFlags(Data.getFlags() | ELF_STB_Global);
     WriteSymbol(F, MSD, Layout);
-    if (Data.getFlags() & ELF_STB_Local)
+    if ((Data.getFlags() & (0xf << ELF_STB_Shift)) == ELF_STB_Local)
       LastLocalSymbolIndex++;
   }
 }
index 570c3917ab46f02ae3788f4c180a2282cc6faac9..583052d0638a5861ecc2bfd4e2868df75be3dcf7 100644 (file)
@@ -196,7 +196,9 @@ void MCELFStreamer::EmitSymbolAttribute(MCSymbol *Symbol,
     break;
 
   case MCSA_Local:
-    SD.setFlags(SD.getFlags() | ELF_STB_Local);
+    // ELF_STB_Local is 0, so zero the ELF_STB area
+    // SD.getFlags() | ELF_STB_Local is a NOP
+    SD.setFlags(SD.getFlags() & ~(0xf << ELF_STB_Shift));
     break;
 
   case MCSA_ELF_TypeFunction: