From: Rafael Espindola Date: Mon, 24 Mar 2014 03:43:21 +0000 (+0000) Subject: Propagate section from base to derived symbol. X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=0bce3343cca290481199c5457bb54577f4a33a68;p=oota-llvm.git Propagate section from base to derived symbol. We were already propagating the section in a = b With this patch we also propagate it for a = b + 1 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@204581 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/MC/ELFObjectWriter.cpp b/lib/MC/ELFObjectWriter.cpp index 076b9993077..fcf6d87e421 100644 --- a/lib/MC/ELFObjectWriter.cpp +++ b/lib/MC/ELFObjectWriter.cpp @@ -264,13 +264,13 @@ class ELFObjectWriter : public MCObjectWriter { // Map from a section to its offset typedef DenseMap SectionOffsetMapTy; - /// ComputeSymbolTable - Compute the symbol table data + /// Compute the symbol table data /// /// \param Asm - The assembler. /// \param SectionIndexMap - Maps a section to its index. /// \param RevGroupMap - Maps a signature symbol to the group section. /// \param NumRegularSections - Number of non-relocation sections. - void ComputeSymbolTable(MCAssembler &Asm, + void computeSymbolTable(MCAssembler &Asm, const MCAsmLayout &Layout, const SectionIndexMapTy &SectionIndexMap, RevGroupMapTy RevGroupMap, unsigned NumRegularSections); @@ -937,10 +937,11 @@ void ELFObjectWriter::ComputeIndexMap(MCAssembler &Asm, } } -void ELFObjectWriter::ComputeSymbolTable(MCAssembler &Asm, - const SectionIndexMapTy &SectionIndexMap, - RevGroupMapTy RevGroupMap, - unsigned NumRegularSections) { +void +ELFObjectWriter::computeSymbolTable(MCAssembler &Asm, const MCAsmLayout &Layout, + const SectionIndexMapTy &SectionIndexMap, + RevGroupMapTy RevGroupMap, + unsigned NumRegularSections) { // FIXME: Is this the correct place to do this? // FIXME: Why is an undefined reference to _GLOBAL_OFFSET_TABLE_ needed? if (NeedsGOT) { @@ -988,33 +989,33 @@ void ELFObjectWriter::ComputeSymbolTable(MCAssembler &Asm, ELFSymbolData MSD; MSD.SymbolData = it; - const MCSymbol &RefSymbol = Symbol.AliasedSymbol(); + const MCSymbol *BaseSymbol = getBaseSymbol(Layout, Symbol); // Undefined symbols are global, but this is the first place we // are able to set it. bool Local = isLocal(*it, isSignature, Used); if (!Local && MCELF::GetBinding(*it) == ELF::STB_LOCAL) { - MCSymbolData &SD = Asm.getSymbolData(RefSymbol); + assert(BaseSymbol); + MCSymbolData &SD = Asm.getSymbolData(*BaseSymbol); MCELF::SetBinding(*it, ELF::STB_GLOBAL); MCELF::SetBinding(SD, ELF::STB_GLOBAL); } - if (RefSymbol.isUndefined() && !Used && WeakrefUsed) - MCELF::SetBinding(*it, ELF::STB_WEAK); - - if (it->isCommon()) { + if (!BaseSymbol) { + MSD.SectionIndex = ELF::SHN_ABS; + } else if (it->isCommon()) { assert(!Local); MSD.SectionIndex = ELF::SHN_COMMON; - } else if (Symbol.isAbsolute() || RefSymbol.isVariable()) { - MSD.SectionIndex = ELF::SHN_ABS; - } else if (RefSymbol.isUndefined()) { + } else if (BaseSymbol->isUndefined()) { if (isSignature && !Used) MSD.SectionIndex = SectionIndexMap.lookup(RevGroupMap[&Symbol]); else MSD.SectionIndex = ELF::SHN_UNDEF; + if (!Used && WeakrefUsed) + MCELF::SetBinding(*it, ELF::STB_WEAK); } else { const MCSectionELF &Section = - static_cast(RefSymbol.getSection()); + static_cast(BaseSymbol->getSection()); MSD.SectionIndex = SectionIndexMap.lookup(&Section); if (MSD.SectionIndex >= ELF::SHN_LORESERVE) NeedsSymtabShndx = true; @@ -1600,8 +1601,8 @@ void ELFObjectWriter::WriteObject(MCAssembler &Asm, unsigned NumRegularSections = NumUserSections + NumIndexedSections; // Compute symbol table information. - ComputeSymbolTable(Asm, SectionIndexMap, RevGroupMap, NumRegularSections); - + computeSymbolTable(Asm, Layout, SectionIndexMap, RevGroupMap, + NumRegularSections); WriteRelocations(Asm, const_cast(Layout), RelMap); diff --git a/test/MC/ELF/offset.s b/test/MC/ELF/offset.s index 962d397d2e8..51f6e7688b0 100644 --- a/test/MC/ELF/offset.s +++ b/test/MC/ELF/offset.s @@ -23,5 +23,5 @@ sym_d = sym_a + 1 // CHECK-NEXT: Binding: Local (0x0) // CHECK-NEXT: Type: None (0x0) // CHECK-NEXT: Other: 0 -// CHECK-NEXT: Section: (0xFFF1) +// CHECK-NEXT: Section: .text (0x1) // CHECK-NEXT: } diff --git a/test/MC/ELF/type-propagate.s b/test/MC/ELF/type-propagate.s index 449b890e304..feb9507a441 100644 --- a/test/MC/ELF/type-propagate.s +++ b/test/MC/ELF/type-propagate.s @@ -114,10 +114,7 @@ sym10: // CHECK-NEXT: Type: Function (0x2) // CHECK-NEXT: Other: 0 - -// GAS: Section: .text (0x1) -// CHECK-NEXT: Section: (0xFFF1) - +// CHECK-NEXT: Section: .text (0x1) // CHECK-NEXT: } // CHECK-NEXT: Symbol { // CHECK-NEXT: Name: sym10 @@ -150,8 +147,5 @@ sym10: // CHECK-NEXT: Type: Function (0x2) // CHECK-NEXT: Other: 0 - -// GAS: Section: .text (0x1) -// CHECK-NEXT: Section: (0xFFF1) - +// CHECK-NEXT: Section: .text (0x1) // CHECK-NEXT: }