Mercurial > projects > ldc
comparison 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 |
comparison
equal
deleted
inserted
replaced
1148:3d1b16dabd25 | 1149:5ebe8224988b |
---|---|
143 // create the IrStruct, we need somewhere to store the classInfo | 143 // create the IrStruct, we need somewhere to store the classInfo |
144 assert(!cd->ir.irStruct); | 144 assert(!cd->ir.irStruct); |
145 IrStruct* irstruct = new IrStruct(cd); | 145 IrStruct* irstruct = new IrStruct(cd); |
146 cd->ir.irStruct = irstruct; | 146 cd->ir.irStruct = irstruct; |
147 | 147 |
148 // create the type | |
149 const LLType* t = LLArrayType::get(getVoidPtrType(), cd->vtbl.dim); | |
150 assert(!ts->ir.type); | |
151 ts->ir.type = new LLPATypeHolder(getPtrToType(t)); | |
152 | |
153 // ... and ClassInfo | |
154 std::string varname("_D"); | |
155 varname.append(cd->mangle()); | |
156 varname.append("11__InterfaceZ"); | |
157 | |
158 // create global | |
159 irstruct->classInfo = new llvm::GlobalVariable(irstruct->classInfoOpaque.get(), false, DtoLinkage(cd), NULL, varname, gIR->module); | |
160 | |
148 // handle base interfaces | 161 // handle base interfaces |
149 if (cd->baseclasses.dim) | 162 if (cd->baseclasses.dim) |
150 { | 163 { |
151 Logger::println("num baseclasses: %u", cd->baseclasses.dim); | 164 Logger::println("num baseclasses: %u", cd->baseclasses.dim); |
152 LOG_SCOPE; | 165 LOG_SCOPE; |
165 IrInterface* iri = new IrInterface(bc); | 178 IrInterface* iri = new IrInterface(bc); |
166 irstruct->interfaceVec.push_back(iri); | 179 irstruct->interfaceVec.push_back(iri); |
167 irstruct->classInfoInterfaces.push_back(iri); | 180 irstruct->classInfoInterfaces.push_back(iri); |
168 } | 181 } |
169 } | 182 } |
170 | |
171 // create the type | |
172 const LLType* t = LLArrayType::get(getVoidPtrType(), cd->vtbl.dim); | |
173 assert(!ts->ir.type); | |
174 ts->ir.type = new LLPATypeHolder(getPtrToType(t)); | |
175 | 183 |
176 // request declaration | 184 // request declaration |
177 DtoDeclareInterface(cd); | 185 DtoDeclareInterface(cd); |
178 | 186 |
179 // handle members | 187 // handle members |
236 varname.append(cd->mangle()); | 244 varname.append(cd->mangle()); |
237 varname.append("6__vtblZ"); | 245 varname.append("6__vtblZ"); |
238 irstruct->vtbl = new llvm::GlobalVariable(irstruct->vtblInitTy.get(), true, _linkage, NULL, varname, gIR->module); | 246 irstruct->vtbl = new llvm::GlobalVariable(irstruct->vtblInitTy.get(), true, _linkage, NULL, varname, gIR->module); |
239 | 247 |
240 // ... and initZ | 248 // ... and initZ |
241 std::string initname("_D"); | 249 varname = "_D"; |
242 initname.append(cd->mangle()); | 250 varname.append(cd->mangle()); |
243 initname.append("6__initZ"); | 251 varname.append("6__initZ"); |
244 irstruct->init = new llvm::GlobalVariable(irstruct->initOpaque.get(), true, _linkage, NULL, initname, gIR->module); | 252 irstruct->init = new llvm::GlobalVariable(irstruct->initOpaque.get(), true, _linkage, NULL, varname, gIR->module); |
253 | |
254 // ... and ClassInfo | |
255 varname = "_D"; | |
256 varname.append(cd->mangle()); | |
257 varname.append("7__ClassZ"); | |
258 | |
259 // create global | |
260 irstruct->classInfo = new llvm::GlobalVariable(irstruct->classInfoOpaque.get(), false, _linkage, NULL, varname, gIR->module); | |
245 | 261 |
246 // push state | 262 // push state |
247 gIR->structs.push_back(irstruct); | 263 gIR->structs.push_back(irstruct); |
248 | 264 |
249 // add vtable | 265 // add vtable |
775 assert(!irstruct->constInit); | 791 assert(!irstruct->constInit); |
776 irstruct->constInit = LLConstantStruct::get(inits); // classes are never packed | 792 irstruct->constInit = LLConstantStruct::get(inits); // classes are never packed |
777 | 793 |
778 // refine __initZ global type to the one of the initializer | 794 // refine __initZ global type to the one of the initializer |
779 llvm::cast<llvm::OpaqueType>(irstruct->initOpaque.get())->refineAbstractTypeTo(irstruct->constInit->getType()); | 795 llvm::cast<llvm::OpaqueType>(irstruct->initOpaque.get())->refineAbstractTypeTo(irstruct->constInit->getType()); |
796 | |
797 // build initializers for static member variables | |
798 size_t n = irstruct->staticVars.size(); | |
799 for (size_t i = 0; i < n; ++i) | |
800 { | |
801 DtoConstInitGlobal(irstruct->staticVars[i]); | |
802 } | |
803 // This is all we use it for. Clear the memory! | |
804 irstruct->staticVars.clear(); | |
780 | 805 |
781 // if (Logger::enabled()) | 806 // if (Logger::enabled()) |
782 // { | 807 // { |
783 // Logger::cout() << "class " << cd->toChars() << std::endl; | 808 // Logger::cout() << "class " << cd->toChars() << std::endl; |
784 // Logger::cout() << "type " << *cd->type->ir.type->get() << std::endl; | 809 // Logger::cout() << "type " << *cd->type->ir.type->get() << std::endl; |
1331 LOG_SCOPE; | 1356 LOG_SCOPE; |
1332 | 1357 |
1333 // resovle ClassInfo | 1358 // resovle ClassInfo |
1334 ClassDeclaration* cinfo = ClassDeclaration::classinfo; | 1359 ClassDeclaration* cinfo = ClassDeclaration::classinfo; |
1335 DtoResolveClass(cinfo); | 1360 DtoResolveClass(cinfo); |
1336 | |
1337 // do the mangle | |
1338 std::string gname("_D"); | |
1339 gname.append(cd->mangle()); | |
1340 if (!cd->isInterfaceDeclaration()) | |
1341 gname.append("7__ClassZ"); | |
1342 else | |
1343 gname.append("11__InterfaceZ"); | |
1344 | |
1345 // create global | |
1346 irstruct->classInfo = new llvm::GlobalVariable(irstruct->classInfoOpaque.get(), false, DtoLinkage(cd), NULL, gname, gIR->module); | |
1347 } | 1361 } |
1348 | 1362 |
1349 ////////////////////////////////////////////////////////////////////////////////////////// | 1363 ////////////////////////////////////////////////////////////////////////////////////////// |
1350 | 1364 |
1351 #if GENERATE_OFFTI | 1365 #if GENERATE_OFFTI |