diff options
author | Sven van Haastregt <sven.vanhaastregt@arm.com> | 2017-12-06 10:11:28 +0000 |
---|---|---|
committer | Sven van Haastregt <sven.vanhaastregt@arm.com> | 2017-12-06 10:11:28 +0000 |
commit | 3bb7eaf72eca331413a21743afa5b67cac50618b (patch) | |
tree | 0055f970c86016394883c95a7eb2c13c9b1dec07 /clang/lib/AST/ASTContext.cpp | |
parent | 898eb34b49e7507a3cc5d9e5e56a8601c289bb4b (diff) | |
download | bcm5719-llvm-3bb7eaf72eca331413a21743afa5b67cac50618b.tar.gz bcm5719-llvm-3bb7eaf72eca331413a21743afa5b67cac50618b.zip |
[OpenCL] Fix layering violation by getOpenCLTypeAddrSpace
Commit 7ac28eb0a5 / r310911 ("[OpenCL] Allow targets to select address
space per type", 2017-08-15) made Basic depend on AST, introducing a
circular dependency. Break this dependency by adding the
OpenCLTypeKind enum in Basic and map from AST types to this enum in
ASTContext.
Differential Revision: https://reviews.llvm.org/D40838
llvm-svn: 319883
Diffstat (limited to 'clang/lib/AST/ASTContext.cpp')
-rw-r--r-- | clang/lib/AST/ASTContext.cpp | 43 |
1 files changed, 42 insertions, 1 deletions
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index 9fb2bf66ed1..e6471be2041 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -1826,7 +1826,8 @@ TypeInfo ASTContext::getTypeInfoImpl(const Type *T) const { #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \ case BuiltinType::Id: #include "clang/Basic/OpenCLImageTypes.def" - AS = getTargetAddressSpace(Target->getOpenCLTypeAddrSpace(T)); + AS = getTargetAddressSpace( + Target->getOpenCLTypeAddrSpace(getOpenCLTypeKind(T))); Width = Target->getPointerWidth(AS); Align = Target->getPointerAlign(AS); break; @@ -5720,6 +5721,46 @@ QualType ASTContext::getBlockDescriptorExtendedType() const { return getTagDeclType(BlockDescriptorExtendedType); } +TargetInfo::OpenCLTypeKind ASTContext::getOpenCLTypeKind(const Type *T) const { + auto BT = dyn_cast<BuiltinType>(T); + + if (!BT) { + if (isa<PipeType>(T)) + return TargetInfo::OCLTK_Pipe; + + return TargetInfo::OCLTK_Default; + } + + switch (BT->getKind()) { +#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \ + case BuiltinType::Id: \ + return TargetInfo::OCLTK_Image; +#include "clang/Basic/OpenCLImageTypes.def" + + case BuiltinType::OCLClkEvent: + return TargetInfo::OCLTK_ClkEvent; + + case BuiltinType::OCLEvent: + return TargetInfo::OCLTK_Event; + + case BuiltinType::OCLQueue: + return TargetInfo::OCLTK_Queue; + + case BuiltinType::OCLReserveID: + return TargetInfo::OCLTK_ReserveID; + + case BuiltinType::OCLSampler: + return TargetInfo::OCLTK_Sampler; + + default: + return TargetInfo::OCLTK_Default; + } +} + +LangAS ASTContext::getOpenCLTypeAddrSpace(const Type *T) const { + return Target->getOpenCLTypeAddrSpace(getOpenCLTypeKind(T)); +} + /// BlockRequiresCopying - Returns true if byref variable "D" of type "Ty" /// requires copy/dispose. Note that this must match the logic /// in buildByrefHelpers. |