diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2010-11-11 16:48:11 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2010-11-11 16:48:11 +0000 |
commit | 03f1b74aed795110f040b7588c8921c5de4bf1ea (patch) | |
tree | 606796e930946576ef55947018695e1c0bf7fc0b /lib/MC | |
parent | 17e8078ae14ed71f657d59c77efa3bedf171161a (diff) |
Fix the symbol index of weak references. Also make RecordRelocation a bit
easier to read by having const references to the symbol, aliased symbol and
renamed symbol.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@118793 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/MC')
-rw-r--r-- | lib/MC/ELFObjectWriter.cpp | 34 |
1 files changed, 12 insertions, 22 deletions
diff --git a/lib/MC/ELFObjectWriter.cpp b/lib/MC/ELFObjectWriter.cpp index 4adc188b61..f84164d253 100644 --- a/lib/MC/ELFObjectWriter.cpp +++ b/lib/MC/ELFObjectWriter.cpp @@ -669,16 +669,16 @@ void ELFObjectWriterImpl::RecordRelocation(const MCAssembler &Asm, int64_t Addend = 0; int Index = 0; int64_t Value = Target.getConstant(); - const MCSymbol *Symbol = 0; - const MCSymbol *Renamed = 0; + const MCSymbol &Symbol = Target.getSymA()->getSymbol(); + const MCSymbol &ASymbol = AliasedSymbol(Symbol); + const MCSymbol *RenamedP = Renames.lookup(&Symbol); + if (!RenamedP) + RenamedP = &ASymbol; + const MCSymbol &Renamed = *RenamedP; bool IsPCRel = isFixupKindX86PCRel(Fixup.getKind()); if (!Target.isAbsolute()) { - Symbol = &AliasedSymbol(Target.getSymA()->getSymbol()); - Renamed = Renames.lookup(Symbol); - if (!Renamed) - Renamed = &Target.getSymA()->getSymbol(); - MCSymbolData &SD = Asm.getSymbolData(*Symbol); + MCSymbolData &SD = Asm.getSymbolData(Symbol); MCFragment *F = SD.getFragment(); if (const MCSymbolRefExpr *RefB = Target.getSymB()) { @@ -695,15 +695,6 @@ void ELFObjectWriterImpl::RecordRelocation(const MCAssembler &Asm, Value += b - a; } - // Check that this case has already been fully resolved before we get - // here. - if (Symbol->isDefined() && !SD.isExternal() && - IsPCRel && - &Fragment->getParent()->getSection() == &Symbol->getSection()) { - llvm_unreachable("We don't need a relocation in this case."); - return; - } - bool RelocOnSymbol = ShouldRelocOnSymbol(SD, Target, *Fragment); if (!RelocOnSymbol) { Index = F->getParent()->getOrdinal(); @@ -712,11 +703,10 @@ void ELFObjectWriterImpl::RecordRelocation(const MCAssembler &Asm, // Offset of the symbol in the section Value += Layout.getSymbolAddress(&SD) - Layout.getSectionAddress(FSD); } else { - UsedInReloc.insert(Renamed); - MCSymbolData &RenamedSD = Asm.getSymbolData(*Renamed); - if (RenamedSD.getFlags() & ELF_Other_Weakref) { - WeakrefUsedInReloc.insert(Symbol); - } + if (Asm.getSymbolData(Symbol).getFlags() & ELF_Other_Weakref) + WeakrefUsedInReloc.insert(&Renamed); + else + UsedInReloc.insert(&Renamed); Index = -1; } Addend = Value; @@ -864,7 +854,7 @@ void ELFObjectWriterImpl::RecordRelocation(const MCAssembler &Asm, ERE.Index = Index; ERE.Type = Type; - ERE.Symbol = Renamed; + ERE.Symbol = &Renamed; ERE.r_offset = Layout.getFragmentOffset(Fragment) + Fixup.getOffset(); |