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