Index: include/clang/Driver/Options.td =================================================================== --- include/clang/Driver/Options.td +++ include/clang/Driver/Options.td @@ -1762,6 +1762,7 @@ def gcolumn_info : Flag<["-"], "gcolumn-info">, Group, Flags<[CoreOption]>; def gno_column_info : Flag<["-"], "gno-column-info">, Group, Flags<[CoreOption]>; def gsplit_dwarf : Flag<["-"], "gsplit-dwarf">, Group; +def gsplit_dwarf_EQ : Joined<["-"], "gsplit-dwarf=">, Group; def ggnu_pubnames : Flag<["-"], "ggnu-pubnames">, Group, Flags<[CC1Option]>; def gdwarf_aranges : Flag<["-"], "gdwarf-aranges">, Group; def gmodules : Flag <["-"], "gmodules">, Group, Index: lib/Driver/ToolChains/CommonArgs.cpp =================================================================== --- lib/Driver/ToolChains/CommonArgs.cpp +++ lib/Driver/ToolChains/CommonArgs.cpp @@ -417,6 +417,27 @@ if (IsThinLTO) CmdArgs.push_back("-plugin-opt=thinlto"); + if (Arg *A = Args.getLastArg(options::OPT_gsplit_dwarf_EQ)) { + const char *Objcopy = + Args.MakeArgString(ToolChain.GetProgramPath(CLANG_DEFAULT_OBJCOPY)); + CmdArgs.push_back( + Args.MakeArgString(Twine("-plugin-opt=objcopy=") + Objcopy)); + StringRef DWO_Dir = A->getValue(); + CmdArgs.push_back( + Args.MakeArgString(Twine("-plugin-opt=dwo_dir=") + DWO_Dir)); + } + + if (Args.hasArg(options::OPT_gsplit_dwarf)) { + if (!Args.getLastArg(options::OPT_gsplit_dwarf_EQ)) { + const char *Objcopy = + Args.MakeArgString(ToolChain.GetProgramPath(CLANG_DEFAULT_OBJCOPY)); + CmdArgs.push_back( + Args.MakeArgString(Twine("-plugin-opt=objcopy=") + Objcopy)); + CmdArgs.push_back( + Args.MakeArgString(Twine("-plugin-opt=dwo_dir=."))); + } + } + if (unsigned Parallelism = getLTOParallelism(Args, ToolChain.getDriver())) CmdArgs.push_back( Args.MakeArgString("-plugin-opt=jobs=" + Twine(Parallelism))); Index: test/Driver/lto-dwo.c =================================================================== --- /dev/null +++ test/Driver/lto-dwo.c @@ -0,0 +1,16 @@ +// Confirm that -gsplit-dwarf=DIR is passed to linker + +// RUN: %clang -target x86_64-unknown-linux -### %s -flto=thin -gsplit-dwarf=DIR 2> %t +// RUN: FileCheck -check-prefix=CHECK-LINK-DWO-DIR < %t %s +// RUN: FileCheck -check-prefix=CHECK-LINK-OBJCOPY < %t %s +// +// CHECK-LINK-DWO-DIR: "-plugin-opt=dwo_dir=DIR" +// CHECK-LINK-OBJCOPY: "-plugin-opt=objcopy={{.*}}objcopy" +// + +// RUN: %clang -target x86_64-unknown-linux -### %s -flto=thin -gsplit-dwarf 2> %t +// RUN: FileCheck -check-prefix=CHECK-LINK-DWO-DIR-DEFAULT < %t %s +// RUN: FileCheck -check-prefix=CHECK-LINK-OBJCOPY-DEFAULT < %t %s +// +// CHECK-LINK-DWO-DIR-DEFAULT: "-plugin-opt=dwo_dir=." +// CHECK-LINK-OBJCOPY-DEFAULT: "-plugin-opt=objcopy={{.*}}objcopy"