summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2014-03-24 03:43:21 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2014-03-24 03:43:21 +0000
commit0bce3343cca290481199c5457bb54577f4a33a68 (patch)
tree92fba8b9b04e15360fbb3507bf94714ee3c4070b
parentb83e788db5c2e0bf5c751536d17723626e9a4b68 (diff)
downloadllvm-0bce3343cca290481199c5457bb54577f4a33a68.tar.gz
llvm-0bce3343cca290481199c5457bb54577f4a33a68.tar.bz2
llvm-0bce3343cca290481199c5457bb54577f4a33a68.tar.xz
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
-rw-r--r--lib/MC/ELFObjectWriter.cpp37
-rw-r--r--test/MC/ELF/offset.s2
-rw-r--r--test/MC/ELF/type-propagate.s10
3 files changed, 22 insertions, 27 deletions
diff --git a/lib/MC/ELFObjectWriter.cpp b/lib/MC/ELFObjectWriter.cpp
index 076b999307..fcf6d87e42 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<const MCSectionELF*, uint64_t> 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<const MCSectionELF&>(RefSymbol.getSection());
+ static_cast<const MCSectionELF&>(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<MCAsmLayout&>(Layout), RelMap);
diff --git a/test/MC/ELF/offset.s b/test/MC/ELF/offset.s
index 962d397d2e..51f6e7688b 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 449b890e30..feb9507a44 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: }