Index: MinGW/Driver.cpp =================================================================== --- MinGW/Driver.cpp +++ MinGW/Driver.cpp @@ -175,6 +175,21 @@ else Add("-highentropyva:no"); + if (Args.hasFlag(OPT_gc_sections, OPT_no_gc_sections, false)) + Add("-opt:ref"); + else + Add("-opt:noref"); + + if (auto *A = Args.getLastArg(OPT_icf)) { + StringRef S = A->getValue(); + if (S == "all") + Add("-opt:icf"); + else + Add("-opt:noicf"); + } else { + Add("-opt:noicf"); + } + if (auto *A = Args.getLastArg(OPT_m)) { StringRef S = A->getValue(); if (S == "i386pe") Index: MinGW/Options.td =================================================================== --- MinGW/Options.td +++ MinGW/Options.td @@ -11,7 +11,9 @@ 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 high_entropy_va: F<"high-entropy-va">, HelpText<"Enable 64-bit ASLR">; +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">; @@ -20,6 +22,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: F<"nxcompat">, HelpText<"Enable data execution prevention">; def o: JoinedOrSeparate<["-"], "o">, MetaVarName<"">, HelpText<"Path to file to write output">; Index: test/MinGW/driver.test =================================================================== --- test/MinGW/driver.test +++ test/MinGW/driver.test @@ -118,3 +118,22 @@ RUN: ld.lld -### -m i386pep foo.o --image-base 0x1230000 | FileCheck -check-prefix IMAGE-BASE %s 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 +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 +RUN: ld.lld -### -m i386pep foo.o -icf=none | FileCheck -check-prefix ICF-NONE %s +RUN: ld.lld -### -m i386pep foo.o --icf=safe | FileCheck -check-prefix ICF-NONE %s +RUN: ld.lld -### -m i386pep foo.o -icf=safe | 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=all | FileCheck -check-prefix ICF %s +ICF: -opt:icf