## Problem When using `-fsave-optimization-record` with offloading, the Clang driver passes optimization record options like `-plugin-opt=opt-remarks-format=yaml` to `clang-nvlink-wrapper`. However, the wrapper doesn't recognize these options, causing compilation to fail. ## Solution This patch adds support for the standard optimization record command line options to `clang-nvlink-wrapper`, matching the interface provided by LLD and gold-plugin as documented in the [LLVM Remarks documentation](https://llvm.org/docs/Remarks.html). ## Changes - **NVLinkOpts.td**: Added definitions for `opt-remarks-filename`, `opt-remarks-format`, `opt-remarks-filter`, and `opt-remarks-with-hotness` options - **NVLinkOpts.td**: Added `plugin-opt=` aliases for these options to match what the Clang driver sends - **ClangNVLinkWrapper.cpp**: Updated `createLTO()` to use command line arguments when available, falling back to existing global variables ## Testing The fix allows `-fsave-optimization-record` to work correctly with offloading, generating optimization records during the LTO phase without throwing unknown argument errors. This change maintains backward compatibility and follows the existing pattern used by other LLVM linkers.
115 lines
5.4 KiB
TableGen
115 lines
5.4 KiB
TableGen
// We try to create options similar to lld's. That way, options passed to clang
|
|
// -Xoffload-linker can be the same whether offloading to nvptx or amdgpu.
|
|
|
|
include "llvm/Option/OptParser.td"
|
|
|
|
def WrapperOnlyOption : OptionFlag;
|
|
|
|
def help : Flag<["-", "--"], "help">,
|
|
HelpText<"Display available options (--help-hidden for more)">;
|
|
|
|
def help_hidden : Flag<["-", "--"], "help-hidden">,
|
|
HelpText<"Display all available options">;
|
|
|
|
def verbose : Flag<["-"], "v">, HelpText<"Print verbose information">;
|
|
def version : Flag<["--"], "version">,
|
|
HelpText<"Display the version number and exit">;
|
|
|
|
def cuda_path_EQ : Joined<["--"], "cuda-path=">, Flags<[WrapperOnlyOption]>,
|
|
MetaVarName<"<dir>">, HelpText<"Set the system CUDA path">;
|
|
def ptxas_path_EQ : Joined<["--"], "ptxas-path=">, Flags<[WrapperOnlyOption]>,
|
|
MetaVarName<"<dir>">, HelpText<"Set the 'ptxas' path">;
|
|
|
|
def o : JoinedOrSeparate<["-"], "o">, MetaVarName<"<path>">,
|
|
HelpText<"Path to file to write output">;
|
|
def output : Separate<["--"], "output-file">, Alias<o>, Flags<[HelpHidden]>,
|
|
HelpText<"Alias for -o">;
|
|
|
|
def library_path : JoinedOrSeparate<["-"], "L">, MetaVarName<"<dir>">,
|
|
HelpText<"Add <dir> to the library search path">;
|
|
def library_path_S : Separate<["--", "-"], "library-path">, Flags<[HelpHidden]>,
|
|
Alias<library_path>;
|
|
def library_path_EQ : Joined<["--", "-"], "library-path=">, Flags<[HelpHidden]>,
|
|
Alias<library_path>;
|
|
|
|
def library : JoinedOrSeparate<["-"], "l">, MetaVarName<"<libname>">,
|
|
HelpText<"Search for library <libname>">;
|
|
def library_S : Separate<["--", "-"], "library">, Flags<[HelpHidden]>,
|
|
Alias<library_path>;
|
|
def library_EQ : Joined<["--", "-"], "library=">, Flags<[HelpHidden]>,
|
|
Alias<library_path>;
|
|
|
|
def plugin : JoinedOrSeparate<["--", "-"], "plugin">,
|
|
Flags<[HelpHidden, WrapperOnlyOption]>;
|
|
|
|
def arch : Separate<["--", "-"], "arch">,
|
|
HelpText<"Specify the 'sm_' name of the target architecture">;
|
|
def : Joined<["--", "-"], "plugin-opt=mcpu=">,
|
|
Flags<[HelpHidden, WrapperOnlyOption]>, Alias<arch>;
|
|
|
|
def g : Flag<["-"], "g">, HelpText<"Specify that this was a debug compile">;
|
|
def debug : Flag<["--"], "debug">, Alias<g>;
|
|
|
|
def lto_emit_llvm : Flag<["--"], "lto-emit-llvm">, Flags<[WrapperOnlyOption]>,
|
|
HelpText<"Emit LLVM-IR bitcode">;
|
|
def lto_emit_asm : Flag<["--"], "lto-emit-asm">, Flags<[WrapperOnlyOption]>,
|
|
HelpText<"Emit assembly code">;
|
|
|
|
def u : JoinedOrSeparate<["-"], "u">, HelpText<"Force undefined symbol during linking">;
|
|
def undefined : JoinedOrSeparate<["--"], "undefined">, Alias<u>;
|
|
|
|
def O : Joined<["--", "-"], "plugin-opt=O">,
|
|
Flags<[WrapperOnlyOption]>, MetaVarName<"<O0, O1, O2, or O3>">,
|
|
HelpText<"Optimization level for LTO">;
|
|
|
|
def thinlto : Joined<["--", "-"], "plugin-opt=thinlto">,
|
|
Flags<[WrapperOnlyOption]>, HelpText<"Enable the thin-lto backend">;
|
|
def lto_partitions : Joined<["--", "-"], "plugin-opt=lto-partitions=">,
|
|
Flags<[WrapperOnlyOption]>, HelpText<"Number of LTO codegen partitions">;
|
|
def jobs : Joined<["--", "-"], "plugin-opt=jobs=">,
|
|
Flags<[WrapperOnlyOption]>, HelpText<"Number of LTO codegen partitions">;
|
|
def : Joined<["--", "-"], "plugin-opt=emit-llvm">,
|
|
Flags<[WrapperOnlyOption]>, Alias<lto_emit_llvm>;
|
|
def : Joined<["--", "-"], "plugin-opt=emit-asm">,
|
|
Flags<[WrapperOnlyOption]>, Alias<lto_emit_asm>;
|
|
|
|
def opt_remarks_filename : Joined<["--", "-"], "plugin-opt=opt-remarks-filename=">,
|
|
Flags<[WrapperOnlyOption]>, HelpText<"YAML output file for optimization remarks">;
|
|
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 : 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<["--", "-"], "plugin-opt=opt-remarks-with-hotness">,
|
|
Flags<[WrapperOnlyOption]>, HelpText<"Include hotness information in the optimization remarks file">;
|
|
|
|
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.">;
|
|
|
|
def lto_newpm_passes : Joined<["--"], "lto-newpm-passes=">,
|
|
Flags<[WrapperOnlyOption]>, HelpText<"Passes to run during LTO">;
|
|
def lto_debug_pass_manager : Flag<["--"], "lto-debug-pass-manager">,
|
|
Flags<[WrapperOnlyOption]>, HelpText<"Debug new pass manager">;
|
|
|
|
def save_temps : Flag<["--", "-"], "save-temps">,
|
|
Flags<[WrapperOnlyOption]>, HelpText<"Save intermediate results">;
|
|
|
|
def relocatable : Flag<["--", "-"], "relocatable">,
|
|
Flags<[WrapperOnlyOption]>, HelpText<"Perform a relocatable link (LTO only)">;
|
|
def r : Flag<["-"], "r">, Flags<[WrapperOnlyOption]>, Alias<relocatable>;
|
|
|
|
def whole_archive : Flag<["--", "-"], "whole-archive">,
|
|
Flags<[WrapperOnlyOption, HelpHidden]>;
|
|
def no_whole_archive : Flag<["--", "-"], "no-whole-archive">,
|
|
Flags<[WrapperOnlyOption, HelpHidden]>;
|
|
|
|
def mllvm : Separate<["-"], "mllvm">, Flags<[WrapperOnlyOption]>,
|
|
MetaVarName<"<arg>">,
|
|
HelpText<"Arguments passed to LLVM, including Clang invocations, for which "
|
|
"the '-mllvm' prefix is preserved. Use '-mllvm --help' for a list "
|
|
"of options.">;
|
|
def mllvm_EQ : Joined<["-"], "mllvm=">, Flags<[HelpHidden]>, Alias<mllvm>;
|
|
|
|
def dry_run : Flag<["--", "-"], "dry-run">, Flags<[WrapperOnlyOption]>,
|
|
HelpText<"Print generated commands without running.">;
|