Skip to content

Commit 7025fef

Browse files
committed
[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
1 parent 029644e commit 7025fef

File tree

2 files changed

+44
-50
lines changed

2 files changed

+44
-50
lines changed

clang/include/clang/Driver/Options.td

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -438,6 +438,8 @@ defvar cplusplus = LangOpts<"CPlusPlus">;
438438
defvar c99 = LangOpts<"C99">;
439439
defvar lang_std = LangOpts<"LangStd">;
440440
defvar open_cl = LangOpts<"OpenCL">;
441+
defvar render_script = LangOpts<"RenderScript">;
442+
defvar hip = LangOpts<"HIP">;
441443
defvar gnu_mode = LangOpts<"GNUMode">;
442444

443445
defvar std = !strconcat("LangStandard::getLangStandardForKind(", lang_std.KeyPath, ")");
@@ -870,8 +872,6 @@ def ptxas_path_EQ : Joined<["--"], "ptxas-path=">, Group<i_Group>,
870872
def fcuda_flush_denormals_to_zero : Flag<["-"], "fcuda-flush-denormals-to-zero">,
871873
HelpText<"Flush denormal floating point values to zero in CUDA device mode.">;
872874
def fno_cuda_flush_denormals_to_zero : Flag<["-"], "fno-cuda-flush-denormals-to-zero">;
873-
defm cuda_approx_transcendentals : OptInFFlag<"cuda-approx-transcendentals", "Use", "Don't use",
874-
" approximate transcendental functions">;
875875
defm gpu_rdc : BoolFOption<"gpu-rdc",
876876
LangOpts<"GPURelocatableDeviceCode">, DefaultFalse,
877877
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",
896896
LangOpts<"HIPUseNewLaunchAPI">, DefaultFalse,
897897
PosFlag<SetTrue, [CC1Option], "Use">, NegFlag<SetFalse, [], "Don't use">,
898898
BothFlags<[], " new kernel launching API for HIP">>;
899-
defm gpu_allow_device_init : OptInFFlag<"gpu-allow-device-init",
900-
"Allow", "Don't allow", " device side init function in HIP">;
899+
defm gpu_allow_device_init : BoolFOption<"gpu-allow-device-init",
900+
LangOpts<"GPUAllowDeviceInit">, DefaultFalse,
901+
PosFlag<SetTrue, [CC1Option], "Allow">, NegFlag<SetFalse, [], "Don't allow">,
902+
BothFlags<[], " device side init function in HIP">>,
903+
ShouldParseIf<hip.KeyPath>;
901904
defm gpu_defer_diag : BoolFOption<"gpu-defer-diag",
902905
LangOpts<"GPUDeferDiag">, DefaultFalse,
903906
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
909912
BothFlags<[HelpHidden], " in overloading resolution for CUDA/HIP">>;
910913
def gpu_max_threads_per_block_EQ : Joined<["--"], "gpu-max-threads-per-block=">,
911914
Flags<[CC1Option]>,
912-
HelpText<"Default max threads per block for kernel launch bounds for HIP">;
915+
HelpText<"Default max threads per block for kernel launch bounds for HIP">,
916+
MarshallingInfoStringInt<LangOpts<"GPUMaxThreadsPerBlock">, "256">,
917+
ShouldParseIf<hip.KeyPath>;
913918
def gpu_instrument_lib_EQ : Joined<["--"], "gpu-instrument-lib=">,
914919
HelpText<"Instrument device library for HIP, which is a LLVM bitcode containing "
915920
"__cyg_profile_func_enter and __cyg_profile_func_exit">;
@@ -5161,11 +5166,17 @@ def vtordisp_mode_EQ : Joined<["-"], "vtordisp-mode=">,
51615166
HelpText<"Control vtordisp placement on win32 targets">,
51625167
MarshallingInfoStringInt<LangOpts<"VtorDispMode">, "1">;
51635168
def fnative_half_type: Flag<["-"], "fnative-half-type">,
5164-
HelpText<"Use the native half type for __fp16 instead of promoting to float">;
5169+
HelpText<"Use the native half type for __fp16 instead of promoting to float">,
5170+
MarshallingInfoFlag<LangOpts<"NativeHalfType">>,
5171+
ImpliedByAnyOf<[open_cl.KeyPath, render_script.KeyPath]>;
51655172
def fnative_half_arguments_and_returns : Flag<["-"], "fnative-half-arguments-and-returns">,
5166-
HelpText<"Use the native __fp16 type for arguments and returns (and skip ABI-specific lowering)">;
5173+
HelpText<"Use the native __fp16 type for arguments and returns (and skip ABI-specific lowering)">,
5174+
MarshallingInfoFlag<LangOpts<"NativeHalfArgsAndReturns">>,
5175+
ImpliedByAnyOf<[open_cl.KeyPath, render_script.KeyPath]>;
51675176
def fallow_half_arguments_and_returns : Flag<["-"], "fallow-half-arguments-and-returns">,
5168-
HelpText<"Allow function arguments and returns of type half">;
5177+
HelpText<"Allow function arguments and returns of type half">,
5178+
MarshallingInfoFlag<LangOpts<"HalfArgsAndReturns">>,
5179+
ImpliedByAnyOf<[fnative_half_arguments_and_returns.KeyPath]>;
51695180
def fdefault_calling_conv_EQ : Joined<["-"], "fdefault-calling-conv=">,
51705181
HelpText<"Set default calling convention">, Values<"cdecl,fastcall,stdcall,vectorcall,regcall">,
51715182
NormalizedValuesScope<"LangOptions">,
@@ -5299,10 +5310,18 @@ def fopenmp_host_ir_file_path : Separate<["-"], "fopenmp-host-ir-file-path">,
52995310
//===----------------------------------------------------------------------===//
53005311

53015312
def fsycl_is_device : Flag<["-"], "fsycl-is-device">,
5302-
HelpText<"Generate code for SYCL device.">;
5313+
HelpText<"Generate code for SYCL device.">,
5314+
MarshallingInfoFlag<LangOpts<"SYCLIsDevice">>,
5315+
ShouldParseIf<fsycl.KeyPath>;
53035316

53045317
} // let Flags = [CC1Option, NoDriverOption]
53055318

