diff options
author | Duncan Sands <baldrick@free.fr> | 2011-03-12 13:07:37 +0000 |
---|---|---|
committer | Duncan Sands <baldrick@free.fr> | 2011-03-12 13:07:37 +0000 |
commit | ba9934648f1b8f5b1749548963f385f1147c1f68 (patch) | |
tree | 2dcd6708c44b08706b4918ee20dff189d03d85bd | |
parent | c5c03f90240e1d2bf9f1579ae14b5dc8f0547c33 (diff) | |
download | external_llvm-ba9934648f1b8f5b1749548963f385f1147c1f68.zip external_llvm-ba9934648f1b8f5b1749548963f385f1147c1f68.tar.gz external_llvm-ba9934648f1b8f5b1749548963f385f1147c1f68.tar.bz2 |
Speculatively revert commit 127478 (jsjodin) in an attempt to fix the
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
-rw-r--r-- | include/llvm/MC/MCSection.h | 8 | ||||
-rw-r--r-- | include/llvm/MC/MCSectionELF.h | 6 | ||||
-rw-r--r-- | lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp | 7 |
3 files changed, 21 insertions, 0 deletions
diff --git a/include/llvm/MC/MCSection.h b/include/llvm/MC/MCSection.h index b64a44c..1c01b2f 100644 --- a/include/llvm/MC/MCSection.h +++ b/include/llvm/MC/MCSection.h @@ -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; diff --git a/include/llvm/MC/MCSectionELF.h b/include/llvm/MC/MCSectionELF.h index 2695172..c82de71 100644 --- a/include/llvm/MC/MCSectionELF.h +++ b/include/llvm/MC/MCSectionELF.h @@ -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; } diff --git a/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp b/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp index 68e80e3..98a1bf2 100644 --- a/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp +++ b/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp @@ -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); } |