<div dir="ltr">Anyone want to test how fast this is to touch a single cc file, relink, rerun all the clang+llvm tests using this option (preferrably on an SSD)?<br><br>Be interesting to know if the increased code size slows down the test execution enough to wash out the benefit of the improved link time (as is the case with a shared library build - but of course there the overhead (loading the shared libraries) is greater)</div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Apr 29, 2016 at 9:12 AM, Rui Ueyama via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: ruiu<br>
Date: Fri Apr 29 11:12:29 2016<br>
New Revision: 268056<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=268056&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=268056&view=rev</a><br>
Log:<br>
ELF: Add -O0 (produce output as fast as possible) mode.<br>
<br>
This patch redefines the default optimization level as 1 and adds<br>
new level 0. In the command line, it is -O0. The flag disables<br>
costly but optional features so that the linker produces semantically<br>
correct but larger output quickly. Currently it only disables<br>
section merging.<br>
<br>
This flag is not intended to be used for final production linking.<br>
It is intended to be used in compile-link-test cycle.<br>
<br>
Time to link clang with debug info is about 2x faster with the flag.<br>
<br>
  Head:<br>
  13.24 seconds<br>
  Output size: 1227189664 bytes<br>
<br>
  With this patch:<br>
  7.41 seconds<br>
  Output size: 2490281784 bytes<br>
<br>
Differential Revision: <a href="http://reviews.llvm.org/D19705" rel="noreferrer" target="_blank">http://reviews.llvm.org/D19705</a><br>
<br>
Modified:<br>
    lld/trunk/ELF/Driver.cpp<br>
    lld/trunk/ELF/InputFiles.cpp<br>
    lld/trunk/test/ELF/merge-string.s<br>
<br>
Modified: lld/trunk/ELF/Driver.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Driver.cpp?rev=268056&r1=268055&r2=268056&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Driver.cpp?rev=268056&r1=268055&r2=268056&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/ELF/Driver.cpp (original)<br>
+++ lld/trunk/ELF/Driver.cpp Fri Apr 29 11:12:29 2016<br>
@@ -356,7 +356,7 @@ void LinkerDriver::readConfigs(opt::Inpu<br>
   Config->SoName = getString(Args, OPT_soname);<br>
   Config->Sysroot = getString(Args, OPT_sysroot);<br>
<br>
-  Config->Optimize = getInteger(Args, OPT_O, 0);<br>
+  Config->Optimize = getInteger(Args, OPT_O, 1);<br>
   Config->LtoO = getInteger(Args, OPT_lto_O, 2);<br>
   if (Config->LtoO > 3)<br>
     error("invalid optimization level for LTO: " + getString(Args, OPT_lto_O));<br>
<br>
Modified: lld/trunk/ELF/InputFiles.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.cpp?rev=268056&r1=268055&r2=268056&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.cpp?rev=268056&r1=268055&r2=268056&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/ELF/InputFiles.cpp (original)<br>
+++ lld/trunk/ELF/InputFiles.cpp Fri Apr 29 11:12:29 2016<br>
@@ -143,6 +143,12 @@ elf::ObjectFile<ELFT>::getShtGroupEntrie<br>
<br>
 template <class ELFT> static bool shouldMerge(const typename ELFT::Shdr &Sec) {<br>
   typedef typename ELFT::uint uintX_t;<br>
+<br>
+  // We don't merge sections if -O0 (default is -O1). This makes sometimes<br>
+  // the linker significantly faster, although the output will be bigger.<br>
+  if (Config->Optimize == 0)<br>
+    return false;<br>
+<br>
   uintX_t Flags = Sec.sh_flags;<br>
   if (!(Flags & SHF_MERGE))<br>
     return false;<br>
<br>
Modified: lld/trunk/test/ELF/merge-string.s<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/merge-string.s?rev=268056&r1=268055&r2=268056&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/merge-string.s?rev=268056&r1=268055&r2=268056&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/test/ELF/merge-string.s (original)<br>
+++ lld/trunk/test/ELF/merge-string.s Fri Apr 29 11:12:29 2016<br>
@@ -4,6 +4,8 @@<br>
 // RUN: llvm-readobj -s -section-data -t %t.so | FileCheck %s<br>
 // RUN: ld.lld -O1 %t.o -o %t.so -shared<br>
 // RUN: llvm-readobj -s -section-data -t %t.so | FileCheck --check-prefix=NOTAIL %s<br>
+// RUN: ld.lld -O0 %t.o -o %t.so -shared<br>
+// RUN: llvm-readobj -s -section-data -t %t.so | FileCheck --check-prefix=NOMERGE %s<br>
<br>
         .section       .rodata.str1.1,"aMS",@progbits,1<br>
        .asciz  "abc"<br>
@@ -55,6 +57,24 @@ zed:<br>
 // NOTAIL-NEXT:   0000: 61626300 626300                     |abc.bc.|<br>
 // NOTAIL-NEXT: )<br>
<br>
+// NOMERGE:      Name:    .rodata<br>
+// NOMERGE-NEXT: Type:    SHT_PROGBITS<br>
+// NOMERGE-NEXT: Flags [<br>
+// NOMERGE-NEXT:   SHF_ALLOC<br>
+// NOMERGE-NEXT:   SHF_MERGE<br>
+// NOMERGE-NEXT:   SHF_STRINGS<br>
+// NOMERGE-NEXT: ]<br>
+// NOMERGE-NEXT: Address:         0x1C8<br>
+// NOMERGE-NEXT: Offset:  0x1C8<br>
+// NOMERGE-NEXT: Size:    16<br>
+// NOMERGE-NEXT: Link: 0<br>
+// NOMERGE-NEXT: Info: 0<br>
+// NOMERGE-NEXT: AddressAlignment: 2<br>
+// NOMERGE-NEXT: EntrySize: 0<br>
+// NOMERGE-NEXT: SectionData (<br>
+// NOMERGE-NEXT:   0000: 61626300 61626300 62630000 14000000  |abc.abc.bc......|<br>
+// NOMERGE-NEXT: )<br>
+<br>
 // CHECK:      Name: .rodata<br>
 // CHECK-NEXT: Type: SHT_PROGBITS<br>
 // CHECK-NEXT: Flags [<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>