Mercurial > projects > ldc
diff gen/typinf.cpp @ 113:27b9f749d9fe trunk
[svn r117] Initial working implementation of interfaces.
Groundwork for all the different types of class/interface casts laid out.
author | lindquist |
---|---|
date | Sat, 24 Nov 2007 06:33:00 +0100 |
parents | e8da7856a260 |
children | 5ba6d286c941 |
line wrap: on
line diff
--- a/gen/typinf.cpp Thu Nov 22 22:30:10 2007 +0100 +++ b/gen/typinf.cpp Sat Nov 24 06:33:00 2007 +0100 @@ -1029,76 +1029,127 @@ void TypeInfoInterfaceDeclaration::llvmDeclare() { - assert(0 && "TypeInfoTupleDeclaration"); + Logger::println("TypeInfoInterfaceDeclaration::llvmDeclare() %s", toChars()); + LOG_SCOPE; + + // init typeinfo class + ClassDeclaration* base = Type::typeinfointerface; + assert(base); + DtoResolveClass(base); + + // get type of typeinfo class + const llvm::StructType* stype = isaStruct(base->type->llvmType->get()); + + // create the symbol + llvmValue = new llvm::GlobalVariable(stype,true,llvm::GlobalValue::WeakLinkage,NULL,toChars(),gIR->module); } void TypeInfoInterfaceDeclaration::llvmDefine() { - assert(0 && "TypeInfoTupleDeclaration"); + Logger::println("TypeInfoInterfaceDeclaration::llvmDefine() %s", toChars()); + LOG_SCOPE; + + // init typeinfo class + ClassDeclaration* base = Type::typeinfointerface; + assert(base); + DtoForceConstInitDsymbol(base); + + // get type of typeinfo class + const llvm::StructType* stype = isaStruct(base->type->llvmType->get()); + + // initializer vector + std::vector<llvm::Constant*> sinits; + // first is always the vtable + sinits.push_back(base->llvmVtbl); + + // get classinfo + assert(tinfo->ty == Tclass); + TypeClass *tc = (TypeClass *)tinfo; + assert(tc->sym->llvmClass); + sinits.push_back(tc->sym->llvmClass); + + // create the symbol + llvm::Constant* tiInit = llvm::ConstantStruct::get(stype, sinits); + isaGlobalVar(llvmValue)->setInitializer(tiInit); } void TypeInfoInterfaceDeclaration::toDt(dt_t **pdt) { - assert(0 && "TypeInfoInterfaceDeclaration"); - - /* - //printf("TypeInfoInterfaceDeclaration::toDt() %s\n", tinfo->toChars()); - dtxoff(pdt, Type::typeinfointerface->toVtblSymbol(), 0, TYnptr); // vtbl for TypeInfoInterface - dtdword(pdt, 0); // monitor - - assert(tinfo->ty == Tclass); - - TypeClass *tc = (TypeClass *)tinfo; - Symbol *s; - - if (!tc->sym->vclassinfo) - tc->sym->vclassinfo = new ClassInfoDeclaration(tc->sym); - s = tc->sym->vclassinfo->toSymbol(); - dtxoff(pdt, s, 0, TYnptr); // ClassInfo for tinfo - */ + assert(0); } /* ========================================================================= */ void TypeInfoTupleDeclaration::llvmDeclare() { - assert(0 && "TypeInfoTupleDeclaration"); + Logger::println("TypeInfoTupleDeclaration::llvmDeclare() %s", toChars()); + LOG_SCOPE; + + // init typeinfo class + ClassDeclaration* base = Type::typeinfotypelist; + assert(base); + DtoResolveClass(base); + + // get type of typeinfo class + const llvm::StructType* stype = isaStruct(base->type->llvmType->get()); + + // create the symbol + llvmValue = new llvm::GlobalVariable(stype,true,llvm::GlobalValue::WeakLinkage,NULL,toChars(),gIR->module); } void TypeInfoTupleDeclaration::llvmDefine() { - assert(0 && "TypeInfoTupleDeclaration"); + Logger::println("TypeInfoTupleDeclaration::llvmDefine() %s", toChars()); + LOG_SCOPE; + + // init typeinfo class + ClassDeclaration* base = Type::typeinfotypelist; + assert(base); + DtoForceConstInitDsymbol(base); + + // get type of typeinfo class + const llvm::StructType* stype = isaStruct(base->type->llvmType->get()); + + // initializer vector + std::vector<llvm::Constant*> sinits; + // first is always the vtable + sinits.push_back(base->llvmVtbl); + + // create elements array + assert(tinfo->ty == Ttuple); + TypeTuple *tu = (TypeTuple *)tinfo; + + size_t dim = tu->arguments->dim; + std::vector<llvm::Constant*> arrInits; + + const llvm::Type* tiTy = Type::typeinfo->type->llvmType->get(); + tiTy = llvm::PointerType::get(tiTy); + + for (size_t i = 0; i < dim; i++) + { + Argument *arg = (Argument *)tu->arguments->data[i]; + arg->type->getTypeInfo(NULL); + DtoForceDeclareDsymbol(arg->type->vtinfo); + assert(arg->type->vtinfo->llvmValue); + llvm::Constant* c = isaConstant(arg->type->vtinfo->llvmValue); + c = llvm::ConstantExpr::getBitCast(c, tiTy); + arrInits.push_back(c); + } + + // build array type + const llvm::ArrayType* arrTy = llvm::ArrayType::get(tiTy, dim); + llvm::Constant* arrC = llvm::ConstantArray::get(arrTy, arrInits); + + // build the slice + llvm::Constant* slice = DtoConstSlice(DtoConstSize_t(dim), arrC); + sinits.push_back(slice); + + // create the symbol + llvm::Constant* tiInit = llvm::ConstantStruct::get(stype, sinits); + isaGlobalVar(llvmValue)->setInitializer(tiInit); } void TypeInfoTupleDeclaration::toDt(dt_t **pdt) { - assert(0 && "TypeInfoTupleDeclaration"); - - /* - //printf("TypeInfoTupleDeclaration::toDt() %s\n", tinfo->toChars()); - dtxoff(pdt, Type::typeinfotypelist->toVtblSymbol(), 0, TYnptr); // vtbl for TypeInfoInterface - dtdword(pdt, 0); // monitor - - assert(tinfo->ty == Ttuple); - - TypeTuple *tu = (TypeTuple *)tinfo; - - size_t dim = tu->arguments->dim; - dtdword(pdt, dim); // elements.length - - dt_t *d = NULL; - for (size_t i = 0; i < dim; i++) - { Argument *arg = (Argument *)tu->arguments->data[i]; - Expression *e = arg->type->getTypeInfo(NULL); - e = e->optimize(WANTvalue); - e->toDt(&d); - } - - Symbol *s; - s = static_sym(); - s->Sdt = d; - outdata(s); - - dtxoff(pdt, s, 0, TYnptr); // elements.ptr - */ + assert(0); }