Mercurial > projects > ldc
diff gen/typinf.cpp @ 115:5ba6d286c941 trunk
[svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
author | lindquist |
---|---|
date | Sun, 25 Nov 2007 03:58:55 +0100 |
parents | 27b9f749d9fe |
children | 9c79b61fb638 |
line wrap: on
line diff
--- a/gen/typinf.cpp Sun Nov 25 00:19:13 2007 +0100 +++ b/gen/typinf.cpp Sun Nov 25 03:58:55 2007 +0100 @@ -355,9 +355,13 @@ const llvm::StructType* stype = isaStruct(base->type->llvmType->get()); Logger::cout() << "got stype: " << *stype << '\n'; + // vtbl std::vector<llvm::Constant*> sinits; sinits.push_back(base->llvmVtbl); + // monitor + sinits.push_back(llvm::ConstantPointerNull::get(llvm::PointerType::get(llvm::Type::Int8Ty))); + assert(tinfo->ty == Ttypedef); TypeTypedef *tc = (TypeTypedef *)tinfo; TypedefDeclaration *sd = tc->sym; @@ -376,13 +380,13 @@ assert(sd->basetype->vtinfo->llvmValue); assert(llvm::isa<llvm::Constant>(sd->basetype->vtinfo->llvmValue)); llvm::Constant* castbase = llvm::cast<llvm::Constant>(sd->basetype->vtinfo->llvmValue); - castbase = llvm::ConstantExpr::getBitCast(castbase, stype->getElementType(1)); + castbase = llvm::ConstantExpr::getBitCast(castbase, stype->getElementType(2)); sinits.push_back(castbase); // char[] name char *name = sd->toPrettyChars(); sinits.push_back(DtoConstString(name)); - assert(sinits.back()->getType() == stype->getElementType(2)); + assert(sinits.back()->getType() == stype->getElementType(3)); // void[] init const llvm::PointerType* initpt = llvm::PointerType::get(llvm::Type::Int8Ty); @@ -437,9 +441,13 @@ const llvm::StructType* stype = isaStruct(base->type->llvmType->get()); + // vtbl std::vector<llvm::Constant*> sinits; sinits.push_back(base->llvmVtbl); + // monitor + sinits.push_back(llvm::ConstantPointerNull::get(llvm::PointerType::get(llvm::Type::Int8Ty))); + assert(tinfo->ty == Tenum); TypeEnum *tc = (TypeEnum *)tinfo; EnumDeclaration *sd = tc->sym; @@ -457,13 +465,13 @@ assert(llvm::isa<llvm::Constant>(sd->memtype->vtinfo->llvmValue)); llvm::Constant* castbase = llvm::cast<llvm::Constant>(sd->memtype->vtinfo->llvmValue); - castbase = llvm::ConstantExpr::getBitCast(castbase, stype->getElementType(1)); + castbase = llvm::ConstantExpr::getBitCast(castbase, stype->getElementType(2)); sinits.push_back(castbase); // char[] name char *name = sd->toPrettyChars(); sinits.push_back(DtoConstString(name)); - assert(sinits.back()->getType() == stype->getElementType(2)); + assert(sinits.back()->getType() == stype->getElementType(3)); // void[] init const llvm::PointerType* initpt = llvm::PointerType::get(llvm::Type::Int8Ty); @@ -513,9 +521,13 @@ const llvm::StructType* stype = isaStruct(base->type->llvmType->get()); + // vtbl std::vector<llvm::Constant*> sinits; sinits.push_back(base->llvmVtbl); + // monitor + sinits.push_back(llvm::ConstantPointerNull::get(llvm::PointerType::get(llvm::Type::Int8Ty))); + // TypeInfo base Logger::println("generating base typeinfo"); basetype->getTypeInfo(NULL); @@ -524,7 +536,7 @@ DtoForceDeclareDsymbol(basetype->vtinfo); assert(llvm::isa<llvm::Constant>(basetype->vtinfo->llvmValue)); llvm::Constant* castbase = llvm::cast<llvm::Constant>(basetype->vtinfo->llvmValue); - castbase = llvm::ConstantExpr::getBitCast(castbase, stype->getElementType(1)); + castbase = llvm::ConstantExpr::getBitCast(castbase, stype->getElementType(2)); sinits.push_back(castbase); // create the symbol @@ -625,6 +637,9 @@ // first is always the vtable sinits.push_back(base->llvmVtbl); + // monitor + sinits.push_back(llvm::ConstantPointerNull::get(llvm::PointerType::get(llvm::Type::Int8Ty))); + // value typeinfo assert(tinfo->ty == Tsarray); TypeSArray *tc = (TypeSArray *)tinfo; @@ -634,7 +649,7 @@ assert(tc->next->vtinfo); DtoForceDeclareDsymbol(tc->next->vtinfo); llvm::Constant* castbase = isaConstant(tc->next->vtinfo->llvmValue); - castbase = llvm::ConstantExpr::getBitCast(castbase, stype->getElementType(1)); + castbase = llvm::ConstantExpr::getBitCast(castbase, stype->getElementType(2)); sinits.push_back(castbase); // length @@ -685,6 +700,9 @@ // first is always the vtable sinits.push_back(base->llvmVtbl); + // monitor + sinits.push_back(llvm::ConstantPointerNull::get(llvm::PointerType::get(llvm::Type::Int8Ty))); + // get type assert(tinfo->ty == Taarray); TypeAArray *tc = (TypeAArray *)tinfo; @@ -696,7 +714,7 @@ assert(tc->next->vtinfo); DtoForceDeclareDsymbol(tc->next->vtinfo); llvm::Constant* castbase = isaConstant(tc->next->vtinfo->llvmValue); - castbase = llvm::ConstantExpr::getBitCast(castbase, stype->getElementType(1)); + castbase = llvm::ConstantExpr::getBitCast(castbase, stype->getElementType(2)); sinits.push_back(castbase); // key typeinfo @@ -706,7 +724,7 @@ assert(tc->index->vtinfo); DtoForceDeclareDsymbol(tc->index->vtinfo); castbase = isaConstant(tc->index->vtinfo->llvmValue); - castbase = llvm::ConstantExpr::getBitCast(castbase, stype->getElementType(2)); + castbase = llvm::ConstantExpr::getBitCast(castbase, stype->getElementType(3)); sinits.push_back(castbase); // create the symbol @@ -813,14 +831,18 @@ const llvm::StructType* stype = isaStruct(((TypeClass*)base->type)->llvmType->get()); + // vtbl std::vector<llvm::Constant*> sinits; sinits.push_back(base->llvmVtbl); + // monitor + sinits.push_back(llvm::ConstantPointerNull::get(llvm::PointerType::get(llvm::Type::Int8Ty))); + // char[] name char *name = sd->toPrettyChars(); sinits.push_back(DtoConstString(name)); //Logger::println("************** A"); - assert(sinits.back()->getType() == stype->getElementType(1)); + assert(sinits.back()->getType() == stype->getElementType(2)); // void[] init const llvm::PointerType* initpt = llvm::PointerType::get(llvm::Type::Int8Ty); @@ -882,7 +904,8 @@ #endif //Logger::println("************** B"); - const llvm::PointerType* ptty = isaPointer(stype->getElementType(3)); + const llvm::PointerType* ptty = isaPointer(stype->getElementType(4)); + assert(ptty); s = search_function(sd, Id::tohash); fdx = s ? s->isFuncDeclaration() : NULL; @@ -910,7 +933,7 @@ for (int i = 0; i < 2; i++) { //Logger::println("************** C %d", i); - ptty = isaPointer(stype->getElementType(4+i)); + ptty = isaPointer(stype->getElementType(5+i)); if (fdx) { fd = fdx->overloadExactMatch(tfeqptr); @@ -935,7 +958,7 @@ } //Logger::println("************** D"); - ptty = isaPointer(stype->getElementType(6)); + ptty = isaPointer(stype->getElementType(7)); s = search_function(sd, Id::tostring); fdx = s ? s->isFuncDeclaration() : NULL; if (fdx) @@ -1009,6 +1032,9 @@ // first is always the vtable sinits.push_back(base->llvmVtbl); + // monitor + sinits.push_back(llvm::ConstantPointerNull::get(llvm::PointerType::get(llvm::Type::Int8Ty))); + // get classinfo assert(tinfo->ty == Tclass); TypeClass *tc = (TypeClass *)tinfo; @@ -1062,6 +1088,9 @@ // first is always the vtable sinits.push_back(base->llvmVtbl); + // monitor + sinits.push_back(llvm::ConstantPointerNull::get(llvm::PointerType::get(llvm::Type::Int8Ty))); + // get classinfo assert(tinfo->ty == Tclass); TypeClass *tc = (TypeClass *)tinfo; @@ -1115,6 +1144,9 @@ // first is always the vtable sinits.push_back(base->llvmVtbl); + // monitor + sinits.push_back(llvm::ConstantPointerNull::get(llvm::PointerType::get(llvm::Type::Int8Ty))); + // create elements array assert(tinfo->ty == Ttuple); TypeTuple *tu = (TypeTuple *)tinfo;