forked from OSchip/llvm-project
[SYCL] Driver option to select SYCL version
Summary: User can select the version of SYCL the compiler will use via the flag -sycl-std, similar to -cl-std. The flag defines the LangOpts.SYCLVersion option to the version of SYCL. The default value is undefined. If driver is building SYCL code, flag is set to the default SYCL version (1.2.1) The preprocessor uses this variable to define CL_SYCL_LANGUAGE_VERSION macro, which should be defined according to SYCL 1.2.1 standard. Only valid value at this point for the flag is 1.2.1. Co-Authored-By: David Wood <Q0KPU0H1YOEPHRY1R2SN5B5RL@david.davidtw.co> Signed-off-by: Ruyman Reyes <ruyman@codeplay.com> Subscribers: ebevhan, Anastasia, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D72857 Signed-off-by: Alexey Bader <alexey.bader@intel.com>
This commit is contained in:
parent
ee1b2e7ded
commit
bd97704eaa
|
@ -230,7 +230,9 @@ LANGOPT(GPURelocatableDeviceCode, 1, 0, "generate relocatable device code")
|
|||
LANGOPT(GPUAllowDeviceInit, 1, 0, "allowing device side global init functions for HIP")
|
||||
LANGOPT(GPUMaxThreadsPerBlock, 32, 256, "default max threads per block for kernel launch bounds for HIP")
|
||||
|
||||
LANGOPT(SYCL , 1, 0, "SYCL")
|
||||
LANGOPT(SYCLIsDevice , 1, 0, "Generate code for SYCL device")
|
||||
LANGOPT(SYCLVersion , 32, 0, "Version of the SYCL standard used")
|
||||
|
||||
LANGOPT(HIPUseNewLaunchAPI, 1, 0, "Use new kernel launching API for HIP")
|
||||
|
||||
|
|
|
@ -3420,10 +3420,12 @@ defm underscoring : BooleanFFlag<"underscoring">, Group<gfortran_Group>;
|
|||
defm whole_file : BooleanFFlag<"whole-file">, Group<gfortran_Group>;
|
||||
|
||||
// C++ SYCL options
|
||||
def fsycl : Flag<["-"], "fsycl">, Group<sycl_Group>,
|
||||
def fsycl : Flag<["-"], "fsycl">, Group<sycl_Group>, Flags<[CC1Option, CoreOption]>,
|
||||
HelpText<"Enable SYCL kernels compilation for device">;
|
||||
def fno_sycl : Flag<["-"], "fno-sycl">, Group<sycl_Group>,
|
||||
def fno_sycl : Flag<["-"], "fno-sycl">, Group<sycl_Group>, Flags<[CoreOption]>,
|
||||
HelpText<"Disable SYCL kernels compilation for device">;
|
||||
def sycl_std_EQ : Joined<["-"], "sycl-std=">, Group<sycl_Group>, Flags<[CC1Option, NoArgumentUnused, CoreOption]>,
|
||||
HelpText<"SYCL language standard to compile for.">, Values<"2017, 121, 1.2.1, sycl-1.2.1">;
|
||||
|
||||
include "CC1Options.td"
|
||||
|
||||
|
|
|
@ -4040,9 +4040,18 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
|
|||
CmdArgs.push_back(Args.MakeArgString(NormalizedTriple));
|
||||
}
|
||||
|
||||
if (Args.hasFlag(options::OPT_fsycl, options::OPT_fno_sycl, false))
|
||||
if (Args.hasFlag(options::OPT_fsycl, options::OPT_fno_sycl, false)) {
|
||||
CmdArgs.push_back("-fsycl");
|
||||
CmdArgs.push_back("-fsycl-is-device");
|
||||
|
||||
if (Arg *A = Args.getLastArg(options::OPT_sycl_std_EQ)) {
|
||||
A->render(Args, CmdArgs);
|
||||
} else {
|
||||
// Ensure the default version in SYCL mode is 1.2.1 (aka 2017)
|
||||
CmdArgs.push_back("-sycl-std=2017");
|
||||
}
|
||||
}
|
||||
|
||||
if (IsOpenMPDevice) {
|
||||
// We have to pass the triple of the host if compiling for an OpenMP device.
|
||||
std::string NormalizedTriple =
|
||||
|
|
|
@ -2535,6 +2535,24 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,
|
|||
LangStd = OpenCLLangStd;
|
||||
}
|
||||
|
||||
Opts.SYCL = Args.hasArg(options::OPT_fsycl);
|
||||
Opts.SYCLIsDevice = Opts.SYCL && Args.hasArg(options::OPT_fsycl_is_device);
|
||||
if (Opts.SYCL) {
|
||||
// -sycl-std applies to any SYCL source, not only those containing kernels,
|
||||
// but also those using the SYCL API
|
||||
if (const Arg *A = Args.getLastArg(OPT_sycl_std_EQ)) {
|
||||
Opts.SYCLVersion = llvm::StringSwitch<unsigned>(A->getValue())
|
||||
.Cases("2017", "1.2.1", "121", "sycl-1.2.1", 2017)
|
||||
.Default(0U);
|
||||
|
||||
if (Opts.SYCLVersion == 0U) {
|
||||
// User has passed an invalid value to the flag, this is an error
|
||||
Diags.Report(diag::err_drv_invalid_value)
|
||||
<< A->getAsString(Args) << A->getValue();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Opts.IncludeDefaultHeader = Args.hasArg(OPT_finclude_default_header);
|
||||
Opts.DeclareOpenCLBuiltins = Args.hasArg(OPT_fdeclare_opencl_builtins);
|
||||
|
||||
|
@ -3136,8 +3154,6 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,
|
|||
<< Opts.OMPHostIRFile;
|
||||
}
|
||||
|
||||
Opts.SYCLIsDevice = Args.hasArg(options::OPT_fsycl_is_device);
|
||||
|
||||
// Set CUDA mode for OpenMP target NVPTX if specified in options
|
||||
Opts.OpenMPCUDAMode = Opts.OpenMPIsDevice && T.isNVPTX() &&
|
||||
Args.hasArg(options::OPT_fopenmp_cuda_mode);
|
||||
|
|
|
@ -460,6 +460,13 @@ static void InitializeStandardPredefinedMacros(const TargetInfo &TI,
|
|||
if (LangOpts.FastRelaxedMath)
|
||||
Builder.defineMacro("__FAST_RELAXED_MATH__");
|
||||
}
|
||||
|
||||
if (LangOpts.SYCL) {
|
||||
// SYCL Version is set to a value when building SYCL applications
|
||||
if (LangOpts.SYCLVersion == 2017)
|
||||
Builder.defineMacro("CL_SYCL_LANGUAGE_VERSION", "121");
|
||||
}
|
||||
|
||||
// Not "standard" per se, but available even with the -undef flag.
|
||||
if (LangOpts.AsmPreprocessor)
|
||||
Builder.defineMacro("__ASSEMBLER__");
|
||||
|
|
|
@ -1,10 +1,20 @@
|
|||
// RUN: %clang -### -fsycl -c %s 2>&1 | FileCheck %s --check-prefix=ENABLED
|
||||
// RUN: %clang -### -fsycl %s 2>&1 | FileCheck %s --check-prefix=ENABLED
|
||||
// RUN: %clang -### -fsycl -sycl-std=1.2.1 %s 2>&1 | FileCheck %s --check-prefix=ENABLED
|
||||
// RUN: %clang -### -fsycl -sycl-std=121 %s 2>&1 | FileCheck %s --check-prefix=ENABLED
|
||||
// RUN: %clang -### -fsycl -sycl-std=2017 %s 2>&1 | FileCheck %s --check-prefix=ENABLED
|
||||
// RUN: %clang -### -fsycl -sycl-std=sycl-1.2.1 %s 2>&1 | FileCheck %s --check-prefix=ENABLED
|
||||
// RUN: %clang -### -fno-sycl -fsycl %s 2>&1 | FileCheck %s --check-prefix=ENABLED
|
||||
// RUN: %clang -### -sycl-std=2017 %s 2>&1 | FileCheck %s --check-prefix=DISABLED
|
||||
// RUN: %clangxx -### -fsycl %s 2>&1 | FileCheck %s --check-prefix=ENABLED
|
||||
// RUN: %clangxx -### -fno-sycl %s 2>&1 | FileCheck %s --check-prefix=DISABLED
|
||||
// RUN: %clangxx -### -fsycl -fno-sycl %s 2>&1 | FileCheck %s --check-prefix=DISABLED
|
||||
// RUN: %clangxx -### %s 2>&1 | FileCheck %s --check-prefix=DISABLED
|
||||
// RUN: %clang_cl -### -fsycl -sycl-std=2017 %s 2>&1 | FileCheck %s --check-prefix=ENABLED
|
||||
// RUN: %clang_cl -### -fsycl %s 2>&1 | FileCheck %s --check-prefix=ENABLED
|
||||
// RUN: %clang_cl -### %s 2>&1 | FileCheck %s --check-prefix=DISABLED
|
||||
|
||||
// ENABLED: "-cc1"{{.*}} "-fsycl-is-device"
|
||||
// ENABLED-SAME: "-sycl-std={{[-.sycl0-9]+}}"
|
||||
// DISABLED-NOT: "-fsycl-is-device"
|
||||
// DISABLED-NOT: "-sycl-std="
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
// RUN: %clang_cc1 %s -triple spir -aux-triple x86_64-unknown-linux-gnu -E -dM | FileCheck %s
|
||||
// RUN: %clang_cc1 %s -fsycl-is-device -triple spir -aux-triple x86_64-unknown-linux-gnu -E -dM | FileCheck --check-prefix=CHECK-SYCL %s
|
||||
// RUN: %clang_cc1 %s -fsycl -fsycl-is-device -triple spir -aux-triple x86_64-unknown-linux-gnu -E -dM | FileCheck --check-prefix=CHECK-SYCL %s
|
||||
|
||||
// CHECK-NOT:#define __x86_64__ 1
|
||||
// CHECK-SYCL:#define __x86_64__ 1
|
||||
|
|
|
@ -1,5 +1,9 @@
|
|||
// RUN: %clang_cc1 %s -E -dM | FileCheck %s
|
||||
// RUN: %clang_cc1 %s -fsycl-is-device -E -dM | FileCheck --check-prefix=CHECK-SYCL %s
|
||||
// RUN: %clang_cc1 %s -fsycl -sycl-std=2017 -E -dM | FileCheck --check-prefix=CHECK-SYCL-STD %s
|
||||
// RUN: %clang_cc1 %s -fsycl -fsycl-is-device -sycl-std=1.2.1 -E -dM | FileCheck --check-prefix=CHECK-SYCL-STD %s
|
||||
// RUN: %clang_cc1 %s -fsycl -fsycl-is-device -E -dM | FileCheck --check-prefixes=CHECK-SYCL %s
|
||||
|
||||
// CHECK-NOT:#define __SYCL_DEVICE_ONLY__ 1
|
||||
// CHECK-NOT:#define CL_SYCL_LANGUAGE_VERSION 121
|
||||
// CHECK-SYCL-STD:#define CL_SYCL_LANGUAGE_VERSION 121
|
||||
// CHECK-SYCL:#define __SYCL_DEVICE_ONLY__ 1
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
// RUN: %clang_cc1 -std=c++11 -fsyntax-only -fsycl-is-device -verify %s
|
||||
// RUN: %clang_cc1 -std=c++11 -fsyntax-only -fsycl -fsycl-is-device -verify %s
|
||||
|
||||
// Only function templates
|
||||
[[clang::sycl_kernel]] int gv2 = 0; // expected-warning {{'sycl_kernel' attribute only applies to function templates}}
|
||||
|
|
Loading…
Reference in New Issue