MC/Mach-O: On second thought, use a custom hook for enabling aggressive
authorDaniel Dunbar <daniel@zuster.org>
Fri, 17 Dec 2010 05:50:29 +0000 (05:50 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Fri, 17 Dec 2010 05:50:29 +0000 (05:50 +0000)
IsSymbolRefDifferenceFullyResolved, it turns out this does change behavior on
enough cases for x86-32 that I would rather wait a bit on it.
 - In practice, we will want to change this eventually because it only means we
   generate less relocations (it also eliminates the need for the horrible
   '.set' hack that Darwin requires in some places).

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@122042 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/MC/MCMachObjectWriter.h
lib/MC/MCMachObjectTargetWriter.cpp
lib/MC/MachObjectWriter.cpp
lib/Target/X86/X86AsmBackend.cpp

index 8c67d257a3045d92e3fc9d1a7f6c660ba88b76fc..6dfa3225d8ef6a1d38c43cfef83d441719d76199 100644 (file)
@@ -19,10 +19,14 @@ class MCMachObjectTargetWriter {
   const unsigned Is64Bit : 1;
   const uint32_t CPUType;
   const uint32_t CPUSubtype;
+  // FIXME: Remove this, we should just always use it once we no longer care
+  // about Darwin 'as' compatibility.
+  const unsigned UseAggressiveSymbolFolding : 1;
 
 protected:
   MCMachObjectTargetWriter(bool Is64Bit_, uint32_t CPUType_,
-                           uint32_t CPUSubtype_);
+                           uint32_t CPUSubtype_,
+                           bool UseAggressiveSymbolFolding_ = false);
 
 public:
   virtual ~MCMachObjectTargetWriter();
@@ -31,6 +35,7 @@ public:
   /// @{
 
   bool is64Bit() const { return Is64Bit; }
+  bool useAggressiveSymbolFolding() const { return UseAggressiveSymbolFolding; }
   uint32_t getCPUType() const { return CPUType; }
   uint32_t getCPUSubtype() const { return CPUSubtype; }
 
index 4dfc0a815f35037ad213e63b04e048a626f0e243..146cebf01a3af9ac46bd40bb1d99de071ca5d615 100644 (file)
 using namespace llvm;
 
 MCMachObjectTargetWriter::MCMachObjectTargetWriter(
-  bool Is64Bit_, uint32_t CPUType_, uint32_t CPUSubtype_)
-  : Is64Bit(Is64Bit_), CPUType(CPUType_), CPUSubtype(CPUSubtype_) {
+  bool Is64Bit_, uint32_t CPUType_, uint32_t CPUSubtype_,
+  bool UseAggressiveSymbolFolding_)
+  : Is64Bit(Is64Bit_), CPUType(CPUType_), CPUSubtype(CPUSubtype_),
+    UseAggressiveSymbolFolding(UseAggressiveSymbolFolding_) {
 }
 
 MCMachObjectTargetWriter::~MCMachObjectTargetWriter() {
index 17615eef6974be696f628901b08aec43a5a96130..6ebc782c8e2483df46a70a5700b017166bf215b1 100644 (file)
@@ -1126,6 +1126,9 @@ public:
   bool IsSymbolRefDifferenceFullyResolved(const MCAssembler &Asm,
                                           const MCSymbolRefExpr *A,
                                           const MCSymbolRefExpr *B) const {
+    if (!TargetObjectWriter->useAggressiveSymbolFolding())
+      return false;
+
     // The effective address is
     //     addr(atom(A)) + offset(A)
     //   - addr(atom(B)) - offset(B)
index 3f58e43ea1523071525e2f8c01224b7731f8c870..fe894ab7a14b641a99b74c38f4b1377642ae282b 100644 (file)
@@ -50,7 +50,8 @@ class X86MachObjectWriter : public MCMachObjectTargetWriter {
 public:
   X86MachObjectWriter(bool Is64Bit, uint32_t CPUType,
                       uint32_t CPUSubtype)
-    : MCMachObjectTargetWriter(Is64Bit, CPUType, CPUSubtype) {}
+    : MCMachObjectTargetWriter(Is64Bit, CPUType, CPUSubtype,
+                               /*UseAggressiveSymbolFolding=*/Is64Bit) {}
 };
 
 class X86AsmBackend : public TargetAsmBackend {