forked from OSchip/llvm-project
[clang][cli] Port GPU-related language options to marshalling system
Port some GPU-related language options to the marshalling system for automatic command line parsing and generation. Reviewed By: dexonsmith Differential Revision: https://reviews.llvm.org/D95345
This commit is contained in:
parent
029644ee51
commit
7025fef3f6
|
@ -438,6 +438,8 @@ defvar cplusplus = LangOpts<"CPlusPlus">;
|
|||
defvar c99 = LangOpts<"C99">;
|
||||
defvar lang_std = LangOpts<"LangStd">;
|
||||
defvar open_cl = LangOpts<"OpenCL">;
|
||||
defvar render_script = LangOpts<"RenderScript">;
|
||||
defvar hip = LangOpts<"HIP">;
|
||||
defvar gnu_mode = LangOpts<"GNUMode">;
|
||||
|
||||
defvar std = !strconcat("LangStandard::getLangStandardForKind(", lang_std.KeyPath, ")");
|
||||
|
@ -870,8 +872,6 @@ def ptxas_path_EQ : Joined<["--"], "ptxas-path=">, Group<i_Group>,
|
|||
def fcuda_flush_denormals_to_zero : Flag<["-"], "fcuda-flush-denormals-to-zero">,
|
||||
HelpText<"Flush denormal floating point values to zero in CUDA device mode.">;
|
||||
def fno_cuda_flush_denormals_to_zero : Flag<["-"], "fno-cuda-flush-denormals-to-zero">;
|
||||
defm cuda_approx_transcendentals : OptInFFlag<"cuda-approx-transcendentals", "Use", "Don't use",
|
||||
" approximate transcendental functions">;
|
||||
defm gpu_rdc : BoolFOption<"gpu-rdc",
|
||||
LangOpts<"GPURelocatableDeviceCode">, DefaultFalse,
|
||||
PosFlag<SetTrue, [CC1Option], "Generate relocatable device code, also known as separate compilation mode">,
|
||||
|
@ -896,8 +896,11 @@ defm hip_new_launch_api : BoolFOption<"hip-new-launch-api",
|
|||
LangOpts<"HIPUseNewLaunchAPI">, DefaultFalse,
|
||||
PosFlag<SetTrue, [CC1Option], "Use">, NegFlag<SetFalse, [], "Don't use">,
|
||||
BothFlags<[], " new kernel launching API for HIP">>;
|
||||
defm gpu_allow_device_init : OptInFFlag<"gpu-allow-device-init",
|
||||
"Allow", "Don't allow", " device side init function in HIP">;
|
||||
defm gpu_allow_device_init : BoolFOption<"gpu-allow-device-init",
|
||||
LangOpts<"GPUAllowDeviceInit">, DefaultFalse,
|
||||
PosFlag<SetTrue, [CC1Option], "Allow">, NegFlag<SetFalse, [], "Don't allow">,
|
||||
BothFlags<[], " device side init function in HIP">>,
|
||||
ShouldParseIf<hip.KeyPath>;
|
||||
defm gpu_defer_diag : BoolFOption<"gpu-defer-diag",
|
||||
LangOpts<"GPUDeferDiag">, DefaultFalse,
|
||||
PosFlag<SetTrue, [CC1Option], "Defer">, NegFlag<SetFalse, [], "Don't defer">,
|
||||
|
@ -909,7 +912,9 @@ defm gpu_exclude_wrong_side_overloads : BoolFOption<"gpu-exclude-wrong-side-over
|
|||
BothFlags<[HelpHidden], " in overloading resolution for CUDA/HIP">>;
|
||||
def gpu_max_threads_per_block_EQ : Joined<["--"], "gpu-max-threads-per-block=">,
|
||||
Flags<[CC1Option]>,
|
||||
HelpText<"Default max threads per block for kernel launch bounds for HIP">;
|
||||
HelpText<"Default max threads per block for kernel launch bounds for HIP">,
|
||||
MarshallingInfoStringInt<LangOpts<"GPUMaxThreadsPerBlock">, "256">,
|
||||
ShouldParseIf<hip.KeyPath>;
|
||||
def gpu_instrument_lib_EQ : Joined<["--"], "gpu-instrument-lib=">,
|
||||
HelpText<"Instrument device library for HIP, which is a LLVM bitcode containing "
|
||||
"__cyg_profile_func_enter and __cyg_profile_func_exit">;
|
||||
|
@ -5161,11 +5166,17 @@ def vtordisp_mode_EQ : Joined<["-"], "vtordisp-mode=">,
|
|||
HelpText<"Control vtordisp placement on win32 targets">,
|
||||
MarshallingInfoStringInt<LangOpts<"VtorDispMode">, "1">;
|
||||
def fnative_half_type: Flag<["-"], "fnative-half-type">,
|
||||
HelpText<"Use the native half type for __fp16 instead of promoting to float">;
|
||||
HelpText<"Use the native half type for __fp16 instead of promoting to float">,
|
||||
MarshallingInfoFlag<LangOpts<"NativeHalfType">>,
|
||||
ImpliedByAnyOf<[open_cl.KeyPath, render_script.KeyPath]>;
|
||||
def fnative_half_arguments_and_returns : Flag<["-"], "fnative-half-arguments-and-returns">,
|
||||
HelpText<"Use the native __fp16 type for arguments and returns (and skip ABI-specific lowering)">;
|
||||
HelpText<"Use the native __fp16 type for arguments and returns (and skip ABI-specific lowering)">,
|
||||
MarshallingInfoFlag<LangOpts<"NativeHalfArgsAndReturns">>,
|
||||
ImpliedByAnyOf<[open_cl.KeyPath, render_script.KeyPath]>;
|
||||
def fallow_half_arguments_and_returns : Flag<["-"], "fallow-half-arguments-and-returns">,
|
||||
HelpText<"Allow function arguments and returns of type half">;
|
||||
HelpText<"Allow function arguments and returns of type half">,
|
||||
MarshallingInfoFlag<LangOpts<"HalfArgsAndReturns">>,
|
||||
ImpliedByAnyOf<[fnative_half_arguments_and_returns.KeyPath]>;
|
||||
def fdefault_calling_conv_EQ : Joined<["-"], "fdefault-calling-conv=">,
|
||||
HelpText<"Set default calling convention">, Values<"cdecl,fastcall,stdcall,vectorcall,regcall">,
|
||||
NormalizedValuesScope<"LangOptions">,
|
||||
|
@ -5299,10 +5310,18 @@ def fopenmp_host_ir_file_path : Separate<["-"], "fopenmp-host-ir-file-path">,
|
|||
//===----------------------------------------------------------------------===//
|
||||
|
||||
def fsycl_is_device : Flag<["-"], "fsycl-is-device">,
|
||||
HelpText<"Generate code for SYCL device.">;
|
||||
HelpText<"Generate code for SYCL device.">,
|
||||
MarshallingInfoFlag<LangOpts<"SYCLIsDevice">>,
|
||||
ShouldParseIf<fsycl.KeyPath>;
|
||||
|
||||
} // let Flags = [CC1Option, NoDriverOption]
|
||||
|
||||
defm cuda_approx_transcendentals : BoolFOption<"cuda-approx-transcendentals",
|
||||
LangOpts<"CUDADeviceApproxTranscendentals">, DefaultFalse,
|
||||
PosFlag<SetTrue, [CC1Option], "Use">, NegFlag<SetFalse, [], "Don't use">,
|
||||
BothFlags<[], " approximate transcendental functions">>,
|
||||
ShouldParseIf<fcuda_is_device.KeyPath>;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Frontend Options - cc1 + fc1
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
|
|
@ -444,6 +444,22 @@ static void FixupInvocation(CompilerInvocation &Invocation,
|
|||
Diags.Report(diag::err_drv_argument_not_allowed_with)
|
||||
<< "-fgnu89-inline" << GetInputKindName(IK);
|
||||
|
||||
if (Args.hasArg(OPT_fgpu_allow_device_init) && !LangOpts.HIP)
|
||||
Diags.Report(diag::warn_ignored_hip_only_option)
|
||||
<< Args.getLastArg(OPT_fgpu_allow_device_init)->getAsString(Args);
|
||||
|
||||
if (Args.hasArg(OPT_gpu_max_threads_per_block_EQ) && !LangOpts.HIP)
|
||||
Diags.Report(diag::warn_ignored_hip_only_option)
|
||||
<< Args.getLastArg(OPT_gpu_max_threads_per_block_EQ)->getAsString(Args);
|
||||
|
||||
// -cl-strict-aliasing needs to emit diagnostic in the case where CL > 1.0.
|
||||
// This option should be deprecated for CL > 1.0 because
|
||||
// this option was added for compatibility with OpenCL 1.0.
|
||||
if (Args.getLastArg(OPT_cl_strict_aliasing) && LangOpts.OpenCLVersion > 100)
|
||||
Diags.Report(diag::warn_option_invalid_ocl_version)
|
||||
<< LangOpts.getOpenCLVersionTuple().getAsString()
|
||||
<< Args.getLastArg(OPT_cl_strict_aliasing)->getAsString(Args);
|
||||
|
||||
if (Arg *A = Args.getLastArg(OPT_fdefault_calling_conv_EQ)) {
|
||||
auto DefaultCC = LangOpts.getDefaultCallingConv();
|
||||
|
||||
|
@ -2014,8 +2030,6 @@ void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK,
|
|||
Opts.AltiVec = 0;
|
||||
Opts.ZVector = 0;
|
||||
Opts.setDefaultFPContractMode(LangOptions::FPM_On);
|
||||
Opts.NativeHalfType = 1;
|
||||
Opts.NativeHalfArgsAndReturns = 1;
|
||||
Opts.OpenCLCPlusPlus = Opts.CPlusPlus;
|
||||
|
||||
// Include default header file for OpenCL.
|
||||
|
@ -2047,10 +2061,6 @@ void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK,
|
|||
}
|
||||
|
||||
Opts.RenderScript = IK.getLanguage() == Language::RenderScript;
|
||||
if (Opts.RenderScript) {
|
||||
Opts.NativeHalfType = 1;
|
||||
Opts.NativeHalfArgsAndReturns = 1;
|
||||
}
|
||||
|
||||
// OpenCL and C++ both have bool, true, false keywords.
|
||||
Opts.Bool = Opts.OpenCL || Opts.CPlusPlus;
|
||||
|
@ -2246,38 +2256,9 @@ void CompilerInvocation::ParseLangArgs(LangOptions &Opts, ArgList &Args,
|
|||
}
|
||||
}
|
||||
|
||||
Opts.SYCLIsDevice = Opts.SYCL && Args.hasArg(options::OPT_fsycl_is_device);
|
||||
|
||||
// -cl-strict-aliasing needs to emit diagnostic in the case where CL > 1.0.
|
||||
// This option should be deprecated for CL > 1.0 because
|
||||
// this option was added for compatibility with OpenCL 1.0.
|
||||
if (Args.getLastArg(OPT_cl_strict_aliasing)
|
||||
&& Opts.OpenCLVersion > 100) {
|
||||
Diags.Report(diag::warn_option_invalid_ocl_version)
|
||||
<< Opts.getOpenCLVersionTuple().getAsString()
|
||||
<< Args.getLastArg(OPT_cl_strict_aliasing)->getAsString(Args);
|
||||
}
|
||||
|
||||
if (Args.hasArg(OPT_fno_operator_names))
|
||||
Opts.CXXOperatorNames = 0;
|
||||
|
||||
if (Opts.CUDAIsDevice && Args.hasArg(OPT_fcuda_approx_transcendentals))
|
||||
Opts.CUDADeviceApproxTranscendentals = 1;
|
||||
|
||||
if (Args.hasArg(OPT_fgpu_allow_device_init)) {
|
||||
if (Opts.HIP)
|
||||
Opts.GPUAllowDeviceInit = 1;
|
||||
else
|
||||
Diags.Report(diag::warn_ignored_hip_only_option)
|
||||
<< Args.getLastArg(OPT_fgpu_allow_device_init)->getAsString(Args);
|
||||
}
|
||||
if (Opts.HIP)
|
||||
Opts.GPUMaxThreadsPerBlock = getLastArgIntValue(
|
||||
Args, OPT_gpu_max_threads_per_block_EQ, Opts.GPUMaxThreadsPerBlock);
|
||||
else if (Args.hasArg(OPT_gpu_max_threads_per_block_EQ))
|
||||
Diags.Report(diag::warn_ignored_hip_only_option)
|
||||
<< Args.getLastArg(OPT_gpu_max_threads_per_block_EQ)->getAsString(Args);
|
||||
|
||||
if (Opts.ObjC) {
|
||||
if (Arg *arg = Args.getLastArg(OPT_fobjc_runtime_EQ)) {
|
||||
StringRef value = arg->getValue();
|
||||
|
@ -2438,12 +2419,6 @@ void CompilerInvocation::ParseLangArgs(LangOptions &Opts, ArgList &Args,
|
|||
Opts.setDefaultFPContractMode(LangOptions::FPM_Fast);
|
||||
Opts.XLPragmaPack = Args.hasArg(OPT_fxl_pragma_pack);
|
||||
llvm::sort(Opts.ModuleFeatures);
|
||||
Opts.NativeHalfType |= Args.hasArg(OPT_fnative_half_type);
|
||||
Opts.NativeHalfArgsAndReturns |= Args.hasArg(OPT_fnative_half_arguments_and_returns);
|
||||
// Enable HalfArgsAndReturns if present in Args or if NativeHalfArgsAndReturns
|
||||
// is enabled.
|
||||
Opts.HalfArgsAndReturns = Args.hasArg(OPT_fallow_half_arguments_and_returns)
|
||||
| Opts.NativeHalfArgsAndReturns;
|
||||
|
||||
Opts.ArmSveVectorBits =
|
||||
getLastArgIntValue(Args, options::OPT_msve_vector_bits_EQ, 0, Diags);
|
||||
|
|
Loading…
Reference in New Issue