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";

clang/lib/AST/NSAPI.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -463,6 +463,11 @@ NSAPI::getNSNumberFactoryMethodKind(QualType T) const {
463463
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
464464
case BuiltinType::Id:
465465
#include "clang/Basic/OpenCLImageTypes.def"
466+
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
467+
case BuiltinType::Sampled##Id:
468+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
469+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
470+
#include "clang/Basic/OpenCLImageTypes.def"
466471
#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
467472
case BuiltinType::Id:
468473
#include "clang/Basic/OpenCLExtensionTypes.def"

clang/lib/AST/PrintfFormatString.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -785,6 +785,11 @@ bool PrintfSpecifier::fixType(QualType QT, const LangOptions &LangOpt,
785785
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
786786
case BuiltinType::Id:
787787
#include "clang/Basic/OpenCLImageTypes.def"
788+
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
789+
case BuiltinType::Sampled##Id:
790+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
791+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
792+
#include "clang/Basic/OpenCLImageTypes.def"
788793
#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
789794
case BuiltinType::Id:
790795
#include "clang/Basic/OpenCLExtensionTypes.def"

clang/lib/AST/Type.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3017,6 +3017,12 @@ StringRef BuiltinType::getName(const PrintingPolicy &Policy) const {
30173017
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
30183018
case Id: \
30193019
return "__" #Access " " #ImgType "_t";
3020+
#include "clang/Basic/OpenCLImageTypes.def"
3021+
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
3022+
case Sampled##Id: \
3023+
return "__ocl_sampled_" #ImgType "_" #Suffix "_t";
3024+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
3025+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
30203026
#include "clang/Basic/OpenCLImageTypes.def"
30213027
case OCLSampler:
30223028
return "sampler_t";
@@ -4044,6 +4050,11 @@ bool Type::canHaveNullability(bool ResultIfUnknown) const {
40444050
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
40454051
case BuiltinType::Id:
40464052
#include "clang/Basic/OpenCLImageTypes.def"
4053+
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
4054+
case BuiltinType::Sampled##Id:
4055+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
4056+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
4057+
#include "clang/Basic/OpenCLImageTypes.def"
40474058
#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
40484059
case BuiltinType::Id:
40494060
#include "clang/Basic/OpenCLExtensionTypes.def"

clang/lib/AST/TypeLoc.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,11 @@ TypeSpecifierType BuiltinTypeLoc::getWrittenTypeSpec() const {
392392
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
393393
case BuiltinType::Id:
394394
#include "clang/Basic/OpenCLImageTypes.def"
395+
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
396+
case BuiltinType::Sampled##Id:
397+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
398+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
399+
#include "clang/Basic/OpenCLImageTypes.def"
395400
#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
396401
case BuiltinType::Id:
397402
#include "clang/Basic/OpenCLExtensionTypes.def"

clang/lib/CodeGen/CGDebugInfo.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -704,6 +704,13 @@ llvm::DIType *CGDebugInfo::CreateType(const BuiltinType *BT) {
704704
case BuiltinType::Id: \
705705
return getOrCreateStructPtrType("opencl_" #ImgType "_" #Suffix "_t", \
706706
SingletonId);
707+
#include "clang/Basic/OpenCLImageTypes.def"
708+
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
709+
case BuiltinType::Sampled##Id: \
710+
return getOrCreateStructPtrType( \
711+
"spirv_sampled_" #ImgType "_" #Suffix "_t", Sampled##SingletonId);
712+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
713+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
707714
#include "clang/Basic/OpenCLImageTypes.def"
708715
case BuiltinType::OCLSampler:
709716
return getOrCreateStructPtrType("opencl_sampler_t", OCLSamplerDITy);

clang/lib/CodeGen/CGDebugInfo.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,11 @@ class CGDebugInfo {
7171
llvm::DIType *SelTy = nullptr;
7272
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
7373
llvm::DIType *SingletonId = nullptr;
74+
#include "clang/Basic/OpenCLImageTypes.def"
75+
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
76+
llvm::DIType *Sampled##SingletonId = nullptr;
77+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
78+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
7479
#include "clang/Basic/OpenCLImageTypes.def"
7580
llvm::DIType *OCLSamplerDITy = nullptr;
7681
llvm::DIType *OCLEventDITy = nullptr;

clang/lib/CodeGen/CGOpenCLRuntime.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,15 @@ llvm::Type *CGOpenCLRuntime::convertOpenCLSpecificType(const Type *T) {
4646
return llvm::PointerType::get( \
4747
llvm::StructType::create(Ctx, "opencl." #ImgType "_" #Suffix "_t"), \
4848
AddrSpc);
49+
#include "clang/Basic/OpenCLImageTypes.def"
50+
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
51+
case BuiltinType::Sampled##Id: \
52+
return llvm::PointerType::get( \
53+
llvm::StructType::create(Ctx, "spirv.SampledImage." #ImgType \
54+
"_" #Suffix "_t"), \
55+
AddrSpc);
56+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
57+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
4958
#include "clang/Basic/OpenCLImageTypes.def"
5059
case BuiltinType::OCLSampler:
5160
return getSamplerType(T);

clang/lib/CodeGen/CodeGenTypes.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -537,6 +537,11 @@ llvm::Type *CodeGenTypes::ConvertType(QualType T) {
537537
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
538538
case BuiltinType::Id:
539539
#include "clang/Basic/OpenCLImageTypes.def"
540+
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
541+
case BuiltinType::Sampled##Id:
542+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
543+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
544+
#include "clang/Basic/OpenCLImageTypes.def"
540545
#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
541546
case BuiltinType::Id:
542547
#include "clang/Basic/OpenCLExtensionTypes.def"

clang/lib/CodeGen/ItaniumCXXABI.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3067,6 +3067,11 @@ static bool TypeInfoIsInStandardLibrary(const BuiltinType *Ty) {
30673067
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
30683068
case BuiltinType::Id:
30693069
#include "clang/Basic/OpenCLImageTypes.def"
3070+
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
3071+
case BuiltinType::Sampled##Id:
3072+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
3073+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
3074+
#include "clang/Basic/OpenCLImageTypes.def"
30703075
#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
30713076
case BuiltinType::Id:
30723077
#include "clang/Basic/OpenCLExtensionTypes.def"

clang/lib/Index/USRGeneration.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -718,6 +718,11 @@ void USRGenerator::VisitType(QualType T) {
718718
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
719719
case BuiltinType::Id:
720720
#include "clang/Basic/OpenCLImageTypes.def"
721+
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
722+
case BuiltinType::Sampled##Id:
723+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
724+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
725+
#include "clang/Basic/OpenCLImageTypes.def"
721726
#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
722727
case BuiltinType::Id:
723728
#include "clang/Basic/OpenCLExtensionTypes.def"

clang/lib/Sema/Sema.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,20 @@ void Sema::Initialize() {
302302
#undef SEMA_STRINGIZE
303303
}
304304

305+
if (getLangOpts().SYCLIsDevice || getLangOpts().OpenCL) {
306+
#ifdef SEMA_STRINGIZE
307+
#error "Undefine SEMA_STRINGIZE macro."
308+
#endif
309+
#define SEMA_STRINGIZE(s) #s
310+
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
311+
addImplicitTypedef(SEMA_STRINGIZE(__ocl_sampled_##ImgType##_##Suffix##_t), \
312+
Context.Sampled##SingletonId);
313+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
314+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
315+
#include "clang/Basic/OpenCLImageTypes.def"
316+
#undef SEMA_STRINGIZE
317+
}
318+
305319
// Initialize predefined OpenCL types and supported extensions and (optional)
306320
// core features.
307321
if (getLangOpts().OpenCL) {

clang/lib/Sema/SemaDecl.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6684,7 +6684,7 @@ static bool diagnoseOpenCLTypes(Scope *S, Sema &Se, Declarator &D,
66846684
// OpenCL v2.0 s6.9.b - Image type can only be used as a function argument.
66856685
// OpenCL v2.0 s6.13.16.1 - Pipe type can only be used as a function
66866686
// argument.
6687-
if (R->isImageType() || R->isPipeType()) {
6687+
if (!R->isSampledImageType() && (R->isImageType() || R->isPipeType())) {
66886688
Se.Diag(D.getIdentifierLoc(),
66896689
diag::err_opencl_type_can_only_be_used_as_function_parameter)
66906690
<< R;

0 commit comments

Comments
 (0)