[llvm] r204771 - Correctly detect if a symbol uses a reserved section index or not.

Rafael Espindola rafael.espindola at gmail.com
Tue Mar 25 17:16:44 PDT 2014


Author: rafael
Date: Tue Mar 25 19:16:43 2014
New Revision: 204771

URL: http://llvm.org/viewvc/llvm-project?rev=204771&view=rev
Log:
Correctly detect if a symbol uses a reserved section index or not.

The logic was incorrect for variables, causing them to end up in the wrong
section if the section had an index >= 0xff00.

Modified:
    llvm/trunk/lib/MC/ELFObjectWriter.cpp
    llvm/trunk/test/MC/ELF/many-sections-2.s

Modified: llvm/trunk/lib/MC/ELFObjectWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/ELFObjectWriter.cpp?rev=204771&r1=204770&r2=204771&view=diff
==============================================================================
--- llvm/trunk/lib/MC/ELFObjectWriter.cpp (original)
+++ llvm/trunk/lib/MC/ELFObjectWriter.cpp Tue Mar 25 19:16:43 2014
@@ -612,13 +612,15 @@ void ELFObjectWriter::WriteSymbol(Symbol
   MCSymbolData &Data =
     Layout.getAssembler().getSymbolData(OrigData.getSymbol().AliasedSymbol());
 
-  bool IsReserved = Data.isCommon() || Data.getSymbol().isAbsolute() ||
-    Data.getSymbol().isVariable();
+  const MCSymbol *Base = getBaseSymbol(Layout, OrigData.getSymbol());
+
+  // This has to be in sync with when computeSymbolTable uses SHN_ABS or
+  // SHN_COMMON.
+  bool IsReserved = !Base || OrigData.isCommon();
 
   // Binding and Type share the same byte as upper and lower nibbles
   uint8_t Binding = MCELF::GetBinding(OrigData);
   uint8_t Type = MCELF::GetType(OrigData);
-  const MCSymbol *Base = getBaseSymbol(Layout, OrigData.getSymbol());
   if (Base) {
     MCSymbolData BaseSD = Layout.getAssembler().getSymbolData(*Base);
     Type = mergeTypeForSet(Type, MCELF::GetType(BaseSD));

Modified: llvm/trunk/test/MC/ELF/many-sections-2.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ELF/many-sections-2.s?rev=204771&r1=204770&r2=204771&view=diff
==============================================================================
--- llvm/trunk/test/MC/ELF/many-sections-2.s (original)
+++ llvm/trunk/test/MC/ELF/many-sections-2.s Tue Mar 25 19:16:43 2014
@@ -10,8 +10,28 @@
 // Test that we don't create a symbol for the symtab_shndx section.
 // SYMBOLS-NOT: symtab_shndx
 
-// Test that this file has one section too many.
 
+// Test that both a and b show up in the correct section.
+// SYMBOLS:         Name: a (1)
+// SYMBOLS-NEXT:    Value: 0x0
+// SYMBOLS-NEXT:    Size: 0
+// SYMBOLS-NEXT:    Binding: Local (0x0)
+// SYMBOLS-NEXT:    Type: None (0x0)
+// SYMBOLS-NEXT:    Other: 0
+// SYMBOLS-NEXT:    Section: last (0xFF00)
+// SYMBOLS-NEXT:  }
+// SYMBOLS-NEXT:  Symbol {
+// SYMBOLS-NEXT:    Name: b (3)
+// SYMBOLS-NEXT:    Value: 0x1
+// SYMBOLS-NEXT:    Size: 0
+// SYMBOLS-NEXT:    Binding: Local (0x0)
+// SYMBOLS-NEXT:    Type: None (0x0)
+// SYMBOLS-NEXT:    Other: 0
+// SYMBOLS-NEXT:    Section: last (0xFF00)
+// SYMBOLS-NEXT:  }
+
+
+// Test that this file has one section too many.
 // SYMBOLS:         Name: last (0)
 // SYMBOLS-NEXT:    Value: 0x0
 // SYMBOLS-NEXT:    Size: 0
@@ -109,3 +129,5 @@ gen_sections8 l
 gen_sections4 m
 
 .section last
+a:
+b = a + 1





More information about the llvm-commits mailing list