Speculatively revert commit 127478 (jsjodin) in an attempt to fix the
authorDuncan Sands <baldrick@free.fr>
Sat, 12 Mar 2011 13:07:37 +0000 (13:07 +0000)
committerDuncan Sands <baldrick@free.fr>
Sat, 12 Mar 2011 13:07:37 +0000 (13:07 +0000)
llvm-gcc-i386-linux-selfhost and llvm-x86_64-linux-checks buildbots.
The original log entry:
Remove optimization emitting a reference insted of label difference, since
it can create more relocations. Removed isBaseAddressKnownZero method,
because it is no longer used.

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

include/llvm/MC/MCSection.h
include/llvm/MC/MCSectionELF.h
lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp

index b64a44cdd0a104b3e10b7cdf84e957a15a23c6d6..1c01b2f8f3cc659aa455e80733d62ac7b7be3adf 100644 (file)
@@ -52,6 +52,14 @@ namespace llvm {
     virtual void PrintSwitchToSection(const MCAsmInfo &MAI,
                                       raw_ostream &OS) const = 0;
 
+    /// isBaseAddressKnownZero - Return true if we know that this section will
+    /// get a base address of zero.  In cases where we know that this is true we
+    /// can emit section offsets as direct references to avoid a subtraction
+    /// from the base of the section, saving a relocation.
+    virtual bool isBaseAddressKnownZero() const {
+      return false;
+    }
+
     // UseCodeAlign - Return true if a .align directive should use
     // "optimized nops" to fill instead of 0s.
     virtual bool UseCodeAlign() const = 0;
index 26951725e497912ed173fbd4bd52cc0e7d32ba2b..c82de71282028d7eeeb43c575e15b98726590cc9 100644 (file)
@@ -66,6 +66,12 @@ public:
   virtual bool UseCodeAlign() const;
   virtual bool isVirtualSection() const;
 
+  /// isBaseAddressKnownZero - We know that non-allocatable sections (like
+  /// debug info) have a base of zero.
+  virtual bool isBaseAddressKnownZero() const {
+    return (getFlags() & ELF::SHF_ALLOC) == 0;
+  }
+
   static bool classof(const MCSection *S) {
     return S->getVariant() == SV_ELF;
   }
index 68e80e3983a4e5a60c265c0b65b4f17070380234..98a1bf2f1ce4f8218a52c7b460acbfdc57b6b64b 100644 (file)
@@ -191,6 +191,13 @@ void AsmPrinter::EmitSectionOffset(const MCSymbol *Label,
   assert((!Label->isInSection() || &Label->getSection() == &Section) &&
          "Section offset using wrong section base for label");
   
+  // If the section in question will end up with an address of 0 anyway, we can
+  // just emit an absolute reference to save a relocation.
+  if (Section.isBaseAddressKnownZero()) {
+    OutStreamer.EmitSymbolValue(Label, 4, 0/*AddrSpace*/);
+    return;
+  }
+  
   // Otherwise, emit it as a label difference from the start of the section.
   EmitLabelDifference(Label, SectionLabel, 4);
 }