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/WinCOFFObjectWriter.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/WinCOFFObjectWriter.cpp')
| -rw-r--r-- | llvm/lib/MC/WinCOFFObjectWriter.cpp | 49 |
1 files changed, 17 insertions, 32 deletions
diff --git a/llvm/lib/MC/WinCOFFObjectWriter.cpp b/llvm/lib/MC/WinCOFFObjectWriter.cpp index 3a88a03f8bd..48a7c3bd64e 100644 --- a/llvm/lib/MC/WinCOFFObjectWriter.cpp +++ b/llvm/lib/MC/WinCOFFObjectWriter.cpp @@ -179,10 +179,12 @@ public: MCValue Target, uint64_t &FixedValue); - 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; void WriteObject(MCAssembler &Asm, const MCAsmLayout &Layout); }; @@ -717,34 +719,17 @@ void WinCOFFObjectWriter::RecordRelocation(const MCAssembler &Asm, coff_section->Relocations.push_back(Reloc); } -bool WinCOFFObjectWriter::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->getSection(); - } - - const MCSection *SectionB = 0; - if (const MCSymbolRefExpr *B = Target.getSymB()) { - SectionB = &B->getSymbol().getSection(); - } - - if (!BaseSection) - return SectionA == SectionB; - - return !SectionB && BaseSection == SectionA; +bool +WinCOFFObjectWriter::IsSymbolRefDifferenceFullyResolvedImpl( + const MCAssembler &Asm, + const MCSymbolData &DataA, + const MCFragment &FB, + bool InSet, + bool IsPCRel) const { + const MCSection &SecA = DataA.getSymbol().AliasedSymbol().getSection(); + const MCSection &SecB = FB.getParent()->getSection(); + // On COFF A - B is absolute if A and B are in the same section. + return &SecA == &SecB; } void WinCOFFObjectWriter::WriteObject(MCAssembler &Asm, |

