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