5319+
defm cuda_approx_transcendentals : BoolFOption<"cuda-approx-transcendentals",
5320+
LangOpts<"CUDADeviceApproxTranscendentals">, DefaultFalse,
5321+
PosFlag<SetTrue, [CC1Option], "Use">, NegFlag<SetFalse, [], "Don't use">,
5322+
BothFlags<[], " approximate transcendental functions">>,
5323+
ShouldParseIf<fcuda_is_device.KeyPath>;
5324+
53065325
//===----------------------------------------------------------------------===//
53075326
// Frontend Options - cc1 + fc1
53085327
//===----------------------------------------------------------------------===//

clang/lib/Frontend/CompilerInvocation.cpp

Lines changed: 16 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -444,6 +444,22 @@ static void FixupInvocation(CompilerInvocation &Invocation,
444444
Diags.Report(diag::err_drv_argument_not_allowed_with)
445445
<< "-fgnu89-inline" << GetInputKindName(IK);
446446

447+
if (Args.hasArg(OPT_fgpu_allow_device_init) && !LangOpts.HIP)
448+
Diags.Report(diag::warn_ignored_hip_only_option)
449+
<< Args.getLastArg(OPT_fgpu_allow_device_init)->getAsString(Args);
450+
451+
if (Args.hasArg(OPT_gpu_max_threads_per_block_EQ) && !LangOpts.HIP)
452+
Diags.Report(diag::warn_ignored_hip_only_option)
453+
<< Args.getLastArg(OPT_gpu_max_threads_per_block_EQ)->getAsString(Args);
454+
455+
// -cl-strict-aliasing needs to emit diagnostic in the case where CL > 1.0.
456+
// This option should be deprecated for CL > 1.0 because
457+
// this option was added for compatibility with OpenCL 1.0.
458+
if (Args.getLastArg(OPT_cl_strict_aliasing) && LangOpts.OpenCLVersion > 100)
459+
Diags.Report(diag::warn_option_invalid_ocl_version)
460+
<< LangOpts.getOpenCLVersionTuple().getAsString()
461+
<< Args.getLastArg(OPT_cl_strict_aliasing)->getAsString(Args);
462+
447463
if (Arg *A = Args.getLastArg(OPT_fdefault_calling_conv_EQ)) {
448464
auto DefaultCC = LangOpts.getDefaultCallingConv();
449465

@@ -2014,8 +2030,6 @@ void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK,
20142030
Opts.AltiVec = 0;
20152031
Opts.ZVector = 0;
20162032
Opts.setDefaultFPContractMode(LangOptions::FPM_On);
2017-
Opts.NativeHalfType = 1;
2018-
Opts.NativeHalfArgsAndReturns = 1;
20192033
Opts.OpenCLCPlusPlus = Opts.CPlusPlus;
20202034

20212035
// Include default header file for OpenCL.
@@ -2047,10 +2061,6 @@ void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK,
20472061
}
20482062

20492063
Opts.RenderScript = IK.getLanguage() == Language::RenderScript;
2050-
if (Opts.RenderScript) {
2051-
Opts.NativeHalfType = 1;
2052-
Opts.NativeHalfArgsAndReturns = 1;
2053-
}
20542064

20552065
// OpenCL and C++ both have bool, true, false keywords.
20562066
Opts.Bool = Opts.OpenCL || Opts.CPlusPlus;
@@ -2246,38 +2256,9 @@ void CompilerInvocation::ParseLangArgs(LangOptions &Opts, ArgList &Args,
22462256
}
22472257
}
22482258

