llvm::Type * IrTypeSArray::sarray2llvm(Type * t) { assert(t->ty == Tsarray && "not static array type"); TypeSArray* tsa = static_cast<TypeSArray*>(t); uint64_t dim = static_cast<uint64_t>(tsa->dim->toUInteger()); LLType* elemType = i1ToI8(voidToI8(DtoType(t->nextOf()))); return llvm::ArrayType::get(elemType, dim); }
llvm::Type* IrTypeVector::vector2llvm(Type* dt) { assert(dt->ty == Tvector && "not vector type"); TypeVector* tv = static_cast<TypeVector*>(dt); assert(tv->basetype->ty == Tsarray); TypeSArray* tsa = static_cast<TypeSArray*>(tv->basetype); uint64_t dim = static_cast<uint64_t>(tsa->dim->toUInteger()); LLType* elemType = voidToI8(DtoType(tsa->next)); return llvm::VectorType::get(elemType, dim); }
IrTypeArray* IrTypeArray::get(Type* dt) { assert(!dt->ctype); assert(dt->ty == Tarray && "not dynamic array type"); LLType* elemType = i1ToI8(voidToI8(DtoType(dt->nextOf()))); // Could have already built the type as part of a struct forward reference, // just as for pointers. if (!dt->ctype) { llvm::Type *types[] = { DtoSize_t(), llvm::PointerType::get(elemType, 0) }; LLType* at = llvm::StructType::get(llvm::getGlobalContext(), types, false); dt->ctype = new IrTypeArray(dt, at); } return dt->ctype->isArray(); }
IrTypePointer* IrTypePointer::get(Type* dt) { assert(!dt->ctype); assert((dt->ty == Tpointer || dt->ty == Tnull) && "not pointer/null type"); LLType* elemType; if (dt->ty == Tnull) { elemType = llvm::Type::getInt8Ty(llvm::getGlobalContext()); } else { elemType = i1ToI8(voidToI8(DtoType(dt->nextOf()))); // DtoType could have already created the same type, e.g. for // dt == Node* in struct Node { Node* n; }. if (dt->ctype) return dt->ctype->isPointer(); } IrTypePointer* t = new IrTypePointer(dt, llvm::PointerType::get(elemType, 0)); dt->ctype = t; return t; }
LLType *DtoMemType(Type *t) { return i1ToI8(voidToI8(DtoType(t))); }