Skip to content

Commit e90c927

Browse files
Naghasanbader
authored andcommitted
[SPIR-V] Add SPIR-V builtin functions and types
* Make the OpenCL Builtin lookup agnostic to programming models Rename the OpenCL Builtin lookup system to make it agnostic. The Builtin emitter is now outputting the builtin information into a class so that different programming models can be produced and used. * Add SPIR-V variants of TypeSampledImage as clang builtin type. 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. * Enable SPIR-V builtin lookup Add flag -fdeclare-spirv-builtins to enable lookup of SPIR-V builtins. If -fdeclare-spirv-builtins is passed to clang, the compiler will try to lookup for the builtin described in SPIRVBuiltins.td for any match. If a match is found, overloads are build for the match. This will enforce a stable way to express SPIR-V builtins and make them closer to how the translator mangles them. This will help ensuring builtin for CUDA does not break easily. This will also support any changes suggested by the SPIRV-LLVM people on how to represent builtins. Define __SPIRV_BUILTIN_DECLARATIONS__ when passing -fdeclare-spirv-builtins to clang. Added OpenCL SPIR-V extended set builtins bindings and part of the core SPIR-V (mostly missing Images and Pipes) TODO: Known vendor extensions are not implemented yet. Signed-off-by: Victor Lomuller <victor@codeplay.com> Differential Revision: https://reviews.llvm.org/D108034
1 parent e343510 commit e90c927

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+1630
-198
lines changed

clang/include/clang-c/Index.h

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

34033403
CXType_ExtVector = 176,
3404-
CXType_Atomic = 177
3404+
CXType_Atomic = 177,
3405+
3406+
/* SPIRV builtin types. */
3407+
CXType_SampledOCLImage1dRO = 178,
3408+
CXType_SampledOCLImage1dArrayRO = 179,
3409+
CXType_SampledOCLImage1dBufferRO = 180,
3410+
CXType_SampledOCLImage2dRO = 181,
3411+
CXType_SampledOCLImage2dArrayRO = 182,
3412+
CXType_SampledOCLImage2dDepthRO = 183,
3413+
CXType_SampledOCLImage2dArrayDepthRO = 184,
3414+
CXType_SampledOCLImage2dMSAARO = 185,
3415+
CXType_SampledOCLImage2dArrayMSAARO = 186,
3416+
CXType_SampledOCLImage2dMSAADepthRO = 187,
3417+
CXType_SampledOCLImage2dArrayMSAADepthRO = 188,
3418+
CXType_SampledOCLImage3dRO = 189
34053419
};
34063420

