[PATCH] D40019: [LLD] [MinGW] Implement the --[no-]gc-sections and --icf options

Martin Storsjö via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 14 03:42:26 PST 2017


mstorsjo created this revision.

GNU ld doesn't seem to support --icf at all, but this was suggested in https://reviews.llvm.org/D39885, and GNU gold seems to support it.


https://reviews.llvm.org/D40019

Files:
  MinGW/Driver.cpp
  MinGW/Options.td
  test/MinGW/driver.test


Index: test/MinGW/driver.test
===================================================================
--- test/MinGW/driver.test
+++ test/MinGW/driver.test
@@ -110,3 +110,18 @@
 
 RUN: ld.lld -### -m i386pep foo.o --image-base 0x1230000 | FileCheck -check-prefix IMAGE-BASE %s
 IMAGE-BASE: -base:0x1230000
+
+RUN: ld.lld -### -m i386pep foo.o | FileCheck -check-prefix NO-GC-SECTIONS %s
+RUN: ld.lld -### -m i386pep foo.o --gc-sections --no-gc-sections | FileCheck -check-prefix NO-GC-SECTIONS %s
+NO-GC-SECTIONS: -opt:noref
+
+RUN: ld.lld -### -m i386pep foo.o --gc-sections | FileCheck -check-prefix GC-SECTIONS %s
+GC-SECTIONS: -opt:ref
+
+RUN: ld.lld -### -m i386pep foo.o | FileCheck -check-prefix ICF-NONE %s
+RUN: ld.lld -### -m i386pep foo.o --icf=none | FileCheck -check-prefix ICF-NONE %s
+ICF-NONE: -opt:noicf
+
+RUN: ld.lld -### -m i386pep foo.o --icf=all | FileCheck -check-prefix ICF %s
+RUN: ld.lld -### -m i386pep foo.o --icf=safe | FileCheck -check-prefix ICF %s
+ICF: -opt:icf
Index: MinGW/Options.td
===================================================================
--- MinGW/Options.td
+++ MinGW/Options.td
@@ -11,14 +11,17 @@
   HelpText<"Name of entry point symbol">;
 def export_all_symbols: F<"export-all-symbols">,
     HelpText<"Export all symbols even if a def file or dllexport attributes are used">;
+def gc_sections: F<"gc-sections">, HelpText<"Remove unused sections">;
+def icf: J<"icf=">, HelpText<"Identical code folding">;
 def image_base: S<"image-base">, HelpText<"Base address of the program">;
 def l: JoinedOrSeparate<["-"], "l">, MetaVarName<"<libName>">,
   HelpText<"Root name of library to use">;
 def m: JoinedOrSeparate<["-"], "m">, HelpText<"Set target emulation">;
 def no_whole_archive: F<"no-whole-archive">,
     HelpText<"No longer include all object files for following archives">;
 def large_address_aware: Flag<["--"], "large-address-aware">,
     HelpText<"Enable large addresses">;
+def no_gc_sections: F<"no-gc-sections">, HelpText<"Don't remove unused sections">;
 def nxcompat: Flag<["--"], "nxcompat">,
     HelpText<"Enable data execution prevention">;
 def o: JoinedOrSeparate<["-"], "o">, MetaVarName<"<path>">,
Index: MinGW/Driver.cpp
===================================================================
--- MinGW/Driver.cpp
+++ MinGW/Driver.cpp
@@ -170,6 +170,20 @@
     Add("-tsaware");
   else
     Add("-tsaware:no");
+  if (auto *A = Args.getLastArg(OPT_gc_sections, OPT_no_gc_sections))
+    Add(A->getOption().getID() == OPT_gc_sections ? "-opt:ref" : "-opt:noref");
+  else
+    Add("-opt:noref");
+
+  if (auto *A = Args.getLastArg(OPT_icf)) {
+    StringRef S = A->getValue();
+    if (S == "none")
+      Add("-opt:noicf");
+    else
+      Add("-opt:icf");
+  } else {
+    Add("-opt:noicf");
+  }
 
   if (auto *A = Args.getLastArg(OPT_m)) {
     StringRef S = A->getValue();


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D40019.122818.patch
Type: text/x-patch
Size: 2851 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20171114/820cdc42/attachment.bin>


More information about the llvm-commits mailing list