Skip to content

Commit 768f74f

Browse files
authored
[SYCL-SPIRV] Add SPIR-V variants of TypeSampledImage as clang builtin type (#1945)
This patch adds SPIR-V sampled image types as derivative of the builtin OpenCL Image types. For each OpenCL image type, clang defines a Sampled<image type> variant and lowered as a "spirv.SampledImage.<image>" llvm opaque type. Signed-off-by: Victor Lomuller <[email protected]>
1 parent 800e452 commit 768f74f

32 files changed

+298
-20
lines changed

clang/include/clang-c/Index.h

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3348,7 +3348,21 @@ enum CXTypeKind {
33483348
CXType_OCLIntelSubgroupAVCImeDualRefStreamin = 175,
33493349

33503350
CXType_ExtVector = 176,
3351-
CXType_Atomic = 177
3351+
CXType_Atomic = 177,
3352+
3353+
/* SPIRV builtin types. */
3354+
CXType_SampledOCLImage1dRO = 178,
3355+
CXType_SampledOCLImage1dArrayRO = 179,
3356+
CXType_SampledOCLImage1dBufferRO = 180,
3357+
CXType_SampledOCLImage2dRO = 181,
3358+
CXType_SampledOCLImage2dArrayRO = 182,
3359+
CXType_SampledOCLImage2dDepthRO = 183,
3360+
CXType_SampledOCLImage2dArrayDepthRO = 184,
3361+
CXType_SampledOCLImage2dMSAARO = 185,
3362+
CXType_SampledOCLImage2dArrayMSAARO = 186,
3363+
CXType_SampledOCLImage2dMSAADepthRO = 187,
3364+
CXType_SampledOCLImage2dArrayMSAADepthRO = 188,
3365+
CXType_SampledOCLImage3dRO = 189
33523366
};
33533367

33543368
/**

clang/include/clang/AST/ASTContext.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -976,6 +976,11 @@ class ASTContext : public RefCountedBase<ASTContext> {
976976
CanQualType ObjCBuiltinBoolTy;
977977
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
978978
CanQualType SingletonId;
979+
#include "clang/Basic/OpenCLImageTypes.def"
980+
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
981+
CanQualType Sampled##SingletonId;
982+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
983+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
979984
#include "clang/Basic/OpenCLImageTypes.def"
980985
CanQualType OCLSamplerTy, OCLEventTy, OCLClkEventTy;
981986
CanQualType OCLQueueTy, OCLReserveIDTy;

clang/include/clang/AST/Type.h

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2134,9 +2134,15 @@ class alignas(8) Type : public ExtQualsTypeCommonBase {
21342134

21352135
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
21362136
bool is##Id##Type() const;
2137+
#include "clang/Basic/OpenCLImageTypes.def"
2138+
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
2139+
bool isSampled##Id##Type() const;
2140+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
2141+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
21372142
#include "clang/Basic/OpenCLImageTypes.def"
21382143

21392144
bool isImageType() const; // Any OpenCL image type
2145+
bool isSampledImageType() const; // Any SPIR-V Sampled image type
21402146

21412147
bool isSamplerT() const; // OpenCL sampler_t
21422148
bool isEventT() const; // OpenCL event_t
@@ -2520,6 +2526,10 @@ class BuiltinType : public Type {
25202526
// OpenCL image types
25212527
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) Id,
25222528
#include "clang/Basic/OpenCLImageTypes.def"
2529+
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) Sampled##Id,
2530+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
2531+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
2532+
#include "clang/Basic/OpenCLImageTypes.def"
25232533
// OpenCL extension types
25242534
#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) Id,
25252535
#include "clang/Basic/OpenCLExtensionTypes.def"
@@ -6847,6 +6857,14 @@ inline bool Type::isDecltypeType() const {
68476857
}
68486858
#include "clang/Basic/OpenCLImageTypes.def"
68496859

6860+
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
6861+
inline bool Type::isSampled##Id##Type() const { \
6862+
return isSpecificBuiltinType(BuiltinType::Sampled##Id); \
6863+
}
6864+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
6865+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
6866+
#include "clang/Basic/OpenCLImageTypes.def"
6867+
68506868
inline bool Type::isSamplerT() const {
68516869
return isSpecificBuiltinType(BuiltinType::OCLSampler);
68526870
}
@@ -6869,7 +6887,17 @@ inline bool Type::isReserveIDT() const {
68696887

68706888
inline bool Type::isImageType() const {
68716889
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) is##Id##Type() ||
6890+
return isSampledImageType() ||
6891+
#include "clang/Basic/OpenCLImageTypes.def"
6892+
false; // end boolean or operation
6893+
}
6894+
6895+
inline bool Type::isSampledImageType() const {
6896+
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
6897+
isSampled##Id##Type() ||
68726898
return
6899+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
6900+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
68736901
#include "clang/Basic/OpenCLImageTypes.def"
68746902
false; // end boolean or operation
68756903
}

clang/include/clang/AST/TypeProperties.td

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -752,6 +752,12 @@ let Class = BuiltinType in {
752752
case BuiltinType::ID: return ctx.SINGLETON_ID;
753753
#include "clang/Basic/OpenCLImageTypes.def"
754754

755+
#define IMAGE_TYPE(IMGTYPE, ID, SINGLETON_ID, ACCESS, SUFFIX) \
756+
case BuiltinType::Sampled##ID: return ctx.Sampled##SINGLETON_ID;
757+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
758+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
759+
#include "clang/Basic/OpenCLImageTypes.def"
760+
755761
#define EXT_OPAQUE_TYPE(EXTTYPE, ID, EXT) \
756762
case BuiltinType::ID: return ctx.ID##Ty;
757763
#include "clang/Basic/OpenCLExtensionTypes.def"

clang/include/clang/Serialization/ASTBitCodes.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1072,6 +1072,11 @@ class TypeIdx {
10721072
/// OpenCL image types with auto numeration
10731073
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
10741074
PREDEF_TYPE_##Id##_ID,
1075+
#include "clang/Basic/OpenCLImageTypes.def"
1076+
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
1077+
PREDEF_TYPE_SAMPLED_##Id##_ID,
1078+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
1079+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
10751080
#include "clang/Basic/OpenCLImageTypes.def"
10761081
/// \brief OpenCL extension types with auto numeration
10771082
#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \

clang/lib/AST/ASTContext.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1407,6 +1407,11 @@ void ASTContext::InitBuiltinTypes(const TargetInfo &Target,
14071407
if (LangOpts.OpenCL || LangOpts.SYCLIsDevice) {
14081408
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
14091409
InitBuiltinType(SingletonId, BuiltinType::Id);
1410+
#include "clang/Basic/OpenCLImageTypes.def"
1411+
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
1412+
InitBuiltinType(Sampled##SingletonId, BuiltinType::Sampled##Id);
1413+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
1414+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
14101415
#include "clang/Basic/OpenCLImageTypes.def"
14111416

14121417
InitBuiltinType(OCLSamplerTy, BuiltinType::OCLSampler);
@@ -2119,6 +2124,11 @@ TypeInfo ASTContext::getTypeInfoImpl(const Type *T) const {
21192124
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
21202125
case BuiltinType::Id:
21212126
#include "clang/Basic/OpenCLImageTypes.def"
2127+
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
2128+
case BuiltinType::Sampled##Id:
2129+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
2130+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
2131+
#include "clang/Basic/OpenCLImageTypes.def"
21222132
#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
21232133
case BuiltinType::Id:
21242134
#include "clang/Basic/OpenCLExtensionTypes.def"
@@ -6474,6 +6484,12 @@ OpenCLTypeKind ASTContext::getOpenCLTypeKind(const Type *T) const {
64746484
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
64756485
case BuiltinType::Id: \
64766486
return OCLTK_Image;
6487+
#include "clang/Basic/OpenCLImageTypes.def"
6488+
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
6489+
case BuiltinType::Sampled##Id: \
6490+
return OCLTK_Image;
6491+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
6492+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
64776493
#include "clang/Basic/OpenCLImageTypes.def"
64786494

64796495
case BuiltinType::OCLClkEvent:
@@ -7057,6 +7073,11 @@ static char getObjCEncodingForPrimitiveType(const ASTContext *C,
70577073
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
70587074
case BuiltinType::Id:
70597075
#include "clang/Basic/OpenCLImageTypes.def"
7076+
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
7077+
case BuiltinType::Sampled##Id:
7078+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
7079+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
7080+
#include "clang/Basic/OpenCLImageTypes.def"
70607081
#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
70617082
case BuiltinType::Id:
70627083
#include "clang/Basic/OpenCLExtensionTypes.def"

clang/lib/AST/ASTImporter.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1028,6 +1028,12 @@ ExpectedType ASTNodeImporter::VisitBuiltinType(const BuiltinType *T) {
10281028
case BuiltinType::Id: \
10291029
return Importer.getToContext().SingletonId;
10301030
#include "clang/Basic/OpenCLImageTypes.def"
1031+
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
1032+
case BuiltinType::Sampled##Id: \
1033+
return Importer.getToContext().Sampled##SingletonId;
1034+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
1035+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
1036+
#include "clang/Basic/OpenCLImageTypes.def"
10311037
#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
10321038
case BuiltinType::Id: \
10331039
return Importer.getToContext().Id##Ty;

clang/lib/AST/ExprConstant.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10507,6 +10507,11 @@ EvaluateBuiltinClassifyType(QualType T, const LangOptions &LangOpts) {
1050710507
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
1050810508
case BuiltinType::Id:
1050910509
#include "clang/Basic/OpenCLImageTypes.def"
10510+
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
10511+
case BuiltinType::Sampled##Id:
10512+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
10513+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
10514+
#include "clang/Basic/OpenCLImageTypes.def"
1051010515
#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
1051110516
case BuiltinType::Id:
1051210517
#include "clang/Basic/OpenCLExtensionTypes.def"

clang/lib/AST/ItaniumMangle.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2819,6 +2819,14 @@ void CXXNameMangler::mangleType(const BuiltinType *T) {
28192819
type_name = "ocl_" #ImgType "_" #Suffix; \
28202820
Out << type_name.size() << type_name; \
28212821
break;
2822+
#include "clang/Basic/OpenCLImageTypes.def"
2823+
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
2824+
case BuiltinType::Sampled##Id: \
2825+
type_name = "__spirv_SampledImage__" #ImgType "_" #Suffix; \
2826+
Out << type_name.size() << type_name; \
2827+
break;
2828+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
2829+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
28222830
#include "clang/Basic/OpenCLImageTypes.def"
28232831
case BuiltinType::OCLSampler:
28242832
Out << "11ocl_sampler";

clang/lib/AST/MicrosoftMangle.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2054,6 +2054,13 @@ void MicrosoftCXXNameMangler::mangleType(const BuiltinType *T, Qualifiers,
20542054
case BuiltinType::Id: \
20552055
Out << "PAUocl_" #ImgType "_" #Suffix "@@"; \
20562056
break;
2057+
#include "clang/Basic/OpenCLImageTypes.def"
2058+
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
2059+
case BuiltinType::Sampled##Id: \
2060+
Out << "PAU__spirv_SampledImage__" #ImgType "_" #Suffix "@@"; \
2061+
break;
2062+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
2063+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
20572064
#include "clang/Basic/OpenCLImageTypes.def"
20582065
case BuiltinType::OCLSampler:
20592066
Out << "PA";

0 commit comments

Comments
 (0)