mirror of
https://github.com/intel/llvm.git
synced 2026-02-06 06:31:50 +08:00
[OpenCL] Add ocl and spir version for spir target
Summary: Add opencl.spir.version and opencl.ocl.version metadata for CodeGen to identify OpenCL version. Reviewers: yaxunl, Anastasia Subscribers: cfe-commits, pekka.jaaskelainen Differential Revision: http://reviews.llvm.org/D17596 llvm-svn: 264241
This commit is contained in:
@@ -7217,6 +7217,47 @@ void XCoreTargetCodeGenInfo::emitTargetMD(const Decl *D, llvm::GlobalValue *GV,
|
||||
}
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// SPIR ABI Implementation
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
namespace {
|
||||
class SPIRTargetCodeGenInfo : public TargetCodeGenInfo {
|
||||
public:
|
||||
SPIRTargetCodeGenInfo(CodeGen::CodeGenTypes &CGT)
|
||||
: TargetCodeGenInfo(new DefaultABIInfo(CGT)) {}
|
||||
void emitTargetMD(const Decl *D, llvm::GlobalValue *GV,
|
||||
CodeGen::CodeGenModule &M) const override;
|
||||
};
|
||||
} // End anonymous namespace.
|
||||
|
||||
/// Emit SPIR specific metadata: OpenCL and SPIR version.
|
||||
void SPIRTargetCodeGenInfo::emitTargetMD(const Decl *D, llvm::GlobalValue *GV,
|
||||
CodeGen::CodeGenModule &CGM) const {
|
||||
assert(CGM.getLangOpts().OpenCL && "SPIR is only for OpenCL");
|
||||
llvm::LLVMContext &Ctx = CGM.getModule().getContext();
|
||||
llvm::Type *Int32Ty = llvm::Type::getInt32Ty(Ctx);
|
||||
llvm::Module &M = CGM.getModule();
|
||||
// SPIR v2.0 s2.12 - The SPIR version used by the module is stored in the
|
||||
// opencl.spir.version named metadata.
|
||||
llvm::Metadata *SPIRVerElts[] = {
|
||||
llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(Int32Ty, 2)),
|
||||
llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(Int32Ty, 0))};
|
||||
llvm::NamedMDNode *SPIRVerMD =
|
||||
M.getOrInsertNamedMetadata("opencl.spir.version");
|
||||
SPIRVerMD->addOperand(llvm::MDNode::get(Ctx, SPIRVerElts));
|
||||
// SPIR v2.0 s2.13 - The OpenCL version used by the module is stored in the
|
||||
// opencl.ocl.version named metadata node.
|
||||
llvm::Metadata *OCLVerElts[] = {
|
||||
llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
|
||||
Int32Ty, CGM.getLangOpts().OpenCLVersion / 100)),
|
||||
llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
|
||||
Int32Ty, (CGM.getLangOpts().OpenCLVersion % 100) / 10))};
|
||||
llvm::NamedMDNode *OCLVerMD =
|
||||
M.getOrInsertNamedMetadata("opencl.ocl.version");
|
||||
OCLVerMD->addOperand(llvm::MDNode::get(Ctx, OCLVerElts));
|
||||
}
|
||||
|
||||
static bool appendType(SmallStringEnc &Enc, QualType QType,
|
||||
const CodeGen::CodeGenModule &CGM,
|
||||
TypeStringCache &TSC);
|
||||
@@ -7707,5 +7748,8 @@ const TargetCodeGenInfo &CodeGenModule::getTargetCodeGenInfo() {
|
||||
return *(TheTargetCodeGenInfo = new SparcV9TargetCodeGenInfo(Types));
|
||||
case llvm::Triple::xcore:
|
||||
return *(TheTargetCodeGenInfo = new XCoreTargetCodeGenInfo(Types));
|
||||
case llvm::Triple::spir:
|
||||
case llvm::Triple::spir64:
|
||||
return *(TheTargetCodeGenInfo = new SPIRTargetCodeGenInfo(Types));
|
||||
}
|
||||
}
|
||||
|
||||
18
clang/test/CodeGenOpenCL/spir_version.cl
Normal file
18
clang/test/CodeGenOpenCL/spir_version.cl
Normal file
@@ -0,0 +1,18 @@
|
||||
// RUN: %clang_cc1 %s -triple "spir-unknown-unknown" -emit-llvm -o - | FileCheck %s --check-prefix=CL10
|
||||
// RUN: %clang_cc1 %s -triple "spir-unknown-unknown" -emit-llvm -o - -cl-std=CL1.2 | FileCheck %s --check-prefix=CL12
|
||||
// RUN: %clang_cc1 %s -triple "spir-unknown-unknown" -emit-llvm -o - -cl-std=CL2.0 | FileCheck %s --check-prefix=CL20
|
||||
// RUN: %clang_cc1 %s -triple "spir64-unknown-unknown" -emit-llvm -o - | FileCheck %s --check-prefix=CL10
|
||||
// RUN: %clang_cc1 %s -triple "spir64-unknown-unknown" -emit-llvm -o - -cl-std=CL1.2 | FileCheck %s --check-prefix=CL12
|
||||
// RUN: %clang_cc1 %s -triple "spir64-unknown-unknown" -emit-llvm -o - -cl-std=CL2.0 | FileCheck %s --check-prefix=CL20
|
||||
kernel void foo() {}
|
||||
// CL10: !opencl.spir.version = !{[[SPIR:![0-9]+]]}
|
||||
// CL10: !opencl.ocl.version = !{[[OCL:![0-9]+]]}
|
||||
// CL10: [[SPIR]] = !{i32 2, i32 0}
|
||||
// CL10: [[OCL]] = !{i32 1, i32 0}
|
||||
// CL12: !opencl.spir.version = !{[[SPIR:![0-9]+]]}
|
||||
// CL12: !opencl.ocl.version = !{[[OCL:![0-9]+]]}
|
||||
// CL12: [[SPIR]] = !{i32 2, i32 0}
|
||||
// CL12: [[OCL]] = !{i32 1, i32 2}
|
||||
// CL20: !opencl.spir.version = !{[[SPIR:![0-9]+]]}
|
||||
// CL20: !opencl.ocl.version = !{[[SPIR:![0-9]+]]}
|
||||
// CL20: [[SPIR]] = !{i32 2, i32 0}
|
||||
Reference in New Issue
Block a user