diff options
author | Sven van Haastregt <sven.vanhaastregt@arm.com> | 2024-07-03 13:24:22 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-07-03 13:24:22 +0200 |
commit | 5fd5b8ada70d9cbdaa8cc5bea50a6314e3140364 (patch) | |
tree | 95cd60e25c8fcd337edbc5cde43e056f62962c96 /clang/lib/CodeGen/CodeGenModule.cpp | |
parent | bcb7c38af7de59f3b2201734ee11987839cd7bbe (diff) | |
download | llvm-5fd5b8ada70d9cbdaa8cc5bea50a6314e3140364.zip llvm-5fd5b8ada70d9cbdaa8cc5bea50a6314e3140364.tar.gz llvm-5fd5b8ada70d9cbdaa8cc5bea50a6314e3140364.tar.bz2 |
[OpenCL] Emit opencl.cxx.version metadata for C++ (#92140)
Currently there is no way to tell whether an IR module was generated
using `-cl-std=cl3.0` or `-cl-std=clc++2021`, i.e., whether the origin
was a OpenCL C or C++ for OpenCL source.
Add new `opencl.cxx.version` named metadata when compiling C++. Keep the
`opencl.ocl.version` metadata to convey the compatible OpenCL C version.
Fixes https://github.com/llvm/llvm-project/issues/91912
Diffstat (limited to 'clang/lib/CodeGen/CodeGenModule.cpp')
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.cpp | 30 |
1 files changed, 19 insertions, 11 deletions
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 652f519..99e986d 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -1399,17 +1399,25 @@ void CodeGenModule::Release() { void CodeGenModule::EmitOpenCLMetadata() { // SPIR v2.0 s2.13 - The OpenCL version used by the module is stored in the // opencl.ocl.version named metadata node. - // C++ for OpenCL has a distinct mapping for versions compatibile with OpenCL. - auto Version = LangOpts.getOpenCLCompatibleVersion(); - llvm::Metadata *OCLVerElts[] = { - llvm::ConstantAsMetadata::get(llvm::ConstantInt::get( - Int32Ty, Version / 100)), - llvm::ConstantAsMetadata::get(llvm::ConstantInt::get( - Int32Ty, (Version % 100) / 10))}; - llvm::NamedMDNode *OCLVerMD = - TheModule.getOrInsertNamedMetadata("opencl.ocl.version"); - llvm::LLVMContext &Ctx = TheModule.getContext(); - OCLVerMD->addOperand(llvm::MDNode::get(Ctx, OCLVerElts)); + // C++ for OpenCL has a distinct mapping for versions compatible with OpenCL. + auto CLVersion = LangOpts.getOpenCLCompatibleVersion(); + + auto EmitVersion = [this](StringRef MDName, int Version) { + llvm::Metadata *OCLVerElts[] = { + llvm::ConstantAsMetadata::get( + llvm::ConstantInt::get(Int32Ty, Version / 100)), + llvm::ConstantAsMetadata::get( + llvm::ConstantInt::get(Int32Ty, (Version % 100) / 10))}; + llvm::NamedMDNode *OCLVerMD = TheModule.getOrInsertNamedMetadata(MDName); + llvm::LLVMContext &Ctx = TheModule.getContext(); + OCLVerMD->addOperand(llvm::MDNode::get(Ctx, OCLVerElts)); + }; + + EmitVersion("opencl.ocl.version", CLVersion); + if (LangOpts.OpenCLCPlusPlus) { + // In addition to the OpenCL compatible version, emit the C++ version. + EmitVersion("opencl.cxx.version", LangOpts.OpenCLCPlusPlusVersion); + } } void CodeGenModule::EmitBackendOptionsMetadata( |