From 72327498aab48086391f57aa8d7aeae3f9991c17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20C=C3=A1rdenas?= Date: Sun, 22 Jun 2025 03:32:24 +0200 Subject: [PATCH 1/4] [clang][nvlink-wrapper] Add support for opt-remarks command line options This patch adds support for optimization record command line options to clang-nvlink-wrapper, fixing an issue where using -fsave-optimization-record with CUDA offloading would fail with "Unknown command line argument 'opt-remarks-format=yaml'". --- .../ClangNVLinkWrapper.cpp | 20 +++++++++++++++---- .../tools/clang-nvlink-wrapper/NVLinkOpts.td | 19 ++++++++++++++++++ 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/clang/tools/clang-nvlink-wrapper/ClangNVLinkWrapper.cpp b/clang/tools/clang-nvlink-wrapper/ClangNVLinkWrapper.cpp index faf73a7c2f193..4e36a04e0286b 100644 --- a/clang/tools/clang-nvlink-wrapper/ClangNVLinkWrapper.cpp +++ b/clang/tools/clang-nvlink-wrapper/ClangNVLinkWrapper.cpp @@ -341,11 +341,23 @@ Expected> createLTO(const ArgList &Args) { Conf.CPU = Args.getLastArgValue(OPT_arch); Conf.Options = codegen::InitTargetOptionsFromCodeGenFlags(Triple); - Conf.RemarksFilename = RemarksFilename; - Conf.RemarksPasses = RemarksPasses; - Conf.RemarksWithHotness = RemarksWithHotness; + if (auto *Arg = Args.getLastArg(OPT_opt_remarks_filename)) + Conf.RemarksFilename = Arg->getValue(); + else + Conf.RemarksFilename = RemarksFilename; + + if (auto *Arg = Args.getLastArg(OPT_opt_remarks_filter)) + Conf.RemarksPasses = Arg->getValue(); + else + Conf.RemarksPasses = RemarksPasses; + + if (auto *Arg = Args.getLastArg(OPT_opt_remarks_format)) + Conf.RemarksFormat = Arg->getValue(); + else + Conf.RemarksFormat = RemarksFormat; + + Conf.RemarksWithHotness = Args.hasArg(OPT_opt_remarks_with_hotness) || RemarksWithHotness; Conf.RemarksHotnessThreshold = RemarksHotnessThreshold; - Conf.RemarksFormat = RemarksFormat; Conf.MAttrs = llvm::codegen::getMAttrs(); std::optional CGOptLevelOrNone = diff --git a/clang/tools/clang-nvlink-wrapper/NVLinkOpts.td b/clang/tools/clang-nvlink-wrapper/NVLinkOpts.td index 6de1a25c14f8b..a0f7dce5bf6b3 100644 --- a/clang/tools/clang-nvlink-wrapper/NVLinkOpts.td +++ b/clang/tools/clang-nvlink-wrapper/NVLinkOpts.td @@ -72,6 +72,25 @@ def : Joined<["--", "-"], "plugin-opt=emit-llvm">, Flags<[WrapperOnlyOption]>, Alias; def : Joined<["--", "-"], "plugin-opt=emit-asm">, Flags<[WrapperOnlyOption]>, Alias; + +def opt_remarks_filename : Separate<["--"], "opt-remarks-filename">, + Flags<[WrapperOnlyOption]>, HelpText<"YAML output file for optimization remarks">; +def opt_remarks_format : Separate<["--"], "opt-remarks-format">, + Flags<[WrapperOnlyOption]>, HelpText<"The format used for serializing remarks (default: YAML)">; +def opt_remarks_filter : Separate<["--"], "opt-remarks-filter">, + Flags<[WrapperOnlyOption]>, HelpText<"Regex for the passes that need to be serialized to the output file">; +def opt_remarks_with_hotness : Flag<["--"], "opt-remarks-with-hotness">, + Flags<[WrapperOnlyOption]>, HelpText<"Include hotness information in the optimization remarks file">; + +def : Joined<["--", "-"], "plugin-opt=opt-remarks-filename=">, + Flags<[WrapperOnlyOption]>, Alias; +def : Joined<["--", "-"], "plugin-opt=opt-remarks-format=">, + Flags<[WrapperOnlyOption]>, Alias; +def : Joined<["--", "-"], "plugin-opt=opt-remarks-filter=">, + Flags<[WrapperOnlyOption]>, Alias; +def : Flag<["--", "-"], "plugin-opt=opt-remarks-with-hotness">, + Flags<[WrapperOnlyOption]>, Alias; + def plugin_opt : Joined<["--", "-"], "plugin-opt=">, Flags<[WrapperOnlyOption]>, HelpText<"Options passed to LLVM, not including the Clang invocation. Use " "'--plugin-opt=--help' for a list of options.">; From a649e2a5f39584140f49aa10d95c9451de66515f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20C=C3=A1rdenas?= Date: Sun, 22 Jun 2025 17:25:08 +0200 Subject: [PATCH 2/4] [clang][nvlink-wrapper] Modified tablegen option definitions Convert alias definitions to proper option definitions for opt-remarks-* options based on suggestions. --- .../clang-nvlink-wrapper/ClangNVLinkWrapper.cpp | 17 +++-------------- clang/tools/clang-nvlink-wrapper/NVLinkOpts.td | 17 ++++------------- 2 files changed, 7 insertions(+), 27 deletions(-) diff --git a/clang/tools/clang-nvlink-wrapper/ClangNVLinkWrapper.cpp b/clang/tools/clang-nvlink-wrapper/ClangNVLinkWrapper.cpp index 4e36a04e0286b..cb17c89765c0a 100644 --- a/clang/tools/clang-nvlink-wrapper/ClangNVLinkWrapper.cpp +++ b/clang/tools/clang-nvlink-wrapper/ClangNVLinkWrapper.cpp @@ -341,20 +341,9 @@ Expected> createLTO(const ArgList &Args) { Conf.CPU = Args.getLastArgValue(OPT_arch); Conf.Options = codegen::InitTargetOptionsFromCodeGenFlags(Triple); - if (auto *Arg = Args.getLastArg(OPT_opt_remarks_filename)) - Conf.RemarksFilename = Arg->getValue(); - else - Conf.RemarksFilename = RemarksFilename; - - if (auto *Arg = Args.getLastArg(OPT_opt_remarks_filter)) - Conf.RemarksPasses = Arg->getValue(); - else - Conf.RemarksPasses = RemarksPasses; - - if (auto *Arg = Args.getLastArg(OPT_opt_remarks_format)) - Conf.RemarksFormat = Arg->getValue(); - else - Conf.RemarksFormat = RemarksFormat; + Conf.RemarksFilename = Args.getLastArgValue(OPT_opt_remarks_filename, RemarksFilename); + Conf.RemarksPasses = Args.getLastArgValue(OPT_opt_remarks_filter, RemarksPasses); + Conf.RemarksFormat = Args.getLastArgValue(OPT_opt_remarks_format, RemarksFormat); Conf.RemarksWithHotness = Args.hasArg(OPT_opt_remarks_with_hotness) || RemarksWithHotness; Conf.RemarksHotnessThreshold = RemarksHotnessThreshold; diff --git a/clang/tools/clang-nvlink-wrapper/NVLinkOpts.td b/clang/tools/clang-nvlink-wrapper/NVLinkOpts.td index a0f7dce5bf6b3..7af35bf5989ec 100644 --- a/clang/tools/clang-nvlink-wrapper/NVLinkOpts.td +++ b/clang/tools/clang-nvlink-wrapper/NVLinkOpts.td @@ -73,24 +73,15 @@ def : Joined<["--", "-"], "plugin-opt=emit-llvm">, def : Joined<["--", "-"], "plugin-opt=emit-asm">, Flags<[WrapperOnlyOption]>, Alias; -def opt_remarks_filename : Separate<["--"], "opt-remarks-filename">, +def opt_remarks_filename : Joined<["--", "-"], "plugin-opt=opt-remarks-filename=">, Flags<[WrapperOnlyOption]>, HelpText<"YAML output file for optimization remarks">; -def opt_remarks_format : Separate<["--"], "opt-remarks-format">, +def opt_remarks_format : Joined<["--", "-"], "plugin-opt=opt-remarks-format=">, Flags<[WrapperOnlyOption]>, HelpText<"The format used for serializing remarks (default: YAML)">; -def opt_remarks_filter : Separate<["--"], "opt-remarks-filter">, +def opt_remarks_filter : Joined<["--", "-"], "plugin-opt=opt-remarks-filter=">, Flags<[WrapperOnlyOption]>, HelpText<"Regex for the passes that need to be serialized to the output file">; -def opt_remarks_with_hotness : Flag<["--"], "opt-remarks-with-hotness">, +def opt_remarks_with_hotness : Flag<["--", "-"], "plugin-opt=opt-remarks-with-hotness">, Flags<[WrapperOnlyOption]>, HelpText<"Include hotness information in the optimization remarks file">; -def : Joined<["--", "-"], "plugin-opt=opt-remarks-filename=">, - Flags<[WrapperOnlyOption]>, Alias; -def : Joined<["--", "-"], "plugin-opt=opt-remarks-format=">, - Flags<[WrapperOnlyOption]>, Alias; -def : Joined<["--", "-"], "plugin-opt=opt-remarks-filter=">, - Flags<[WrapperOnlyOption]>, Alias; -def : Flag<["--", "-"], "plugin-opt=opt-remarks-with-hotness">, - Flags<[WrapperOnlyOption]>, Alias; - def plugin_opt : Joined<["--", "-"], "plugin-opt=">, Flags<[WrapperOnlyOption]>, HelpText<"Options passed to LLVM, not including the Clang invocation. Use " "'--plugin-opt=--help' for a list of options.">; From f61d7a8346d2827a17b8cd1083d9e47c0a6c7105 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20C=C3=A1rdenas?= Date: Sun, 22 Jun 2025 17:25:08 +0200 Subject: [PATCH 3/4] [clang][nvlink-wrapper] Modified tablegen option definitions Convert alias definitions to proper option definitions for opt-remarks-* options based on suggestions. --- .../clang-nvlink-wrapper/ClangNVLinkWrapper.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/clang/tools/clang-nvlink-wrapper/ClangNVLinkWrapper.cpp b/clang/tools/clang-nvlink-wrapper/ClangNVLinkWrapper.cpp index cb17c89765c0a..ee7cca7bb2425 100644 --- a/clang/tools/clang-nvlink-wrapper/ClangNVLinkWrapper.cpp +++ b/clang/tools/clang-nvlink-wrapper/ClangNVLinkWrapper.cpp @@ -341,11 +341,15 @@ Expected> createLTO(const ArgList &Args) { Conf.CPU = Args.getLastArgValue(OPT_arch); Conf.Options = codegen::InitTargetOptionsFromCodeGenFlags(Triple); - Conf.RemarksFilename = Args.getLastArgValue(OPT_opt_remarks_filename, RemarksFilename); - Conf.RemarksPasses = Args.getLastArgValue(OPT_opt_remarks_filter, RemarksPasses); - Conf.RemarksFormat = Args.getLastArgValue(OPT_opt_remarks_format, RemarksFormat); - - Conf.RemarksWithHotness = Args.hasArg(OPT_opt_remarks_with_hotness) || RemarksWithHotness; + Conf.RemarksFilename = + Args.getLastArgValue(OPT_opt_remarks_filename, RemarksFilename); + Conf.RemarksPasses = + Args.getLastArgValue(OPT_opt_remarks_filter, RemarksPasses); + Conf.RemarksFormat = + Args.getLastArgValue(OPT_opt_remarks_format, RemarksFormat); + + Conf.RemarksWithHotness = + Args.hasArg(OPT_opt_remarks_with_hotness) || RemarksWithHotness; Conf.RemarksHotnessThreshold = RemarksHotnessThreshold; Conf.MAttrs = llvm::codegen::getMAttrs(); From 9e896a559424c04c482f9f57d5967906e77cdda3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20C=C3=A1rdenas?= Date: Mon, 23 Jun 2025 19:05:51 +0200 Subject: [PATCH 4/4] Format ClangNVLinkWrapper.cpp to pass code formatting checks --- clang/tools/clang-nvlink-wrapper/ClangNVLinkWrapper.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/tools/clang-nvlink-wrapper/ClangNVLinkWrapper.cpp b/clang/tools/clang-nvlink-wrapper/ClangNVLinkWrapper.cpp index ee7cca7bb2425..4b63971214f81 100644 --- a/clang/tools/clang-nvlink-wrapper/ClangNVLinkWrapper.cpp +++ b/clang/tools/clang-nvlink-wrapper/ClangNVLinkWrapper.cpp @@ -348,7 +348,7 @@ Expected> createLTO(const ArgList &Args) { Conf.RemarksFormat = Args.getLastArgValue(OPT_opt_remarks_format, RemarksFormat); - Conf.RemarksWithHotness = + Conf.RemarksWithHotness = Args.hasArg(OPT_opt_remarks_with_hotness) || RemarksWithHotness; Conf.RemarksHotnessThreshold = RemarksHotnessThreshold;