2249-
Opts.SYCLIsDevice = Opts.SYCL && Args.hasArg(options::OPT_fsycl_is_device);
2250-
2251-
// -cl-strict-aliasing needs to emit diagnostic in the case where CL > 1.0.
2252-
// This option should be deprecated for CL > 1.0 because
2253-
// this option was added for compatibility with OpenCL 1.0.
2254-
if (Args.getLastArg(OPT_cl_strict_aliasing)
2255-
&& Opts.OpenCLVersion > 100) {
2256-
Diags.Report(diag::warn_option_invalid_ocl_version)
2257-
<< Opts.getOpenCLVersionTuple().getAsString()
2258-
<< Args.getLastArg(OPT_cl_strict_aliasing)->getAsString(Args);
2259-
}
2260-
22612259
if (Args.hasArg(OPT_fno_operator_names))
22622260
Opts.CXXOperatorNames = 0;
22632261

2264-
if (Opts.CUDAIsDevice && Args.hasArg(OPT_fcuda_approx_transcendentals))
2265-
Opts.CUDADeviceApproxTranscendentals = 1;
2266-
2267-
if (Args.hasArg(OPT_fgpu_allow_device_init)) {
2268-
if (Opts.HIP)
2269-
Opts.GPUAllowDeviceInit = 1;
2270-
else
2271-
Diags.Report(diag::warn_ignored_hip_only_option)
2272-
<< Args.getLastArg(OPT_fgpu_allow_device_init)->getAsString(Args);
2273-
}
2274-
if (Opts.HIP)
2275-
Opts.GPUMaxThreadsPerBlock = getLastArgIntValue(
2276-
Args, OPT_gpu_max_threads_per_block_EQ, Opts.GPUMaxThreadsPerBlock);
2277-
else if (Args.hasArg(OPT_gpu_max_threads_per_block_EQ))
2278-
Diags.Report(diag::warn_ignored_hip_only_option)
2279-
<< Args.getLastArg(OPT_gpu_max_threads_per_block_EQ)->getAsString(Args);
2280-
22812262
if (Opts.ObjC) {
22822263
if (Arg *arg = Args.getLastArg(OPT_fobjc_runtime_EQ)) {
22832264
StringRef value = arg->getValue();
@@ -2438,12 +2419,6 @@ void CompilerInvocation::ParseLangArgs(LangOptions &Opts, ArgList &Args,
24382419
Opts.setDefaultFPContractMode(LangOptions::FPM_Fast);
24392420
Opts.XLPragmaPack = Args.hasArg(OPT_fxl_pragma_pack);
24402421
llvm::sort(Opts.ModuleFeatures);
2441-
Opts.NativeHalfType |= Args.hasArg(OPT_fnative_half_type);
2442-
Opts.NativeHalfArgsAndReturns |= Args.hasArg(OPT_fnative_half_arguments_and_returns);
2443-
// Enable HalfArgsAndReturns if present in Args or if NativeHalfArgsAndReturns
2444-
// is enabled.
2445-
Opts.HalfArgsAndReturns = Args.hasArg(OPT_fallow_half_arguments_and_returns)
2446-
| Opts.NativeHalfArgsAndReturns;
24472422

24482423
Opts.ArmSveVectorBits =
24492424
getLastArgIntValue(Args, options::OPT_msve_vector_bits_EQ, 0, Diags);

0 commit comments

Comments
 (0)