Mercurial > projects > ldc
diff gen/typinf.cpp @ 102:027b8d8b71ec trunk
[svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
Basically it tries to do the following in order: Resolve types, Declare symbols, Create constant initializers, Apply initializers, Generate functions bodies.
ClassInfo is now has the most useful(biased?) members working.
Probably other stuf...
author | lindquist |
---|---|
date | Sun, 18 Nov 2007 06:52:57 +0100 |
parents | 5071469303d4 |
children | 182b41f56b7f |
line wrap: on
line diff
--- a/gen/typinf.cpp Fri Nov 16 10:01:24 2007 +0100 +++ b/gen/typinf.cpp Sun Nov 18 06:52:57 2007 +0100 @@ -8,6 +8,10 @@ // in artistic.txt, or the GNU General Public License in gnu.txt. // See the included readme.txt for details. +// Modifications for LLVMDC: +// Copyright (c) 2007 by Tomas Lindquist Olsen +// tomas at famolsen dk + #include <cstdio> #include <cassert> @@ -238,32 +242,76 @@ void TypeInfoDeclaration::toObjFile() { - if (llvmTouched) return; - else llvmTouched = true; + gIR->resolveList.push_back(this); +} - Logger::println("TypeInfoDeclaration::toObjFile()"); +void DtoResolveTypeInfo(TypeInfoDeclaration* tid) +{ + if (tid->llvmResolved) return; + tid->llvmResolved = true; + + Logger::println("* DtoResolveTypeInfo(%s)", tid->toChars()); LOG_SCOPE; - std::string mangled(mangle()); + tid->llvmIRGlobal = new IRGlobal(tid); + + gIR->declareList.push_back(tid); +} - Logger::println("type = '%s'", tinfo->toChars()); +void DtoDeclareTypeInfo(TypeInfoDeclaration* tid) +{ + if (tid->llvmDeclared) return; + tid->llvmDeclared = true; + + Logger::println("* DtoDeclareTypeInfo(%s)", tid->toChars()); + LOG_SCOPE; + + std::string mangled(tid->mangle()); + + Logger::println("type = '%s'", tid->tinfo->toChars()); Logger::println("typeinfo mangle: %s", mangled.c_str()); // this is a declaration of a builtin __initZ var - if (tinfo->builtinTypeInfo()) { - llvmValue = LLVM_D_GetRuntimeGlobal(gIR->module, mangled.c_str()); - assert(llvmValue); + if (tid->tinfo->builtinTypeInfo()) { + tid->llvmValue = LLVM_D_GetRuntimeGlobal(gIR->module, mangled.c_str()); + assert(tid->llvmValue); mangled.append("__TYPE"); - gIR->module->addTypeName(mangled, llvmValue->getType()->getContainedType(0)); - Logger::println("Got typeinfo var: %s", llvmValue->getName().c_str()); + gIR->module->addTypeName(mangled, tid->llvmValue->getType()->getContainedType(0)); + Logger::println("Got typeinfo var: %s", tid->llvmValue->getName().c_str()); + tid->llvmInitialized = true; + tid->llvmDefined = true; } // custom typedef else { - // emit globals - toDt(NULL); + gIR->constInitList.push_back(tid); } } +void DtoConstInitTypeInfo(TypeInfoDeclaration* tid) +{ + if (tid->llvmInitialized) return; + tid->llvmInitialized = true; + + Logger::println("* DtoConstInitTypeInfo(%s)", tid->toChars()); + LOG_SCOPE; + + tid->toDt(NULL); + + tid->llvmDefined = true; + //gIR->defineList.push_back(tid); +} + +void DtoDefineTypeInfo(TypeInfoDeclaration* tid) +{ + if (tid->llvmDefined) return; + tid->llvmDefined = true; + + Logger::println("* DtoDefineTypeInfo(%s)", tid->toChars()); + LOG_SCOPE; + + assert(0); +} + /* ========================================================================= */ void TypeInfoDeclaration::toDt(dt_t **pdt) @@ -279,9 +327,10 @@ LOG_SCOPE; ClassDeclaration* base = Type::typeinfotypedef; - base->toObjFile(); + DtoForceConstInitDsymbol(base); const llvm::StructType* stype = isaStruct(base->type->llvmType->get()); + Logger::cout() << "got stype: " << *stype << '\n'; std::vector<llvm::Constant*> sinits; sinits.push_back(base->llvmVtbl); @@ -295,10 +344,13 @@ //sinits.push_back(llvm::ConstantPointerNull::get(basept)); Logger::println("generating base typeinfo"); //sd->basetype = sd->basetype->merge(); + sd->basetype->getTypeInfo(NULL); // generate vtinfo assert(sd->basetype->vtinfo); if (!sd->basetype->vtinfo->llvmValue) - sd->basetype->vtinfo->toObjFile(); + DtoForceConstInitDsymbol(sd->basetype->vtinfo); + + 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)); @@ -341,7 +393,7 @@ LOG_SCOPE; ClassDeclaration* base = Type::typeinfoenum; - base->toObjFile(); + DtoForceConstInitDsymbol(base); const llvm::StructType* stype = isaStruct(base->type->llvmType->get()); @@ -357,10 +409,12 @@ //sinits.push_back(llvm::ConstantPointerNull::get(basept)); Logger::println("generating base typeinfo"); //sd->basetype = sd->basetype->merge(); + sd->memtype->getTypeInfo(NULL); // generate vtinfo assert(sd->memtype->vtinfo); if (!sd->memtype->vtinfo->llvmValue) - sd->memtype->vtinfo->toObjFile(); + DtoForceConstInitDsymbol(sd->memtype->vtinfo); + 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)); @@ -401,7 +455,7 @@ static llvm::Constant* LLVM_D_Create_TypeInfoBase(Type* basetype, TypeInfoDeclaration* tid, ClassDeclaration* cd) { ClassDeclaration* base = cd; - base->toObjFile(); + DtoForceConstInitDsymbol(base); const llvm::StructType* stype = isaStruct(base->type->llvmType->get()); @@ -413,7 +467,7 @@ basetype->getTypeInfo(NULL); assert(basetype->vtinfo); if (!basetype->vtinfo->llvmValue) - basetype->vtinfo->toObjFile(); + DtoForceConstInitDsymbol(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)); @@ -533,11 +587,10 @@ assert(tinfo->ty == Tstruct); TypeStruct *tc = (TypeStruct *)tinfo; StructDeclaration *sd = tc->sym; - sd->toObjFile(); - DtoConstInitStruct(sd); + DtoForceConstInitDsymbol(sd); ClassDeclaration* base = Type::typeinfostruct; - base->toObjFile(); + DtoForceConstInitDsymbol(base); const llvm::StructType* stype = isaStruct(((TypeClass*)base->type)->llvmType->get());