https://github.com/elizabethandrews created
https://github.com/llvm/llvm-project/pull/207077
Add a new builtin type __spirv_event_t for SPIR-V targets. It represents
SPIR-V's OpTypeEvent and lowers to the target("spirv.Event") extension
type.
We would like to expose SPIR-V instructions to users via builtins (not yet
implemented). The builtins return an event type.
>From f8a82d3009e6329c9028af5a9c08b5d1bc89082b Mon Sep 17 00:00:00 2001
From: Elizabeth Andrews <[email protected]>
Date: Fri, 26 Jun 2026 12:43:47 -0700
Subject: [PATCH 1/3] Implement ocl_event_t
---
clang/lib/AST/ASTContext.cpp | 5 +++-
clang/lib/CodeGen/CodeGenModule.cpp | 4 +++-
clang/lib/Sema/Sema.cpp | 3 +++
.../CodeGenSYCL/builtin-ocl-event-type.cpp | 14 +++++++++++
.../test/SemaSYCL/builtin-ocl-event-type.cpp | 24 +++++++++++++++++++
5 files changed, 48 insertions(+), 2 deletions(-)
create mode 100644 clang/test/CodeGenSYCL/builtin-ocl-event-type.cpp
create mode 100644 clang/test/SemaSYCL/builtin-ocl-event-type.cpp
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index abf0cd5e18c2b..df9a4d3c30b61 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -1426,13 +1426,16 @@ void ASTContext::InitBuiltinTypes(const TargetInfo
&Target,
InitBuiltinType(ObjCBuiltinClassTy, BuiltinType::ObjCClass);
InitBuiltinType(ObjCBuiltinSelTy, BuiltinType::ObjCSel);
+ if (LangOpts.OpenCL || Target.getTriple().isSPIROrSPIRV()) {
+ InitBuiltinType(OCLEventTy, BuiltinType::OCLEvent);
+ }
+
if (LangOpts.OpenCL) {
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
InitBuiltinType(SingletonId, BuiltinType::Id);
#include "clang/Basic/OpenCLImageTypes.def"
InitBuiltinType(OCLSamplerTy, BuiltinType::OCLSampler);
- InitBuiltinType(OCLEventTy, BuiltinType::OCLEvent);
InitBuiltinType(OCLClkEventTy, BuiltinType::OCLClkEvent);
InitBuiltinType(OCLQueueTy, BuiltinType::OCLQueue);
InitBuiltinType(OCLReserveIDTy, BuiltinType::OCLReserveID);
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp
b/clang/lib/CodeGen/CodeGenModule.cpp
index 41049d85121be..504d32b0a825c 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -497,7 +497,9 @@ CodeGenModule::CodeGenModule(ASTContext &C,
if (LangOpts.ObjC)
createObjCRuntime();
- if (LangOpts.OpenCL)
+ // OpenCL types (e.g., event_t) are used by SPIR-V targets in SYCL device
+ // compilation. OpenCL runtime provides the required type conversions.
+ if (LangOpts.OpenCL || getTriple().isSPIROrSPIRV())
createOpenCLRuntime();
if (LangOpts.OpenMP)
createOpenMPRuntime();
diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp
index 78fbc9e31842d..6552819c7aedc 100644
--- a/clang/lib/Sema/Sema.cpp
+++ b/clang/lib/Sema/Sema.cpp
@@ -447,6 +447,9 @@ void Sema::Initialize() {
addImplicitTypedef("size_t", Context.getSizeType());
}
+ if (Context.getTargetInfo().getTriple().isSPIROrSPIRV())
+ addImplicitTypedef("__ocl_event_t", Context.OCLEventTy);
+
// Initialize predefined OpenCL types and supported extensions and (optional)
// core features.
if (getLangOpts().OpenCL) {
diff --git a/clang/test/CodeGenSYCL/builtin-ocl-event-type.cpp
b/clang/test/CodeGenSYCL/builtin-ocl-event-type.cpp
new file mode 100644
index 0000000000000..3b19d18ec36cd
--- /dev/null
+++ b/clang/test/CodeGenSYCL/builtin-ocl-event-type.cpp
@@ -0,0 +1,14 @@
+// RUN: %clang_cc1 -triple spirv64-unknown-unknown -fsycl-is-device
-disable-llvm-passes -emit-llvm %s -o - | FileCheck %s
+
+// Test that __ocl_event_t is available in SYCL device code and lowers to
+// target("spirv.Event") in LLVM IR for SPIR-V targets.
+
+[[clang::sycl_external]] void test_ocl_event_param(__ocl_event_t evt) {}
+// CHECK: define{{.*}} void
@_Z20test_ocl_event_param9ocl_event(target("spirv.Event") %evt)
+
+[[clang::sycl_external]] void test_ocl_event() {
+ __ocl_event_t evt;
+ // CHECK: %evt = alloca target("spirv.Event")
+ test_ocl_event_param(evt);
+ // CHECK: call spir_func void
@_Z20test_ocl_event_param9ocl_event(target("spirv.Event") %0)
+}
diff --git a/clang/test/SemaSYCL/builtin-ocl-event-type.cpp
b/clang/test/SemaSYCL/builtin-ocl-event-type.cpp
new file mode 100644
index 0000000000000..e42a2ccc36970
--- /dev/null
+++ b/clang/test/SemaSYCL/builtin-ocl-event-type.cpp
@@ -0,0 +1,24 @@
+// RUN: %clang_cc1 -triple spirv64-unknown-unknown -fsycl-is-device -verify
-fsyntax-only %s
+// expected-no-diagnostics
+
+// Test that __ocl_event_t is available in SYCL device code
+
+// A generic kernel launch function.
+template<typename KernelName, typename... Ts>
+void sycl_kernel_launch(const char *, Ts...) {}
+
+template<typename KNT, typename T>
+[[clang::sycl_kernel_entry_point(KNT)]]
+void kernel_single_task(T t) {
+ t();
+}
+
+struct KernelName;
+
+void test_ocl_event_t() {
+ kernel_single_task<KernelName>([]() {
+ // Test that __ocl_event_t is defined and can be used
+ __ocl_event_t evt;
+ (void)evt;
+ });
+}
>From 9686460ce89f87d3fd855799101288f066367793 Mon Sep 17 00:00:00 2001
From: Elizabeth Andrews <[email protected]>
Date: Mon, 29 Jun 2026 14:01:54 -0700
Subject: [PATCH 2/3] Revert "Implement ocl_event_t"
This reverts commit f8a82d3009 to implement SPIR-V builtin type.
---
clang/lib/AST/ASTContext.cpp | 5 +---
clang/lib/CodeGen/CodeGenModule.cpp | 4 +---
clang/lib/Sema/Sema.cpp | 3 ---
.../CodeGenSYCL/builtin-ocl-event-type.cpp | 14 -----------
.../test/SemaSYCL/builtin-ocl-event-type.cpp | 24 -------------------
5 files changed, 2 insertions(+), 48 deletions(-)
delete mode 100644 clang/test/CodeGenSYCL/builtin-ocl-event-type.cpp
delete mode 100644 clang/test/SemaSYCL/builtin-ocl-event-type.cpp
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index df9a4d3c30b61..abf0cd5e18c2b 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -1426,16 +1426,13 @@ void ASTContext::InitBuiltinTypes(const TargetInfo
&Target,
InitBuiltinType(ObjCBuiltinClassTy, BuiltinType::ObjCClass);
InitBuiltinType(ObjCBuiltinSelTy, BuiltinType::ObjCSel);
- if (LangOpts.OpenCL || Target.getTriple().isSPIROrSPIRV()) {
- InitBuiltinType(OCLEventTy, BuiltinType::OCLEvent);
- }
-
if (LangOpts.OpenCL) {
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
InitBuiltinType(SingletonId, BuiltinType::Id);
#include "clang/Basic/OpenCLImageTypes.def"
InitBuiltinType(OCLSamplerTy, BuiltinType::OCLSampler);
+ InitBuiltinType(OCLEventTy, BuiltinType::OCLEvent);
InitBuiltinType(OCLClkEventTy, BuiltinType::OCLClkEvent);
InitBuiltinType(OCLQueueTy, BuiltinType::OCLQueue);
InitBuiltinType(OCLReserveIDTy, BuiltinType::OCLReserveID);
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp
b/clang/lib/CodeGen/CodeGenModule.cpp
index 504d32b0a825c..41049d85121be 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -497,9 +497,7 @@ CodeGenModule::CodeGenModule(ASTContext &C,
if (LangOpts.ObjC)
createObjCRuntime();
- // OpenCL types (e.g., event_t) are used by SPIR-V targets in SYCL device
- // compilation. OpenCL runtime provides the required type conversions.
- if (LangOpts.OpenCL || getTriple().isSPIROrSPIRV())
+ if (LangOpts.OpenCL)
createOpenCLRuntime();
if (LangOpts.OpenMP)
createOpenMPRuntime();
diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp
index 6552819c7aedc..78fbc9e31842d 100644
--- a/clang/lib/Sema/Sema.cpp
+++ b/clang/lib/Sema/Sema.cpp
@@ -447,9 +447,6 @@ void Sema::Initialize() {
addImplicitTypedef("size_t", Context.getSizeType());
}
- if (Context.getTargetInfo().getTriple().isSPIROrSPIRV())
- addImplicitTypedef("__ocl_event_t", Context.OCLEventTy);
-
// Initialize predefined OpenCL types and supported extensions and (optional)
// core features.
if (getLangOpts().OpenCL) {
diff --git a/clang/test/CodeGenSYCL/builtin-ocl-event-type.cpp
b/clang/test/CodeGenSYCL/builtin-ocl-event-type.cpp
deleted file mode 100644
index 3b19d18ec36cd..0000000000000
--- a/clang/test/CodeGenSYCL/builtin-ocl-event-type.cpp
+++ /dev/null
@@ -1,14 +0,0 @@
-// RUN: %clang_cc1 -triple spirv64-unknown-unknown -fsycl-is-device
-disable-llvm-passes -emit-llvm %s -o - | FileCheck %s
-
-// Test that __ocl_event_t is available in SYCL device code and lowers to
-// target("spirv.Event") in LLVM IR for SPIR-V targets.
-
-[[clang::sycl_external]] void test_ocl_event_param(__ocl_event_t evt) {}
-// CHECK: define{{.*}} void
@_Z20test_ocl_event_param9ocl_event(target("spirv.Event") %evt)
-
-[[clang::sycl_external]] void test_ocl_event() {
- __ocl_event_t evt;
- // CHECK: %evt = alloca target("spirv.Event")
- test_ocl_event_param(evt);
- // CHECK: call spir_func void
@_Z20test_ocl_event_param9ocl_event(target("spirv.Event") %0)
-}
diff --git a/clang/test/SemaSYCL/builtin-ocl-event-type.cpp
b/clang/test/SemaSYCL/builtin-ocl-event-type.cpp
deleted file mode 100644
index e42a2ccc36970..0000000000000
--- a/clang/test/SemaSYCL/builtin-ocl-event-type.cpp
+++ /dev/null
@@ -1,24 +0,0 @@
-// RUN: %clang_cc1 -triple spirv64-unknown-unknown -fsycl-is-device -verify
-fsyntax-only %s
-// expected-no-diagnostics
-
-// Test that __ocl_event_t is available in SYCL device code
-
-// A generic kernel launch function.
-template<typename KernelName, typename... Ts>
-void sycl_kernel_launch(const char *, Ts...) {}
-
-template<typename KNT, typename T>
-[[clang::sycl_kernel_entry_point(KNT)]]
-void kernel_single_task(T t) {
- t();
-}
-
-struct KernelName;
-
-void test_ocl_event_t() {
- kernel_single_task<KernelName>([]() {
- // Test that __ocl_event_t is defined and can be used
- __ocl_event_t evt;
- (void)evt;
- });
-}
>From bae6f2a6569afec9abc1b1171da4d2d657026203 Mon Sep 17 00:00:00 2001
From: Elizabeth Andrews <[email protected]>
Date: Wed, 1 Jul 2026 12:32:38 -0700
Subject: [PATCH 3/3] [Clang][SPIRV] Add __spirv_event_t builtin type
Add a new builtin type __spirv_event_t for SPIR-V targets. It represents
SPIR-V's OpTypeEvent and lowers to the target("spirv.Event") extension
type.
We would like to expose SPIR-V instructions to users via builtins (not yet
implemented). The builtins return an event type.
---
clang/include/clang/AST/ASTContext.h | 2 ++
clang/include/clang/AST/TypeBase.h | 3 ++
clang/include/clang/AST/TypeProperties.td | 4 +++
clang/include/clang/Basic/SPIRVTypes.def | 22 ++++++++++++
.../include/clang/Serialization/ASTBitCodes.h | 5 ++-
clang/lib/AST/ASTContext.cpp | 15 ++++++++
clang/lib/AST/ASTImporter.cpp | 4 +++
clang/lib/AST/ExprConstant.cpp | 2 ++
clang/lib/AST/ItaniumMangle.cpp | 5 +++
clang/lib/AST/NSAPI.cpp | 2 ++
clang/lib/AST/PrintfFormatString.cpp | 3 ++
clang/lib/AST/Type.cpp | 6 ++++
clang/lib/AST/TypeLoc.cpp | 2 ++
clang/lib/CodeGen/CGDebugInfo.cpp | 9 +++++
clang/lib/CodeGen/CGDebugInfo.h | 2 ++
clang/lib/CodeGen/CodeGenTypes.cpp | 4 +++
clang/lib/CodeGen/ItaniumCXXABI.cpp | 2 ++
clang/lib/Sema/Sema.cpp | 8 +++++
clang/lib/Sema/SemaExpr.cpp | 4 +++
clang/lib/Serialization/ASTCommon.cpp | 5 +++
clang/lib/Serialization/ASTReader.cpp | 5 +++
.../UnifiedSymbolResolution/USRGeneration.cpp | 5 +++
clang/test/AST/spirv-event-type.cpp | 15 ++++++++
clang/test/CodeGenCXX/spirv-event-type.cpp | 34 +++++++++++++++++++
clang/test/SemaCXX/spirv-event.cpp | 21 ++++++++++++
clang/tools/libclang/CIndex.cpp | 2 ++
26 files changed, 190 insertions(+), 1 deletion(-)
create mode 100644 clang/include/clang/Basic/SPIRVTypes.def
create mode 100644 clang/test/AST/spirv-event-type.cpp
create mode 100644 clang/test/CodeGenCXX/spirv-event-type.cpp
create mode 100644 clang/test/SemaCXX/spirv-event.cpp
diff --git a/clang/include/clang/AST/ASTContext.h
b/clang/include/clang/AST/ASTContext.h
index a4ed852d36442..798c59e5449c9 100644
--- a/clang/include/clang/AST/ASTContext.h
+++ b/clang/include/clang/AST/ASTContext.h
@@ -1373,6 +1373,8 @@ class ASTContext : public RefCountedBase<ASTContext> {
#include "clang/Basic/AMDGPUTypes.def"
#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) CanQualType SingletonId;
#include "clang/Basic/HLSLIntangibleTypes.def"
+#define SPIRV_TYPE(Name, Id, SingletonId) CanQualType SingletonId;
+#include "clang/Basic/SPIRVTypes.def"
// Types for deductions in C++0x [stmt.ranged]'s desugaring. Built on demand.
mutable QualType AutoDeductTy; // Deduction against 'auto'.
diff --git a/clang/include/clang/AST/TypeBase.h
b/clang/include/clang/AST/TypeBase.h
index e3141a82b54d2..00a11770f6832 100644
--- a/clang/include/clang/AST/TypeBase.h
+++ b/clang/include/clang/AST/TypeBase.h
@@ -3250,6 +3250,9 @@ class BuiltinType : public Type {
// HLSL intangible Types
#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) Id,
#include "clang/Basic/HLSLIntangibleTypes.def"
+// SPIRV types
+#define SPIRV_TYPE(Name, Id, SingletonId) Id,
+#include "clang/Basic/SPIRVTypes.def"
// All other builtin types
#define BUILTIN_TYPE(Id, SingletonId) Id,
#define LAST_BUILTIN_TYPE(Id) LastKind = Id
diff --git a/clang/include/clang/AST/TypeProperties.td
b/clang/include/clang/AST/TypeProperties.td
index 0f3722b36774a..3e02fc5125a8f 100644
--- a/clang/include/clang/AST/TypeProperties.td
+++ b/clang/include/clang/AST/TypeProperties.td
@@ -867,6 +867,10 @@ let Class = BuiltinType in {
case BuiltinType::ID: return ctx.SINGLETON_ID;
#include "clang/Basic/HLSLIntangibleTypes.def"
+#define SPIRV_TYPE(NAME, ID, SINGLETON_ID) \
+ case BuiltinType::ID: return ctx.SINGLETON_ID;
+#include "clang/Basic/SPIRVTypes.def"
+
#define BUILTIN_TYPE(ID, SINGLETON_ID) \
case BuiltinType::ID: return ctx.SINGLETON_ID;
#include "clang/AST/BuiltinTypes.def"
diff --git a/clang/include/clang/Basic/SPIRVTypes.def
b/clang/include/clang/Basic/SPIRVTypes.def
new file mode 100644
index 0000000000000..e8c536c007ccd
--- /dev/null
+++ b/clang/include/clang/Basic/SPIRVTypes.def
@@ -0,0 +1,22 @@
+//===-- SPIRVTypes.def - Metadata about SPIRV types -------------*- C++
-*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM
Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// This file defines various SPIRV builtin types.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef SPIRV_OPAQUE_TYPE
+#define SPIRV_OPAQUE_TYPE(Name, MangledName, Id, SingletonId) \
+ SPIRV_TYPE(Name, Id, SingletonId)
+#endif
+
+SPIRV_OPAQUE_TYPE("__spirv_event_t", "__spirv_event_t", SPIRVEvent,
SPIRVEventTy)
+
+#undef SPIRV_TYPE
+#undef SPIRV_OPAQUE_TYPE
+
diff --git a/clang/include/clang/Serialization/ASTBitCodes.h
b/clang/include/clang/Serialization/ASTBitCodes.h
index 279380de2f7fe..ff9fc7b2be9ea 100644
--- a/clang/include/clang/Serialization/ASTBitCodes.h
+++ b/clang/include/clang/Serialization/ASTBitCodes.h
@@ -1154,6 +1154,9 @@ enum PredefinedTypeIDs {
// \brief HLSL intangible types with auto numeration
#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) PREDEF_TYPE_##Id##_ID,
#include "clang/Basic/HLSLIntangibleTypes.def"
+// \brief SPIRV types with auto numeration
+#define SPIRV_TYPE(Name, Id, SingletonId) PREDEF_TYPE_##Id##_ID,
+#include "clang/Basic/SPIRVTypes.def"
/// The placeholder type for unresolved templates.
PREDEF_TYPE_UNRESOLVED_TEMPLATE,
@@ -1166,7 +1169,7 @@ enum PredefinedTypeIDs {
///
/// Type IDs for non-predefined types will start at
/// NUM_PREDEF_TYPE_IDs.
-const unsigned NUM_PREDEF_TYPE_IDS = 529;
+const unsigned NUM_PREDEF_TYPE_IDS = 530;
// Ensure we do not overrun the predefined types we reserved
// in the enum PredefinedTypeIDs above.
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index abf0cd5e18c2b..c5b7bc5ae3f07 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -1488,6 +1488,13 @@ void ASTContext::InitBuiltinTypes(const TargetInfo
&Target,
#include "clang/Basic/AMDGPUTypes.def"
}
+ if (Target.getTriple().isSPIRV() ||
+ (AuxTarget && AuxTarget->getTriple().isSPIRV())) {
+#define SPIRV_TYPE(Name, Id, SingletonId)
\
+ InitBuiltinType(SingletonId, BuiltinType::Id);
+#include "clang/Basic/SPIRVTypes.def"
+ }
+
// Builtin type for __objc_yes and __objc_no
ObjCBuiltinBoolTy = (Target.useSignedCharForObjCBool() ?
SignedCharTy : BoolTy);
@@ -2438,6 +2445,12 @@ TypeInfo ASTContext::getTypeInfoImpl(const Type *T)
const {
Width = Target->getPointerWidth(LangAS::Default);
Align = Target->getPointerAlign(LangAS::Default);
break;
+#define SPIRV_OPAQUE_TYPE(NAME, MANGLEDNAME, ID, SINGLETONID)
\
+ case BuiltinType::ID:
\
+ Width = Target->getPointerWidth(LangAS::Default);
\
+ Align = Target->getPointerAlign(LangAS::Default);
\
+ break;
+#include "clang/Basic/SPIRVTypes.def"
}
break;
case Type::ObjCObjectPointer:
@@ -9281,6 +9294,8 @@ static char getObjCEncodingForPrimitiveType(const
ASTContext *C,
#include "clang/Basic/WebAssemblyReferenceTypes.def"
#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) case BuiltinType::Id:
#include "clang/Basic/AMDGPUTypes.def"
+#define SPIRV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
+#include "clang/Basic/SPIRVTypes.def"
{
DiagnosticsEngine &Diags = C->getDiagnostics();
Diags.Report(diag::err_unsupported_objc_primitive_encoding)
diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp
index f5848d154f49e..156ae82bbaa28 100644
--- a/clang/lib/AST/ASTImporter.cpp
+++ b/clang/lib/AST/ASTImporter.cpp
@@ -1365,6 +1365,10 @@ ExpectedType ASTNodeImporter::VisitBuiltinType(const
BuiltinType *T) {
case BuiltinType::Id:
\
return Importer.getToContext().SingletonId;
#include "clang/Basic/HLSLIntangibleTypes.def"
+#define SPIRV_TYPE(Name, Id, SingletonId)
\
+ case BuiltinType::Id:
\
+ return Importer.getToContext().SingletonId;
+#include "clang/Basic/SPIRVTypes.def"
#define SHARED_SINGLETON_TYPE(Expansion)
#define BUILTIN_TYPE(Id, SingletonId) \
case BuiltinType::Id: return Importer.getToContext().SingletonId;
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index 1642c41a99a2f..d877d0d4cd402 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -15830,6 +15830,8 @@ GCCTypeClass EvaluateBuiltinClassifyType(QualType T,
#include "clang/Basic/AMDGPUTypes.def"
#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
#include "clang/Basic/HLSLIntangibleTypes.def"
+#define SPIRV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
+#include "clang/Basic/SPIRVTypes.def"
return GCCTypeClass::None;
case BuiltinType::Dependent:
diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp
index 2e74aeb558e3d..b448d53fac7e2 100644
--- a/clang/lib/AST/ItaniumMangle.cpp
+++ b/clang/lib/AST/ItaniumMangle.cpp
@@ -3513,6 +3513,11 @@ void CXXNameMangler::mangleType(const BuiltinType *T) {
mangleVendorType(#Name);
\
break;
#include "clang/Basic/HLSLIntangibleTypes.def"
+#define SPIRV_TYPE(Name, Id, SingletonId)
\
+ case BuiltinType::Id:
\
+ mangleVendorType(Name);
\
+ break;
+#include "clang/Basic/SPIRVTypes.def"
}
}
diff --git a/clang/lib/AST/NSAPI.cpp b/clang/lib/AST/NSAPI.cpp
index 17f5ee5dee3d1..7142ded5a551d 100644
--- a/clang/lib/AST/NSAPI.cpp
+++ b/clang/lib/AST/NSAPI.cpp
@@ -457,6 +457,8 @@ NSAPI::getNSNumberFactoryMethodKind(QualType T) const {
#include "clang/Basic/AMDGPUTypes.def"
#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
#include "clang/Basic/HLSLIntangibleTypes.def"
+#define SPIRV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
+#include "clang/Basic/SPIRVTypes.def"
case BuiltinType::BoundMember:
case BuiltinType::UnresolvedTemplate:
case BuiltinType::Dependent:
diff --git a/clang/lib/AST/PrintfFormatString.cpp
b/clang/lib/AST/PrintfFormatString.cpp
index 4b56157d64a5d..e0cff04069d59 100644
--- a/clang/lib/AST/PrintfFormatString.cpp
+++ b/clang/lib/AST/PrintfFormatString.cpp
@@ -957,6 +957,9 @@ bool PrintfSpecifier::fixType(QualType QT, const
LangOptions &LangOpt,
#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
#include "clang/Basic/HLSLIntangibleTypes.def"
+#define SPIRV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
+#include "clang/Basic/SPIRVTypes.def"
+
#define SIGNED_TYPE(Id, SingletonId)
#define UNSIGNED_TYPE(Id, SingletonId)
#define FLOATING_TYPE(Id, SingletonId)
diff --git a/clang/lib/AST/Type.cpp b/clang/lib/AST/Type.cpp
index 55c3e5c3ead17..0a7542a19cd2b 100644
--- a/clang/lib/AST/Type.cpp
+++ b/clang/lib/AST/Type.cpp
@@ -3664,6 +3664,10 @@ StringRef BuiltinType::getName(const PrintingPolicy
&Policy) const {
case Id:
\
return #Name;
#include "clang/Basic/HLSLIntangibleTypes.def"
+#define SPIRV_TYPE(Name, Id, SingletonId)
\
+ case Id:
\
+ return Name;
+#include "clang/Basic/SPIRVTypes.def"
}
llvm_unreachable("Invalid builtin type.");
@@ -5251,6 +5255,8 @@ bool Type::canHaveNullability(bool ResultIfUnknown) const
{
#include "clang/Basic/AMDGPUTypes.def"
#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
#include "clang/Basic/HLSLIntangibleTypes.def"
+#define SPIRV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
+#include "clang/Basic/SPIRVTypes.def"
case BuiltinType::BuiltinFn:
case BuiltinType::NullPtr:
case BuiltinType::IncompleteMatrixIdx:
diff --git a/clang/lib/AST/TypeLoc.cpp b/clang/lib/AST/TypeLoc.cpp
index 7e72a85136966..c2f83e7f5cbae 100644
--- a/clang/lib/AST/TypeLoc.cpp
+++ b/clang/lib/AST/TypeLoc.cpp
@@ -421,6 +421,8 @@ TypeSpecifierType BuiltinTypeLoc::getWrittenTypeSpec()
const {
#include "clang/Basic/AMDGPUTypes.def"
#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
#include "clang/Basic/HLSLIntangibleTypes.def"
+#define SPIRV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
+#include "clang/Basic/SPIRVTypes.def"
case BuiltinType::BuiltinFn:
case BuiltinType::IncompleteMatrixIdx:
case BuiltinType::ArraySection:
diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp
b/clang/lib/CodeGen/CGDebugInfo.cpp
index 3d429d0d78e82..286940f5f099e 100644
--- a/clang/lib/CodeGen/CGDebugInfo.cpp
+++ b/clang/lib/CodeGen/CGDebugInfo.cpp
@@ -1141,6 +1141,15 @@ llvm::DIType *CGDebugInfo::CreateType(const BuiltinType
*BT) {
return SingletonId;
\
}
#include "clang/Basic/AMDGPUTypes.def"
+#define SPIRV_OPAQUE_TYPE(Name, MangledName, Id, SingletonId)
\
+ case BuiltinType::Id: {
\
+ if (!SingletonId)
\
+ SingletonId =
\
+ DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type,
\
+ MangledName, TheCU, TheCU->getFile(), 0);
\
+ return SingletonId;
\
+ }
+#include "clang/Basic/SPIRVTypes.def"
case BuiltinType::UChar:
case BuiltinType::Char_U:
Encoding = llvm::dwarf::DW_ATE_unsigned_char;
diff --git a/clang/lib/CodeGen/CGDebugInfo.h b/clang/lib/CodeGen/CGDebugInfo.h
index 4c385c26efc4e..f9cec24b2b4d7 100644
--- a/clang/lib/CodeGen/CGDebugInfo.h
+++ b/clang/lib/CodeGen/CGDebugInfo.h
@@ -97,6 +97,8 @@ class CGDebugInfo {
#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId)
\
llvm::DIType *SingletonId = nullptr;
#include "clang/Basic/HLSLIntangibleTypes.def"
+#define SPIRV_TYPE(Name, Id, SingletonId) llvm::DIType *SingletonId = nullptr;
+#include "clang/Basic/SPIRVTypes.def"
/// Cache of previously constructed Types.
llvm::DenseMap<const void *, llvm::TrackingMDRef> TypeCache;
diff --git a/clang/lib/CodeGen/CodeGenTypes.cpp
b/clang/lib/CodeGen/CodeGenTypes.cpp
index b28a0eb82f302..8d6547195360e 100644
--- a/clang/lib/CodeGen/CodeGenTypes.cpp
+++ b/clang/lib/CodeGen/CodeGenTypes.cpp
@@ -617,6 +617,10 @@ llvm::Type *CodeGenTypes::ConvertType(QualType T) {
#include "clang/Basic/HLSLIntangibleTypes.def"
ResultType = CGM.getHLSLRuntime().convertHLSLSpecificType(Ty);
break;
+#define SPIRV_OPAQUE_TYPE(Name, MangledName, Id, SingletonId)
\
+ case BuiltinType::Id:
\
+ return llvm::TargetExtType::get(getLLVMContext(), "spirv.Event");
+#include "clang/Basic/SPIRVTypes.def"
case BuiltinType::Dependent:
#define BUILTIN_TYPE(Id, SingletonId)
#define PLACEHOLDER_TYPE(Id, SingletonId) \
diff --git a/clang/lib/CodeGen/ItaniumCXXABI.cpp
b/clang/lib/CodeGen/ItaniumCXXABI.cpp
index b4b3284f752ae..090e18b5f3512 100644
--- a/clang/lib/CodeGen/ItaniumCXXABI.cpp
+++ b/clang/lib/CodeGen/ItaniumCXXABI.cpp
@@ -3778,6 +3778,8 @@ static bool TypeInfoIsInStandardLibrary(const BuiltinType
*Ty) {
#include "clang/Basic/AMDGPUTypes.def"
#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
#include "clang/Basic/HLSLIntangibleTypes.def"
+#define SPIRV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
+#include "clang/Basic/SPIRVTypes.def"
case BuiltinType::ShortAccum:
case BuiltinType::Accum:
case BuiltinType::LongAccum:
diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp
index 78fbc9e31842d..a741261163b9e 100644
--- a/clang/lib/Sema/Sema.cpp
+++ b/clang/lib/Sema/Sema.cpp
@@ -580,6 +580,14 @@ void Sema::Initialize() {
#include "clang/Basic/AMDGPUTypes.def"
}
+ if (Context.getTargetInfo().getTriple().isSPIRV() ||
+ (Context.getAuxTargetInfo() &&
+ Context.getAuxTargetInfo()->getTriple().isSPIRV())) {
+#define SPIRV_TYPE(Name, Id, SingletonId)
\
+ addImplicitTypedef(Name, Context.SingletonId);
+#include "clang/Basic/SPIRVTypes.def"
+ }
+
if (Context.getTargetInfo().hasBuiltinMSVaList()) {
DeclarationName MSVaList = &Context.Idents.get("__builtin_ms_va_list");
if (IdResolver.begin(MSVaList) == IdResolver.end())
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index ad6e7183cb3a4..6d2772827001e 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -6448,6 +6448,8 @@ static bool isPlaceholderToRemoveAsArg(QualType type) {
#include "clang/Basic/AMDGPUTypes.def"
#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
#include "clang/Basic/HLSLIntangibleTypes.def"
+#define SPIRV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
+#include "clang/Basic/SPIRVTypes.def"
#define PLACEHOLDER_TYPE(ID, SINGLETON_ID)
#define BUILTIN_TYPE(ID, SINGLETON_ID) case BuiltinType::ID:
#include "clang/AST/BuiltinTypes.def"
@@ -22028,6 +22030,8 @@ ExprResult Sema::CheckPlaceholderExpr(Expr *E) {
#include "clang/Basic/AMDGPUTypes.def"
#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
#include "clang/Basic/HLSLIntangibleTypes.def"
+#define SPIRV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
+#include "clang/Basic/SPIRVTypes.def"
#define BUILTIN_TYPE(Id, SingletonId) case BuiltinType::Id:
#define PLACEHOLDER_TYPE(Id, SingletonId)
#include "clang/AST/BuiltinTypes.def"
diff --git a/clang/lib/Serialization/ASTCommon.cpp
b/clang/lib/Serialization/ASTCommon.cpp
index 49e6fe8004cec..d10de5c288d69 100644
--- a/clang/lib/Serialization/ASTCommon.cpp
+++ b/clang/lib/Serialization/ASTCommon.cpp
@@ -268,6 +268,11 @@ serialization::TypeIdxFromBuiltin(const BuiltinType *BT) {
ID = PREDEF_TYPE_##Id##_ID;
\
break;
#include "clang/Basic/HLSLIntangibleTypes.def"
+#define SPIRV_TYPE(Name, Id, SingletonId)
\
+ case BuiltinType::Id:
\
+ ID = PREDEF_TYPE_##Id##_ID;
\
+ break;
+#include "clang/Basic/SPIRVTypes.def"
case BuiltinType::BuiltinFn:
ID = PREDEF_TYPE_BUILTIN_FN;
break;
diff --git a/clang/lib/Serialization/ASTReader.cpp
b/clang/lib/Serialization/ASTReader.cpp
index f8a6a38bb9b5c..098e7acf86eaf 100644
--- a/clang/lib/Serialization/ASTReader.cpp
+++ b/clang/lib/Serialization/ASTReader.cpp
@@ -8146,6 +8146,11 @@ QualType ASTReader::GetType(TypeID ID) {
T = Context.SingletonId;
\
break;
#include "clang/Basic/HLSLIntangibleTypes.def"
+#define SPIRV_TYPE(Name, Id, SingletonId)
\
+ case PREDEF_TYPE_##Id##_ID:
\
+ T = Context.SingletonId;
\
+ break;
+#include "clang/Basic/SPIRVTypes.def"
}
assert(!T.isNull() && "Unknown predefined type");
diff --git a/clang/lib/UnifiedSymbolResolution/USRGeneration.cpp
b/clang/lib/UnifiedSymbolResolution/USRGeneration.cpp
index c4788dd6917f2..eec09795d922b 100644
--- a/clang/lib/UnifiedSymbolResolution/USRGeneration.cpp
+++ b/clang/lib/UnifiedSymbolResolution/USRGeneration.cpp
@@ -826,6 +826,11 @@ void USRGenerator::VisitType(QualType T) {
Out << "@BT@" << #Name;
\
break;
#include "clang/Basic/HLSLIntangibleTypes.def"
+#define SPIRV_TYPE(Name, Id, SingletonId)
\
+ case BuiltinType::Id:
\
+ Out << "@BT@" << Name;
\
+ break;
+#include "clang/Basic/SPIRVTypes.def"
case BuiltinType::ShortAccum:
Out << "@BT@ShortAccum";
break;
diff --git a/clang/test/AST/spirv-event-type.cpp
b/clang/test/AST/spirv-event-type.cpp
new file mode 100644
index 0000000000000..8f29c6215b64d
--- /dev/null
+++ b/clang/test/AST/spirv-event-type.cpp
@@ -0,0 +1,15 @@
+// REQUIRES: spirv-registered-target
+// Test without serialization:
+// RUN: %clang_cc1 -triple spirv64 -ast-dump %s | FileCheck %s
+//
+// Test with serialization:
+// RUN: %clang_cc1 -triple spirv64 -emit-pch -o %t %s
+// RUN: %clang_cc1 -x c++ -triple spirv64 -include-pch %t -ast-dump-all
/dev/null | sed -e "s/ <undeserialized declarations>//" -e "s/ imported//" |
FileCheck %s
+
+void test(void) {
+ __spirv_event_t e;
+}
+
+// CHECK: TypedefDecl {{.*}} implicit {{.*}}__spirv_event_t '__spirv_event_t'
+// CHECK-NEXT: -BuiltinType {{.*}} '__spirv_event_t'
+// CHECK: VarDecl {{.*}} e '__spirv_event_t'
diff --git a/clang/test/CodeGenCXX/spirv-event-type.cpp
b/clang/test/CodeGenCXX/spirv-event-type.cpp
new file mode 100644
index 0000000000000..edf27336d9612
--- /dev/null
+++ b/clang/test/CodeGenCXX/spirv-event-type.cpp
@@ -0,0 +1,34 @@
+// REQUIRES: spirv-registered-target
+// RUN: %clang_cc1 -triple spirv64 -emit-llvm -o - %s | FileCheck %s
+// RUN: %clang_cc1 -triple spirv64 -emit-llvm -debug-info-kind=limited -o - %s
| FileCheck %s --check-prefix=DEBUG
+
+// Verify that __spirv_event_t lowers to the target("spirv.Event") extension
+// type and that it mangles as a vendor extended type.
+
+namespace std { class type_info; }
+
+__spirv_event_t getEvent();
+void consumeEvent(__spirv_event_t e);
+
+const std::type_info &ti = typeid(__spirv_event_t);
+// CHECK: @_ZTIu15__spirv_event_t = {{.*}}constant { {{.*}} } {
{{.*}}@_ZTVN10__cxxabiv123__fundamental_type_infoE{{.*}},
{{.*}}@_ZTSu15__spirv_event_t {{.*}}}
+// CHECK: @_ZTSu15__spirv_event_t = {{.*}}constant [19 x i8]
c"u15__spirv_event_t\00"
+
+void test() {
+ __spirv_event_t e = getEvent();
+ consumeEvent(e);
+}
+// CHECK-LABEL: define spir_func void @_Z4testv()
+// CHECK: %e = alloca target("spirv.Event")
+// CHECK: %call = call spir_func target("spirv.Event") @_Z8getEventv()
+// CHECK: store target("spirv.Event") %call, ptr %e
+// CHECK: %[[LD:.*]] = load target("spirv.Event"), ptr %e
+// CHECK: call spir_func void
@_Z12consumeEventu15__spirv_event_t(target("spirv.Event") %[[LD]])
+
+// CHECK: declare spir_func target("spirv.Event") @_Z8getEventv()
+// CHECK: declare spir_func void
@_Z12consumeEventu15__spirv_event_t(target("spirv.Event"))
+
+// DEBUG: !DILocalVariable(name: "e", {{.*}} type: ![[TD:[0-9]+]])
+// DEBUG: ![[TD]] = !DIDerivedType(tag: DW_TAG_typedef, name:
"__spirv_event_t", {{.*}} baseType: ![[BT:[0-9]+]])
+// DEBUG: ![[BT]] = !DICompositeType(tag: DW_TAG_structure_type, name:
"__spirv_event_t", {{.*}} flags: DIFlagFwdDecl)
+
diff --git a/clang/test/SemaCXX/spirv-event.cpp
b/clang/test/SemaCXX/spirv-event.cpp
new file mode 100644
index 0000000000000..335d43d243883
--- /dev/null
+++ b/clang/test/SemaCXX/spirv-event.cpp
@@ -0,0 +1,21 @@
+// REQUIRES: spirv-registered-target
+// RUN: %clang_cc1 -fsyntax-only -verify -std=gnu++11 -triple spirv64
-Wno-unused-value %s
+
+// __spirv_event_t is an opaque type: it cannot be initialized from, converted
+// to, or cast from other types, nor used in arithmetic.
+void foo() {
+ int n = 100;
+ __spirv_event_t v = 0; // expected-error {{cannot initialize a variable of
type '__spirv_event_t' with an rvalue of type 'int'}}
+ static_cast<__spirv_event_t>(n); // expected-error {{static_cast from 'int'
to '__spirv_event_t' is not allowed}}
+ reinterpret_cast<__spirv_event_t>(n); // expected-error {{reinterpret_cast
from 'int' to '__spirv_event_t' is not allowed}}
+ (void)(v + v); // expected-error {{invalid operands to binary expression
('__spirv_event_t' and '__spirv_event_t')}}
+ int x(v); // expected-error {{cannot initialize a variable of type 'int'
with an lvalue of type '__spirv_event_t'}}
+ __spirv_event_t k;
+ int *ip = (int *)k; // expected-error {{cannot cast from type
'__spirv_event_t' to pointer type 'int *'}}
+}
+
+// __spirv_event_t can be used as a function parameter, a template argument,
and
+// a struct field.
+template <class T> void bar(T);
+void use(__spirv_event_t r) { bar(r); }
+struct S { __spirv_event_t r; int a; };
diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp
index ac2fad38a1348..a373528c2f2fa 100644
--- a/clang/tools/libclang/CIndex.cpp
+++ b/clang/tools/libclang/CIndex.cpp
@@ -1586,6 +1586,8 @@ bool CursorVisitor::VisitBuiltinTypeLoc(BuiltinTypeLoc
TL) {
#include "clang/Basic/AMDGPUTypes.def"
#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
#include "clang/Basic/HLSLIntangibleTypes.def"
+#define SPIRV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
+#include "clang/Basic/SPIRVTypes.def"
#define BUILTIN_TYPE(Id, SingletonId)
#define SIGNED_TYPE(Id, SingletonId) case BuiltinType::Id:
#define UNSIGNED_TYPE(Id, SingletonId) case BuiltinType::Id:
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits