Mercurial > projects > ldc
diff gen/classes.cpp @ 1149:5ebe8224988b
Fixed problems introduced by previous commits that prevented Tango from compiling.
author | Tomas Lindquist Olsen <tomas.l.olsen gmail.com> |
---|---|
date | Fri, 27 Mar 2009 23:17:04 +0100 |
parents | 3d1b16dabd25 |
children | 83d3b25c2213 |
line wrap: on
line diff
--- a/gen/classes.cpp Fri Mar 27 21:50:32 2009 +0100 +++ b/gen/classes.cpp Fri Mar 27 23:17:04 2009 +0100 @@ -145,6 +145,19 @@ IrStruct* irstruct = new IrStruct(cd); cd->ir.irStruct = irstruct; + // create the type + const LLType* t = LLArrayType::get(getVoidPtrType(), cd->vtbl.dim); + assert(!ts->ir.type); + ts->ir.type = new LLPATypeHolder(getPtrToType(t)); + + // ... and ClassInfo + std::string varname("_D"); + varname.append(cd->mangle()); + varname.append("11__InterfaceZ"); + + // create global + irstruct->classInfo = new llvm::GlobalVariable(irstruct->classInfoOpaque.get(), false, DtoLinkage(cd), NULL, varname, gIR->module); + // handle base interfaces if (cd->baseclasses.dim) { @@ -168,11 +181,6 @@ } } - // create the type - const LLType* t = LLArrayType::get(getVoidPtrType(), cd->vtbl.dim); - assert(!ts->ir.type); - ts->ir.type = new LLPATypeHolder(getPtrToType(t)); - // request declaration DtoDeclareInterface(cd); @@ -238,10 +246,18 @@ irstruct->vtbl = new llvm::GlobalVariable(irstruct->vtblInitTy.get(), true, _linkage, NULL, varname, gIR->module); // ... and initZ - std::string initname("_D"); - initname.append(cd->mangle()); - initname.append("6__initZ"); - irstruct->init = new llvm::GlobalVariable(irstruct->initOpaque.get(), true, _linkage, NULL, initname, gIR->module); + varname = "_D"; + varname.append(cd->mangle()); + varname.append("6__initZ"); + irstruct->init = new llvm::GlobalVariable(irstruct->initOpaque.get(), true, _linkage, NULL, varname, gIR->module); + + // ... and ClassInfo + varname = "_D"; + varname.append(cd->mangle()); + varname.append("7__ClassZ"); + + // create global + irstruct->classInfo = new llvm::GlobalVariable(irstruct->classInfoOpaque.get(), false, _linkage, NULL, varname, gIR->module); // push state gIR->structs.push_back(irstruct); @@ -778,6 +794,15 @@ // refine __initZ global type to the one of the initializer llvm::cast<llvm::OpaqueType>(irstruct->initOpaque.get())->refineAbstractTypeTo(irstruct->constInit->getType()); + // build initializers for static member variables + size_t n = irstruct->staticVars.size(); + for (size_t i = 0; i < n; ++i) + { + DtoConstInitGlobal(irstruct->staticVars[i]); + } + // This is all we use it for. Clear the memory! + irstruct->staticVars.clear(); + // if (Logger::enabled()) // { // Logger::cout() << "class " << cd->toChars() << std::endl; @@ -1333,17 +1358,6 @@ // resovle ClassInfo ClassDeclaration* cinfo = ClassDeclaration::classinfo; DtoResolveClass(cinfo); - - // do the mangle - std::string gname("_D"); - gname.append(cd->mangle()); - if (!cd->isInterfaceDeclaration()) - gname.append("7__ClassZ"); - else - gname.append("11__InterfaceZ"); - - // create global - irstruct->classInfo = new llvm::GlobalVariable(irstruct->classInfoOpaque.get(), false, DtoLinkage(cd), NULL, gname, gIR->module); } //////////////////////////////////////////////////////////////////////////////////////////