slang_rs_export_type.cpp revision 1b6a0883cd6984e11e59b0c847fb334df1f41afc
1c383a500aa59423264811be3874461bf8adbfea0Zonr Chang/* 2c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Copyright 2010, The Android Open Source Project 3c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * 4c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Licensed under the Apache License, Version 2.0 (the "License"); 5c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * you may not use this file except in compliance with the License. 6c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * You may obtain a copy of the License at 7c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * 8c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * http://www.apache.org/licenses/LICENSE-2.0 9c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * 10c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Unless required by applicable law or agreed to in writing, software 11c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * distributed under the License is distributed on an "AS IS" BASIS, 12c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * See the License for the specific language governing permissions and 14c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * limitations under the License. 15c383a500aa59423264811be3874461bf8adbfea0Zonr Chang */ 16c383a500aa59423264811be3874461bf8adbfea0Zonr Chang 176315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_export_type.h" 186315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr 19e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include <list> 206315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include <vector> 21462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 22e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "clang/AST/RecordLayout.h" 23462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "llvm/ADT/StringExtras.h" 25e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 26e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "llvm/DerivedTypes.h" 27e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "llvm/Target/TargetData.h" 29462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 30e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "llvm/Type.h" 310a3f20ec28ed6f5ae1ed5d61f6b6e3e577f7f5d1Shih-wei Liao 326e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines#include "slang_assert.h" 336315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_context.h" 346315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_export_element.h" 35a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang#include "slang_rs_type_spec.h" 36462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 37641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang#define CHECK_PARENT_EQUALITY(ParentClass, E) \ 38641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang if (!ParentClass::equals(E)) \ 39641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang return false; 40641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 41e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hinesnamespace slang { 42462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 43e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hinesnamespace { 44462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 45fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hinesstatic RSReflectionType gReflectionTypes[] = { 46fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines {"FLOAT_16", "F16", 16, "half", "half", "Half", "Half", false}, 47fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines {"FLOAT_32", "F32", 32, "float", "float", "Float", "Float", false}, 48fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines {"FLOAT_64", "F64", 64, "double", "double", "Double", "Double",false}, 49fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines {"SIGNED_8", "I8", 8, "int8_t", "byte", "Byte", "Byte", false}, 50fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines {"SIGNED_16", "I16", 16, "int16_t", "short", "Short", "Short", false}, 51fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines {"SIGNED_32", "I32", 32, "int32_t", "int", "Int", "Int", false}, 52fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines {"SIGNED_64", "I64", 64, "int64_t", "long", "Long", "Long", false}, 5347aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines {"UNSIGNED_8", "U8", 8, "uint8_t", "short", "UByte", "Short", true}, 5447aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines {"UNSIGNED_16", "U16", 16, "uint16_t", "int", "UShort", "Int", true}, 5547aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines {"UNSIGNED_32", "U32", 32, "uint32_t", "long", "UInt", "Long", true}, 5647aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines {"UNSIGNED_64", "U64", 64, "uint64_t", "long", "ULong", "Long", false}, 57fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines 5847aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines {"BOOLEAN", "BOOLEAN", 8, "bool", "boolean", NULL, NULL, false}, 59fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines 60fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines {"UNSIGNED_5_6_5", NULL, 16, NULL, NULL, NULL, NULL, false}, 61fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines {"UNSIGNED_5_5_5_1", NULL, 16, NULL, NULL, NULL, NULL, false}, 62fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines {"UNSIGNED_4_4_4_4", NULL, 16, NULL, NULL, NULL, NULL, false}, 63fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines 64fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines {"MATRIX_2X2", NULL, 4*32, "rsMatrix_2x2", "Matrix2f", NULL, NULL, false}, 65fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines {"MATRIX_3X3", NULL, 9*32, "rsMatrix_3x3", "Matrix3f", NULL, NULL, false}, 66fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines {"MATRIX_4X4", NULL, 16*32, "rsMatrix_4x4", "Matrix4f", NULL, NULL, false}, 67fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines 68fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines {"RS_ELEMENT", "ELEMENT", 32, "Element", "Element", NULL, NULL, false}, 69fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines {"RS_TYPE", "TYPE", 32, "Type", "Type", NULL, NULL, false}, 70fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines {"RS_ALLOCATION", "ALLOCATION", 32, "Allocation", "Allocation", NULL, NULL, false}, 71fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines {"RS_SAMPLER", "SAMPLER", 32, "Sampler", "Sampler", NULL, NULL, false}, 72fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines {"RS_SCRIPT", "SCRIPT", 32, "Script", "Script", NULL, NULL, false}, 73fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines {"RS_MESH", "MESH", 32, "Mesh", "Mesh", NULL, NULL, false}, 74fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines {"RS_PATH", "PATH", 32, "Path", "Path", NULL, NULL, false}, 75fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines {"RS_PROGRAM_FRAGMENT", "PROGRAM_FRAGMENT", 32, "ProgramFragment", "ProgramFragment", NULL, NULL, false}, 76fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines {"RS_PROGRAM_VERTEX", "PROGRAM_VERTEX", 32, "ProgramVertex", "ProgramVertex", NULL, NULL, false}, 77fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines {"RS_PROGRAM_RASTER", "PROGRAM_RASTER", 32, "ProgramRaster", "ProgramRaster", NULL, NULL, false}, 78fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines {"RS_PROGRAM_STORE", "PROGRAM_STORE", 32, "ProgramStore", "ProgramStore", NULL, NULL, false}, 79fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines {"RS_FONT", "FONT", 32, "Font", "Font", NULL, NULL, false} 80fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines}; 81fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines 8224e79f69125cf87fcaa78c04510a831037203eebStephen Hinesstatic const clang::Type *TypeExportableHelper( 8324e79f69125cf87fcaa78c04510a831037203eebStephen Hines const clang::Type *T, 8424e79f69125cf87fcaa78c04510a831037203eebStephen Hines llvm::SmallPtrSet<const clang::Type*, 8>& SPS, 859207a2e495c8363606861e4f034504ec5c153dabLogan Chien clang::DiagnosticsEngine *DiagEngine, 8624e79f69125cf87fcaa78c04510a831037203eebStephen Hines const clang::VarDecl *VD, 8724e79f69125cf87fcaa78c04510a831037203eebStephen Hines const clang::RecordDecl *TopLevelRecord); 8824e79f69125cf87fcaa78c04510a831037203eebStephen Hines 899207a2e495c8363606861e4f034504ec5c153dabLogan Chienstatic void ReportTypeError(clang::DiagnosticsEngine *DiagEngine, 9024e79f69125cf87fcaa78c04510a831037203eebStephen Hines const clang::VarDecl *VD, 9124e79f69125cf87fcaa78c04510a831037203eebStephen Hines const clang::RecordDecl *TopLevelRecord, 9224e79f69125cf87fcaa78c04510a831037203eebStephen Hines const char *Message) { 939207a2e495c8363606861e4f034504ec5c153dabLogan Chien if (!DiagEngine) { 9424e79f69125cf87fcaa78c04510a831037203eebStephen Hines return; 9524e79f69125cf87fcaa78c04510a831037203eebStephen Hines } 9624e79f69125cf87fcaa78c04510a831037203eebStephen Hines 979207a2e495c8363606861e4f034504ec5c153dabLogan Chien const clang::SourceManager &SM = DiagEngine->getSourceManager(); 9878e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines 9924e79f69125cf87fcaa78c04510a831037203eebStephen Hines // Attempt to use the type declaration first (if we have one). 10024e79f69125cf87fcaa78c04510a831037203eebStephen Hines // Fall back to the variable definition, if we are looking at something 10124e79f69125cf87fcaa78c04510a831037203eebStephen Hines // like an array declaration that can't be exported. 10224e79f69125cf87fcaa78c04510a831037203eebStephen Hines if (TopLevelRecord) { 1039207a2e495c8363606861e4f034504ec5c153dabLogan Chien DiagEngine->Report( 1049207a2e495c8363606861e4f034504ec5c153dabLogan Chien clang::FullSourceLoc(TopLevelRecord->getLocation(), SM), 1059207a2e495c8363606861e4f034504ec5c153dabLogan Chien DiagEngine->getCustomDiagID(clang::DiagnosticsEngine::Error, Message)) 1069207a2e495c8363606861e4f034504ec5c153dabLogan Chien << TopLevelRecord->getName(); 10724e79f69125cf87fcaa78c04510a831037203eebStephen Hines } else if (VD) { 1089207a2e495c8363606861e4f034504ec5c153dabLogan Chien DiagEngine->Report( 1099207a2e495c8363606861e4f034504ec5c153dabLogan Chien clang::FullSourceLoc(VD->getLocation(), SM), 1109207a2e495c8363606861e4f034504ec5c153dabLogan Chien DiagEngine->getCustomDiagID(clang::DiagnosticsEngine::Error, Message)) 1119207a2e495c8363606861e4f034504ec5c153dabLogan Chien << VD->getName(); 11224e79f69125cf87fcaa78c04510a831037203eebStephen Hines } else { 1136e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "Variables should be validated before exporting"); 11424e79f69125cf87fcaa78c04510a831037203eebStephen Hines } 11524e79f69125cf87fcaa78c04510a831037203eebStephen Hines} 11624e79f69125cf87fcaa78c04510a831037203eebStephen Hines 11724e79f69125cf87fcaa78c04510a831037203eebStephen Hinesstatic const clang::Type *ConstantArrayTypeExportableHelper( 11824e79f69125cf87fcaa78c04510a831037203eebStephen Hines const clang::ConstantArrayType *CAT, 11924e79f69125cf87fcaa78c04510a831037203eebStephen Hines llvm::SmallPtrSet<const clang::Type*, 8>& SPS, 1209207a2e495c8363606861e4f034504ec5c153dabLogan Chien clang::DiagnosticsEngine *DiagEngine, 12124e79f69125cf87fcaa78c04510a831037203eebStephen Hines const clang::VarDecl *VD, 12224e79f69125cf87fcaa78c04510a831037203eebStephen Hines const clang::RecordDecl *TopLevelRecord) { 12324e79f69125cf87fcaa78c04510a831037203eebStephen Hines // Check element type 12424e79f69125cf87fcaa78c04510a831037203eebStephen Hines const clang::Type *ElementType = GET_CONSTANT_ARRAY_ELEMENT_TYPE(CAT); 12524e79f69125cf87fcaa78c04510a831037203eebStephen Hines if (ElementType->isArrayType()) { 1269207a2e495c8363606861e4f034504ec5c153dabLogan Chien ReportTypeError(DiagEngine, VD, TopLevelRecord, 1279207a2e495c8363606861e4f034504ec5c153dabLogan Chien "multidimensional arrays cannot be exported: '%0'"); 12824e79f69125cf87fcaa78c04510a831037203eebStephen Hines return NULL; 12924e79f69125cf87fcaa78c04510a831037203eebStephen Hines } else if (ElementType->isExtVectorType()) { 13024e79f69125cf87fcaa78c04510a831037203eebStephen Hines const clang::ExtVectorType *EVT = 13124e79f69125cf87fcaa78c04510a831037203eebStephen Hines static_cast<const clang::ExtVectorType*>(ElementType); 13224e79f69125cf87fcaa78c04510a831037203eebStephen Hines unsigned numElements = EVT->getNumElements(); 13324e79f69125cf87fcaa78c04510a831037203eebStephen Hines 13424e79f69125cf87fcaa78c04510a831037203eebStephen Hines const clang::Type *BaseElementType = GET_EXT_VECTOR_ELEMENT_TYPE(EVT); 13524e79f69125cf87fcaa78c04510a831037203eebStephen Hines if (!RSExportPrimitiveType::IsPrimitiveType(BaseElementType)) { 1369207a2e495c8363606861e4f034504ec5c153dabLogan Chien ReportTypeError(DiagEngine, VD, TopLevelRecord, 1379207a2e495c8363606861e4f034504ec5c153dabLogan Chien "vectors of non-primitive types cannot be exported: '%0'"); 13824e79f69125cf87fcaa78c04510a831037203eebStephen Hines return NULL; 13924e79f69125cf87fcaa78c04510a831037203eebStephen Hines } 14024e79f69125cf87fcaa78c04510a831037203eebStephen Hines 14124e79f69125cf87fcaa78c04510a831037203eebStephen Hines if (numElements == 3 && CAT->getSize() != 1) { 1429207a2e495c8363606861e4f034504ec5c153dabLogan Chien ReportTypeError(DiagEngine, VD, TopLevelRecord, 1439207a2e495c8363606861e4f034504ec5c153dabLogan Chien "arrays of width 3 vector types cannot be exported: '%0'"); 14424e79f69125cf87fcaa78c04510a831037203eebStephen Hines return NULL; 14524e79f69125cf87fcaa78c04510a831037203eebStephen Hines } 14624e79f69125cf87fcaa78c04510a831037203eebStephen Hines } 14724e79f69125cf87fcaa78c04510a831037203eebStephen Hines 1489207a2e495c8363606861e4f034504ec5c153dabLogan Chien if (TypeExportableHelper(ElementType, SPS, DiagEngine, VD, 1499207a2e495c8363606861e4f034504ec5c153dabLogan Chien TopLevelRecord) == NULL) 15024e79f69125cf87fcaa78c04510a831037203eebStephen Hines return NULL; 15124e79f69125cf87fcaa78c04510a831037203eebStephen Hines else 15224e79f69125cf87fcaa78c04510a831037203eebStephen Hines return CAT; 15324e79f69125cf87fcaa78c04510a831037203eebStephen Hines} 15424e79f69125cf87fcaa78c04510a831037203eebStephen Hines 15524e79f69125cf87fcaa78c04510a831037203eebStephen Hinesstatic const clang::Type *TypeExportableHelper( 156e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines clang::Type const *T, 157e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines llvm::SmallPtrSet<clang::Type const *, 8> &SPS, 158e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines clang::DiagnosticsEngine *DiagEngine, 159e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines clang::VarDecl const *VD, 160e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines clang::RecordDecl const *TopLevelRecord) { 1619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Normalize first 1629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if ((T = GET_CANONICAL_TYPE(T)) == NULL) 1639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return NULL; 164462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (SPS.count(T)) 1669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return T; 1671f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao 1689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (T->getTypeClass()) { 1699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case clang::Type::Builtin: { 170be27482cdeaf08576bc39b72a15d35d13014a636Logan const clang::BuiltinType *BT = 171be27482cdeaf08576bc39b72a15d35d13014a636Logan UNSAFE_CAST_TYPE(const clang::BuiltinType, T); 172462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (BT->getKind()) { 174a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang#define ENUM_SUPPORT_BUILTIN_TYPE(builtin_type, type, cname) \ 1759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case builtin_type: 176a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang#include "RSClangBuiltinEnums.inc" 1779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return T; 1789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao default: { 1799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return NULL; 180462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 1819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case clang::Type::Record: { 184b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang if (RSExportPrimitiveType::GetRSSpecificType(T) != 1859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RSExportPrimitiveType::DataTypeUnknown) 1866315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr return T; // RS object type, no further checks are needed 187462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Check internal struct 189cd440ee9b3bdb7985a20b2cd4b0f8229de34f0a9Stephen Hines if (T->isUnionType()) { 1909207a2e495c8363606861e4f034504ec5c153dabLogan Chien ReportTypeError(DiagEngine, NULL, T->getAsUnionType()->getDecl(), 1919207a2e495c8363606861e4f034504ec5c153dabLogan Chien "unions cannot be exported: '%0'"); 192cd440ee9b3bdb7985a20b2cd4b0f8229de34f0a9Stephen Hines return NULL; 193cd440ee9b3bdb7985a20b2cd4b0f8229de34f0a9Stephen Hines } else if (!T->isStructureType()) { 1946e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "Unknown type cannot be exported"); 195cd440ee9b3bdb7985a20b2cd4b0f8229de34f0a9Stephen Hines return NULL; 196cd440ee9b3bdb7985a20b2cd4b0f8229de34f0a9Stephen Hines } 197cd440ee9b3bdb7985a20b2cd4b0f8229de34f0a9Stephen Hines 19824e79f69125cf87fcaa78c04510a831037203eebStephen Hines clang::RecordDecl *RD = T->getAsStructureType()->getDecl(); 1992ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines if (RD != NULL) { 2009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RD = RD->getDefinition(); 2012ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines if (RD == NULL) { 2029207a2e495c8363606861e4f034504ec5c153dabLogan Chien ReportTypeError(DiagEngine, NULL, T->getAsStructureType()->getDecl(), 2039207a2e495c8363606861e4f034504ec5c153dabLogan Chien "struct is not defined in this module"); 2042ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines return NULL; 2052ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines } 2062ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines } 207f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao 208e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines if (!TopLevelRecord) { 209e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines TopLevelRecord = RD; 210e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines } 211e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines if (RD->getName().empty()) { 2129207a2e495c8363606861e4f034504ec5c153dabLogan Chien ReportTypeError(DiagEngine, NULL, RD, 2139207a2e495c8363606861e4f034504ec5c153dabLogan Chien "anonymous structures cannot be exported"); 214e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines return NULL; 215e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines } 216e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines 2179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Fast check 2189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (RD->hasFlexibleArrayMember() || RD->hasObjectMember()) 2199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return NULL; 220f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao 2219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Insert myself into checking set 2229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao SPS.insert(T); 223f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao 2249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Check all element 2259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (clang::RecordDecl::field_iterator FI = RD->field_begin(), 2269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FE = RD->field_end(); 2279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FI != FE; 2289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FI++) { 2290da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang const clang::FieldDecl *FD = *FI; 230e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines const clang::Type *FT = RSExportType::GetTypeOfDecl(FD); 2319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FT = GET_CANONICAL_TYPE(FT); 232462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2339207a2e495c8363606861e4f034504ec5c153dabLogan Chien if (!TypeExportableHelper(FT, SPS, DiagEngine, VD, TopLevelRecord)) { 2349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return NULL; 2350da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang } 2362ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines 2372ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines // We don't support bit fields yet 2382ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines // 2392ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines // TODO(zonr/srhines): allow bit fields of size 8, 16, 32 2402ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines if (FD->isBitField()) { 2419207a2e495c8363606861e4f034504ec5c153dabLogan Chien if (DiagEngine) { 2429207a2e495c8363606861e4f034504ec5c153dabLogan Chien DiagEngine->Report( 2439207a2e495c8363606861e4f034504ec5c153dabLogan Chien clang::FullSourceLoc(FD->getLocation(), 2449207a2e495c8363606861e4f034504ec5c153dabLogan Chien DiagEngine->getSourceManager()), 2459207a2e495c8363606861e4f034504ec5c153dabLogan Chien DiagEngine->getCustomDiagID( 2469207a2e495c8363606861e4f034504ec5c153dabLogan Chien clang::DiagnosticsEngine::Error, 2479207a2e495c8363606861e4f034504ec5c153dabLogan Chien "bit fields are not able to be exported: '%0.%1'")) 2489207a2e495c8363606861e4f034504ec5c153dabLogan Chien << RD->getName() 2499207a2e495c8363606861e4f034504ec5c153dabLogan Chien << FD->getName(); 2502ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines } 2512ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines return NULL; 2522ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines } 2539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 254462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return T; 2569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case clang::Type::Pointer: { 258e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines if (TopLevelRecord) { 2599207a2e495c8363606861e4f034504ec5c153dabLogan Chien ReportTypeError(DiagEngine, NULL, TopLevelRecord, 2609207a2e495c8363606861e4f034504ec5c153dabLogan Chien "structures containing pointers cannot be exported: '%0'"); 261c808a99831115928b4648f4c8b86dc682594217aStephen Hines return NULL; 262c808a99831115928b4648f4c8b86dc682594217aStephen Hines } 26324e79f69125cf87fcaa78c04510a831037203eebStephen Hines 264be27482cdeaf08576bc39b72a15d35d13014a636Logan const clang::PointerType *PT = 265be27482cdeaf08576bc39b72a15d35d13014a636Logan UNSAFE_CAST_TYPE(const clang::PointerType, T); 2669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const clang::Type *PointeeType = GET_POINTEE_TYPE(PT); 267462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2682e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang if (PointeeType->getTypeClass() == clang::Type::Pointer) 2699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return T; 2702e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang // We don't support pointer with array-type pointee or unsupported pointee 2712e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang // type 2722e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang if (PointeeType->isArrayType() || 2739207a2e495c8363606861e4f034504ec5c153dabLogan Chien (TypeExportableHelper(PointeeType, SPS, DiagEngine, VD, 274e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines TopLevelRecord) == NULL)) 2759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return NULL; 2769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 2779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return T; 2789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case clang::Type::ExtVector: { 2809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const clang::ExtVectorType *EVT = 281be27482cdeaf08576bc39b72a15d35d13014a636Logan UNSAFE_CAST_TYPE(const clang::ExtVectorType, T); 2829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Only vector with size 2, 3 and 4 are supported. 2839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (EVT->getNumElements() < 2 || EVT->getNumElements() > 4) 2849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return NULL; 285f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao 2869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Check base element type 2879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const clang::Type *ElementType = GET_EXT_VECTOR_ELEMENT_TYPE(EVT); 288462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if ((ElementType->getTypeClass() != clang::Type::Builtin) || 2909207a2e495c8363606861e4f034504ec5c153dabLogan Chien (TypeExportableHelper(ElementType, SPS, DiagEngine, VD, 291e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines TopLevelRecord) == NULL)) 2929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return NULL; 2939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 2949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return T; 2959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2962e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang case clang::Type::ConstantArray: { 2972e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang const clang::ConstantArrayType *CAT = 298be27482cdeaf08576bc39b72a15d35d13014a636Logan UNSAFE_CAST_TYPE(const clang::ConstantArrayType, T); 2992e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 3009207a2e495c8363606861e4f034504ec5c153dabLogan Chien return ConstantArrayTypeExportableHelper(CAT, SPS, DiagEngine, VD, 30124e79f69125cf87fcaa78c04510a831037203eebStephen Hines TopLevelRecord); 3022e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang } 3039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao default: { 3049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return NULL; 305462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 3069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 3079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 308462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 309e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines// Return the type that can be used to create RSExportType, will always return 310e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines// the canonical type 3119207a2e495c8363606861e4f034504ec5c153dabLogan Chien// If the Type T is not exportable, this function returns NULL. DiagEngine is 31278e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines// used to generate proper Clang diagnostic messages when a 313e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines// non-exportable type is detected. TopLevelRecord is used to capture the 314e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines// highest struct (in the case of a nested hierarchy) for detecting other 315e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines// types that cannot be exported (mostly pointers within a struct). 316e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hinesstatic const clang::Type *TypeExportable(const clang::Type *T, 3179207a2e495c8363606861e4f034504ec5c153dabLogan Chien clang::DiagnosticsEngine *DiagEngine, 318dd6206bb61bf8df2ed6b643abe8a29c48a315685Stephen Hines const clang::VarDecl *VD) { 319e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines llvm::SmallPtrSet<const clang::Type*, 8> SPS = 320e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines llvm::SmallPtrSet<const clang::Type*, 8>(); 321e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines 3229207a2e495c8363606861e4f034504ec5c153dabLogan Chien return TypeExportableHelper(T, SPS, DiagEngine, VD, NULL); 32378e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines} 32478e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines 32578e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hinesstatic bool ValidateVarDeclHelper( 32678e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines clang::VarDecl *VD, 32778e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines const clang::Type *&T, 32878e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines llvm::SmallPtrSet<const clang::Type*, 8>& SPS, 32978e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines clang::RecordDecl *UnionDecl) { 33078e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines if ((T = GET_CANONICAL_TYPE(T)) == NULL) 33178e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines return true; 33278e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines 33378e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines if (SPS.count(T)) 33478e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines return true; 33578e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines 33678e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines switch (T->getTypeClass()) { 33778e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines case clang::Type::Record: { 33878e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines if (RSExportPrimitiveType::GetRSSpecificType(T) != 33978e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines RSExportPrimitiveType::DataTypeUnknown) { 34078e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines if (!UnionDecl) { 34178e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines return true; 34278e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines } else if (RSExportPrimitiveType::IsRSObjectType(T)) { 34378e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines clang::ASTContext &C = VD->getASTContext(); 34478e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines ReportTypeError(&C.getDiagnostics(), VD, UnionDecl, 34578e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines "unions containing RS object types are not allowed"); 34678e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines return false; 34778e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines } 34878e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines } 34978e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines 35078e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines clang::RecordDecl *RD = NULL; 35178e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines 35278e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines // Check internal struct 35378e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines if (T->isUnionType()) { 35478e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines RD = T->getAsUnionType()->getDecl(); 35578e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines UnionDecl = RD; 35678e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines } else if (T->isStructureType()) { 35778e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines RD = T->getAsStructureType()->getDecl(); 35878e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines } else { 35978e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines slangAssert(false && "Unknown type cannot be exported"); 36078e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines return false; 36178e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines } 36278e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines 36378e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines if (RD != NULL) { 36478e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines RD = RD->getDefinition(); 36578e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines if (RD == NULL) { 36678e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines // FIXME 36778e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines return true; 36878e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines } 36978e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines } 37078e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines 37178e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines // Fast check 37278e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines if (RD->hasFlexibleArrayMember() || RD->hasObjectMember()) 37378e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines return false; 37478e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines 37578e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines // Insert myself into checking set 37678e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines SPS.insert(T); 37778e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines 37878e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines // Check all elements 37978e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines for (clang::RecordDecl::field_iterator FI = RD->field_begin(), 38078e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines FE = RD->field_end(); 38178e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines FI != FE; 38278e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines FI++) { 38378e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines const clang::FieldDecl *FD = *FI; 38478e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines const clang::Type *FT = RSExportType::GetTypeOfDecl(FD); 38578e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines FT = GET_CANONICAL_TYPE(FT); 38678e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines 38778e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines if (!ValidateVarDeclHelper(VD, FT, SPS, UnionDecl)) { 38878e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines return false; 38978e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines } 39078e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines } 39178e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines 39278e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines return true; 39378e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines } 39478e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines 39578e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines case clang::Type::Builtin: { 39678e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines break; 39778e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines } 39878e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines 39978e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines case clang::Type::Pointer: { 40078e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines const clang::PointerType *PT = 40178e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines UNSAFE_CAST_TYPE(const clang::PointerType, T); 40278e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines const clang::Type *PointeeType = GET_POINTEE_TYPE(PT); 40378e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines 40478e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines return ValidateVarDeclHelper(VD, PointeeType, SPS, UnionDecl); 40578e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines } 40678e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines 40778e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines case clang::Type::ExtVector: { 40878e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines const clang::ExtVectorType *EVT = 40978e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines UNSAFE_CAST_TYPE(const clang::ExtVectorType, T); 41078e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines const clang::Type *ElementType = GET_EXT_VECTOR_ELEMENT_TYPE(EVT); 41178e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines return ValidateVarDeclHelper(VD, ElementType, SPS, UnionDecl); 41278e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines } 41378e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines 41478e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines case clang::Type::ConstantArray: { 41578e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines const clang::ConstantArrayType *CAT = 41678e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines UNSAFE_CAST_TYPE(const clang::ConstantArrayType, T); 41778e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines const clang::Type *ElementType = GET_CONSTANT_ARRAY_ELEMENT_TYPE(CAT); 41878e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines return ValidateVarDeclHelper(VD, ElementType, SPS, UnionDecl); 41978e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines } 42078e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines 42178e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines default: { 42278e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines break; 42378e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines } 42478e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines } 42578e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines 42678e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines return true; 427e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines} 428e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines 429e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines} // namespace 430e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines 431e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines/****************************** RSExportType ******************************/ 432e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hinesbool RSExportType::NormalizeType(const clang::Type *&T, 433e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines llvm::StringRef &TypeName, 4349207a2e495c8363606861e4f034504ec5c153dabLogan Chien clang::DiagnosticsEngine *DiagEngine, 435dd6206bb61bf8df2ed6b643abe8a29c48a315685Stephen Hines const clang::VarDecl *VD) { 4369207a2e495c8363606861e4f034504ec5c153dabLogan Chien if ((T = TypeExportable(T, DiagEngine, VD)) == NULL) { 437e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines return false; 438e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines } 439e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines // Get type name 440e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines TypeName = RSExportType::GetTypeName(T); 441e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines if (TypeName.empty()) { 4429207a2e495c8363606861e4f034504ec5c153dabLogan Chien if (DiagEngine) { 44324e79f69125cf87fcaa78c04510a831037203eebStephen Hines if (VD) { 4449207a2e495c8363606861e4f034504ec5c153dabLogan Chien DiagEngine->Report( 4459207a2e495c8363606861e4f034504ec5c153dabLogan Chien clang::FullSourceLoc(VD->getLocation(), 4469207a2e495c8363606861e4f034504ec5c153dabLogan Chien DiagEngine->getSourceManager()), 4479207a2e495c8363606861e4f034504ec5c153dabLogan Chien DiagEngine->getCustomDiagID(clang::DiagnosticsEngine::Error, 4489207a2e495c8363606861e4f034504ec5c153dabLogan Chien "anonymous types cannot be exported")); 44924e79f69125cf87fcaa78c04510a831037203eebStephen Hines } else { 4509207a2e495c8363606861e4f034504ec5c153dabLogan Chien DiagEngine->Report( 4519207a2e495c8363606861e4f034504ec5c153dabLogan Chien DiagEngine->getCustomDiagID(clang::DiagnosticsEngine::Error, 4529207a2e495c8363606861e4f034504ec5c153dabLogan Chien "anonymous types cannot be exported")); 45324e79f69125cf87fcaa78c04510a831037203eebStephen Hines } 454e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines } 455e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines return false; 456e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines } 457e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines 458e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines return true; 459e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines} 460e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines 46178e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hinesbool RSExportType::ValidateVarDecl(clang::VarDecl *VD) { 46278e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines const clang::Type *T = VD->getType().getTypePtr(); 46378e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines llvm::SmallPtrSet<const clang::Type*, 8> SPS = 46478e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines llvm::SmallPtrSet<const clang::Type*, 8>(); 46578e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines 46678e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines return ValidateVarDeclHelper(VD, T, SPS, NULL); 46778e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines} 46878e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines 469e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hinesconst clang::Type 470e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines*RSExportType::GetTypeOfDecl(const clang::DeclaratorDecl *DD) { 471e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines if (DD) { 472e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines clang::QualType T; 473e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines if (DD->getTypeSourceInfo()) 474e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines T = DD->getTypeSourceInfo()->getType(); 475e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines else 476e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines T = DD->getType(); 477e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines 478e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines if (T.isNull()) 479e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines return NULL; 480e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines else 481e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines return T.getTypePtr(); 482e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines } 483e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines return NULL; 484e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines} 485e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines 486e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hinesllvm::StringRef RSExportType::GetTypeName(const clang::Type* T) { 487e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines T = GET_CANONICAL_TYPE(T); 488e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines if (T == NULL) 489e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines return llvm::StringRef(); 490e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines 491e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines switch (T->getTypeClass()) { 492e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines case clang::Type::Builtin: { 493be27482cdeaf08576bc39b72a15d35d13014a636Logan const clang::BuiltinType *BT = 494be27482cdeaf08576bc39b72a15d35d13014a636Logan UNSAFE_CAST_TYPE(const clang::BuiltinType, T); 495e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines 496e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines switch (BT->getKind()) { 497e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines#define ENUM_SUPPORT_BUILTIN_TYPE(builtin_type, type, cname) \ 498e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines case builtin_type: \ 499e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines return cname; \ 500e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines break; 501e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines#include "RSClangBuiltinEnums.inc" 502e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines default: { 5036e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "Unknown data type of the builtin"); 504e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines break; 505e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines } 506e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines } 507e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines break; 508e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines } 509e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines case clang::Type::Record: { 510cd440ee9b3bdb7985a20b2cd4b0f8229de34f0a9Stephen Hines clang::RecordDecl *RD; 511cd440ee9b3bdb7985a20b2cd4b0f8229de34f0a9Stephen Hines if (T->isStructureType()) { 512cd440ee9b3bdb7985a20b2cd4b0f8229de34f0a9Stephen Hines RD = T->getAsStructureType()->getDecl(); 513dd6206bb61bf8df2ed6b643abe8a29c48a315685Stephen Hines } else { 514cd440ee9b3bdb7985a20b2cd4b0f8229de34f0a9Stephen Hines break; 515cd440ee9b3bdb7985a20b2cd4b0f8229de34f0a9Stephen Hines } 516cd440ee9b3bdb7985a20b2cd4b0f8229de34f0a9Stephen Hines 517e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines llvm::StringRef Name = RD->getName(); 518e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines if (Name.empty()) { 51983f0c6261efc8f397fc2509e3862bc6d0eb1e1c4Shih-wei Liao if (RD->getTypedefNameForAnonDecl() != NULL) { 52083f0c6261efc8f397fc2509e3862bc6d0eb1e1c4Shih-wei Liao Name = RD->getTypedefNameForAnonDecl()->getName(); 52183f0c6261efc8f397fc2509e3862bc6d0eb1e1c4Shih-wei Liao } 52283f0c6261efc8f397fc2509e3862bc6d0eb1e1c4Shih-wei Liao 52383f0c6261efc8f397fc2509e3862bc6d0eb1e1c4Shih-wei Liao if (Name.empty()) { 52483f0c6261efc8f397fc2509e3862bc6d0eb1e1c4Shih-wei Liao // Try to find a name from redeclaration (i.e. typedef) 52583f0c6261efc8f397fc2509e3862bc6d0eb1e1c4Shih-wei Liao for (clang::TagDecl::redecl_iterator RI = RD->redecls_begin(), 52683f0c6261efc8f397fc2509e3862bc6d0eb1e1c4Shih-wei Liao RE = RD->redecls_end(); 52783f0c6261efc8f397fc2509e3862bc6d0eb1e1c4Shih-wei Liao RI != RE; 52883f0c6261efc8f397fc2509e3862bc6d0eb1e1c4Shih-wei Liao RI++) { 52983f0c6261efc8f397fc2509e3862bc6d0eb1e1c4Shih-wei Liao slangAssert(*RI != NULL && "cannot be NULL object"); 53083f0c6261efc8f397fc2509e3862bc6d0eb1e1c4Shih-wei Liao 53183f0c6261efc8f397fc2509e3862bc6d0eb1e1c4Shih-wei Liao Name = (*RI)->getName(); 53283f0c6261efc8f397fc2509e3862bc6d0eb1e1c4Shih-wei Liao if (!Name.empty()) 53383f0c6261efc8f397fc2509e3862bc6d0eb1e1c4Shih-wei Liao break; 53483f0c6261efc8f397fc2509e3862bc6d0eb1e1c4Shih-wei Liao } 53583f0c6261efc8f397fc2509e3862bc6d0eb1e1c4Shih-wei Liao } 536e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines } 537e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines return Name; 538e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines } 539e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines case clang::Type::Pointer: { 540e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines // "*" plus pointee name 541e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines const clang::Type *PT = GET_POINTEE_TYPE(T); 542e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines llvm::StringRef PointeeName; 54378e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines if (NormalizeType(PT, PointeeName, NULL, NULL)) { 544e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines char *Name = new char[ 1 /* * */ + PointeeName.size() + 1 ]; 545e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines Name[0] = '*'; 546e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines memcpy(Name + 1, PointeeName.data(), PointeeName.size()); 547e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines Name[PointeeName.size() + 1] = '\0'; 548e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines return Name; 549e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines } 550e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines break; 551e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines } 552e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines case clang::Type::ExtVector: { 553e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines const clang::ExtVectorType *EVT = 554be27482cdeaf08576bc39b72a15d35d13014a636Logan UNSAFE_CAST_TYPE(const clang::ExtVectorType, T); 555e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines return RSExportVectorType::GetTypeName(EVT); 556e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines break; 557e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines } 558e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines case clang::Type::ConstantArray : { 559e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines // Construct name for a constant array is too complicated. 560e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines return DUMMY_TYPE_NAME_FOR_RS_CONSTANT_ARRAY_TYPE; 561e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines } 562e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines default: { 563e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines break; 564e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines } 565e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines } 566e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines 567e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines return llvm::StringRef(); 568e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines} 569e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines 570e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines 5719ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSExportType *RSExportType::Create(RSContext *Context, 5729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const clang::Type *T, 5739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const llvm::StringRef &TypeName) { 5749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Lookup the context to see whether the type was processed before. 5759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Newly created RSExportType will insert into context 5769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // in RSExportType::RSExportType() 5779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RSContext::export_type_iterator ETI = Context->findExportType(TypeName); 5789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 5799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (ETI != Context->export_types_end()) 5809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return ETI->second; 5819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 5829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RSExportType *ET = NULL; 5839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (T->getTypeClass()) { 5849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case clang::Type::Record: { 5859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RSExportPrimitiveType::DataType dt = 586b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang RSExportPrimitiveType::GetRSSpecificType(TypeName); 5879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (dt) { 58892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang case RSExportPrimitiveType::DataTypeUnknown: { 58992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang // User-defined types 5909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ET = RSExportRecordType::Create(Context, 5919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao T->getAsStructureType(), 5929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao TypeName); 5939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 5949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 59592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang case RSExportPrimitiveType::DataTypeRSMatrix2x2: { 59692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang // 2 x 2 Matrix type 59792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang ET = RSExportMatrixType::Create(Context, 59892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang T->getAsStructureType(), 59992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang TypeName, 60092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 2); 60192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang break; 60292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang } 60392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang case RSExportPrimitiveType::DataTypeRSMatrix3x3: { 60492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang // 3 x 3 Matrix type 60592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang ET = RSExportMatrixType::Create(Context, 60692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang T->getAsStructureType(), 60792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang TypeName, 60892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 3); 60992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang break; 61092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang } 6119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case RSExportPrimitiveType::DataTypeRSMatrix4x4: { 61292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang // 4 x 4 Matrix type 61392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang ET = RSExportMatrixType::Create(Context, 61492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang T->getAsStructureType(), 61592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang TypeName, 61692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 4); 6179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 6189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 6199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao default: { 62092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang // Others are primitive types 6219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ET = RSExportPrimitiveType::Create(Context, T, TypeName); 6229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 6239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 6249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 6259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 6269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 6279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case clang::Type::Builtin: { 6289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ET = RSExportPrimitiveType::Create(Context, T, TypeName); 6299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 6309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 6319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case clang::Type::Pointer: { 6329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ET = RSExportPointerType::Create(Context, 6335baf6324a97430016026419deaef246ad75430fcStephen Hines UNSAFE_CAST_TYPE(const clang::PointerType, T), TypeName); 63492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang // FIXME: free the name (allocated in RSExportType::GetTypeName) 6359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao delete [] TypeName.data(); 6369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 6379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 6389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case clang::Type::ExtVector: { 6399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ET = RSExportVectorType::Create(Context, 6405baf6324a97430016026419deaef246ad75430fcStephen Hines UNSAFE_CAST_TYPE(const clang::ExtVectorType, T), TypeName); 6419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 6429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 6432e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang case clang::Type::ConstantArray: { 6442e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang ET = RSExportConstantArrayType::Create( 6452e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang Context, 646be27482cdeaf08576bc39b72a15d35d13014a636Logan UNSAFE_CAST_TYPE(const clang::ConstantArrayType, T)); 6472e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang break; 6482e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang } 6499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao default: { 6509207a2e495c8363606861e4f034504ec5c153dabLogan Chien clang::DiagnosticsEngine *DiagEngine = Context->getDiagnostics(); 6519207a2e495c8363606861e4f034504ec5c153dabLogan Chien DiagEngine->Report( 6529207a2e495c8363606861e4f034504ec5c153dabLogan Chien DiagEngine->getCustomDiagID(clang::DiagnosticsEngine::Error, 6539207a2e495c8363606861e4f034504ec5c153dabLogan Chien "unknown type cannot be exported: '%0'")) 6549207a2e495c8363606861e4f034504ec5c153dabLogan Chien << T->getTypeClassName(); 6559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 6569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 6579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 6589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 6599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return ET; 660462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 6611f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao 6626315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonrRSExportType *RSExportType::Create(RSContext *Context, const clang::Type *T) { 6639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao llvm::StringRef TypeName; 66478e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines if (NormalizeType(T, TypeName, Context->getDiagnostics(), NULL)) 6659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return Create(Context, T, TypeName); 6669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 6679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return NULL; 668462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 669462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 6709ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSExportType *RSExportType::CreateFromDecl(RSContext *Context, 6719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const clang::VarDecl *VD) { 6729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return RSExportType::Create(Context, GetTypeOfDecl(VD)); 673462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 674462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 6759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaosize_t RSExportType::GetTypeStoreSize(const RSExportType *ET) { 6769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return ET->getRSContext()->getTargetData()->getTypeStoreSize( 6776315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr ET->getLLVMType()); 678462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 679462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 6809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaosize_t RSExportType::GetTypeAllocSize(const RSExportType *ET) { 6819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (ET->getClass() == RSExportType::ExportClassRecord) 6829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return static_cast<const RSExportRecordType*>(ET)->getAllocSize(); 6839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 6849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return ET->getRSContext()->getTargetData()->getTypeAllocSize( 6856315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr ET->getLLVMType()); 686462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 687462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 6886b6320ad5faee29e0f75fe937e40156746ef9e80Zonr ChangRSExportType::RSExportType(RSContext *Context, 6896b6320ad5faee29e0f75fe937e40156746ef9e80Zonr Chang ExportClass Class, 6906b6320ad5faee29e0f75fe937e40156746ef9e80Zonr Chang const llvm::StringRef &Name) 691a41ce1d98094da84643995d40d71c529905123fcZonr Chang : RSExportable(Context, RSExportable::EX_TYPE), 6926b6320ad5faee29e0f75fe937e40156746ef9e80Zonr Chang mClass(Class), 6930da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang // Make a copy on Name since memory stored @Name is either allocated in 6940da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang // ASTContext or allocated in GetTypeName which will be destroyed later. 6956315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr mName(Name.data(), Name.size()), 696a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang mLLVMType(NULL), 697a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang mSpecType(NULL) { 6980da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang // Don't cache the type whose name start with '<'. Those type failed to 6990da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang // get their name since constructing their name in GetTypeName() requiring 7000da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang // complicated work. 7010da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang if (!Name.startswith(DUMMY_RS_TYPE_NAME_PREFIX)) 7020da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang // TODO(zonr): Need to check whether the insertion is successful or not. 7030da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang Context->insertExportType(llvm::StringRef(Name), this); 7049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 705462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 706462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 7073cd3dd327445fcfa49f0e96cb2de2055bce541e9Zonr Changbool RSExportType::keep() { 7083cd3dd327445fcfa49f0e96cb2de2055bce541e9Zonr Chang if (!RSExportable::keep()) 7093cd3dd327445fcfa49f0e96cb2de2055bce541e9Zonr Chang return false; 710641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // Invalidate converted LLVM type. 711641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang mLLVMType = NULL; 7123cd3dd327445fcfa49f0e96cb2de2055bce541e9Zonr Chang return true; 713641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang} 714641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 715641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Changbool RSExportType::equals(const RSExportable *E) const { 716641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang CHECK_PARENT_EQUALITY(RSExportable, E); 717641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang return (static_cast<const RSExportType*>(E)->getClass() == getClass()); 718641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang} 719641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 720a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr ChangRSExportType::~RSExportType() { 721a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang delete mSpecType; 722a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang} 723a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang 7249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/************************** RSExportPrimitiveType **************************/ 725b1771ef128b10c4d4575634828006bfba20b1d9cZonr Changllvm::ManagedStatic<RSExportPrimitiveType::RSSpecificTypeMapTy> 726b1771ef128b10c4d4575634828006bfba20b1d9cZonr ChangRSExportPrimitiveType::RSSpecificTypeMap; 7279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 7286315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonrllvm::Type *RSExportPrimitiveType::RSObjectLLVMType = NULL; 729462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 7309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaobool RSExportPrimitiveType::IsPrimitiveType(const clang::Type *T) { 7319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if ((T != NULL) && (T->getTypeClass() == clang::Type::Builtin)) 7329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 7339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 7349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 735462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 736462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 7379ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSExportPrimitiveType::DataType 738b1771ef128b10c4d4575634828006bfba20b1d9cZonr ChangRSExportPrimitiveType::GetRSSpecificType(const llvm::StringRef &TypeName) { 7399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (TypeName.empty()) 7409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return DataTypeUnknown; 741462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 742b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang if (RSSpecificTypeMap->empty()) { 743b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang#define ENUM_RS_MATRIX_TYPE(type, cname, dim) \ 744b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang RSSpecificTypeMap->GetOrCreateValue(cname, DataType ## type); 745b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang#include "RSMatrixTypeEnums.inc" 746a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang#define ENUM_RS_OBJECT_TYPE(type, cname) \ 747b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang RSSpecificTypeMap->GetOrCreateValue(cname, DataType ## type); 748a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang#include "RSObjectTypeEnums.inc" 7499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 750462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 751b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang RSSpecificTypeMapTy::const_iterator I = RSSpecificTypeMap->find(TypeName); 752b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang if (I == RSSpecificTypeMap->end()) 7539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return DataTypeUnknown; 7549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 7559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return I->getValue(); 7569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 7579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 7589ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSExportPrimitiveType::DataType 759b1771ef128b10c4d4575634828006bfba20b1d9cZonr ChangRSExportPrimitiveType::GetRSSpecificType(const clang::Type *T) { 7609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao T = GET_CANONICAL_TYPE(T); 7619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if ((T == NULL) || (T->getTypeClass() != clang::Type::Record)) 7629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return DataTypeUnknown; 7639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 764b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang return GetRSSpecificType( RSExportType::GetTypeName(T) ); 765b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang} 766b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang 767b1771ef128b10c4d4575634828006bfba20b1d9cZonr Changbool RSExportPrimitiveType::IsRSMatrixType(DataType DT) { 768b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang return ((DT >= FirstRSMatrixType) && (DT <= LastRSMatrixType)); 769b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang} 770b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang 771b1771ef128b10c4d4575634828006bfba20b1d9cZonr Changbool RSExportPrimitiveType::IsRSObjectType(DataType DT) { 772b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang return ((DT >= FirstRSObjectType) && (DT <= LastRSObjectType)); 7739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 7749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 775feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hinesbool RSExportPrimitiveType::IsStructureTypeWithRSObject(const clang::Type *T) { 776feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines bool RSObjectTypeSeen = false; 777feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines while (T && T->isArrayType()) { 778feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines T = T->getArrayElementTypeNoTypeQual(); 779feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines } 780feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines 781feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines const clang::RecordType *RT = T->getAsStructureType(); 782feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines if (!RT) { 783feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines return false; 784feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines } 785feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines const clang::RecordDecl *RD = RT->getDecl(); 786feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines RD = RD->getDefinition(); 787feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines for (clang::RecordDecl::field_iterator FI = RD->field_begin(), 788feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines FE = RD->field_end(); 789feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines FI != FE; 790feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines FI++) { 791feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines // We just look through all field declarations to see if we find a 792feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines // declaration for an RS object type (or an array of one). 793feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines const clang::FieldDecl *FD = *FI; 794feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines const clang::Type *FT = RSExportType::GetTypeOfDecl(FD); 795feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines while (FT && FT->isArrayType()) { 796feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines FT = FT->getArrayElementTypeNoTypeQual(); 797feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines } 798feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines 799feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines RSExportPrimitiveType::DataType DT = GetRSSpecificType(FT); 800feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines if (IsRSObjectType(DT)) { 801feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines // RS object types definitely need to be zero-initialized 802feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines RSObjectTypeSeen = true; 803feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines } else { 804feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines switch (DT) { 805feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines case RSExportPrimitiveType::DataTypeRSMatrix2x2: 806feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines case RSExportPrimitiveType::DataTypeRSMatrix3x3: 807feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines case RSExportPrimitiveType::DataTypeRSMatrix4x4: 808feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines // Matrix types should get zero-initialized as well 809feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines RSObjectTypeSeen = true; 810feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines break; 811feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines default: 812feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines // Ignore all other primitive types 813feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines break; 814feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines } 815feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines while (FT && FT->isArrayType()) { 816feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines FT = FT->getArrayElementTypeNoTypeQual(); 817feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines } 818feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines if (FT->isStructureType()) { 819feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines // Recursively handle structs of structs (even though these can't 820feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines // be exported, it is possible for a user to have them internally). 821feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines RSObjectTypeSeen |= IsStructureTypeWithRSObject(FT); 822feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines } 823feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines } 824feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines } 825feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines 826feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines return RSObjectTypeSeen; 827feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines} 828feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines 829a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Changconst size_t RSExportPrimitiveType::SizeOfDataTypeInBits[] = { 830a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang#define ENUM_RS_DATA_TYPE(type, cname, bits) \ 831a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang bits, 832a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang#include "RSDataTypeEnums.inc" 833a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang 0 // DataTypeMax 834462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}; 835462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 8369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaosize_t RSExportPrimitiveType::GetSizeInBits(const RSExportPrimitiveType *EPT) { 8376e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(((EPT->getType() > DataTypeUnknown) && 8386e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines (EPT->getType() < DataTypeMax)) && 8396e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "RSExportPrimitiveType::GetSizeInBits : unknown data type"); 8409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return SizeOfDataTypeInBits[ static_cast<int>(EPT->getType()) ]; 841462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 842462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 8439ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSExportPrimitiveType::DataType 8442ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen HinesRSExportPrimitiveType::GetDataType(RSContext *Context, const clang::Type *T) { 8459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (T == NULL) 8469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return DataTypeUnknown; 847462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 8489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (T->getTypeClass()) { 8499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case clang::Type::Builtin: { 850be27482cdeaf08576bc39b72a15d35d13014a636Logan const clang::BuiltinType *BT = 851be27482cdeaf08576bc39b72a15d35d13014a636Logan UNSAFE_CAST_TYPE(const clang::BuiltinType, T); 8529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (BT->getKind()) { 853a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang#define ENUM_SUPPORT_BUILTIN_TYPE(builtin_type, type, cname) \ 854a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang case builtin_type: { \ 855a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang return DataType ## type; \ 8569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 857a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang#include "RSClangBuiltinEnums.inc" 858a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang // The size of type WChar depend on platform so we abandon the support 859a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang // to them. 8609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao default: { 8619207a2e495c8363606861e4f034504ec5c153dabLogan Chien clang::DiagnosticsEngine *DiagEngine = Context->getDiagnostics(); 8629207a2e495c8363606861e4f034504ec5c153dabLogan Chien DiagEngine->Report( 8639207a2e495c8363606861e4f034504ec5c153dabLogan Chien DiagEngine->getCustomDiagID( 8649207a2e495c8363606861e4f034504ec5c153dabLogan Chien clang::DiagnosticsEngine::Error, 8659207a2e495c8363606861e4f034504ec5c153dabLogan Chien "built-in type cannot be exported: '%0'")) 8669207a2e495c8363606861e4f034504ec5c153dabLogan Chien << T->getTypeClassName(); 8679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 868462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 8699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 8709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 8719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 8729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case clang::Type::Record: { 8739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // must be RS object type 874b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang return RSExportPrimitiveType::GetRSSpecificType(T); 8759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 8769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao default: { 8779207a2e495c8363606861e4f034504ec5c153dabLogan Chien clang::DiagnosticsEngine *DiagEngine = Context->getDiagnostics(); 8789207a2e495c8363606861e4f034504ec5c153dabLogan Chien DiagEngine->Report( 8799207a2e495c8363606861e4f034504ec5c153dabLogan Chien DiagEngine->getCustomDiagID(clang::DiagnosticsEngine::Error, 8809207a2e495c8363606861e4f034504ec5c153dabLogan Chien "primitive type cannot be exported: '%0'")) 8812ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines << T->getTypeClassName(); 8829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 883462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 8849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 885462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 8869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return DataTypeUnknown; 887462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 888462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 8899ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSExportPrimitiveType 8909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao*RSExportPrimitiveType::Create(RSContext *Context, 8919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const clang::Type *T, 8929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const llvm::StringRef &TypeName, 8939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool Normalized) { 8942ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines DataType DT = GetDataType(Context, T); 895462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 8969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if ((DT == DataTypeUnknown) || TypeName.empty()) 8979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return NULL; 8989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 8996b6320ad5faee29e0f75fe937e40156746ef9e80Zonr Chang return new RSExportPrimitiveType(Context, ExportClassPrimitive, TypeName, 9002b8fb64be3047df940a219872b331eb11de2758dStephen Hines DT, Normalized); 901462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 902462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 9039ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSExportPrimitiveType *RSExportPrimitiveType::Create(RSContext *Context, 9042b8fb64be3047df940a219872b331eb11de2758dStephen Hines const clang::Type *T) { 9059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao llvm::StringRef TypeName; 90678e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines if (RSExportType::NormalizeType(T, TypeName, Context->getDiagnostics(), NULL) 90778e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines && IsPrimitiveType(T)) { 9082b8fb64be3047df940a219872b331eb11de2758dStephen Hines return Create(Context, T, TypeName); 909e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines } else { 9109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return NULL; 911e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines } 912462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 913462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 9147c67e578c760408dba0c2f64da6e074dd8b56fd9Shih-wei Liaollvm::Type *RSExportPrimitiveType::convertToLLVMType() const { 9159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao llvm::LLVMContext &C = getRSContext()->getLLVMContext(); 9169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 9179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (isRSObjectType()) { 9189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // struct { 9199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // int *p; 9209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // } __attribute__((packed, aligned(pointer_size))) 9219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // 9229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // which is 9239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // 9249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // <{ [1 x i32] }> in LLVM 9259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // 9269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (RSObjectLLVMType == NULL) { 9277c67e578c760408dba0c2f64da6e074dd8b56fd9Shih-wei Liao std::vector<llvm::Type *> Elements; 9286315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr Elements.push_back(llvm::ArrayType::get(llvm::Type::getInt32Ty(C), 1)); 929a67e4451d0d03b4ab7866b64807d95a8399c73a0Stephen Hines RSObjectLLVMType = llvm::StructType::get(C, Elements, true); 930462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 9319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return RSObjectLLVMType; 9329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 933462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 9349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (mType) { 9359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case DataTypeFloat32: { 9369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return llvm::Type::getFloatTy(C); 9379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 9389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 9399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case DataTypeFloat64: { 9409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return llvm::Type::getDoubleTy(C); 9419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 9429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 94391a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao case DataTypeBoolean: { 94491a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao return llvm::Type::getInt1Ty(C); 94591a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao break; 94691a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao } 9479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case DataTypeSigned8: 9489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case DataTypeUnsigned8: { 9499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return llvm::Type::getInt8Ty(C); 9509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 9519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 9529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case DataTypeSigned16: 9539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case DataTypeUnsigned16: 9549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case DataTypeUnsigned565: 9559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case DataTypeUnsigned5551: 9569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case DataTypeUnsigned4444: { 9579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return llvm::Type::getInt16Ty(C); 9589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 9599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 9609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case DataTypeSigned32: 9619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case DataTypeUnsigned32: { 9629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return llvm::Type::getInt32Ty(C); 9639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 9649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 965a5d2c232d56b04292cb51c8fb343aef990f7970fStephen Hines case DataTypeSigned64: 966a5d2c232d56b04292cb51c8fb343aef990f7970fStephen Hines case DataTypeUnsigned64: { 9679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return llvm::Type::getInt64Ty(C); 9689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 9699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 9709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao default: { 9716e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "Unknown data type"); 972462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 9739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 974462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 9759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return NULL; 976462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 977462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 978a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Changunion RSType *RSExportPrimitiveType::convertToSpecType() const { 979a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang llvm::OwningPtr<union RSType> ST(new union RSType); 980a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang RS_TYPE_SET_CLASS(ST, RS_TC_Primitive); 981a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang // enum RSExportPrimitiveType::DataType is synced with enum RSDataType in 982a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang // slang_rs_type_spec.h 983a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang RS_PRIMITIVE_TYPE_SET_DATA_TYPE(ST, getType()); 984a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang return ST.take(); 985a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang} 986a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang 987641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Changbool RSExportPrimitiveType::equals(const RSExportable *E) const { 988641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang CHECK_PARENT_EQUALITY(RSExportType, E); 989641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang return (static_cast<const RSExportPrimitiveType*>(E)->getType() == getType()); 990641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang} 991641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 992fdd1ba13a69501a1b91fdc9be31413215d467497Stephen HinesRSReflectionType *RSExportPrimitiveType::getRSReflectionType(DataType DT) { 993fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines if (DT > DataTypeUnknown && DT < DataTypeMax) { 994fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines return &gReflectionTypes[DT]; 995fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines } else { 996fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines return NULL; 997fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines } 998fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines} 999fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines 10009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/**************************** RSExportPointerType ****************************/ 1001462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 10029ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSExportPointerType 10039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao*RSExportPointerType::Create(RSContext *Context, 10049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const clang::PointerType *PT, 10059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const llvm::StringRef &TypeName) { 10069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const clang::Type *PointeeType = GET_POINTEE_TYPE(PT); 10079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportType *PointeeET; 1008462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 10099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (PointeeType->getTypeClass() != clang::Type::Pointer) { 10109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PointeeET = RSExportType::Create(Context, PointeeType); 10119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else { 10129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Double or higher dimension of pointer, export as int* 10132ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines PointeeET = RSExportPrimitiveType::Create(Context, 10142ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines Context->getASTContext().IntTy.getTypePtr()); 10159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1016462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 10179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (PointeeET == NULL) { 10182ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines // Error diagnostic is emitted for corresponding pointee type 10199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return NULL; 10209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1021462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 10229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return new RSExportPointerType(Context, TypeName, PointeeET); 1023462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1024462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 10257c67e578c760408dba0c2f64da6e074dd8b56fd9Shih-wei Liaollvm::Type *RSExportPointerType::convertToLLVMType() const { 10267c67e578c760408dba0c2f64da6e074dd8b56fd9Shih-wei Liao llvm::Type *PointeeType = mPointeeType->getLLVMType(); 10279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return llvm::PointerType::getUnqual(PointeeType); 1028462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1029462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1030a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Changunion RSType *RSExportPointerType::convertToSpecType() const { 1031a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang llvm::OwningPtr<union RSType> ST(new union RSType); 1032a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang 1033a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang RS_TYPE_SET_CLASS(ST, RS_TC_Pointer); 1034a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang RS_POINTER_TYPE_SET_POINTEE_TYPE(ST, getPointeeType()->getSpecType()); 1035a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang 1036a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang if (RS_POINTER_TYPE_GET_POINTEE_TYPE(ST) != NULL) 1037a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang return ST.take(); 1038a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang else 1039a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang return NULL; 1040a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang} 1041a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang 10423cd3dd327445fcfa49f0e96cb2de2055bce541e9Zonr Changbool RSExportPointerType::keep() { 10433cd3dd327445fcfa49f0e96cb2de2055bce541e9Zonr Chang if (!RSExportType::keep()) 10443cd3dd327445fcfa49f0e96cb2de2055bce541e9Zonr Chang return false; 1045641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang const_cast<RSExportType*>(mPointeeType)->keep(); 10463cd3dd327445fcfa49f0e96cb2de2055bce541e9Zonr Chang return true; 1047641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang} 1048641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 1049641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Changbool RSExportPointerType::equals(const RSExportable *E) const { 1050641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang CHECK_PARENT_EQUALITY(RSExportType, E); 1051641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang return (static_cast<const RSExportPointerType*>(E) 1052641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang ->getPointeeType()->equals(getPointeeType())); 1053641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang} 1054641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 10556315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr/***************************** RSExportVectorType *****************************/ 10566315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonrllvm::StringRef 10576315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonrRSExportVectorType::GetTypeName(const clang::ExtVectorType *EVT) { 10589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const clang::Type *ElementType = GET_EXT_VECTOR_ELEMENT_TYPE(EVT); 1059462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 10609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if ((ElementType->getTypeClass() != clang::Type::Builtin)) 10619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return llvm::StringRef(); 10629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1063be27482cdeaf08576bc39b72a15d35d13014a636Logan const clang::BuiltinType *BT = UNSAFE_CAST_TYPE(const clang::BuiltinType, 10649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ElementType); 1065a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang if ((EVT->getNumElements() < 1) || 1066a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang (EVT->getNumElements() > 4)) 1067a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang return llvm::StringRef(); 10689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 10699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (BT->getKind()) { 10709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Compiler is smart enough to optimize following *big if branches* since 10719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // they all become "constant comparison" after macro expansion 1072a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang#define ENUM_SUPPORT_BUILTIN_TYPE(builtin_type, type, cname) \ 1073a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang case builtin_type: { \ 1074a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang const char *Name[] = { cname"2", cname"3", cname"4" }; \ 1075a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang return Name[EVT->getNumElements() - 2]; \ 1076a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang break; \ 1077a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang } 1078a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang#include "RSClangBuiltinEnums.inc" 10799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao default: { 10809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return llvm::StringRef(); 1081462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 10829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1083462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1084462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 10859ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSExportVectorType *RSExportVectorType::Create(RSContext *Context, 10869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const clang::ExtVectorType *EVT, 10879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const llvm::StringRef &TypeName, 10889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool Normalized) { 10896e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(EVT != NULL && EVT->getTypeClass() == clang::Type::ExtVector); 1090462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 10919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const clang::Type *ElementType = GET_EXT_VECTOR_ELEMENT_TYPE(EVT); 10929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RSExportPrimitiveType::DataType DT = 10932ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines RSExportPrimitiveType::GetDataType(Context, ElementType); 1094462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 10959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (DT != RSExportPrimitiveType::DataTypeUnknown) 10969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return new RSExportVectorType(Context, 10979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao TypeName, 10989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao DT, 10999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Normalized, 11009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao EVT->getNumElements()); 11019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 11022ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines return NULL; 1103462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1104462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 11057c67e578c760408dba0c2f64da6e074dd8b56fd9Shih-wei Liaollvm::Type *RSExportVectorType::convertToLLVMType() const { 11067c67e578c760408dba0c2f64da6e074dd8b56fd9Shih-wei Liao llvm::Type *ElementType = RSExportPrimitiveType::convertToLLVMType(); 11079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return llvm::VectorType::get(ElementType, getNumElement()); 1108462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1109462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1110a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Changunion RSType *RSExportVectorType::convertToSpecType() const { 1111a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang llvm::OwningPtr<union RSType> ST(new union RSType); 1112a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang 1113a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang RS_TYPE_SET_CLASS(ST, RS_TC_Vector); 1114a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang RS_VECTOR_TYPE_SET_ELEMENT_TYPE(ST, getType()); 1115a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang RS_VECTOR_TYPE_SET_VECTOR_SIZE(ST, getNumElement()); 1116a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang 1117a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang return ST.take(); 1118a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang} 1119a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang 1120641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Changbool RSExportVectorType::equals(const RSExportable *E) const { 1121641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang CHECK_PARENT_EQUALITY(RSExportPrimitiveType, E); 1122641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang return (static_cast<const RSExportVectorType*>(E)->getNumElement() 1123641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang == getNumElement()); 1124641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang} 1125641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 112692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang/***************************** RSExportMatrixType *****************************/ 112792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr ChangRSExportMatrixType *RSExportMatrixType::Create(RSContext *Context, 112892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang const clang::RecordType *RT, 112992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang const llvm::StringRef &TypeName, 113092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang unsigned Dim) { 11316e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((RT != NULL) && (RT->getTypeClass() == clang::Type::Record)); 11326e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((Dim > 1) && "Invalid dimension of matrix"); 113392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 113492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang // Check whether the struct rs_matrix is in our expected form (but assume it's 113592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang // correct if we're not sure whether it's correct or not) 113692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang const clang::RecordDecl* RD = RT->getDecl(); 113792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang RD = RD->getDefinition(); 113892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang if (RD != NULL) { 11399207a2e495c8363606861e4f034504ec5c153dabLogan Chien clang::DiagnosticsEngine *DiagEngine = Context->getDiagnostics(); 11402ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines const clang::SourceManager *SM = Context->getSourceManager(); 114192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang // Find definition, perform further examination 114292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang if (RD->field_empty()) { 11439207a2e495c8363606861e4f034504ec5c153dabLogan Chien DiagEngine->Report( 11449207a2e495c8363606861e4f034504ec5c153dabLogan Chien clang::FullSourceLoc(RD->getLocation(), *SM), 11459207a2e495c8363606861e4f034504ec5c153dabLogan Chien DiagEngine->getCustomDiagID( 11469207a2e495c8363606861e4f034504ec5c153dabLogan Chien clang::DiagnosticsEngine::Error, 11479207a2e495c8363606861e4f034504ec5c153dabLogan Chien "invalid matrix struct: must have 1 field for saving values: '%0'")) 11482ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines << RD->getName(); 114992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang return NULL; 115092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang } 115192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 115292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang clang::RecordDecl::field_iterator FIT = RD->field_begin(); 115392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang const clang::FieldDecl *FD = *FIT; 115492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang const clang::Type *FT = RSExportType::GetTypeOfDecl(FD); 115592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang if ((FT == NULL) || (FT->getTypeClass() != clang::Type::ConstantArray)) { 11569207a2e495c8363606861e4f034504ec5c153dabLogan Chien DiagEngine->Report( 11579207a2e495c8363606861e4f034504ec5c153dabLogan Chien clang::FullSourceLoc(RD->getLocation(), *SM), 11589207a2e495c8363606861e4f034504ec5c153dabLogan Chien DiagEngine->getCustomDiagID(clang::DiagnosticsEngine::Error, 11599207a2e495c8363606861e4f034504ec5c153dabLogan Chien "invalid matrix struct: first field should" 11609207a2e495c8363606861e4f034504ec5c153dabLogan Chien " be an array with constant size: '%0'")) 11619207a2e495c8363606861e4f034504ec5c153dabLogan Chien << RD->getName(); 116292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang return NULL; 116392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang } 116492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang const clang::ConstantArrayType *CAT = 116592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang static_cast<const clang::ConstantArrayType *>(FT); 11662e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang const clang::Type *ElementType = GET_CONSTANT_ARRAY_ELEMENT_TYPE(CAT); 116792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang if ((ElementType == NULL) || 116892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang (ElementType->getTypeClass() != clang::Type::Builtin) || 11699207a2e495c8363606861e4f034504ec5c153dabLogan Chien (static_cast<const clang::BuiltinType *>(ElementType)->getKind() != 11709207a2e495c8363606861e4f034504ec5c153dabLogan Chien clang::BuiltinType::Float)) { 11719207a2e495c8363606861e4f034504ec5c153dabLogan Chien DiagEngine->Report( 11729207a2e495c8363606861e4f034504ec5c153dabLogan Chien clang::FullSourceLoc(RD->getLocation(), *SM), 11739207a2e495c8363606861e4f034504ec5c153dabLogan Chien DiagEngine->getCustomDiagID(clang::DiagnosticsEngine::Error, 11749207a2e495c8363606861e4f034504ec5c153dabLogan Chien "invalid matrix struct: first field " 11759207a2e495c8363606861e4f034504ec5c153dabLogan Chien "should be a float array: '%0'")) 11769207a2e495c8363606861e4f034504ec5c153dabLogan Chien << RD->getName(); 117792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang return NULL; 117892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang } 117992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 118092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang if (CAT->getSize() != Dim * Dim) { 11819207a2e495c8363606861e4f034504ec5c153dabLogan Chien DiagEngine->Report( 11829207a2e495c8363606861e4f034504ec5c153dabLogan Chien clang::FullSourceLoc(RD->getLocation(), *SM), 11839207a2e495c8363606861e4f034504ec5c153dabLogan Chien DiagEngine->getCustomDiagID(clang::DiagnosticsEngine::Error, 11849207a2e495c8363606861e4f034504ec5c153dabLogan Chien "invalid matrix struct: first field " 11859207a2e495c8363606861e4f034504ec5c153dabLogan Chien "should be an array with size %0: '%1'")) 11869207a2e495c8363606861e4f034504ec5c153dabLogan Chien << (Dim * Dim) << (RD->getName()); 118792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang return NULL; 118892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang } 118992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 119092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang FIT++; 119192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang if (FIT != RD->field_end()) { 11929207a2e495c8363606861e4f034504ec5c153dabLogan Chien DiagEngine->Report( 11939207a2e495c8363606861e4f034504ec5c153dabLogan Chien clang::FullSourceLoc(RD->getLocation(), *SM), 11949207a2e495c8363606861e4f034504ec5c153dabLogan Chien DiagEngine->getCustomDiagID(clang::DiagnosticsEngine::Error, 11959207a2e495c8363606861e4f034504ec5c153dabLogan Chien "invalid matrix struct: must have " 11969207a2e495c8363606861e4f034504ec5c153dabLogan Chien "exactly 1 field: '%0'")) 11979207a2e495c8363606861e4f034504ec5c153dabLogan Chien << RD->getName(); 119892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang return NULL; 119992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang } 120092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang } 120192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 120292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang return new RSExportMatrixType(Context, TypeName, Dim); 120392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang} 120492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 12057c67e578c760408dba0c2f64da6e074dd8b56fd9Shih-wei Liaollvm::Type *RSExportMatrixType::convertToLLVMType() const { 120692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang // Construct LLVM type: 120792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang // struct { 120892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang // float X[mDim * mDim]; 120992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang // } 121092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 121192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang llvm::LLVMContext &C = getRSContext()->getLLVMContext(); 121292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang llvm::ArrayType *X = llvm::ArrayType::get(llvm::Type::getFloatTy(C), 121392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang mDim * mDim); 1214a67e4451d0d03b4ab7866b64807d95a8399c73a0Stephen Hines return llvm::StructType::get(C, X, false); 121592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang} 121692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 1217a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Changunion RSType *RSExportMatrixType::convertToSpecType() const { 1218a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang llvm::OwningPtr<union RSType> ST(new union RSType); 1219a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang RS_TYPE_SET_CLASS(ST, RS_TC_Matrix); 1220a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang switch (getDim()) { 1221a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang case 2: RS_MATRIX_TYPE_SET_DATA_TYPE(ST, RS_DT_RSMatrix2x2); break; 1222a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang case 3: RS_MATRIX_TYPE_SET_DATA_TYPE(ST, RS_DT_RSMatrix3x3); break; 1223a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang case 4: RS_MATRIX_TYPE_SET_DATA_TYPE(ST, RS_DT_RSMatrix4x4); break; 12246e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines default: slangAssert(false && "Matrix type with unsupported dimension."); 1225a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang } 1226a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang return ST.take(); 1227a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang} 1228a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang 1229641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Changbool RSExportMatrixType::equals(const RSExportable *E) const { 1230641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang CHECK_PARENT_EQUALITY(RSExportType, E); 1231641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang return (static_cast<const RSExportMatrixType*>(E)->getDim() == getDim()); 1232641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang} 1233641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 12342e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang/************************* RSExportConstantArrayType *************************/ 12352e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr ChangRSExportConstantArrayType 12362e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang*RSExportConstantArrayType::Create(RSContext *Context, 12372e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang const clang::ConstantArrayType *CAT) { 12386e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(CAT != NULL && CAT->getTypeClass() == clang::Type::ConstantArray); 12392e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 12406e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((CAT->getSize().getActiveBits() < 32) && "array too large"); 12412e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 12422e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang unsigned Size = static_cast<unsigned>(CAT->getSize().getZExtValue()); 12436e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((Size > 0) && "Constant array should have size greater than 0"); 12442e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 12452e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang const clang::Type *ElementType = GET_CONSTANT_ARRAY_ELEMENT_TYPE(CAT); 12462e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang RSExportType *ElementET = RSExportType::Create(Context, ElementType); 12472e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 12482e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang if (ElementET == NULL) { 12492e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang return NULL; 12502e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang } 12512e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 12522e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang return new RSExportConstantArrayType(Context, 12532e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang ElementET, 12542e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang Size); 12552e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang} 12562e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 12577c67e578c760408dba0c2f64da6e074dd8b56fd9Shih-wei Liaollvm::Type *RSExportConstantArrayType::convertToLLVMType() const { 12582e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang return llvm::ArrayType::get(mElementType->getLLVMType(), getSize()); 12592e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang} 12602e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 1261a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Changunion RSType *RSExportConstantArrayType::convertToSpecType() const { 1262a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang llvm::OwningPtr<union RSType> ST(new union RSType); 1263a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang 1264a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang RS_TYPE_SET_CLASS(ST, RS_TC_ConstantArray); 1265a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang RS_CONSTANT_ARRAY_TYPE_SET_ELEMENT_TYPE( 1266a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang ST, getElementType()->getSpecType()); 1267a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang RS_CONSTANT_ARRAY_TYPE_SET_ELEMENT_SIZE(ST, getSize()); 1268a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang 1269a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang if (RS_CONSTANT_ARRAY_TYPE_GET_ELEMENT_TYPE(ST) != NULL) 1270a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang return ST.take(); 1271a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang else 1272a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang return NULL; 1273a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang} 1274a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang 12753cd3dd327445fcfa49f0e96cb2de2055bce541e9Zonr Changbool RSExportConstantArrayType::keep() { 12763cd3dd327445fcfa49f0e96cb2de2055bce541e9Zonr Chang if (!RSExportType::keep()) 12773cd3dd327445fcfa49f0e96cb2de2055bce541e9Zonr Chang return false; 1278641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang const_cast<RSExportType*>(mElementType)->keep(); 12793cd3dd327445fcfa49f0e96cb2de2055bce541e9Zonr Chang return true; 1280641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang} 1281641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 1282641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Changbool RSExportConstantArrayType::equals(const RSExportable *E) const { 1283641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang CHECK_PARENT_EQUALITY(RSExportType, E); 1284a7b7518aa3725d5cff1c1a6319ec7a6b8b244e0eStephen Hines const RSExportConstantArrayType *RHS = 1285a7b7518aa3725d5cff1c1a6319ec7a6b8b244e0eStephen Hines static_cast<const RSExportConstantArrayType*>(E); 1286a7b7518aa3725d5cff1c1a6319ec7a6b8b244e0eStephen Hines return ((getSize() == RHS->getSize()) && 1287a7b7518aa3725d5cff1c1a6319ec7a6b8b244e0eStephen Hines (getElementType()->equals(RHS->getElementType()))); 1288641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang} 1289641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 12909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/**************************** RSExportRecordType ****************************/ 12919ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSExportRecordType *RSExportRecordType::Create(RSContext *Context, 12929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const clang::RecordType *RT, 12939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const llvm::StringRef &TypeName, 12949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool mIsArtificial) { 12956e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(RT != NULL && RT->getTypeClass() == clang::Type::Record); 1296462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 12979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const clang::RecordDecl *RD = RT->getDecl(); 12986e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(RD->isStruct()); 1299462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 13009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RD = RD->getDefinition(); 13019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (RD == NULL) { 13026e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "struct is not defined in this module"); 13039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return NULL; 13049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1305462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 13060da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang // Struct layout construct by clang. We rely on this for obtaining the 13070da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang // alloc size of a struct and offset of every field in that struct. 13080da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang const clang::ASTRecordLayout *RL = 13099e5b503349719144f63ccb7c62ee9c291a7d83b8Stephen Hines &Context->getASTContext().getASTRecordLayout(RD); 1310f2174cfd6a556b51aadf2b8765e50df080e8f18eStephen Hines slangAssert((RL != NULL) && 1311f2174cfd6a556b51aadf2b8765e50df080e8f18eStephen Hines "Failed to retrieve the struct layout from Clang."); 13120da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang 13130da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang RSExportRecordType *ERT = 13140da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang new RSExportRecordType(Context, 13150da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang TypeName, 13160da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang RD->hasAttr<clang::PackedAttr>(), 13170da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang mIsArtificial, 131868318a14fe6d2debc1b9dce3fe71c42f5916eef5Shih-wei Liao RL->getSize().getQuantity()); 13199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao unsigned int Index = 0; 13209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 13219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (clang::RecordDecl::field_iterator FI = RD->field_begin(), 13229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FE = RD->field_end(); 13239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FI != FE; 132491a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao FI++, Index++) { 13259207a2e495c8363606861e4f034504ec5c153dabLogan Chien clang::DiagnosticsEngine *DiagEngine = Context->getDiagnostics(); 13269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 13279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // FIXME: All fields should be primitive type 13286e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((*FI)->getKind() == clang::Decl::Field); 13299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::FieldDecl *FD = *FI; 13309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 13312ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines if (FD->isBitField()) { 13322ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines return NULL; 13332ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines } 13349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 13359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Type 13366315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr RSExportType *ET = RSExportElement::CreateFromDecl(Context, FD); 13379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 13382ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines if (ET != NULL) { 13390da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang ERT->mFields.push_back( 13400da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang new Field(ET, FD->getName(), ERT, 13410da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang static_cast<size_t>(RL->getFieldOffset(Index) >> 3))); 13422ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines } else { 13439207a2e495c8363606861e4f034504ec5c153dabLogan Chien DiagEngine->Report( 13449207a2e495c8363606861e4f034504ec5c153dabLogan Chien clang::FullSourceLoc(RD->getLocation(), DiagEngine->getSourceManager()), 13459207a2e495c8363606861e4f034504ec5c153dabLogan Chien DiagEngine->getCustomDiagID(clang::DiagnosticsEngine::Error, 13469207a2e495c8363606861e4f034504ec5c153dabLogan Chien "field type cannot be exported: '%0.%1'")) 13479207a2e495c8363606861e4f034504ec5c153dabLogan Chien << RD->getName() << FD->getName(); 13482ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines return NULL; 13492ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines } 13509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 13510a3f20ec28ed6f5ae1ed5d61f6b6e3e577f7f5d1Shih-wei Liao 13529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return ERT; 1353462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1354462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 13557c67e578c760408dba0c2f64da6e074dd8b56fd9Shih-wei Liaollvm::Type *RSExportRecordType::convertToLLVMType() const { 13563cd3dd327445fcfa49f0e96cb2de2055bce541e9Zonr Chang // Create an opaque type since struct may reference itself recursively. 13573cd3dd327445fcfa49f0e96cb2de2055bce541e9Zonr Chang 13587c67e578c760408dba0c2f64da6e074dd8b56fd9Shih-wei Liao // TODO(sliao): LLVM took out the OpaqueType. Any other to migrate to? 13597c67e578c760408dba0c2f64da6e074dd8b56fd9Shih-wei Liao std::vector<llvm::Type*> FieldTypes; 1360462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 13613cd3dd327445fcfa49f0e96cb2de2055bce541e9Zonr Chang for (const_field_iterator FI = fields_begin(), FE = fields_end(); 13629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FI != FE; 13639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FI++) { 13649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const Field *F = *FI; 13659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportType *FET = F->getType(); 13661f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao 13679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FieldTypes.push_back(FET->getLLVMType()); 13689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1369462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 13703cd3dd327445fcfa49f0e96cb2de2055bce541e9Zonr Chang llvm::StructType *ST = llvm::StructType::get(getRSContext()->getLLVMContext(), 13713cd3dd327445fcfa49f0e96cb2de2055bce541e9Zonr Chang FieldTypes, 13723cd3dd327445fcfa49f0e96cb2de2055bce541e9Zonr Chang mIsPacked); 13737c67e578c760408dba0c2f64da6e074dd8b56fd9Shih-wei Liao if (ST != NULL) { 13747c67e578c760408dba0c2f64da6e074dd8b56fd9Shih-wei Liao return ST; 13757c67e578c760408dba0c2f64da6e074dd8b56fd9Shih-wei Liao } else { 13763cd3dd327445fcfa49f0e96cb2de2055bce541e9Zonr Chang return NULL; 13777c67e578c760408dba0c2f64da6e074dd8b56fd9Shih-wei Liao } 1378462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1379641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 1380a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Changunion RSType *RSExportRecordType::convertToSpecType() const { 1381a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang unsigned NumFields = getFields().size(); 1382a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang unsigned AllocSize = sizeof(union RSType) + 1383a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang sizeof(struct RSRecordField) * NumFields; 1384a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang llvm::OwningPtr<union RSType> ST( 1385e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines reinterpret_cast<union RSType*>(operator new(AllocSize))); 1386a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang 1387a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang ::memset(ST.get(), 0, AllocSize); 1388a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang 1389a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang RS_TYPE_SET_CLASS(ST, RS_TC_Record); 1390a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang RS_RECORD_TYPE_SET_NAME(ST, getName().c_str()); 1391a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang RS_RECORD_TYPE_SET_NUM_FIELDS(ST, NumFields); 1392a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang 1393a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang setSpecTypeTemporarily(ST.get()); 1394a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang 1395a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang unsigned FieldIdx = 0; 1396a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang for (const_field_iterator FI = fields_begin(), FE = fields_end(); 1397a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang FI != FE; 1398a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang FI++, FieldIdx++) { 1399a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang const Field *F = *FI; 1400a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang 1401a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang RS_RECORD_TYPE_SET_FIELD_NAME(ST, FieldIdx, F->getName().c_str()); 1402a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang RS_RECORD_TYPE_SET_FIELD_TYPE(ST, FieldIdx, F->getType()->getSpecType()); 1403a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang } 1404a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang 1405e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines // TODO(slang): Check whether all fields were created normally. 1406a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang 1407a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang return ST.take(); 1408a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang} 1409a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang 14103cd3dd327445fcfa49f0e96cb2de2055bce541e9Zonr Changbool RSExportRecordType::keep() { 14113cd3dd327445fcfa49f0e96cb2de2055bce541e9Zonr Chang if (!RSExportType::keep()) 14123cd3dd327445fcfa49f0e96cb2de2055bce541e9Zonr Chang return false; 1413641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang for (std::list<const Field*>::iterator I = mFields.begin(), 1414641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang E = mFields.end(); 1415641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang I != E; 1416641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang I++) { 1417641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang const_cast<RSExportType*>((*I)->getType())->keep(); 1418641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang } 14193cd3dd327445fcfa49f0e96cb2de2055bce541e9Zonr Chang return true; 1420641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang} 1421641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 1422641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Changbool RSExportRecordType::equals(const RSExportable *E) const { 1423641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang CHECK_PARENT_EQUALITY(RSExportType, E); 1424641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 1425641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang const RSExportRecordType *ERT = static_cast<const RSExportRecordType*>(E); 1426641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 1427641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang if (ERT->getFields().size() != getFields().size()) 1428641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang return false; 1429641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 1430641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang const_field_iterator AI = fields_begin(), BI = ERT->fields_begin(); 1431641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 1432641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang for (unsigned i = 0, e = getFields().size(); i != e; i++) { 1433641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang if (!(*AI)->getType()->equals((*BI)->getType())) 1434641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang return false; 1435641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang AI++; 1436641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang BI++; 1437641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang } 1438641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 1439641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang return true; 1440641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang} 1441e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 14421b6a0883cd6984e11e59b0c847fb334df1f41afcJason Samsvoid RSExportType::convertToRTD(RSReflectionTypeData *rtd) const { 14431b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams memset(rtd, 0, sizeof(*rtd)); 14441b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams rtd->vecSize = 1; 14451b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams 14461b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams switch(getClass()) { 14471b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams case RSExportType::ExportClassPrimitive: { 14481b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams const RSExportPrimitiveType *EPT = static_cast<const RSExportPrimitiveType*>(this); 14491b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams rtd->type = RSExportPrimitiveType::getRSReflectionType(EPT); 14501b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams return; 14511b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams } 14521b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams case RSExportType::ExportClassPointer: { 14531b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams const RSExportPointerType *EPT = static_cast<const RSExportPointerType*>(this); 14541b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams const RSExportType *PointeeType = EPT->getPointeeType(); 14551b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams PointeeType->convertToRTD(rtd); 14561b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams rtd->isPointer = true; 14571b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams return; 14581b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams } 14591b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams case RSExportType::ExportClassVector: { 14601b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams const RSExportVectorType *EVT = static_cast<const RSExportVectorType*>(this); 14611b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams rtd->type = EVT->getRSReflectionType(EVT); 14621b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams rtd->vecSize = EVT->getNumElement(); 14631b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams return; 14641b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams } 14651b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams case RSExportType::ExportClassMatrix: { 14661b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams const RSExportMatrixType *EMT = static_cast<const RSExportMatrixType*>(this); 14671b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams unsigned Dim = EMT->getDim(); 14681b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams slangAssert((Dim >= 2) && (Dim <= 4)); 14691b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams rtd->type = &gReflectionTypes[15 + Dim-2]; 14701b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams return; 14711b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams } 14721b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams case RSExportType::ExportClassConstantArray: { 14731b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams const RSExportConstantArrayType* CAT = 14741b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams static_cast<const RSExportConstantArrayType*>(this); 14751b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams CAT->getElementType()->convertToRTD(rtd); 14761b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams rtd->arraySize = CAT->getSize(); 14771b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams return; 14781b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams } 14791b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams case RSExportType::ExportClassRecord: { 14801b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams slangAssert(!"RSExportType::ExportClassRecord not implemented"); 14811b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams return;// RS_TYPE_CLASS_NAME_PREFIX + ET->getName() + ".Item"; 14821b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams } 14831b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams default: { 14841b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams slangAssert(false && "Unknown class of type"); 14851b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams } 14861b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams } 14871b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams} 14881b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams 14891b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams 1490e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines} // namespace slang 1491