diff --git a/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp b/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp --- a/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp +++ b/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp @@ -35,6 +35,7 @@ #include "llvm/Option/ArgList.h" #include "llvm/Option/OptTable.h" #include "llvm/Option/Option.h" +#include "llvm/Remarks/HotnessThresholdParser.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/Errc.h" #include "llvm/Support/FileOutputBuffer.h" @@ -783,8 +784,9 @@ lto::Config Conf; lto::ThinBackend Backend; // TODO: Handle index-only thin-LTO - Backend = - lto::createInProcessThinBackend(llvm::heavyweight_hardware_concurrency()); + StringRef Jobs = Args.getLastArgValue(OPT_jobs, "0"); + Backend = lto::createInProcessThinBackend( + llvm::heavyweight_hardware_concurrency(Jobs)); Conf.CPU = Arch.str(); Conf.Options = codegen::InitTargetOptionsFromCodeGenFlags(Triple); @@ -820,7 +822,18 @@ Conf.PostOptModuleHook = Hook; Conf.CGFileType = Triple.isNVPTX() ? CGFT_AssemblyFile : CGFT_ObjectFile; - // TODO: Handle remark files + Conf.RemarksFilename = (Args.getLastArgValue(OPT_remarks_filename) + "-" + + Triple.getTriple() + "-" + Arch) + .str(); + Conf.RemarksPasses = Args.getLastArgValue(OPT_remarks_passes).str(); + Conf.RemarksWithHotness = Args.hasArg(OPT_remarks_with_hotness); + Conf.RemarksFormat = Args.getLastArgValue(OPT_remarks_format).str(); + auto Threshold = remarks::parseHotnessThresholdOption( + Args.getLastArgValue(OPT_remarks_hotness_threshold, "-1")); + if (!Threshold) + reportError(Threshold.takeError()); + Conf.RemarksHotnessThreshold = *Threshold; + Conf.HasWholeProgramVisibility = Args.hasArg(OPT_whole_program); return std::make_unique(std::move(Conf), Backend); diff --git a/clang/tools/clang-linker-wrapper/LinkerWrapperOpts.td b/clang/tools/clang-linker-wrapper/LinkerWrapperOpts.td --- a/clang/tools/clang-linker-wrapper/LinkerWrapperOpts.td +++ b/clang/tools/clang-linker-wrapper/LinkerWrapperOpts.td @@ -112,6 +112,24 @@ def opt_level : Joined<["--", "-"], "plugin-opt=O">, Flags<[HelpHidden, PluginOnlyOption]>, HelpText<"Optimization level for LTO">; +def jobs : Joined<["--", "-"], "plugin-opt=jobs=">, Flags<[HelpHidden, PluginOnlyOption]>, + HelpText<"Number of jobs for ThinLTO">; + +def remarks_filename : Joined<["--", "-"], "plugin-opt=opt-remarks-filename=">, + Flags<[HelpHidden, PluginOnlyOption]>, HelpText<"YAML output file for optimization remarks">; +def remarks_passes : Joined<["--", "-"], "plugin-opt=opt-remarks-passes=">, + Flags<[HelpHidden, PluginOnlyOption]>, + HelpText<"Regex for the passes that need to be serialized to the output file">; +def remarks_with_hotness : Flag<["--", "-"], "plugin-opt=opt-remarks-with-hotness">, + Flags<[HelpHidden, PluginOnlyOption]>, + HelpText<"Regex for the passes that need to be serialized to the output file">; +def remarks_hotness_threshold : Joined<["--", "-"], "plugin-opt=opt-remarks-hotness-threshold">, + Flags<[HelpHidden, PluginOnlyOption]>, + HelpText<"Minimum profile count to trigger an optimization">; +def remarks_format : Joined<["--", "-"], "plugin-opt=opt-remarks-format=">, + Flags<[HelpHidden, PluginOnlyOption]>, + HelpText<"The format used for serializing remarks (default: YAML)">; + // Sink all the other options here so we can ignore them if needed. def plugin_opt : Separate<["--", "-"], "plugin-opt">, Flags<[HelpHidden, PluginOnlyOption]>, HelpText<"Options passed to the linker plugin">;