Add support for -cl-std option (#484)
Match what Clang does except that:
- lowercase aliases of the language names are not supported
(they are not described in the OpenCL specification)
- the default standard is OpenCL C 1.2
Remove -c++ (replaced by -cl-std=CLC++).
Turn on address space inferencing when compiling as OpenCL C 2.0.
Signed-off-by: Kévin Petit <kpet@free.fr>
diff --git a/lib/Compiler.cpp b/lib/Compiler.cpp
index 82b39ce..905b7d1 100644
--- a/lib/Compiler.cpp
+++ b/lib/Compiler.cpp
@@ -407,15 +407,26 @@
}
clang::LangStandard::Kind standard;
- if (clspv::Option::CPlusPlus()) {
- standard = clang::LangStandard::lang_openclcpp;
- } else {
+ switch (clspv::Option::Language()) {
+ case clspv::Option::SourceLanguage::OpenCL_C_10:
+ standard = clang::LangStandard::lang_opencl10;
+ break;
+ case clspv::Option::SourceLanguage::OpenCL_C_11:
+ standard = clang::LangStandard::lang_opencl11;
+ break;
+ case clspv::Option::SourceLanguage::OpenCL_C_12:
standard = clang::LangStandard::lang_opencl12;
+ break;
+ case clspv::Option::SourceLanguage::OpenCL_C_20:
+ standard = clang::LangStandard::lang_opencl20;
+ break;
+ case clspv::Option::SourceLanguage::OpenCL_CPP:
+ standard = clang::LangStandard::lang_openclcpp;
+ break;
+ default:
+ llvm_unreachable("Unknown source language");
}
- // We are targeting OpenCL 1.2 only
- instance.getLangOpts().OpenCLVersion = 120;
-
instance.getLangOpts().C99 = true;
instance.getLangOpts().RTTI = false;
instance.getLangOpts().RTTIData = false;
@@ -653,7 +664,7 @@
pm->add(clspv::createInlineFuncWithSingleCallSitePass());
}
- if (clspv::Option::CPlusPlus()) {
+ if (clspv::Option::LanguageUsesGenericAddressSpace()) {
pm->add(llvm::createInferAddressSpacesPass(clspv::AddressSpace::Generic));
}
@@ -758,8 +769,10 @@
llvm::cl::ParseCommandLineOptions(llvmArgc, llvmArgv);
llvm::cl::ParseCommandLineOptions(argc, argv);
- if (clspv::Option::CPlusPlus() && !clspv::Option::InlineEntryPoints()) {
- llvm::errs() << "cannot use -c++ without -inline-entry-points\n";
+ if (clspv::Option::LanguageUsesGenericAddressSpace() &&
+ !clspv::Option::InlineEntryPoints()) {
+ llvm::errs() << "cannot compile languages that use the generic address "
+ "space (e.g. CLC++, CL2.0) without -inline-entry-points\n";
return -1;
}