Merge isAbsolute into IsSymbolRefDifferenceFullyResolved.

llvm-svn: 122148
diff --git a/llvm/lib/MC/ELFObjectWriter.cpp b/llvm/lib/MC/ELFObjectWriter.cpp
index a6503b7..1bb4775 100644
--- a/llvm/lib/MC/ELFObjectWriter.cpp
+++ b/llvm/lib/MC/ELFObjectWriter.cpp
@@ -344,20 +344,6 @@
                                           MCDataFragment *F,
                                           const MCSectionData *SD);
 
-    virtual bool
-    IsSymbolRefDifferenceFullyResolved(const MCAssembler &Asm,
-                                       const MCSymbolRefExpr *A,
-                                       const MCSymbolRefExpr *B) const {
-      // FIXME: Implement this!
-      return false;
-    }
-
-    virtual bool isAbsolute(bool IsSet, const MCSymbol &A,
-                            const MCSymbol &B) const {
-      // On ELF A - B is absolute if A and B are in the same section.
-      return &A.getSection() == &B.getSection();
-    }
-
     virtual bool IsFixupFullyResolved(const MCAssembler &Asm,
                               const MCValue Target,
                               bool IsPCRel,
diff --git a/llvm/lib/MC/MCExpr.cpp b/llvm/lib/MC/MCExpr.cpp
index 22d8740..94b9f00 100644
--- a/llvm/lib/MC/MCExpr.cpp
+++ b/llvm/lib/MC/MCExpr.cpp
@@ -300,7 +300,7 @@
   const MCAssembler &Asm = Layout->getAssembler();
 
   if (A && B &&
-      Asm.getWriter().IsSymbolRefDifferenceFullyResolved(Asm, A, B)) {
+      Asm.getWriter().IsSymbolRefDifferenceFullyResolved(Asm, A, B, false)) {
     // Eagerly evaluate.
     Addend += (Layout->getSymbolOffset(&Asm.getSymbolData(A->getSymbol())) -
                Layout->getSymbolOffset(&Asm.getSymbolData(B->getSymbol())));
@@ -385,10 +385,9 @@
          "Must have an assembler object if layout is given!");
 
   if (Asm && A && B) {
-    const MCSymbol &SA = A->getSymbol();
-    const MCSymbol &SB = B->getSymbol();
-    if (SA.isDefined() && SB.isDefined() &&
-        Asm->getWriter().isAbsolute(InSet, SA, SB)) {
+    if (A->getSymbol().isDefined() && B->getSymbol().isDefined() &&
+        Asm->getWriter().IsSymbolRefDifferenceFullyResolved(*Asm, A, B,
+                                                            InSet)) {
       MCSymbolData &AD = Asm->getSymbolData(A->getSymbol());
       MCSymbolData &BD = Asm->getSymbolData(B->getSymbol());
 
diff --git a/llvm/lib/MC/MCObjectWriter.cpp b/llvm/lib/MC/MCObjectWriter.cpp
index 6cee76d..e5f5f70 100644
--- a/llvm/lib/MC/MCObjectWriter.cpp
+++ b/llvm/lib/MC/MCObjectWriter.cpp
@@ -7,7 +7,9 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include "llvm/MC/MCExpr.h"
 #include "llvm/MC/MCObjectWriter.h"
+#include "llvm/MC/MCSymbol.h"
 
 using namespace llvm;
 
@@ -39,3 +41,22 @@
     OS << char(Byte);
   } while (Value != 0);
 }
+
+bool
+MCObjectWriter::IsSymbolRefDifferenceFullyResolved(const MCAssembler &Asm,
+                                                   const MCSymbolRefExpr *A,
+                                                   const MCSymbolRefExpr *B,
+                                                   bool InSet) const {
+  // Modified symbol references cannot be resolved.
+  if (A->getKind() != MCSymbolRefExpr::VK_None ||
+      B->getKind() != MCSymbolRefExpr::VK_None)
+    return false;
+
+  const MCSymbol &SA = A->getSymbol();
+  const MCSymbol &SB = B->getSymbol();
+  if (SA.isUndefined() || SB.isUndefined())
+    return false;
+
+  // On ELF and COFF A - B is absolute if A and B are in the same section.
+  return &SA.getSection() == &SB.getSection();
+}
diff --git a/llvm/lib/MC/MachObjectWriter.cpp b/llvm/lib/MC/MachObjectWriter.cpp
index 42cf43f..11681ca 100644
--- a/llvm/lib/MC/MachObjectWriter.cpp
+++ b/llvm/lib/MC/MachObjectWriter.cpp
@@ -1123,15 +1123,13 @@
                        UndefinedSymbolData);
   }
 
-  bool isAbsolute(bool IsSet, const MCSymbol &A,
-                                     const MCSymbol &B) const  {
-    // On MachO A - B is absolute only if in a set.
-    return IsSet;
-  }
-
   bool IsSymbolRefDifferenceFullyResolved(const MCAssembler &Asm,
                                           const MCSymbolRefExpr *A,
-                                          const MCSymbolRefExpr *B) const {
+                                          const MCSymbolRefExpr *B,
+                                          bool InSet) const {
+    if (InSet)
+      return true;
+
     if (!TargetObjectWriter->useAggressiveSymbolFolding())
       return false;
 
diff --git a/llvm/lib/MC/WinCOFFObjectWriter.cpp b/llvm/lib/MC/WinCOFFObjectWriter.cpp
index 7f75662..3a88a03 100644
--- a/llvm/lib/MC/WinCOFFObjectWriter.cpp
+++ b/llvm/lib/MC/WinCOFFObjectWriter.cpp
@@ -179,20 +179,6 @@
                         MCValue Target,
                         uint64_t &FixedValue);
 
-  virtual bool
-  IsSymbolRefDifferenceFullyResolved(const MCAssembler &Asm,
-                                     const MCSymbolRefExpr *A,
-                                     const MCSymbolRefExpr *B) const {
-    // FIXME: Implement this!
-    return false;
-  }
-
-  virtual bool isAbsolute(bool IsSet, const MCSymbol &A,
-                          const MCSymbol &B) const  {
-    // On COFF A - B is absolute if A and B are in the same section.
-    return &A.getSection() == &B.getSection();
-  }
-
   virtual bool IsFixupFullyResolved(const MCAssembler &Asm,
                                     const MCValue Target,
                                     bool IsPCRel,