slang_rs_export_type.cpp revision 0a3f20ec28ed6f5ae1ed5d61f6b6e3e577f7f5d1
1462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <vector> 2462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "slang_rs_context.hpp" 4462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "slang_rs_export_type.hpp" 5462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "slang_rs_export_element.hpp" 6462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 7462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "llvm/Type.h" 8462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "llvm/DerivedTypes.h" 9462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 10462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "llvm/ADT/StringExtras.h" /* for function llvm::utostr_32() */ 11462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "llvm/Target/TargetData.h" /* for class llvm::TargetData and class llvm::StructLayout */ 12462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 130a3f20ec28ed6f5ae1ed5d61f6b6e3e577f7f5d1Shih-wei Liao#include "clang/AST/RecordLayout.h" 140a3f20ec28ed6f5ae1ed5d61f6b6e3e577f7f5d1Shih-wei Liao 15462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace slang { 16462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 17462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao/****************************** RSExportType ******************************/ 18462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaobool RSExportType::NormalizeType(const Type*& T, llvm::StringRef& TypeName) { 19462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao llvm::SmallPtrSet<const Type*, 8> SPS = llvm::SmallPtrSet<const Type*, 8>(); 20462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 211f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao if((T = RSExportType::TypeExportable(T, SPS)) == NULL) 22462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* TODO: warning the user: type not exportable */ 23462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return false; 24462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 25462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Get type name */ 26462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao TypeName = RSExportType::GetTypeName(T); 27462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(TypeName.empty()) 28462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* TODO: warning the user: the type is unnmaed */ 29462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return false; 30462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 31462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return true; 32462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 33462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 34462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoconst Type* RSExportType::GetTypeOfDecl(const DeclaratorDecl* DD) { 35462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(DD && DD->getTypeSourceInfo()) { 36462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao QualType T = DD->getTypeSourceInfo()->getType(); 37462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(T.isNull()) 38462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return NULL; 39462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else 40462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return T.getTypePtr(); 41462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 42462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 43462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 44462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaollvm::StringRef RSExportType::GetTypeName(const Type* T) { 45462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao T = GET_CANONICAL_TYPE(T); 46462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(T == NULL) 47462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return llvm::StringRef(); 48462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 49462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao switch(T->getTypeClass()) { 50462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case Type::Builtin: 51462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 52462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const BuiltinType* BT = UNSAFE_CAST_TYPE(BuiltinType, T); 53462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 54462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao switch(BT->getKind()) { 55462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define SLANG_RS_SUPPORT_BUILTIN_TYPE(builtin_type, type) \ 56462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case builtin_type: \ 57462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Compiler is smart enough to optimize following *big if branches* since they all become "constant comparison" after macro expansion */ \ 58462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(type == RSExportPrimitiveType::DataTypeFloat32) return "float"; \ 59462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else if(type == RSExportPrimitiveType::DataTypeUnsigned8) return "uchar"; \ 60462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else if(type == RSExportPrimitiveType::DataTypeUnsigned16) return "ushort"; \ 61462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else if(type == RSExportPrimitiveType::DataTypeUnsigned32) return "uint"; \ 62462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else if(type == RSExportPrimitiveType::DataTypeSigned8) return "char"; \ 63462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else if(type == RSExportPrimitiveType::DataTypeSigned16) return "short"; \ 64462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else if(type == RSExportPrimitiveType::DataTypeSigned32) return "int"; \ 651f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao else if(type == RSExportPrimitiveType::DataTypeBool) return "bool"; \ 66462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else assert(false && "Unknow data type of supported builtin"); \ 67462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 68462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "slang_rs_export_type_support.inc" 69462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 70462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao default: assert(false && "Unknow data type of the builtin"); break; 71462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 72462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 73462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 74462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 75462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case Type::Record: 76462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 77462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RecordDecl* RD = T->getAsStructureType()->getDecl(); 78462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao llvm::StringRef Name = RD->getName(); 79462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(Name.empty()) { 801f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao if(RD->getTypedefForAnonDecl() != NULL) 81462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao Name = RD->getTypedefForAnonDecl()->getName(); 82462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 83462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(Name.empty()) 84462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Try to find a name from redeclaration (i.e. typedef) */ 85462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao for(TagDecl::redecl_iterator RI = RD->redecls_begin(); 86462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao RI != RD->redecls_end(); 87462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao RI++) 88462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 89462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao assert(*RI != NULL && "cannot be NULL object"); 90462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 91462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao Name = (*RI)->getName(); 92462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(!Name.empty()) 93462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 94462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 95462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 96462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return Name; 97462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 98462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 99462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 100462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case Type::Pointer: 101462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 102462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* "*" plus pointee name */ 103462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const Type* PT = GET_POINTEE_TYPE(T); 104462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao llvm::StringRef PointeeName; 105462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(NormalizeType(PT, PointeeName)) { 106462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao char* Name = new char[ 1 /* * */ + PointeeName.size() ]; 107462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao Name[0] = '*'; 108462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao memcpy(Name + 1, PointeeName.data(), PointeeName.size()); 109462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return Name; 110462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 111462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 112462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 113462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 114462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case Type::ExtVector: 115462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 116462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const ExtVectorType* EVT = UNSAFE_CAST_TYPE(ExtVectorType, T); 117462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return RSExportVectorType::GetTypeName(EVT); 118462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 119462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 120462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 121462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao default: 122462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 123462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 124462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 125462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return llvm::StringRef(); 126462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 127462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 128462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoconst Type* RSExportType::TypeExportable(const Type* T, llvm::SmallPtrSet<const Type*, 8>& SPS) { 129462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Normailize first */ 130462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if((T = GET_CANONICAL_TYPE(T)) == NULL) 131462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return NULL; 132462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 133462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(SPS.count(T)) 134462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return T; 1351f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao 136462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao switch(T->getTypeClass()) { 137462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case Type::Builtin: 138462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 139462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const BuiltinType* BT = UNSAFE_CAST_TYPE(BuiltinType, T); 140462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 141462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao switch(BT->getKind()) { 142462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define SLANG_RS_SUPPORT_BUILTIN_TYPE(builtin_type, type) \ 143462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case builtin_type: 144462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "slang_rs_export_type_support.inc" 145462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return T; 146462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 147462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 148462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao default: 149462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return NULL; 150462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 151462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 152462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 153462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 154462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 155462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case Type::Record: 156462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 157462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(RSExportPrimitiveType::GetRSObjectType(T) != RSExportPrimitiveType::DataTypeUnknown) 158462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return T; /* RS object type, no further checks are needed */ 159462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 160462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Check internal struct */ 161462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RecordDecl* RD = T->getAsStructureType()->getDecl(); 162462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(RD != NULL) 163462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao RD = RD->getDefinition(); 164462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 165462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Fast check */ 1661f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao if(RD->hasFlexibleArrayMember() || RD->hasObjectMember()) 167462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return NULL; 1681f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao 169462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Insert myself into checking set */ 170462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao SPS.insert(T); 171462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 172462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Check all element */ 173462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao for(RecordDecl::field_iterator F = RD->field_begin(); 174462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao F != RD->field_end(); 175462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao F++) 176462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 177462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const Type* FT = GetTypeOfDecl(*F); 178462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao FT = GET_CANONICAL_TYPE(FT); 179462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1801f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao if(!TypeExportable(FT, SPS)) 181462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* TODO: warning: unsupported field type */ 182462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return NULL; 183462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 184462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 185462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return T; 186462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 187462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 188462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 189462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case Type::Pointer: 190462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 191462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const PointerType* PT = UNSAFE_CAST_TYPE(PointerType, T); 192462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const Type* PointeeType = GET_POINTEE_TYPE(PT); 193462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 194462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if((PointeeType->getTypeClass() != Type::Pointer) && (TypeExportable(PointeeType, SPS) == NULL) ) 195462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return NULL; 196462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return T; 197462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 198462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 199462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 200462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case Type::ExtVector: 201462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 202462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const ExtVectorType* EVT = UNSAFE_CAST_TYPE(ExtVectorType, T); 203462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Check element numbers */ 204462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(EVT->getNumElements() < 2 || EVT->getNumElements() > 4) /* only support vector with size 2, 3 and 4 */ 205462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return NULL; 206462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 207462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Check base element type */ 208462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const Type* ElementType = GET_EXT_VECTOR_ELEMENT_TYPE(EVT); 209462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 210462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if((ElementType->getTypeClass() != Type::Builtin) || (TypeExportable(ElementType, SPS) == NULL)) 211462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return NULL; 212462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return T; 213462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 214462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 215462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 216462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao default: 217462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return NULL; 218462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 219462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 220462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 221462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 222462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei LiaoRSExportType* RSExportType::Create(RSContext* Context, const Type* T, const llvm::StringRef& TypeName) { 2231f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao /* 2241f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao * Lookup the context to see whether the type was processed before. 2251f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao * Newly create RSExportType will insert into context in RSExportType::RSExportType() 226462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao */ 227462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao RSContext::export_type_iterator ETI = Context->findExportType(TypeName); 228462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2291f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao if(ETI != Context->export_types_end()) 230462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return ETI->second; 231462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 232462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao RSExportType* ET = NULL; 233462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao switch(T->getTypeClass()) { 234462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case Type::Record: 235462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(RSExportPrimitiveType::GetRSObjectType(TypeName) != RSExportPrimitiveType::DataTypeUnknown) 236462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao ET = RSExportPrimitiveType::Create(Context, T, TypeName); 237462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else 238462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao ET = RSExportRecordType::Create(Context, T->getAsStructureType(), TypeName); 239462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 240462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 241462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case Type::Builtin: 242462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao ET = RSExportPrimitiveType::Create(Context, T, TypeName); 243462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 244462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 245462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case Type::Pointer: 246462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao ET = RSExportPointerType::Create(Context, UNSAFE_CAST_TYPE(PointerType, T), TypeName); 247462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* free the name (allocated in RSExportType::GetTypeName) */ 248462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao delete [] TypeName.data(); 249462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 250462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 251462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case Type::ExtVector: 252462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao ET = RSExportVectorType::Create(Context, UNSAFE_CAST_TYPE(ExtVectorType, T), TypeName); 253462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 254462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 255462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao default: 256462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* TODO: warning: type is not exportable */ 257462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao printf("RSExportType::Create : type '%s' is not exportable\n", T->getTypeClassName()); 258462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 259462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 260462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 261462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return ET; 262462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2631f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao 264462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei LiaoRSExportType* RSExportType::Create(RSContext* Context, const Type* T) { 265462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao llvm::StringRef TypeName; 266462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(NormalizeType(T, TypeName)) 267462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return Create(Context, T, TypeName); 268462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else 269462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return NULL; 270462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 271462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 272462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei LiaoRSExportType* RSExportType::CreateFromDecl(RSContext* Context, const VarDecl* VD) { 273462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return RSExportType::Create(Context, GetTypeOfDecl(VD)); 274462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 275462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 276462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaosize_t RSExportType::GetTypeStoreSize(const RSExportType* ET) { 277462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return ET->getRSContext()->getTargetData()->getTypeStoreSize(ET->getLLVMType()); 278462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 279462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 280462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaosize_t RSExportType::GetTypeAllocSize(const RSExportType* ET) { 2810a3f20ec28ed6f5ae1ed5d61f6b6e3e577f7f5d1Shih-wei Liao if(ET->getClass() == RSExportType::ExportClassRecord) 2820a3f20ec28ed6f5ae1ed5d61f6b6e3e577f7f5d1Shih-wei Liao return static_cast<const RSExportRecordType*>(ET)->getAllocSize(); 2830a3f20ec28ed6f5ae1ed5d61f6b6e3e577f7f5d1Shih-wei Liao else 2840a3f20ec28ed6f5ae1ed5d61f6b6e3e577f7f5d1Shih-wei Liao return ET->getRSContext()->getTargetData()->getTypeAllocSize(ET->getLLVMType()); 285462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 286462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2871f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei LiaoRSExportType::RSExportType(RSContext* Context, const llvm::StringRef& Name) : 2881f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao mContext(Context), 2891f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao mName(Name.data(), Name.size()), /* make a copy on Name since data of @Name which is stored in ASTContext will be destroyed later */ 290462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao mLLVMType(NULL) 2911f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao{ 292462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* TODO: need to check whether the insertion is successful or not */ 293462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao Context->insertExportType(Name, this); 2941f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao return; 295462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 296462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 297462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao/****************************** RSExportPrimitiveType ******************************/ 298462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei LiaoRSExportPrimitiveType::RSObjectTypeMapTy* RSExportPrimitiveType::RSObjectTypeMap = NULL; 299462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaollvm::Type* RSExportPrimitiveType::RSObjectLLVMType = NULL; 300462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 301462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaobool RSExportPrimitiveType::IsPrimitiveType(const Type* T) { 302462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if((T != NULL) && (T->getTypeClass() == Type::Builtin)) 303462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return true; 304462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else 305462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return false; 306462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 307462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 308462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei LiaoRSExportPrimitiveType::DataType RSExportPrimitiveType::GetRSObjectType(const llvm::StringRef& TypeName) { 309462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(TypeName.empty()) 310462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return DataTypeUnknown; 311462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 312462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(RSObjectTypeMap == NULL) { 313462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao RSObjectTypeMap = new RSObjectTypeMapTy(16); 314462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 315462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define USE_ELEMENT_DATA_TYPE 316462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define DEF_RS_OBJECT_TYPE(type, name) \ 317462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao RSObjectTypeMap->GetOrCreateValue(name, GET_ELEMENT_DATA_TYPE(type)); 318462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "slang_rs_export_element_support.inc" 319462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 320462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 321462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao RSObjectTypeMapTy::const_iterator I = RSObjectTypeMap->find(TypeName); 322462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(I == RSObjectTypeMap->end()) 323462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return DataTypeUnknown; 324462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else 325462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return I->getValue(); 326462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 327462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 328462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei LiaoRSExportPrimitiveType::DataType RSExportPrimitiveType::GetRSObjectType(const Type* T) { 329462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao T = GET_CANONICAL_TYPE(T); 330462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if((T == NULL) || (T->getTypeClass() != Type::Record)) 331462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return DataTypeUnknown; 332462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 333462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return GetRSObjectType( RSExportType::GetTypeName(T) ); 334462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 335462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3361f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liaoconst size_t RSExportPrimitiveType::SizeOfDataTypeInBits[RSExportPrimitiveType::DataTypeMax + 1] = { 337462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 0, 3381f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao 16, /* DataTypeFloat16 */ 3391f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao 32, /* DataTypeFloat32 */ 3401f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao 64, /* DataTypeFloat64 */ 3411f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao 8, /* DataTypeSigned8 */ 3421f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao 16, /* DataTypeSigned16 */ 3431f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao 32, /* DataTypeSigned32 */ 3441f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao 64, /* DataTypeSigned64 */ 3451f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao 8, /* DataTypeUnsigned8 */ 3461f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao 16, /* DataTypeUnsigned16 */ 3471f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao 32, /* DataTypeUnsigned32 */ 3481f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao 64, /* DataTypeUnSigned64 */ 3491f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao 3501f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao 16, /* DataTypeUnsigned565 */ 3511f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao 16, /* DataTypeUnsigned5551 */ 3521f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao 16, /* DataTypeUnsigned4444 */ 3531f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao 3541f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao 1, /* DataTypeBool */ 3551f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao 3561f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao 32, /* DataTypeRSElement */ 3571f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao 32, /* DataTypeRSType */ 3581f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao 32, /* DataTypeRSAllocation */ 3591f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao 32, /* DataTypeRSSampler */ 3601f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao 32, /* DataTypeRSScript */ 3611f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao 32, /* DataTypeRSMesh */ 3621f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao 32, /* DataTypeRSProgramFragment */ 3631f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao 32, /* DataTypeRSProgramVertex */ 3641f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao 32, /* DataTypeRSProgramRaster */ 3651f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao 32, /* DataTypeRSProgramStore */ 3661f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao 32, /* DataTypeRSFont */ 367462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 0 368462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}; 369462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3701f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liaosize_t RSExportPrimitiveType::GetSizeInBits(const RSExportPrimitiveType* EPT) { 3711f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao assert(((EPT->getType() >= DataTypeFloat32) && (EPT->getType() < DataTypeMax)) && "RSExportPrimitiveType::GetSizeInBits : unknown data type"); 3721f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao return SizeOfDataTypeInBits[ static_cast<int>(EPT->getType()) ]; 373462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 374462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 375462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei LiaoRSExportPrimitiveType::DataType RSExportPrimitiveType::GetDataType(const Type* T) { 376462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(T == NULL) 377462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return DataTypeUnknown; 378462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 379462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao switch(T->getTypeClass()) { 380462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case Type::Builtin: 381462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 382462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const BuiltinType* BT = UNSAFE_CAST_TYPE(BuiltinType, T); 383462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao switch(BT->getKind()) { 384462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define SLANG_RS_SUPPORT_BUILTIN_TYPE(builtin_type, type) \ 385462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case builtin_type: \ 386462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return type; \ 387462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 388462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "slang_rs_export_type_support.inc" 389462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 390462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* The size of types Long, ULong and WChar depend on platform so we abandon the support to them */ 391462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Type of its size exceeds 32 bits (e.g. int64_t, double, etc.) does not support */ 392462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 393462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao default: 394462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* TODO: warning the user: unsupported type */ 395462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao printf("RSExportPrimitiveType::GetDataType : built-in type has no corresponding data type for built-in type"); 396462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 397462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 398462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 399462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 400462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 401462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case Type::Record: 402462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* must be RS object type */ 403462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return RSExportPrimitiveType::GetRSObjectType(T); 404462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 405462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 406462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao default: 407462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao printf("RSExportPrimitiveType::GetDataType : type '%s' is not supported primitive type", T->getTypeClassName()); 408462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 409462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 410462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 411462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return DataTypeUnknown; 412462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 413462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 414462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei LiaoRSExportPrimitiveType* RSExportPrimitiveType::Create(RSContext* Context, const Type* T, const llvm::StringRef& TypeName, DataKind DK, bool Normalized) { 415462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao DataType DT = GetDataType(T); 416462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 417462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if((DT == DataTypeUnknown) || TypeName.empty()) 418462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return NULL; 419462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else 420462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return new RSExportPrimitiveType(Context, TypeName, DT, DK, Normalized); 421462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 422462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 423462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei LiaoRSExportPrimitiveType* RSExportPrimitiveType::Create(RSContext* Context, const Type* T, DataKind DK) { 424462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao llvm::StringRef TypeName; 425462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(RSExportType::NormalizeType(T, TypeName) && IsPrimitiveType(T)) 426462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return Create(Context, T, TypeName, DK); 427462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else 428462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return NULL; 429462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 430462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 4311f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei LiaoRSExportType::ExportClass RSExportPrimitiveType::getClass() const { 4321f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao return RSExportType::ExportClassPrimitive; 433462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 434462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 435462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoconst llvm::Type* RSExportPrimitiveType::convertToLLVMType() const { 436462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao llvm::LLVMContext& C = getRSContext()->getLLVMContext(); 437462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 438462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(isRSObjectType()) { 439462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* struct { int* p; } __attribute__((packed, aligned(pointer_size))) which is <{ [1 x i32] }> in LLVM */ 440462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(RSObjectLLVMType == NULL) { 441462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao std::vector<const llvm::Type*> Elements; 442462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao Elements.push_back( llvm::ArrayType::get(llvm::Type::getInt32Ty(C), 1) ); 443462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao RSObjectLLVMType = llvm::StructType::get(C, Elements, true); 444462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 445462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return RSObjectLLVMType; 446462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 447462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 448462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao switch(mType) { 4491f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao case DataTypeFloat32: 4501f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao return llvm::Type::getFloatTy(C); 451462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 452462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 453462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case DataTypeSigned8: 454462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case DataTypeUnsigned8: 4551f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao return llvm::Type::getInt8Ty(C); 456462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 457462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 458462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case DataTypeSigned16: 459462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case DataTypeUnsigned16: 460462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case DataTypeUnsigned565: 461462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case DataTypeUnsigned5551: 462462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case DataTypeUnsigned4444: 4631f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao return llvm::Type::getInt16Ty(C); 464462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 465462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 466462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case DataTypeSigned32: 467462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case DataTypeUnsigned32: 4681f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao return llvm::Type::getInt32Ty(C); 4691f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao break; 4701f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao 4711f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao case DataTypeBool: 4721f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao return llvm::Type::getInt1Ty(C); 473462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 474462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 475462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao default: 476462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao assert(false && "Unknown data type"); 477462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 478462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 479462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 480462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return NULL; 481462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 482462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 483462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao/****************************** RSExportPointerType ******************************/ 484462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 485462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoconst Type* RSExportPointerType::IntegerType = NULL; 486462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 487462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei LiaoRSExportPointerType* RSExportPointerType::Create(RSContext* Context, const PointerType* PT, const llvm::StringRef& TypeName) { 488462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const Type* PointeeType = GET_POINTEE_TYPE(PT); 489462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportType* PointeeET; 490462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 491462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(PointeeType->getTypeClass() != Type::Pointer) { 492462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao PointeeET = RSExportType::Create(Context, PointeeType); 493462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } else { 494462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Double or higher dimension of pointer, export as int* */ 495462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao assert(IntegerType != NULL && "Built-in integer type is not set"); 496462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao PointeeET = RSExportPrimitiveType::Create(Context, IntegerType); 497462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 498462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 499462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(PointeeET == NULL) { 500462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao printf("Failed to create type for pointee"); 501462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return NULL; 502462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 503462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 504462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return new RSExportPointerType(Context, TypeName, PointeeET); 505462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 506462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 5071f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei LiaoRSExportType::ExportClass RSExportPointerType::getClass() const { 508462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return RSExportType::ExportClassPointer; 509462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 510462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 511462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoconst llvm::Type* RSExportPointerType::convertToLLVMType() const { 512462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const llvm::Type* PointeeType = mPointeeType->getLLVMType(); 513462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return llvm::PointerType::getUnqual(PointeeType); 514462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 515462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 516462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao/****************************** RSExportVectorType ******************************/ 5171f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liaoconst char* RSExportVectorType::VectorTypeNameStore[][3] = { 518462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* 0 */ { "char2", "char3", "char4" }, 519462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* 1 */ { "uchar2", "uchar3", "uchar4" }, 520462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* 2 */ { "short2", "short3", "short4" }, 521462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* 3 */ { "ushort2", "ushort3", "ushort4" }, 522462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* 4 */ { "int2", "int3", "int4" }, 523462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* 5 */ { "uint2", "uint3", "uint4" }, 524462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* 6 */ { "float2", "float3", "float4" }, 5251f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao}; 526462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 527462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaollvm::StringRef RSExportVectorType::GetTypeName(const ExtVectorType* EVT) { 528462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const Type* ElementType = GET_EXT_VECTOR_ELEMENT_TYPE(EVT); 529462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 530462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if((ElementType->getTypeClass() != Type::Builtin)) 531462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return llvm::StringRef(); 532462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 533462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const BuiltinType* BT = UNSAFE_CAST_TYPE(BuiltinType, ElementType); 534462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const char** BaseElement = NULL; 535462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 536462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao switch(BT->getKind()) { 537462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define SLANG_RS_SUPPORT_BUILTIN_TYPE(builtin_type, type) \ 538462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case builtin_type: \ 539462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Compiler is smart enough to optimize following *big if branches* since they all become "constant comparison" after macro expansion */ \ 540462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(type == RSExportPrimitiveType::DataTypeSigned8) BaseElement = VectorTypeNameStore[0]; \ 541462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else if(type == RSExportPrimitiveType::DataTypeUnsigned8) BaseElement = VectorTypeNameStore[1]; \ 542462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else if(type == RSExportPrimitiveType::DataTypeSigned16) BaseElement = VectorTypeNameStore[2]; \ 543462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else if(type == RSExportPrimitiveType::DataTypeUnsigned16) BaseElement = VectorTypeNameStore[3]; \ 544462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else if(type == RSExportPrimitiveType::DataTypeSigned32) BaseElement = VectorTypeNameStore[4]; \ 545462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else if(type == RSExportPrimitiveType::DataTypeUnsigned32) BaseElement = VectorTypeNameStore[5]; \ 546462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else if(type == RSExportPrimitiveType::DataTypeFloat32) BaseElement = VectorTypeNameStore[6]; \ 5471f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao else if(type == RSExportPrimitiveType::DataTypeBool) BaseElement = VectorTypeNameStore[0]; \ 548462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 549462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "slang_rs_export_type_support.inc" 550462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 551462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao default: return llvm::StringRef(); break; 552462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 553462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 554462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if((BaseElement != NULL) && (EVT->getNumElements() > 1) && (EVT->getNumElements() <= 4)) 555462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return BaseElement[EVT->getNumElements() - 2]; 556462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else 557462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return llvm::StringRef(); 558462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 559462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 560462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei LiaoRSExportVectorType* RSExportVectorType::Create(RSContext* Context, const ExtVectorType* EVT, const llvm::StringRef& TypeName, DataKind DK, bool Normalized) { 561462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao assert(EVT != NULL && EVT->getTypeClass() == Type::ExtVector); 562462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 563462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const Type* ElementType = GET_EXT_VECTOR_ELEMENT_TYPE(EVT); 564462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao RSExportPrimitiveType::DataType DT = RSExportPrimitiveType::GetDataType(ElementType); 565462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 5661f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao if(DT != RSExportPrimitiveType::DataTypeUnknown) 567462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return new RSExportVectorType(Context, TypeName, DT, DK, Normalized, EVT->getNumElements()); 568462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else 569462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao printf("RSExportVectorType::Create : unsupported base element type\n"); 570462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 571462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 5721f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei LiaoRSExportType::ExportClass RSExportVectorType::getClass() const { 5731f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao return RSExportType::ExportClassVector; 574462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 575462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 576462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoconst llvm::Type* RSExportVectorType::convertToLLVMType() const { 577462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const llvm::Type* ElementType = RSExportPrimitiveType::convertToLLVMType(); 578462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return llvm::VectorType::get(ElementType, getNumElement()); 579462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 580462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 581462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao/****************************** RSExportRecordType ******************************/ 582462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei LiaoRSExportRecordType* RSExportRecordType::Create(RSContext* Context, const RecordType* RT, const llvm::StringRef& TypeName, bool mIsArtificial) { 583462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao assert(RT != NULL && RT->getTypeClass() == Type::Record); 584462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 585462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RecordDecl* RD = RT->getDecl(); 586462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao assert(RD->isStruct()); 587462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 588462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao RD = RD->getDefinition(); 589462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(RD == NULL) { 590462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* TODO: warning: actual struct definition isn't declared in this moudle */ 591462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao printf("RSExportRecordType::Create : this struct is not defined in this module."); 592462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return NULL; 593462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 594462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 595462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao RSExportRecordType* ERT = new RSExportRecordType(Context, TypeName, RD->hasAttr<PackedAttr>(), mIsArtificial); 596462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao unsigned int Index = 0; 597462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 598462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao for(RecordDecl::field_iterator fit = RD->field_begin(); 599462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao fit != RD->field_end(); 600462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao fit++, Index++) 601462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 602462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define FAILED_CREATE_FIELD(err) do { \ 603462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(*err) \ 604462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao printf("RSExportRecordType::Create : failed to create field (%s)\n", err); \ 605462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao delete ERT; \ 606462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return NULL; \ 607462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } while(false) 608462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* FIXME: All fields should be primitive type */ 609462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao assert((*fit)->getKind() == Decl::Field); 610462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao FieldDecl* FD = *fit; 611462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 612462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* We don't support bit field TODO: allow bitfield with size 8, 16, 32 */ 613462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(FD->isBitField()) 614462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao FAILED_CREATE_FIELD("bit field is not supported"); 615462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 616462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Type */ 617462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao RSExportType* ET = RSExportElement::CreateFromDecl(Context, FD); 618462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 619462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(ET != NULL) 620462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao ERT->mFields.push_back( new Field(ET, FD->getName(), ERT, Index) ); 621462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else 622462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao FAILED_CREATE_FIELD(FD->getName().str().c_str()); 623462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#undef FAILED_CREATE_FIELD 624462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 625462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 6260a3f20ec28ed6f5ae1ed5d61f6b6e3e577f7f5d1Shih-wei Liao 6270a3f20ec28ed6f5ae1ed5d61f6b6e3e577f7f5d1Shih-wei Liao const ASTRecordLayout &ASTRL = Context->getASTContext()->getASTRecordLayout(RD); 6280a3f20ec28ed6f5ae1ed5d61f6b6e3e577f7f5d1Shih-wei Liao ERT->AllocSize = (ASTRL.getSize() > ASTRL.getDataSize()) ? (ASTRL.getSize() >> 3) : (ASTRL.getDataSize() >> 3); 6290a3f20ec28ed6f5ae1ed5d61f6b6e3e577f7f5d1Shih-wei Liao 630462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return ERT; 631462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 632462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 633462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei LiaoRSExportType::ExportClass RSExportRecordType::getClass() const { 634462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return RSExportType::ExportClassRecord; 635462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 636462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 637462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoconst llvm::Type* RSExportRecordType::convertToLLVMType() const { 638462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao std::vector<const llvm::Type*> FieldTypes; 639462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 640462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao for(const_field_iterator FI = fields_begin(); 641462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao FI != fields_end(); 642462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao FI++) 643462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 644462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const Field* F = *FI; 645462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportType* FET = F->getType(); 6461f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao 647462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao FieldTypes.push_back(FET->getLLVMType()); 648462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 649462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 650462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return llvm::StructType::get(getRSContext()->getLLVMContext(), FieldTypes, mIsPacked); 651462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 652462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 653462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao/****************************** RSExportRecordType::Field ******************************/ 654462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaosize_t RSExportRecordType::Field::getOffsetInParent() const { 655462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Struct layout obtains below will be cached by LLVM */ 656462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const llvm::StructLayout* SL = mParent->getRSContext()->getTargetData()->getStructLayout(static_cast<const llvm::StructType*>(mParent->getLLVMType())); 657462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return SL->getElementOffset(mIndex); 658462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 659462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 660462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} /* namespace slang */ 661