Mercurial > projects > ldc
comparison gen/toobj.cpp @ 156:ccd07d9f2ce9 trunk
[svn r172] moving all IR state previously stored in Dsymbol into IrDsymbol and a Dsymbol->IrDsymbol map
author | ChristianK |
---|---|
date | Thu, 01 May 2008 13:05:53 +0200 |
parents | 7f92f477ff53 |
children | 5c17f81fc1c1 |
comparison
equal
deleted
inserted
replaced
155:7f92f477ff53 | 156:ccd07d9f2ce9 |
---|---|
65 gIR = &ir; | 65 gIR = &ir; |
66 ir.dmodule = this; | 66 ir.dmodule = this; |
67 | 67 |
68 // module ir state | 68 // module ir state |
69 // might already exist via import, just overwrite... | 69 // might already exist via import, just overwrite... |
70 irModule = new IrModule(this); | 70 gIR->irDsymbol[this].irModule = new IrModule(this); |
71 | 71 |
72 // name the module | 72 // name the module |
73 std::string mname(toChars()); | 73 std::string mname(toChars()); |
74 if (md != 0) | 74 if (md != 0) |
75 mname = md->toChars(); | 75 mname = md->toChars(); |
175 if (gIR->ctors.empty()) | 175 if (gIR->ctors.empty()) |
176 return NULL; | 176 return NULL; |
177 | 177 |
178 size_t n = gIR->ctors.size(); | 178 size_t n = gIR->ctors.size(); |
179 if (n == 1) | 179 if (n == 1) |
180 return gIR->irFunc[gIR->ctors[0]]->func; | 180 return gIR->irDsymbol[gIR->ctors[0]].irFunc->func; |
181 | 181 |
182 std::string name("_D"); | 182 std::string name("_D"); |
183 name.append(gIR->dmodule->mangle()); | 183 name.append(gIR->dmodule->mangle()); |
184 name.append("6__ctorZ"); | 184 name.append("6__ctorZ"); |
185 | 185 |
190 | 190 |
191 llvm::BasicBlock* bb = new llvm::BasicBlock("entry", fn); | 191 llvm::BasicBlock* bb = new llvm::BasicBlock("entry", fn); |
192 LLVMBuilder builder(bb); | 192 LLVMBuilder builder(bb); |
193 | 193 |
194 for (size_t i=0; i<n; i++) { | 194 for (size_t i=0; i<n; i++) { |
195 llvm::Function* f = gIR->irFunc[gIR->ctors[i]]->func; | 195 llvm::Function* f = gIR->irDsymbol[gIR->ctors[i]].irFunc->func; |
196 llvm::CallInst* call = builder.CreateCall(f,""); | 196 llvm::CallInst* call = builder.CreateCall(f,""); |
197 call->setCallingConv(llvm::CallingConv::Fast); | 197 call->setCallingConv(llvm::CallingConv::Fast); |
198 } | 198 } |
199 | 199 |
200 builder.CreateRetVoid(); | 200 builder.CreateRetVoid(); |
208 if (gIR->dtors.empty()) | 208 if (gIR->dtors.empty()) |
209 return NULL; | 209 return NULL; |
210 | 210 |
211 size_t n = gIR->dtors.size(); | 211 size_t n = gIR->dtors.size(); |
212 if (n == 1) | 212 if (n == 1) |
213 return gIR->irFunc[gIR->dtors[0]]->func; | 213 return gIR->irDsymbol[gIR->dtors[0]].irFunc->func; |
214 | 214 |
215 std::string name("_D"); | 215 std::string name("_D"); |
216 name.append(gIR->dmodule->mangle()); | 216 name.append(gIR->dmodule->mangle()); |
217 name.append("6__dtorZ"); | 217 name.append("6__dtorZ"); |
218 | 218 |
223 | 223 |
224 llvm::BasicBlock* bb = new llvm::BasicBlock("entry", fn); | 224 llvm::BasicBlock* bb = new llvm::BasicBlock("entry", fn); |
225 LLVMBuilder builder(bb); | 225 LLVMBuilder builder(bb); |
226 | 226 |
227 for (size_t i=0; i<n; i++) { | 227 for (size_t i=0; i<n; i++) { |
228 llvm::Function* f = gIR->irFunc[gIR->dtors[i]]->func; | 228 llvm::Function* f = gIR->irDsymbol[gIR->dtors[i]].irFunc->func; |
229 llvm::CallInst* call = builder.CreateCall(f,""); | 229 llvm::CallInst* call = builder.CreateCall(f,""); |
230 call->setCallingConv(llvm::CallingConv::Fast); | 230 call->setCallingConv(llvm::CallingConv::Fast); |
231 } | 231 } |
232 | 232 |
233 builder.CreateRetVoid(); | 233 builder.CreateRetVoid(); |
241 if (gIR->unitTests.empty()) | 241 if (gIR->unitTests.empty()) |
242 return NULL; | 242 return NULL; |
243 | 243 |
244 size_t n = gIR->unitTests.size(); | 244 size_t n = gIR->unitTests.size(); |
245 if (n == 1) | 245 if (n == 1) |
246 return gIR->irFunc[gIR->unitTests[0]]->func; | 246 return gIR->irDsymbol[gIR->unitTests[0]].irFunc->func; |
247 | 247 |
248 std::string name("_D"); | 248 std::string name("_D"); |
249 name.append(gIR->dmodule->mangle()); | 249 name.append(gIR->dmodule->mangle()); |
250 name.append("10__unittestZ"); | 250 name.append("10__unittestZ"); |
251 | 251 |
256 | 256 |
257 llvm::BasicBlock* bb = new llvm::BasicBlock("entry", fn); | 257 llvm::BasicBlock* bb = new llvm::BasicBlock("entry", fn); |
258 LLVMBuilder builder(bb); | 258 LLVMBuilder builder(bb); |
259 | 259 |
260 for (size_t i=0; i<n; i++) { | 260 for (size_t i=0; i<n; i++) { |
261 llvm::Function* f = gIR->irFunc[gIR->unitTests[i]]->func; | 261 llvm::Function* f = gIR->irDsymbol[gIR->unitTests[i]].irFunc->func; |
262 llvm::CallInst* call = builder.CreateCall(f,""); | 262 llvm::CallInst* call = builder.CreateCall(f,""); |
263 call->setCallingConv(llvm::CallingConv::Fast); | 263 call->setCallingConv(llvm::CallingConv::Fast); |
264 } | 264 } |
265 | 265 |
266 builder.CreateRetVoid(); | 266 builder.CreateRetVoid(); |
297 // initializer vector | 297 // initializer vector |
298 std::vector<llvm::Constant*> initVec; | 298 std::vector<llvm::Constant*> initVec; |
299 llvm::Constant* c = 0; | 299 llvm::Constant* c = 0; |
300 | 300 |
301 // vtable | 301 // vtable |
302 c = moduleinfo->irStruct->vtbl; | 302 c = gIR->irDsymbol[moduleinfo].irStruct->vtbl; |
303 initVec.push_back(c); | 303 initVec.push_back(c); |
304 | 304 |
305 // monitor | 305 // monitor |
306 c = getNullPtr(getPtrToType(llvm::Type::Int8Ty)); | 306 c = getNullPtr(getPtrToType(llvm::Type::Int8Ty)); |
307 initVec.push_back(c); | 307 initVec.push_back(c); |
339 llvm::GlobalVariable* m_gvar = new llvm::GlobalVariable(importArrTy, true, llvm::GlobalValue::InternalLinkage, c, m_name, gIR->module); | 339 llvm::GlobalVariable* m_gvar = new llvm::GlobalVariable(importArrTy, true, llvm::GlobalValue::InternalLinkage, c, m_name, gIR->module); |
340 c = llvm::ConstantExpr::getBitCast(m_gvar, getPtrToType(importArrTy->getElementType())); | 340 c = llvm::ConstantExpr::getBitCast(m_gvar, getPtrToType(importArrTy->getElementType())); |
341 c = DtoConstSlice(DtoConstSize_t(importInits.size()), c); | 341 c = DtoConstSlice(DtoConstSize_t(importInits.size()), c); |
342 } | 342 } |
343 else | 343 else |
344 c = moduleinfo->irStruct->constInit->getOperand(3); | 344 c = gIR->irDsymbol[moduleinfo].irStruct->constInit->getOperand(3); |
345 initVec.push_back(c); | 345 initVec.push_back(c); |
346 | 346 |
347 // localClasses[] | 347 // localClasses[] |
348 ClassDeclarations aclasses; | 348 ClassDeclarations aclasses; |
349 //printf("members->dim = %d\n", members->dim); | 349 //printf("members->dim = %d\n", members->dim); |
364 { | 364 { |
365 Logger::println("skipping interface '%s' in moduleinfo", cd->toPrettyChars()); | 365 Logger::println("skipping interface '%s' in moduleinfo", cd->toPrettyChars()); |
366 continue; | 366 continue; |
367 } | 367 } |
368 Logger::println("class: %s", cd->toPrettyChars()); | 368 Logger::println("class: %s", cd->toPrettyChars()); |
369 assert(cd->irStruct->classInfo); | 369 assert(gIR->irDsymbol[cd].irStruct->classInfo); |
370 classInits.push_back(cd->irStruct->classInfo); | 370 classInits.push_back(gIR->irDsymbol[cd].irStruct->classInfo); |
371 } | 371 } |
372 // has class array? | 372 // has class array? |
373 if (!classInits.empty()) | 373 if (!classInits.empty()) |
374 { | 374 { |
375 const llvm::ArrayType* classArrTy = llvm::ArrayType::get(getPtrToType(classinfoTy), classInits.size()); | 375 const llvm::ArrayType* classArrTy = llvm::ArrayType::get(getPtrToType(classinfoTy), classInits.size()); |
380 llvm::GlobalVariable* m_gvar = new llvm::GlobalVariable(classArrTy, true, llvm::GlobalValue::InternalLinkage, c, m_name, gIR->module); | 380 llvm::GlobalVariable* m_gvar = new llvm::GlobalVariable(classArrTy, true, llvm::GlobalValue::InternalLinkage, c, m_name, gIR->module); |
381 c = llvm::ConstantExpr::getBitCast(m_gvar, getPtrToType(classArrTy->getElementType())); | 381 c = llvm::ConstantExpr::getBitCast(m_gvar, getPtrToType(classArrTy->getElementType())); |
382 c = DtoConstSlice(DtoConstSize_t(classInits.size()), c); | 382 c = DtoConstSlice(DtoConstSize_t(classInits.size()), c); |
383 } | 383 } |
384 else | 384 else |
385 c = moduleinfo->irStruct->constInit->getOperand(4); | 385 c = gIR->irDsymbol[moduleinfo].irStruct->constInit->getOperand(4); |
386 initVec.push_back(c); | 386 initVec.push_back(c); |
387 | 387 |
388 // flags | 388 // flags |
389 c = DtoConstUint(0); | 389 c = DtoConstUint(0); |
390 if (!needmoduleinfo) | 390 if (!needmoduleinfo) |
391 c = DtoConstUint(4); // flags (4 means MIstandalone) | 391 c = DtoConstUint(4); // flags (4 means MIstandalone) |
392 initVec.push_back(c); | 392 initVec.push_back(c); |
393 | 393 |
394 // ctor | 394 // ctor |
395 llvm::Function* fctor = build_module_ctor(); | 395 llvm::Function* fctor = build_module_ctor(); |
396 c = fctor ? fctor : moduleinfo->irStruct->constInit->getOperand(6); | 396 c = fctor ? fctor : gIR->irDsymbol[moduleinfo].irStruct->constInit->getOperand(6); |
397 initVec.push_back(c); | 397 initVec.push_back(c); |
398 | 398 |
399 // dtor | 399 // dtor |
400 llvm::Function* fdtor = build_module_dtor(); | 400 llvm::Function* fdtor = build_module_dtor(); |
401 c = fdtor ? fdtor : moduleinfo->irStruct->constInit->getOperand(7); | 401 c = fdtor ? fdtor : gIR->irDsymbol[moduleinfo].irStruct->constInit->getOperand(7); |
402 initVec.push_back(c); | 402 initVec.push_back(c); |
403 | 403 |
404 // unitTest | 404 // unitTest |
405 llvm::Function* unittest = build_module_unittest(); | 405 llvm::Function* unittest = build_module_unittest(); |
406 c = unittest ? unittest : moduleinfo->irStruct->constInit->getOperand(8); | 406 c = unittest ? unittest : gIR->irDsymbol[moduleinfo].irStruct->constInit->getOperand(8); |
407 initVec.push_back(c); | 407 initVec.push_back(c); |
408 | 408 |
409 // xgetMembers | 409 // xgetMembers |
410 c = moduleinfo->irStruct->constInit->getOperand(9); | 410 c = gIR->irDsymbol[moduleinfo].irStruct->constInit->getOperand(9); |
411 initVec.push_back(c); | 411 initVec.push_back(c); |
412 | 412 |
413 // ictor | 413 // ictor |
414 c = moduleinfo->irStruct->constInit->getOperand(10); | 414 c = gIR->irDsymbol[moduleinfo].irStruct->constInit->getOperand(10); |
415 initVec.push_back(c); | 415 initVec.push_back(c); |
416 | 416 |
417 /*Logger::println("MODULE INFO INITIALIZERS"); | 417 /*Logger::println("MODULE INFO INITIALIZERS"); |
418 for (size_t i=0; i<initVec.size(); ++i) | 418 for (size_t i=0; i<initVec.size(); ++i) |
419 { | 419 { |
509 // we don't want to touch private static members at all !!! | 509 // we don't want to touch private static members at all !!! |
510 if ((prot() == PROTprivate) && getModule() != gIR->dmodule) | 510 if ((prot() == PROTprivate) && getModule() != gIR->dmodule) |
511 return; | 511 return; |
512 | 512 |
513 // don't duplicate work | 513 // don't duplicate work |
514 if (llvmResolved) return; | 514 if (gIR->irDsymbol[this].resolved) return; |
515 llvmResolved = true; | 515 gIR->irDsymbol[this].resolved = true; |
516 llvmDeclared = true; | 516 gIR->irDsymbol[this].declared = true; |
517 | 517 |
518 irGlobal = new IrGlobal(this); | 518 gIR->irDsymbol[this].irGlobal = new IrGlobal(this); |
519 | 519 |
520 Logger::println("parent: %s (%s)", parent->toChars(), parent->kind()); | 520 Logger::println("parent: %s (%s)", parent->toChars(), parent->kind()); |
521 | 521 |
522 // handle static local variables | 522 // handle static local variables |
523 bool static_local = false; | 523 bool static_local = false; |
530 } | 530 } |
531 } | 531 } |
532 | 532 |
533 Logger::println("Creating global variable"); | 533 Logger::println("Creating global variable"); |
534 | 534 |
535 const llvm::Type* _type = irGlobal->type.get(); | 535 const llvm::Type* _type = gIR->irDsymbol[this].irGlobal->type.get(); |
536 llvm::GlobalValue::LinkageTypes _linkage = DtoLinkage(this); | 536 llvm::GlobalValue::LinkageTypes _linkage = DtoLinkage(this); |
537 std::string _name(mangle()); | 537 std::string _name(mangle()); |
538 | 538 |
539 llvm::GlobalVariable* gvar = new llvm::GlobalVariable(_type,_isconst,_linkage,NULL,_name,gIR->module); | 539 llvm::GlobalVariable* gvar = new llvm::GlobalVariable(_type,_isconst,_linkage,NULL,_name,gIR->module); |
540 irGlobal->value = gvar; | 540 gIR->irDsymbol[this].irGlobal->value = gvar; |
541 | 541 |
542 if (static_local) | 542 if (static_local) |
543 DtoConstInitGlobal(this); | 543 DtoConstInitGlobal(this); |
544 else | 544 else |
545 gIR->constInitList.push_back(this); | 545 gIR->constInitList.push_back(this); |
549 else | 549 else |
550 { | 550 { |
551 Logger::println("Aggregate var declaration: '%s' offset=%d", toChars(), offset); | 551 Logger::println("Aggregate var declaration: '%s' offset=%d", toChars(), offset); |
552 | 552 |
553 const llvm::Type* _type = DtoType(type); | 553 const llvm::Type* _type = DtoType(type); |
554 irField = new IrField(this); | 554 gIR->irDsymbol[this].irField = new IrField(this); |
555 | 555 |
556 // add the field in the IRStruct | 556 // add the field in the IRStruct |
557 gIR->topstruct()->offsets.insert(std::make_pair(offset, IrStruct::Offset(this, _type))); | 557 gIR->topstruct()->offsets.insert(std::make_pair(offset, IrStruct::Offset(this, _type))); |
558 } | 558 } |
559 | 559 |