34073421
/**

clang/include/clang/AST/ASTContext.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1107,6 +1107,11 @@ class ASTContext : public RefCountedBase<ASTContext> {
11071107
CanQualType ObjCBuiltinBoolTy;
11081108
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
11091109
CanQualType SingletonId;
1110+
#include "clang/Basic/OpenCLImageTypes.def"
1111+
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
1112+
CanQualType Sampled##SingletonId;
1113+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
1114+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
11101115
#include "clang/Basic/OpenCLImageTypes.def"
11111116
CanQualType OCLSamplerTy, OCLEventTy, OCLClkEventTy;
11121117
CanQualType OCLQueueTy, OCLReserveIDTy;

clang/include/clang/AST/Type.h

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

21112111
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
21122112
bool is##Id##Type() const;
2113+
#include "clang/Basic/OpenCLImageTypes.def"
2114+
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
2115+
bool isSampled##Id##Type() const;
2116+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
2117+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
21132118
#include "clang/Basic/OpenCLImageTypes.def"
21142119

21152120
bool isImageType() const; // Any OpenCL image type
2121+
bool isSampledImageType() const; // Any SPIR-V Sampled image type
21162122

21172123
bool isSamplerT() const; // OpenCL sampler_t
21182124
bool isEventT() const; // OpenCL event_t
@@ -2496,6 +2502,10 @@ class BuiltinType : public Type {
24962502
// OpenCL image types
24972503
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) Id,
24982504
#include "clang/Basic/OpenCLImageTypes.def"
2505+
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) Sampled##Id,
2506+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
2507+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
2508+
#include "clang/Basic/OpenCLImageTypes.def"
24992509
// OpenCL extension types
25002510
#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) Id,
25012511
#include "clang/Basic/OpenCLExtensionTypes.def"
@@ -6860,6 +6870,14 @@ inline bool Type::isDecltypeType() const {
68606870
}
68616871
#include "clang/Basic/OpenCLImageTypes.def"
68626872

6873+
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
6874+
inline bool Type::isSampled##Id##Type() const { \
6875+
return isSpecificBuiltinType(BuiltinType::Sampled##Id); \
6876+
}
6877+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
6878+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
6879+
#include "clang/Basic/OpenCLImageTypes.def"
6880+
68636881
inline bool Type::isSamplerT() const {
68646882
return isSpecificBuiltinType(BuiltinType::OCLSampler);
68656883
}
@@ -6882,7 +6900,17 @@ inline bool Type::isReserveIDT() const {
68826900

68836901
inline bool Type::isImageType() const {
68846902
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) is##Id##Type() ||
6903+
return isSampledImageType() ||
6904+
#include "clang/Basic/OpenCLImageTypes.def"
6905+
false; // end boolean or operation
6906+
}
6907+
6908+
inline bool Type::isSampledImageType() const {
6909+
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
6910+
isSampled##Id##Type() ||
68856911
return
6912+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
6913+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
68866914
#include "clang/Basic/OpenCLImageTypes.def"
68876915
false; // end boolean or operation
68886916
}

clang/include/clang/AST/TypeProperties.td

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

760+
#define IMAGE_TYPE(IMGTYPE, ID, SINGLETON_ID, ACCESS, SUFFIX) \
761+
case BuiltinType::Sampled##ID: return ctx.Sampled##SINGLETON_ID;
762+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
763+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
764+
#include "clang/Basic/OpenCLImageTypes.def"
765+
760766
#define EXT_OPAQUE_TYPE(EXTTYPE, ID, EXT) \
761767
case BuiltinType::ID: return ctx.ID##Ty;
762768
#include "clang/Basic/OpenCLExtensionTypes.def"

clang/include/clang/Basic/LangOptions.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,7 @@ LANGOPT(GPUExcludeWrongSideOverloads, 1, 0, "always exclude wrong side overloads
261261
LANGOPT(SYCLIsDevice , 1, 0, "Generate code for SYCL device")
262262
LANGOPT(SYCLIsHost , 1, 0, "SYCL host compilation")
263263
ENUM_LANGOPT(SYCLVersion , SYCLMajorVersion, 2, SYCL_None, "Version of the SYCL standard used")
264+
LANGOPT(DeclareSPIRVBuiltins, 1, 0, "Declare SPIR-V builtin functions")
264265

265266
LANGOPT(HIPUseNewLaunchAPI, 1, 0, "Use new kernel launching API for HIP")
266267

clang/include/clang/Driver/Options.td

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5771,6 +5771,8 @@ def finclude_default_header : Flag<["-"], "finclude-default-header">,
57715771
HelpText<"Include default header file for OpenCL">;
57725772
def fdeclare_opencl_builtins : Flag<["-"], "fdeclare-opencl-builtins">,
57735773
HelpText<"Add OpenCL builtin function declarations (experimental)">;
5774+
def fdeclare_spirv_builtins : Flag<["-"], "fdeclare-spirv-builtins">,
5775+
HelpText<"Add SPIR-V builtin function declarations (experimental)">;
57745776

57755777
def fpreserve_vec3_type : Flag<["-"], "fpreserve-vec3-type">,
57765778
HelpText<"Preserve 3-component vector type">,

clang/include/clang/Serialization/ASTBitCodes.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1074,6 +1074,11 @@ enum PredefinedTypeIDs {
10741074
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
10751075
PREDEF_TYPE_##Id##_ID,
10761076
#include "clang/Basic/OpenCLImageTypes.def"
1077+
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
1078+
PREDEF_TYPE_SAMPLED_##Id##_ID,
1079+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
1080+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
1081+
#include "clang/Basic/OpenCLImageTypes.def"
10771082
/// \brief OpenCL extension types with auto numeration
10781083
#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) PREDEF_TYPE_##Id##_ID,
10791084
#include "clang/Basic/OpenCLExtensionTypes.def"

clang/lib/AST/ASTContext.cpp

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1423,18 +1423,14 @@ void ASTContext::InitBuiltinTypes(const TargetInfo &Target,
14231423
InitBuiltinType(ObjCBuiltinClassTy, BuiltinType::ObjCClass);
14241424
InitBuiltinType(ObjCBuiltinSelTy, BuiltinType::ObjCSel);
14251425

1426-
if (LangOpts.SYCLIsDevice) {
1427-
InitBuiltinType(OCLSamplerTy, BuiltinType::OCLSampler);
1428-
InitBuiltinType(OCLEventTy, BuiltinType::OCLEvent);
1426+
if (LangOpts.OpenCL || LangOpts.SYCLIsDevice) {
14291427
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
14301428
InitBuiltinType(SingletonId, BuiltinType::Id);
14311429
#include "clang/Basic/OpenCLImageTypes.def"
1432-
#undef IMAGE_TYPE
1433-
}
1434-
1435-
if (LangOpts.OpenCL) {
1436-
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
1437-
InitBuiltinType(SingletonId, BuiltinType::Id);
1430+
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
1431+
InitBuiltinType(Sampled##SingletonId, BuiltinType::Sampled##Id);
1432+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
1433+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
14381434
#include "clang/Basic/OpenCLImageTypes.def"
14391435

14401436
InitBuiltinType(OCLSamplerTy, BuiltinType::OCLSampler);
@@ -2193,6 +2189,11 @@ TypeInfo ASTContext::getTypeInfoImpl(const Type *T) const {
21932189
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
21942190
case BuiltinType::Id:
21952191
#include "clang/Basic/OpenCLImageTypes.def"
2192+
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
2193+
case BuiltinType::Sampled##Id:
2194+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
2195+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
2196+
#include "clang/Basic/OpenCLImageTypes.def"
21962197
#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
21972198
case BuiltinType::Id:
21982199
#include "clang/Basic/OpenCLExtensionTypes.def"
@@ -6860,6 +6861,12 @@ OpenCLTypeKind ASTContext::getOpenCLTypeKind(const Type *T) const {
68606861
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
68616862
case BuiltinType::Id: \
68626863
return OCLTK_Image;
6864+
#include "clang/Basic/OpenCLImageTypes.def"
6865+
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
6866+
case BuiltinType::Sampled##Id: \
6867+
return OCLTK_Image;
6868+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
6869+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
68636870
#include "clang/Basic/OpenCLImageTypes.def"
68646871

68656872
case BuiltinType::OCLClkEvent:
@@ -7446,6 +7453,11 @@ static char getObjCEncodingForPrimitiveType(const ASTContext *C,
74467453
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
74477454
case BuiltinType::Id:
74487455
#include "clang/Basic/OpenCLImageTypes.def"
7456+
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
7457+
case BuiltinType::Sampled##Id:
7458+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
7459+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
7460+
#include "clang/Basic/OpenCLImageTypes.def"
74497461
#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
74507462
case BuiltinType::Id:
74517463
#include "clang/Basic/OpenCLExtensionTypes.def"

clang/lib/AST/ASTImporter.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1041,6 +1041,12 @@ ExpectedType ASTNodeImporter::VisitBuiltinType(const BuiltinType *T) {
10411041
case BuiltinType::Id: \
10421042
return Importer.getToContext().SingletonId;
10431043
#include "clang/Basic/OpenCLImageTypes.def"
1044+
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
1045+
case BuiltinType::Sampled##Id: \
1046+
return Importer.getToContext().Sampled##SingletonId;
1047+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
1048+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
1049+
#include "clang/Basic/OpenCLImageTypes.def"
10441050
#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
10451051
case BuiltinType::Id: \
10461052
return Importer.getToContext().Id##Ty;

clang/lib/AST/ExprConstant.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11018,6 +11018,11 @@ EvaluateBuiltinClassifyType(QualType T, const LangOptions &LangOpts) {
1101811018
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
1101911019
case BuiltinType::Id:
1102011020
#include "clang/Basic/OpenCLImageTypes.def"
11021+
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
11022+
case BuiltinType::Sampled##Id:
11023+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
11024+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
11025+
#include "clang/Basic/OpenCLImageTypes.def"
1102111026
#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
1102211027
case BuiltinType::Id:
1102311028
#include "clang/Basic/OpenCLExtensionTypes.def"

clang/lib/AST/ItaniumMangle.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3027,6 +3027,14 @@ void CXXNameMangler::mangleType(const BuiltinType *T) {
30273027
type_name = "ocl_" #ImgType "_" #Suffix; \
30283028
Out << type_name.size() << type_name; \
30293029
break;
3030+
#include "clang/Basic/OpenCLImageTypes.def"
3031+
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
3032+
case BuiltinType::Sampled##Id: \
3033+
type_name = "__spirv_SampledImage__" #ImgType "_" #Suffix; \
3034+
Out << type_name.size() << type_name; \
3035+
break;
3036+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
3037+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
30303038
#include "clang/Basic/OpenCLImageTypes.def"
30313039
case BuiltinType::OCLSampler:
30323040
Out << "11ocl_sampler";

clang/lib/AST/MicrosoftMangle.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2423,6 +2423,13 @@ void MicrosoftCXXNameMangler::mangleType(const BuiltinType *T, Qualifiers,
24232423
case BuiltinType::Id: \
24242424
Out << "PAUocl_" #ImgType "_" #Suffix "@@"; \
24252425
break;
2426+
#include "clang/Basic/OpenCLImageTypes.def"
2427+
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
2428+
case BuiltinType::Sampled##Id: \
2429+
Out << "PAU__spirv_SampledImage__" #ImgType "_" #Suffix "@@"; \
2430+
break;
2431+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
2432+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
24262433
#include "clang/Basic/OpenCLImageTypes.def"
24272434
case BuiltinType::OCLSampler:
24282435
Out << "PA";

clang/lib/AST/NSAPI.cpp

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

clang/lib/AST/PrintfFormatString.cpp

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

clang/lib/AST/Type.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3072,6 +3072,12 @@ StringRef BuiltinType::getName(const PrintingPolicy &Policy) const {
30723072
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
30733073
case Id: \
30743074
return "__" #Access " " #ImgType "_t";
3075+
#include "clang/Basic/OpenCLImageTypes.def"
3076+
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
3077+
case Sampled##Id: \
3078+
return "__ocl_sampled_" #ImgType "_" #Suffix "_t";
3079+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
3080+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
30753081
#include "clang/Basic/OpenCLImageTypes.def"
30763082
case OCLSampler:
30773083
return "sampler_t";
@@ -4117,6 +4123,11 @@ bool Type::canHaveNullability(bool ResultIfUnknown) const {
41174123
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
41184124
case BuiltinType::Id:
41194125
#include "clang/Basic/OpenCLImageTypes.def"
4126+
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
4127+
case BuiltinType::Sampled##Id:
4128+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
4129+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
4130+
#include "clang/Basic/OpenCLImageTypes.def"
41204131
#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
41214132
case BuiltinType::Id:
41224133
#include "clang/Basic/OpenCLExtensionTypes.def"

clang/lib/AST/TypeLoc.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -402,6 +402,11 @@ TypeSpecifierType BuiltinTypeLoc::getWrittenTypeSpec() const {
402402
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
403403
case BuiltinType::Id:
404404
#include "clang/Basic/OpenCLImageTypes.def"
405+
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
406+
case BuiltinType::Sampled##Id:
407+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
408+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
409+
#include "clang/Basic/OpenCLImageTypes.def"
405410
#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
406411
case BuiltinType::Id:
407412
#include "clang/Basic/OpenCLExtensionTypes.def"

clang/lib/CodeGen/CGDebugInfo.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -689,6 +689,13 @@ llvm::DIType *CGDebugInfo::CreateType(const BuiltinType *BT) {
689689
case BuiltinType::Id: \
690690
return getOrCreateStructPtrType("opencl_" #ImgType "_" #Suffix "_t", \
691691
SingletonId);
692+
#include "clang/Basic/OpenCLImageTypes.def"
693+
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
694+
case BuiltinType::Sampled##Id: \
695+
return getOrCreateStructPtrType( \
696+
"spirv_sampled_" #ImgType "_" #Suffix "_t", Sampled##SingletonId);
697+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
698+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
692699
#include "clang/Basic/OpenCLImageTypes.def"
693700
case BuiltinType::OCLSampler:
694701
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
@@ -531,6 +531,11 @@ llvm::Type *CodeGenTypes::ConvertType(QualType T) {
531531
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
532532
case BuiltinType::Id:
533533
#include "clang/Basic/OpenCLImageTypes.def"
534+
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
535+
case BuiltinType::Sampled##Id:
536+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
537+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
538+
#include "clang/Basic/OpenCLImageTypes.def"
534539
#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
535540
case BuiltinType::Id:
536541
#include "clang/Basic/OpenCLExtensionTypes.def"

clang/lib/CodeGen/ItaniumCXXABI.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3293,6 +3293,11 @@ static bool TypeInfoIsInStandardLibrary(const BuiltinType *Ty) {
32933293
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
32943294
case BuiltinType::Id:
32953295
#include "clang/Basic/OpenCLImageTypes.def"
3296+
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
3297+
case BuiltinType::Sampled##Id:
3298+
#define IMAGE_WRITE_TYPE(Type, Id, Ext)
3299+
#define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
3300+
#include "clang/Basic/OpenCLImageTypes.def"
32963301
#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
32973302
case BuiltinType::Id:
32983303
#include "clang/Basic/OpenCLExtensionTypes.def"

clang/lib/Frontend/CompilerInvocation.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3366,6 +3366,8 @@ void CompilerInvocation::GenerateLangArgs(const LangOptions &Opts,
33663366
GenerateArg(Args, OPT_finclude_default_header, SA);
33673367
if (Opts.DeclareOpenCLBuiltins)
33683368
GenerateArg(Args, OPT_fdeclare_opencl_builtins, SA);
3369+
if (Opts.DeclareSPIRVBuiltins)
3370+
GenerateArg(Args, OPT_fdeclare_spirv_builtins, SA);
33693371

33703372
const LangOptions *LangOpts = &Opts;
33713373

@@ -3678,6 +3680,9 @@ bool CompilerInvocation::ParseLangArgs(LangOptions &Opts, ArgList &Args,
36783680
Opts.IncludeDefaultHeader = Args.hasArg(OPT_finclude_default_header);
36793681
Opts.DeclareOpenCLBuiltins = Args.hasArg(OPT_fdeclare_opencl_builtins);
36803682

3683+
Opts.SYCLIsDevice = Args.hasArg(options::OPT_fsycl_is_device);
3684+
Opts.DeclareSPIRVBuiltins = Args.hasArg(OPT_fdeclare_spirv_builtins);
3685+
36813686
CompilerInvocation::setLangDefaults(Opts, IK, T, Includes, LangStd);
36823687

36833688
// The key paths of codegen options defined in Options.td start with

0 commit comments

Comments
 (0)