diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2010-12-24 21:22:02 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2010-12-24 21:22:02 +0000 |
commit | 0f8abeba1d526068ac8bd8ce6ec00ea661225721 (patch) | |
tree | 8deb76f610ff835623712674082eb7aecd73a355 /llvm/lib/MC/ELFObjectWriter.cpp | |
parent | ea9152e551364e54da36e51a483c36ee15669a2e (diff) | |
download | bcm5719-llvm-0f8abeba1d526068ac8bd8ce6ec00ea661225721.tar.gz bcm5719-llvm-0f8abeba1d526068ac8bd8ce6ec00ea661225721.zip |
Merge IsFixupFullyResolved and IsSymbolRefDifferenceFullyResolved. We now
have a single point where targets test if a relocation is needed.
llvm-svn: 122549
Diffstat (limited to 'llvm/lib/MC/ELFObjectWriter.cpp')
-rw-r--r-- | llvm/lib/MC/ELFObjectWriter.cpp | 58 |
1 files changed, 16 insertions, 42 deletions
diff --git a/llvm/lib/MC/ELFObjectWriter.cpp b/llvm/lib/MC/ELFObjectWriter.cpp index b6e1223bc41..ef6e0f14141 100644 --- a/llvm/lib/MC/ELFObjectWriter.cpp +++ b/llvm/lib/MC/ELFObjectWriter.cpp @@ -344,10 +344,12 @@ namespace { MCDataFragment *F, const MCSectionData *SD); - virtual bool IsFixupFullyResolved(const MCAssembler &Asm, - const MCValue Target, - bool IsPCRel, - const MCFragment *DF) const; + virtual bool + IsSymbolRefDifferenceFullyResolvedImpl(const MCAssembler &Asm, + const MCSymbolData &DataA, + const MCFragment &FB, + bool InSet, + bool IsPCRel) const; virtual void WriteObject(MCAssembler &Asm, const MCAsmLayout &Layout); virtual void WriteSection(MCAssembler &Asm, @@ -1154,50 +1156,22 @@ void ELFObjectWriter::CreateMetadataSections(MCAssembler &Asm, } } -bool ELFObjectWriter::IsFixupFullyResolved(const MCAssembler &Asm, - const MCValue Target, - bool IsPCRel, - const MCFragment *DF) const { - // If this is a PCrel relocation, find the section this fixup value is - // relative to. - const MCSection *BaseSection = 0; - if (IsPCRel) { - BaseSection = &DF->getParent()->getSection(); - assert(BaseSection); - } - - const MCSection *SectionA = 0; - const MCSymbol *SymbolA = 0; - if (const MCSymbolRefExpr *A = Target.getSymA()) { - SymbolA = &A->getSymbol(); - SectionA = &SymbolA->AliasedSymbol().getSection(); - } - - const MCSection *SectionB = 0; - const MCSymbol *SymbolB = 0; - if (const MCSymbolRefExpr *B = Target.getSymB()) { - SymbolB = &B->getSymbol(); - SectionB = &SymbolB->AliasedSymbol().getSection(); - } - - if (!BaseSection) - return SectionA == SectionB; - - if (SymbolB) - return false; - - // Absolute address but PCrel instruction, so we need a relocation. - if (!SymbolA) - return false; - +bool +ELFObjectWriter::IsSymbolRefDifferenceFullyResolvedImpl(const MCAssembler &Asm, + const MCSymbolData &DataA, + const MCFragment &FB, + bool InSet, + bool IsPCRel) const { // FIXME: This is in here just to match gnu as output. If the two ends // are in the same section, there is nothing that the linker can do to // break it. - const MCSymbolData &DataA = Asm.getSymbolData(*SymbolA); if (DataA.isExternal()) return false; - return BaseSection == SectionA; + const MCSection &SecA = DataA.getSymbol().AliasedSymbol().getSection(); + const MCSection &SecB = FB.getParent()->getSection(); + // On ELF A - B is absolute if A and B are in the same section. + return &SecA == &SecB; } void ELFObjectWriter::CreateGroupSections(MCAssembler &Asm, |