summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDuncan Sands <baldrick@free.fr>2011-03-12 13:07:37 +0000
committerDuncan Sands <baldrick@free.fr>2011-03-12 13:07:37 +0000
commitba9934648f1b8f5b1749548963f385f1147c1f68 (patch)
tree2dcd6708c44b08706b4918ee20dff189d03d85bd
parentc5c03f90240e1d2bf9f1579ae14b5dc8f0547c33 (diff)
downloadllvm-ba9934648f1b8f5b1749548963f385f1147c1f68.tar.gz
llvm-ba9934648f1b8f5b1749548963f385f1147c1f68.tar.bz2
llvm-ba9934648f1b8f5b1749548963f385f1147c1f68.tar.xz
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.h8
-rw-r--r--include/llvm/MC/MCSectionELF.h6
-rw-r--r--lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp7
3 files changed, 21 insertions, 0 deletions
diff --git a/include/llvm/MC/MCSection.h b/include/llvm/MC/MCSection.h
index b64a44cdd0..1c01b2f8f3 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 26951725e4..c82de71282 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 68e80e3983..98a1bf2f1c 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);
}