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(); Index: MinGW/Options.td =================================================================== --- MinGW/Options.td +++ MinGW/Options.td @@ -11,6 +11,8 @@ 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<"">, HelpText<"Root name of library to use">; @@ -19,6 +21,7 @@ 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<"">, 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