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;