MC-COFF: Handle relaxation in COFF better. Fixes PR8321.
authorMichael J. Spencer <bigcheesegs@gmail.com>
Thu, 7 Oct 2010 23:55:40 +0000 (23:55 +0000)
committerMichael J. Spencer <bigcheesegs@gmail.com>
Thu, 7 Oct 2010 23:55:40 +0000 (23:55 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@116013 91177308-0d34-0410-b5e6-96231b3b80d8

lib/MC/WinCOFFObjectWriter.cpp

index 5ebdb714a2629c93cf1884c1796aaf30bb2276f1..7bb19b2481cc59fa81e354b921a9e8c1c1bdaad2 100644 (file)
@@ -639,6 +639,11 @@ void WinCOFFObjectWriter::RecordRelocation(const MCAssembler &Asm,
   COFFSymbol *coff_symbol = SymbolMap[&A_SD];
 
   if (Target.getSymB()) {
+    if (&Target.getSymA()->getSymbol().getSection()
+     != &Target.getSymB()->getSymbol().getSection()) {
+      llvm_unreachable("Symbol relative relocations are only allowed between "
+                       "symbols in the same section");
+    }
     const MCSymbol *B = &Target.getSymB()->getSymbol();
     MCSymbolData &B_SD = Asm.getSymbolData(*B);
 
@@ -701,7 +706,30 @@ bool WinCOFFObjectWriter::IsFixupFullyResolved(const MCAssembler &Asm,
                                                const MCValue Target,
                                                bool IsPCRel,
                                                const MCFragment *DF) const {
-  return false;
+  // 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;
 }
 
 void WinCOFFObjectWriter::WriteObject(MCAssembler &Asm,