[llvm-commits] [llvm] r127540 - in /llvm/trunk: include/llvm/MC/MCSection.h include/llvm/MC/MCSectionELF.h lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp

Jan Sjodin jan_sjodin at yahoo.com
Thu Mar 17 12:57:29 PDT 2011


I have been investigating this failure for the past couple of days. There is 
something wrong with the linker on the test machine. If i take the generated asm 
file (.s) and assemble and link on my own machine it works fine. If i assemble 
on the test machine and link on my machine it works fine, but if I link on the 
test machine the ELF format becomes corrupted somehow. This shows up e.g. with 
readelf -a, where the object file is okay, but the binary does not list the 
symbol table (it is there and can be listed with  readelf -s) The patch should 
be good otherwise, the object file is smaller with the patch than without.

- Jan




________________________________
From: Duncan Sands <baldrick at free.fr>
To: llvm-commits at cs.uiuc.edu
Sent: Sat, March 12, 2011 8:07:37 AM
Subject: [llvm-commits] [llvm] r127540 - in /llvm/trunk: 
include/llvm/MC/MCSection.h include/llvm/MC/MCSectionELF.h 
lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp

Author: baldrick
Date: Sat Mar 12 07:07:37 2011
New Revision: 127540

URL: http://llvm.org/viewvc/llvm-project?rev=127540&view=rev
Log:
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.

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

Modified: llvm/trunk/include/llvm/MC/MCSection.h
URL: 
http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCSection.h?rev=127540&r1=127539&r2=127540&view=diff

==============================================================================
--- llvm/trunk/include/llvm/MC/MCSection.h (original)
+++ llvm/trunk/include/llvm/MC/MCSection.h Sat Mar 12 07:07:37 2011
@@ -52,6 +52,14 @@
     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;

Modified: llvm/trunk/include/llvm/MC/MCSectionELF.h
URL: 
http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCSectionELF.h?rev=127540&r1=127539&r2=127540&view=diff

==============================================================================
--- llvm/trunk/include/llvm/MC/MCSectionELF.h (original)
+++ llvm/trunk/include/llvm/MC/MCSectionELF.h Sat Mar 12 07:07:37 2011
@@ -66,6 +66,12 @@
   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;
   }

Modified: llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp
URL: 
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp?rev=127540&r1=127539&r2=127540&view=diff

==============================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp (original)
+++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp Sat Mar 12 07:07:37 
2011
@@ -191,6 +191,13 @@
   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);
}


_______________________________________________
llvm-commits mailing list
llvm-commits at cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20110317/c779b8f3/attachment.html>


More information about the llvm-commits mailing list