[lld] r332149 - COFF: Add a flag for disabling string tail merging.

Peter Collingbourne via llvm-commits llvm-commits at lists.llvm.org
Fri May 11 15:21:36 PDT 2018


Author: pcc
Date: Fri May 11 15:21:36 2018
New Revision: 332149

URL: http://llvm.org/viewvc/llvm-project?rev=332149&view=rev
Log:
COFF: Add a flag for disabling string tail merging.

We discovered (crbug.com/838449#c24) that string tail merging can
negatively affect compressed binary size, so provide a flag to turn
it off for users who care more about compressed size than uncompressed
size.

Differential Revision: https://reviews.llvm.org/D46780

Modified:
    lld/trunk/COFF/Config.h
    lld/trunk/COFF/Driver.cpp
    lld/trunk/COFF/InputFiles.cpp
    lld/trunk/test/COFF/string-tail-merge.s

Modified: lld/trunk/COFF/Config.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Config.h?rev=332149&r1=332148&r2=332149&view=diff
==============================================================================
--- lld/trunk/COFF/Config.h (original)
+++ lld/trunk/COFF/Config.h Fri May 11 15:21:36 2018
@@ -92,6 +92,7 @@ struct Configuration {
   std::string ImportName;
   bool DoGC = true;
   bool DoICF = true;
+  bool TailMerge;
   bool Relocatable = true;
   bool Force = false;
   bool Debug = false;

Modified: lld/trunk/COFF/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Driver.cpp?rev=332149&r1=332148&r2=332149&view=diff
==============================================================================
--- lld/trunk/COFF/Driver.cpp (original)
+++ lld/trunk/COFF/Driver.cpp Fri May 11 15:21:36 2018
@@ -1049,6 +1049,7 @@ void LinkerDriver::link(ArrayRef<const c
   bool DoGC = !Args.hasArg(OPT_debug) || Args.hasArg(OPT_profile);
   unsigned ICFLevel =
       Args.hasArg(OPT_profile) ? 0 : 1; // 0: off, 1: limited, 2: on
+  unsigned TailMerge = 1;
   for (auto *Arg : Args.filtered(OPT_opt)) {
     std::string Str = StringRef(Arg->getValue()).lower();
     SmallVector<StringRef, 1> Vec;
@@ -1062,6 +1063,10 @@ void LinkerDriver::link(ArrayRef<const c
         ICFLevel = 2;
       } else if (S == "noicf") {
         ICFLevel = 0;
+      } else if (S == "lldtailmerge") {
+        TailMerge = 2;
+      } else if (S == "nolldtailmerge") {
+        TailMerge = 0;
       } else if (S.startswith("lldlto=")) {
         StringRef OptLevel = S.substr(7);
         if (OptLevel.getAsInteger(10, Config->LTOOptLevel) ||
@@ -1090,6 +1095,7 @@ void LinkerDriver::link(ArrayRef<const c
     ICFLevel = 0;
   Config->DoGC = DoGC;
   Config->DoICF = ICFLevel > 0;
+  Config->TailMerge = (TailMerge == 1 && Config->DoICF) || TailMerge == 2;
 
   // Handle /lldsavetemps
   if (Args.hasArg(OPT_lldsavetemps))

Modified: lld/trunk/COFF/InputFiles.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/InputFiles.cpp?rev=332149&r1=332148&r2=332149&view=diff
==============================================================================
--- lld/trunk/COFF/InputFiles.cpp (original)
+++ lld/trunk/COFF/InputFiles.cpp Fri May 11 15:21:36 2018
@@ -190,8 +190,8 @@ SectionChunk *ObjFile::readSection(uint3
     GuardLJmpChunks.push_back(C);
   else if (Name == ".sxdata")
     SXDataChunks.push_back(C);
-  else if (Config->DoICF && Sec->NumberOfRelocations == 0 && Name == ".rdata" &&
-           LeaderName.startswith("??_C@"))
+  else if (Config->TailMerge && Sec->NumberOfRelocations == 0 &&
+           Name == ".rdata" && LeaderName.startswith("??_C@"))
     // COFF sections that look like string literal sections (i.e. no
     // relocations, in .rdata, leader symbol name matches the MSVC name mangling
     // for string literals) are subject to string tail merging.

Modified: lld/trunk/test/COFF/string-tail-merge.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/string-tail-merge.s?rev=332149&r1=332148&r2=332149&view=diff
==============================================================================
--- lld/trunk/test/COFF/string-tail-merge.s (original)
+++ lld/trunk/test/COFF/string-tail-merge.s Fri May 11 15:21:36 2018
@@ -2,20 +2,31 @@
 # RUN: llvm-mc -triple=x86_64-windows-msvc -filetype=obj -o %t.obj %s
 # RUN: lld-link %t.obj /out:%t.exe /entry:main /subsystem:console
 # RUN: llvm-objdump -s %t.exe | FileCheck %s
+# RUN: lld-link %t.obj /out:%t.exe /entry:main /subsystem:console /opt:noicf /opt:lldtailmerge
+# RUN: llvm-objdump -s %t.exe | FileCheck %s
+# RUN: lld-link %t.obj /out:%t.exe /entry:main /subsystem:console /opt:noicf
+# RUN: llvm-objdump -s %t.exe | FileCheck --check-prefix=NOSTM %s
+# RUN: lld-link %t.obj /out:%t.exe /entry:main /subsystem:console /opt:nolldtailmerge
+# RUN: llvm-objdump -s %t.exe | FileCheck --check-prefix=NOSTM %s
 
 # CHECK: Contents of section .text:
+# NOSTM: Contents of section .text:
 .globl main
 main:
 # CHECK-NEXT: 140001000 11200040 01000000 17200040 01000000
+# NOSTM-NEXT: 140001000 00200040 01000000 0c200040 01000000
 .8byte "??_C at _0M@LACCCNMM at hello?5world?$AA@"
 .8byte "??_C at _05MCBCHHEJ@world?$AA@"
 # CHECK-NEXT: 140001010 2a200040 01000000 36200040 01000000
+# NOSTM-NEXT: 140001010 12200040 01000000 2a200040 01000000
 .8byte "??_C at _1BI@HHJHKLLN@?$AAh?$AAe?$AAl?$AAl?$AAo?$AA?5?$AAw?$AAo?$AAr?$AAl?$AAd?$AA?$AA@"
 .8byte "??_C at _1M@NBBDDHIO@?$AAw?$AAo?$AAr?$AAl?$AAd?$AA?$AA@"
 # CHECK-NEXT: 140001020 00200040 01000000 0c200040 01000000
+# NOSTM-NEXT: 140001020 36200040 01000000 42200040 01000000
 .8byte "??_D at not_a_string_literal"
 .8byte "??_C at string_literal_with_relocs"
 # CHECK-NEXT: 140001030 00300040 01000000 1e200040 01000000
+# NOSTM-NEXT: 140001030 00300040 01000000 48200040 01000000
 .8byte "??_C at string_literal_in_wrong_section"
 .8byte "??_C at overaligned_string_literal"
 
@@ -26,6 +37,13 @@ main:
 # CHECK-NEXT:  140002030 6c006f00 20007700 6f007200 6c006400  l.o. .w.o.r.l.d.
 # CHECK-NEXT:  140002040 0000                                 ..
 
+# NOSTM: Contents of section .rdata:
+# NOSTM-NEXT:  140002000 68656c6c 6f20776f 726c6400 776f726c  hello world.worl
+# NOSTM-NEXT:  140002010 64006800 65006c00 6c006f00 20007700  d.h.e.l.l.o. .w.
+# NOSTM-NEXT:  140002020 6f007200 6c006400 00007700 6f007200  o.r.l.d...w.o.r.
+# NOSTM-NEXT:  140002030 6c006400 00006865 6c6c6f20 776f726c  l.d...hello worl
+# NOSTM-NEXT:  140002040 64006f82 6ca40000 68656c6c 6f20776f  d.o.l...hello wo
+# NOSTM-NEXT:  140002050 726c6400                             rld.
 
 .section .rdata,"dr",discard,"??_C at _0M@LACCCNMM at hello?5world?$AA@"
 .globl "??_C at _0M@LACCCNMM at hello?5world?$AA@"




More information about the llvm-commits mailing list