slang_rs_export_type.h revision 462aefd62cc646d2ff753c1d003ef3cd7bbea26
1462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#ifndef _SLANG_COMPILER_RS_EXPORT_TYPE_HPP 2462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao# define _SLANG_COMPILER_RS_EXPORT_TYPE_HPP 3462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 4462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <set> 5462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <list> 6462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <string> 7462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 8462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "llvm/ADT/StringRef.h" /* for class llvm::StringRef */ 9462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "llvm/ADT/StringMap.h" /* for class llvm::StringMap */ 10462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "llvm/ADT/SmallPtrSet.h" /* for class llvm::SmallPtrSet */ 11462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 12462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "clang/AST/Type.h" /* for clang::Type and clang::QualType */ 13462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "clang/AST/Decl.h" /* for clang::VarDecl and clang::DeclaratorDecl */ 14462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 15462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define GET_CANONICAL_TYPE(T) (((T) == NULL) ? NULL : (T)->getCanonicalTypeInternal().getTypePtr()) 16462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define UNSAFE_CAST_TYPE(TT, T) static_cast<TT*>(T->getCanonicalTypeInternal().getTypePtr()) 17462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define GET_EXT_VECTOR_ELEMENT_TYPE(T) (((T) == NULL) ? NULL : GET_CANONICAL_TYPE((T)->getElementType().getTypePtr())) 18462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define GET_POINTEE_TYPE(T) (((T) == NULL) ? NULL : GET_CANONICAL_TYPE((T)->getPointeeType().getTypePtr())) 19462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 20462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace llvm { 21462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao class Type; 22462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} /* namespace llvm */ 23462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 24462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace slang { 25462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 26462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSContext; 27462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSExportPrimitiveType; 28462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSExportVectorType; 29462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSExportRecordType; 30462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSExportFunction; 31462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 32462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaousing namespace clang; 33462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 34462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSExportType { 35462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao friend class RSExportElement; 36462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaopublic: 37462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao typedef enum { 38462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao ExportClassPrimitive, 39462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao ExportClassPointer, 40462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao ExportClassVector, 41462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao ExportClassRecord 42462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } ExportClass; 43462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 44462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoprivate: 45462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao RSContext* mContext; 46462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao std::string mName; 47462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 48462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao mutable const llvm::Type* mLLVMType; /* Cache the result after calling convertToLLVMType() at the first time */ 49462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 50462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoprotected: 51462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao RSExportType(RSContext* Context, const llvm::StringRef& Name); 52462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 53462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* 54462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao * Let's make it private since there're some prerequisites to call this function. 55462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao * 56462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao * @T was normalized by calling RSExportType::TypeExportable(). 57462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao * @TypeName was retrieve from RSExportType::GetTypeName() before calling this. 58462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao */ 59462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao static RSExportType* Create(RSContext* Context, const Type* T, const llvm::StringRef& TypeName); 60462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 61462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao static llvm::StringRef GetTypeName(const Type* T); 62462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Return the type that can be used to create RSExportType, will always return the canonical type */ 63462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao static const Type* TypeExportable(const Type* T, llvm::SmallPtrSet<const Type*, 8>& SPS /* contain the checked type for recursion */); 64462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 65462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* This function convert the RSExportType to LLVM type. Actually, it should be "convert Clang type to LLVM type." 66462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao * However, clang doesn't make this API (lib/CodeGen/CodeGenTypes.h) public, we need to do by ourselves. 67462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao * 68462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao * Once we can get LLVM type, we can use LLVM to get alignment information, allocation size of a given type and structure 69462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao * layout that LLVM used (all of these information are target dependent) without deal with these by ourselves. 70462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao */ 71462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao virtual const llvm::Type* convertToLLVMType() const = 0; 72462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 73462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaopublic: 74462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao static bool NormalizeType(const Type*& T, llvm::StringRef& TypeName); 75462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* @T may not be normalized */ 76462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao static RSExportType* Create(RSContext* Context, const Type* T); 77462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao static RSExportType* CreateFromDecl(RSContext* Context, const VarDecl* VD); 78462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 79462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao static const Type* GetTypeOfDecl(const DeclaratorDecl* DD); 80462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 81462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao virtual ExportClass getClass() const = 0; 82462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 83462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao inline const llvm::Type* getLLVMType() const { 84462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(mLLVMType == NULL) 85462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao mLLVMType = convertToLLVMType(); 86462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return mLLVMType; 87462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 88462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 89462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Return the number of bits necessary to hold the specified RSExportType */ 90462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao static size_t GetTypeStoreSize(const RSExportType* ET); 91462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 92462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* The size of allocation of specified RSExportType (alignment considered) */ 93462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao static size_t GetTypeAllocSize(const RSExportType* ET); 94462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 95462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const std::string& getName() const { return mName; } 96462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao inline RSContext* getRSContext() const { return mContext; } 97462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}; /* RSExportType */ 98462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 99462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao/* Primitive types */ 100462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSExportPrimitiveType : public RSExportType { 101462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao friend class RSExportType; 102462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao friend class RSExportElement; 103462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaopublic: 104462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* From graphics/java/android/renderscript/Element.java: Element.DataType */ 105462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao typedef enum { 106462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao DataTypeUnknown = -1, 107462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 108462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao //DataTypeFloat16 = 1, 109462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao DataTypeFloat32 = 2, 110462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao //DataTypeFloat64 = 3, 111462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao DataTypeSigned8 = 4, 112462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao DataTypeSigned16 = 5, 113462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao DataTypeSigned32 = 6, 114462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao //DataTypeSigned64 = 7, 115462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao DataTypeUnsigned8 = 8, 116462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao DataTypeUnsigned16 = 9, 117462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao DataTypeUnsigned32 = 10, 118462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao //DataTypeUnSigned64 = 11, 119462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 120462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao DataTypeUnsigned565 = 12, 121462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao DataTypeUnsigned5551 = 13, 122462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao DataTypeUnsigned4444 = 14, 123462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 124462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao DataTypeRSElement = 15, 125462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao DataTypeRSType = 16, 126462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao DataTypeRSAllocation = 17, 127462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao DataTypeRSSampler = 18, 128462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao DataTypeRSScript = 19, 129462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao DataTypeRSMesh = 20, 130462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao DataTypeRSProgramFragment = 21, 131462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao DataTypeRSProgramVertex = 22, 132462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao DataTypeRSProgramRaster = 23, 133462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao DataTypeRSProgramStore = 24, 134462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 135462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao DataTypeMax 136462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } DataType; 137462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 138462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* From graphics/java/android/renderscript/Element.java: Element.DataKind */ 139462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao typedef enum { 140462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao DataKindUser = 0, 141462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao DataKindColor = 1, 142462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao DataKindPosition = 2, 143462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao DataKindTexture = 3, 144462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao DataKindNormal = 4, 145462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao DataKindIndex = 5, 146462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao DataKindPointSize = 6, 147462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao DataKindPixelL = 7, 148462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao DataKindPixelA = 8, 149462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao DataKindPixelLA = 9, 150462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao DataKindPixelRGB = 10, 151462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao DataKindPixelRGBA = 11 152462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } DataKind; 153462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 154462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoprivate: 155462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao DataType mType; 156462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao DataKind mKind; 157462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao bool mNormalized; 158462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 159462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao typedef llvm::StringMap<DataType> RSObjectTypeMapTy; 160462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao static RSObjectTypeMapTy* RSObjectTypeMap; 161462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 162462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao static llvm::Type* RSObjectLLVMType; 163462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 164462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao static const size_t SizeOfDataTypeInBytes[]; 165462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* 166462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao * @T was normalized by calling RSExportType::TypeExportable() before calling this. 167462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao * @TypeName was retrieved from RSExportType::GetTypeName() before calling this 168462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao */ 169462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao static RSExportPrimitiveType* Create(RSContext* Context, const Type* T, const llvm::StringRef& TypeName, DataKind DK = DataKindUser, bool Normalized = false); 170462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 171462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoprotected: 172462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* T is normalized by calling RSExportType::TypeExportable() before calling this */ 173462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao static bool IsPrimitiveType(const Type* T); 174462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 175462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao static DataType GetDataType(const Type* T); 176462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 177462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao RSExportPrimitiveType(RSContext* Context, const llvm::StringRef& Name, DataType DT, DataKind DK, bool Normalized) : 178462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao RSExportType(Context, Name), 179462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao mType(DT), 180462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao mKind(DK), 181462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao mNormalized(Normalized) 182462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 183462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 184462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 185462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 186462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao virtual const llvm::Type* convertToLLVMType() const; 187462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaopublic: 188462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* @T may not be normalized */ 189462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao static RSExportPrimitiveType* Create(RSContext* Context, const Type* T, DataKind DK = DataKindUser); 190462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 191462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao static DataType GetRSObjectType(const llvm::StringRef& TypeName); 192462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao static DataType GetRSObjectType(const Type* T); 193462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 194462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao static size_t GetSizeInBytes(const RSExportPrimitiveType* EPT); 195462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 196462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao virtual ExportClass getClass() const; 197462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 198462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao inline DataType getType() const { return mType; } 199462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao inline DataKind getKind() const { return mKind; } 200462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao inline bool isRSObjectType() const { return ((mType >= DataTypeRSElement) && (mType <= DataTypeRSProgramStore)); } 201462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}; /* RSExportPrimitiveType */ 202462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 203462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 204462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSExportPointerType : public RSExportType { 205462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao friend class RSExportType; 206462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao friend class RSExportElement; 207462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoprivate: 208462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportType* mPointeeType; 209462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 210462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao RSExportPointerType(RSContext* Context, 211462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const llvm::StringRef& Name, 212462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportType* PointeeType) : 213462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao RSExportType(Context, Name), 214462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao mPointeeType(PointeeType) 215462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 216462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 217462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 218462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 219462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* 220462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao * @PT was normalized by calling RSExportType::TypeExportable() before calling this. 221462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao */ 222462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao static RSExportPointerType* Create(RSContext* Context, const PointerType* PT, const llvm::StringRef& TypeName); 223462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 224462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao virtual const llvm::Type* convertToLLVMType() const; 225462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaopublic: 226462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao static const Type* IntegerType; 227462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 228462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao virtual ExportClass getClass() const; 229462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 230462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao inline const RSExportType* getPointeeType() const { return mPointeeType; } 231462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}; /* RSExportPointerType */ 232462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 233462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 234462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSExportVectorType : public RSExportPrimitiveType { 235462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao friend class RSExportType; 236462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao friend class RSExportElement; 237462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 238462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoprivate: 239462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao int mNumElement; /* number of element */ 240462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 241462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao RSExportVectorType(RSContext* Context, 242462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const llvm::StringRef& Name, 243462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao DataType DT, 244462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao DataKind DK, 245462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao bool Normalized, 246462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao int NumElement) : 247462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao RSExportPrimitiveType(Context, Name, DT, DK, Normalized), 248462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao mNumElement(NumElement) 249462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 250462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 251462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 252462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 253462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* 254462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao * @EVT was normalized by calling RSExportType::TypeExportable() before calling this. 255462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao */ 256462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao static RSExportVectorType* Create(RSContext* Context, const ExtVectorType* EVT, const llvm::StringRef& TypeName, DataKind DK = DataKindUser, bool Normalized = false); 257462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 258462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao static const char* VectorTypeNameStore[][3]; 259462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 260462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao virtual const llvm::Type* convertToLLVMType() const; 261462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaopublic: 262462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao static llvm::StringRef GetTypeName(const ExtVectorType* EVT); 263462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 264462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao virtual ExportClass getClass() const; 265462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 266462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao inline int getNumElement() const { return mNumElement; } 267462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}; 268462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 269462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSExportRecordType : public RSExportType { 270462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao friend class RSExportType; 271462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao friend class RSExportElement; 272462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao friend class RSExportFunc; 273462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaopublic: 274462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao class Field { 275462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao private: 276462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Link to the struct that contain this field */ 277462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportRecordType* mParent; 278462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Index in the container */ 279462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao unsigned int mIndex; 280462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportType* mType; 281462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Field name */ 282462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao std::string mName; 283462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 284462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao public: 285462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao Field(const RSExportType* T, const llvm::StringRef& Name, const RSExportRecordType* Parent, unsigned int Index) : 286462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao mType(T), 287462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao mName(Name.data(), Name.size()), 288462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao mParent(Parent), 289462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao mIndex(Index) 290462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 291462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 292462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 293462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 294462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao inline const RSExportRecordType* getParent() const { return mParent; } 295462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao inline unsigned int getIndex() const { return mIndex; } 296462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao inline const RSExportType* getType() const { return mType; } 297462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao inline const std::string& getName() const { return mName; } 298462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao size_t getOffsetInParent() const; 299462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao }; 300462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 301462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao typedef std::list<const Field*>::const_iterator const_field_iterator; 302462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 303462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao inline const_field_iterator fields_begin() const { return this->mFields.begin(); } 304462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao inline const_field_iterator fields_end() const { return this->mFields.end(); } 305462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 306462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoprivate: 307462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao std::list<const Field*> mFields; 308462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao bool mIsPacked; 309462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao bool mIsArtificial; /* Artificial export struct type is not exported by user (and thus it won't get reflected) */ 310462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 311462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao RSExportRecordType(RSContext* Context, 312462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const llvm::StringRef& Name, 313462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao bool IsPacked, 314462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao bool IsArtificial = false) : 315462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao RSExportType(Context, Name), 316462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao mIsPacked(IsPacked), 317462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao mIsArtificial(IsArtificial) 318462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 319462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 320462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 321462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 322462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* 323462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao * @RT was normalized by calling RSExportType::TypeExportable() before calling this. 324462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao * @TypeName was retrieved from RSExportType::GetTypeName() before calling this. 325462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao */ 326462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao static RSExportRecordType* Create(RSContext* Context, const RecordType* RT, const llvm::StringRef& TypeName, bool mIsArtificial = false); 327462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 328462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao virtual const llvm::Type* convertToLLVMType() const; 329462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaopublic: 330462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao virtual ExportClass getClass() const; 331462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 332462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao inline bool isPacked() const { return mIsPacked; } 333462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao inline bool isArtificial() const { return mIsArtificial; } 334462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 335462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao ~RSExportRecordType() { 336462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao for(std::list<const Field*>::iterator it = mFields.begin(); 337462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao it != mFields.end(); 338462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao it++) 339462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(*it != NULL) 340462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao delete *it; 341462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 342462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 343462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}; /* RSExportRecordType */ 344462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 345462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} /* namespace slang */ 346462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 347462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#endif /* _SLANG_COMPILER_RS_EXPORT_TYPE_HPP */ 348