Mercurial > projects > ldc
comparison gen/toobj.cpp @ 173:db9890b3fb64 trunk
[svn r189] moving IR data back into DMD frontend nodes
author | ChristianK |
---|---|
date | Tue, 06 May 2008 07:56:03 +0200 |
parents | a8cd9bc1021a |
children | f5ca6bbbf1d7 |
comparison
equal
deleted
inserted
replaced
172:68a7dd38c03c | 173:db9890b3fb64 |
---|---|
63 // TODO look at making the instance static and moving most functionality into IrModule where it belongs | 63 // TODO look at making the instance static and moving most functionality into IrModule where it belongs |
64 IRState ir; | 64 IRState ir; |
65 gIR = &ir; | 65 gIR = &ir; |
66 ir.dmodule = this; | 66 ir.dmodule = this; |
67 | 67 |
68 // reset all IR data stored in Dsymbols and Types | |
69 IrDsymbol::resetAll(); | |
70 IrType::resetAll(); | |
71 | |
68 // module ir state | 72 // module ir state |
69 // might already exist via import, just overwrite... | 73 // might already exist via import, just overwrite... |
70 gIR->irDsymbol[this].irModule = new IrModule(this); | 74 this->ir.irModule = new IrModule(this); |
71 | 75 |
72 // name the module | 76 // name the module |
73 std::string mname(toChars()); | 77 std::string mname(toChars()); |
74 if (md != 0) | 78 if (md != 0) |
75 mname = md->toChars(); | 79 mname = md->toChars(); |
96 RegisterDwarfSymbols(ir.module); | 100 RegisterDwarfSymbols(ir.module); |
97 DtoDwarfCompileUnit(this); | 101 DtoDwarfCompileUnit(this); |
98 } | 102 } |
99 | 103 |
100 // start out by providing opaque for the built-in class types | 104 // start out by providing opaque for the built-in class types |
101 if (!gIR->irType[ClassDeclaration::object->type].type) | 105 if (!ClassDeclaration::object->type->ir.type) |
102 gIR->irType[ClassDeclaration::object->type].type = new llvm::PATypeHolder(llvm::OpaqueType::get()); | 106 ClassDeclaration::object->type->ir.type = new llvm::PATypeHolder(llvm::OpaqueType::get()); |
103 | 107 |
104 if (!gIR->irType[Type::typeinfo->type].type) | 108 if (!Type::typeinfo->type->ir.type) |
105 gIR->irType[Type::typeinfo->type].type = new llvm::PATypeHolder(llvm::OpaqueType::get()); | 109 Type::typeinfo->type->ir.type = new llvm::PATypeHolder(llvm::OpaqueType::get()); |
106 | 110 |
107 if (!gIR->irType[ClassDeclaration::classinfo->type].type) | 111 if (!ClassDeclaration::classinfo->type->ir.type) |
108 gIR->irType[ClassDeclaration::classinfo->type].type = new llvm::PATypeHolder(llvm::OpaqueType::get()); | 112 ClassDeclaration::classinfo->type->ir.type = new llvm::PATypeHolder(llvm::OpaqueType::get()); |
109 | 113 |
110 /*if (!gIR->irType[Type::typeinfoclass->type].type) | 114 /*if (!Type::typeinfoclass->type->ir.type) |
111 gIR->irType[Type::typeinfoclass->type].type = new llvm::PATypeHolder(llvm::OpaqueType::get());*/ | 115 Type::typeinfoclass->type->ir.type = new llvm::PATypeHolder(llvm::OpaqueType::get());*/ |
112 | 116 |
113 // process module members | 117 // process module members |
114 for (int k=0; k < members->dim; k++) { | 118 for (int k=0; k < members->dim; k++) { |
115 Dsymbol* dsym = (Dsymbol*)(members->data[k]); | 119 Dsymbol* dsym = (Dsymbol*)(members->data[k]); |
116 assert(dsym); | 120 assert(dsym); |
175 if (gIR->ctors.empty()) | 179 if (gIR->ctors.empty()) |
176 return NULL; | 180 return NULL; |
177 | 181 |
178 size_t n = gIR->ctors.size(); | 182 size_t n = gIR->ctors.size(); |
179 if (n == 1) | 183 if (n == 1) |
180 return gIR->irDsymbol[gIR->ctors[0]].irFunc->func; | 184 return gIR->ctors[0]->ir.irFunc->func; |
181 | 185 |
182 std::string name("_D"); | 186 std::string name("_D"); |
183 name.append(gIR->dmodule->mangle()); | 187 name.append(gIR->dmodule->mangle()); |
184 name.append("6__ctorZ"); | 188 name.append("6__ctorZ"); |
185 | 189 |
190 | 194 |
191 llvm::BasicBlock* bb = new llvm::BasicBlock("entry", fn); | 195 llvm::BasicBlock* bb = new llvm::BasicBlock("entry", fn); |
192 LLVMBuilder builder(bb); | 196 LLVMBuilder builder(bb); |
193 | 197 |
194 for (size_t i=0; i<n; i++) { | 198 for (size_t i=0; i<n; i++) { |
195 llvm::Function* f = gIR->irDsymbol[gIR->ctors[i]].irFunc->func; | 199 llvm::Function* f = gIR->ctors[i]->ir.irFunc->func; |
196 llvm::CallInst* call = builder.CreateCall(f,""); | 200 llvm::CallInst* call = builder.CreateCall(f,""); |
197 call->setCallingConv(llvm::CallingConv::Fast); | 201 call->setCallingConv(llvm::CallingConv::Fast); |
198 } | 202 } |
199 | 203 |
200 builder.CreateRetVoid(); | 204 builder.CreateRetVoid(); |
208 if (gIR->dtors.empty()) | 212 if (gIR->dtors.empty()) |
209 return NULL; | 213 return NULL; |
210 | 214 |
211 size_t n = gIR->dtors.size(); | 215 size_t n = gIR->dtors.size(); |
212 if (n == 1) | 216 if (n == 1) |
213 return gIR->irDsymbol[gIR->dtors[0]].irFunc->func; | 217 return gIR->dtors[0]->ir.irFunc->func; |
214 | 218 |
215 std::string name("_D"); | 219 std::string name("_D"); |
216 name.append(gIR->dmodule->mangle()); | 220 name.append(gIR->dmodule->mangle()); |
217 name.append("6__dtorZ"); | 221 name.append("6__dtorZ"); |
218 | 222 |
223 | 227 |
224 llvm::BasicBlock* bb = new llvm::BasicBlock("entry", fn); | 228 llvm::BasicBlock* bb = new llvm::BasicBlock("entry", fn); |
225 LLVMBuilder builder(bb); | 229 LLVMBuilder builder(bb); |
226 | 230 |
227 for (size_t i=0; i<n; i++) { | 231 for (size_t i=0; i<n; i++) { |
228 llvm::Function* f = gIR->irDsymbol[gIR->dtors[i]].irFunc->func; | 232 llvm::Function* f = gIR->dtors[i]->ir.irFunc->func; |
229 llvm::CallInst* call = builder.CreateCall(f,""); | 233 llvm::CallInst* call = builder.CreateCall(f,""); |
230 call->setCallingConv(llvm::CallingConv::Fast); | 234 call->setCallingConv(llvm::CallingConv::Fast); |
231 } | 235 } |
232 | 236 |
233 builder.CreateRetVoid(); | 237 builder.CreateRetVoid(); |
241 if (gIR->unitTests.empty()) | 245 if (gIR->unitTests.empty()) |
242 return NULL; | 246 return NULL; |
243 | 247 |
244 size_t n = gIR->unitTests.size(); | 248 size_t n = gIR->unitTests.size(); |
245 if (n == 1) | 249 if (n == 1) |
246 return gIR->irDsymbol[gIR->unitTests[0]].irFunc->func; | 250 return gIR->unitTests[0]->ir.irFunc->func; |
247 | 251 |
248 std::string name("_D"); | 252 std::string name("_D"); |
249 name.append(gIR->dmodule->mangle()); | 253 name.append(gIR->dmodule->mangle()); |
250 name.append("10__unittestZ"); | 254 name.append("10__unittestZ"); |
251 | 255 |
256 | 260 |
257 llvm::BasicBlock* bb = new llvm::BasicBlock("entry", fn); | 261 llvm::BasicBlock* bb = new llvm::BasicBlock("entry", fn); |
258 LLVMBuilder builder(bb); | 262 LLVMBuilder builder(bb); |
259 | 263 |
260 for (size_t i=0; i<n; i++) { | 264 for (size_t i=0; i<n; i++) { |
261 llvm::Function* f = gIR->irDsymbol[gIR->unitTests[i]].irFunc->func; | 265 llvm::Function* f = gIR->unitTests[i]->ir.irFunc->func; |
262 llvm::CallInst* call = builder.CreateCall(f,""); | 266 llvm::CallInst* call = builder.CreateCall(f,""); |
263 call->setCallingConv(llvm::CallingConv::Fast); | 267 call->setCallingConv(llvm::CallingConv::Fast); |
264 } | 268 } |
265 | 269 |
266 builder.CreateRetVoid(); | 270 builder.CreateRetVoid(); |
287 // resolve ModuleInfo | 291 // resolve ModuleInfo |
288 assert(moduleinfo); | 292 assert(moduleinfo); |
289 DtoForceConstInitDsymbol(moduleinfo); | 293 DtoForceConstInitDsymbol(moduleinfo); |
290 | 294 |
291 // moduleinfo llvm struct type | 295 // moduleinfo llvm struct type |
292 const llvm::StructType* moduleinfoTy = isaStruct(gIR->irType[moduleinfo->type].type->get()); | 296 const llvm::StructType* moduleinfoTy = isaStruct(moduleinfo->type->ir.type->get()); |
293 | 297 |
294 // classinfo llvm struct type | 298 // classinfo llvm struct type |
295 const llvm::StructType* classinfoTy = isaStruct(gIR->irType[ClassDeclaration::classinfo->type].type->get()); | 299 const llvm::StructType* classinfoTy = isaStruct(ClassDeclaration::classinfo->type->ir.type->get()); |
296 | 300 |
297 // initializer vector | 301 // initializer vector |
298 std::vector<llvm::Constant*> initVec; | 302 std::vector<llvm::Constant*> initVec; |
299 llvm::Constant* c = 0; | 303 llvm::Constant* c = 0; |
300 | 304 |
301 // vtable | 305 // vtable |
302 c = gIR->irDsymbol[moduleinfo].irStruct->vtbl; | 306 c = moduleinfo->ir.irStruct->vtbl; |
303 initVec.push_back(c); | 307 initVec.push_back(c); |
304 | 308 |
305 // monitor | 309 // monitor |
306 c = getNullPtr(getPtrToType(llvm::Type::Int8Ty)); | 310 c = getNullPtr(getPtrToType(llvm::Type::Int8Ty)); |
307 initVec.push_back(c); | 311 initVec.push_back(c); |
341 if (!m_gvar) m_gvar = new llvm::GlobalVariable(importArrTy, true, llvm::GlobalValue::InternalLinkage, c, m_name, gIR->module); | 345 if (!m_gvar) m_gvar = new llvm::GlobalVariable(importArrTy, true, llvm::GlobalValue::InternalLinkage, c, m_name, gIR->module); |
342 c = llvm::ConstantExpr::getBitCast(m_gvar, getPtrToType(importArrTy->getElementType())); | 346 c = llvm::ConstantExpr::getBitCast(m_gvar, getPtrToType(importArrTy->getElementType())); |
343 c = DtoConstSlice(DtoConstSize_t(importInits.size()), c); | 347 c = DtoConstSlice(DtoConstSize_t(importInits.size()), c); |
344 } | 348 } |
345 else | 349 else |
346 c = gIR->irDsymbol[moduleinfo].irStruct->constInit->getOperand(3); | 350 c = moduleinfo->ir.irStruct->constInit->getOperand(3); |
347 initVec.push_back(c); | 351 initVec.push_back(c); |
348 | 352 |
349 // localClasses[] | 353 // localClasses[] |
350 ClassDeclarations aclasses; | 354 ClassDeclarations aclasses; |
351 //printf("members->dim = %d\n", members->dim); | 355 //printf("members->dim = %d\n", members->dim); |
366 { | 370 { |
367 Logger::println("skipping interface '%s' in moduleinfo", cd->toPrettyChars()); | 371 Logger::println("skipping interface '%s' in moduleinfo", cd->toPrettyChars()); |
368 continue; | 372 continue; |
369 } | 373 } |
370 Logger::println("class: %s", cd->toPrettyChars()); | 374 Logger::println("class: %s", cd->toPrettyChars()); |
371 assert(gIR->irDsymbol[cd].irStruct->classInfo); | 375 assert(cd->ir.irStruct->classInfo); |
372 classInits.push_back(gIR->irDsymbol[cd].irStruct->classInfo); | 376 classInits.push_back(cd->ir.irStruct->classInfo); |
373 } | 377 } |
374 // has class array? | 378 // has class array? |
375 if (!classInits.empty()) | 379 if (!classInits.empty()) |
376 { | 380 { |
377 const llvm::ArrayType* classArrTy = llvm::ArrayType::get(getPtrToType(classinfoTy), classInits.size()); | 381 const llvm::ArrayType* classArrTy = llvm::ArrayType::get(getPtrToType(classinfoTy), classInits.size()); |
382 llvm::GlobalVariable* m_gvar = new llvm::GlobalVariable(classArrTy, true, llvm::GlobalValue::InternalLinkage, c, m_name, gIR->module); | 386 llvm::GlobalVariable* m_gvar = new llvm::GlobalVariable(classArrTy, true, llvm::GlobalValue::InternalLinkage, c, m_name, gIR->module); |
383 c = llvm::ConstantExpr::getBitCast(m_gvar, getPtrToType(classArrTy->getElementType())); | 387 c = llvm::ConstantExpr::getBitCast(m_gvar, getPtrToType(classArrTy->getElementType())); |
384 c = DtoConstSlice(DtoConstSize_t(classInits.size()), c); | 388 c = DtoConstSlice(DtoConstSize_t(classInits.size()), c); |
385 } | 389 } |
386 else | 390 else |
387 c = gIR->irDsymbol[moduleinfo].irStruct->constInit->getOperand(4); | 391 c = moduleinfo->ir.irStruct->constInit->getOperand(4); |
388 initVec.push_back(c); | 392 initVec.push_back(c); |
389 | 393 |
390 // flags | 394 // flags |
391 c = DtoConstUint(0); | 395 c = DtoConstUint(0); |
392 if (!needmoduleinfo) | 396 if (!needmoduleinfo) |
393 c = DtoConstUint(4); // flags (4 means MIstandalone) | 397 c = DtoConstUint(4); // flags (4 means MIstandalone) |
394 initVec.push_back(c); | 398 initVec.push_back(c); |
395 | 399 |
396 // ctor | 400 // ctor |
397 llvm::Function* fctor = build_module_ctor(); | 401 llvm::Function* fctor = build_module_ctor(); |
398 c = fctor ? fctor : gIR->irDsymbol[moduleinfo].irStruct->constInit->getOperand(6); | 402 c = fctor ? fctor : moduleinfo->ir.irStruct->constInit->getOperand(6); |
399 initVec.push_back(c); | 403 initVec.push_back(c); |
400 | 404 |
401 // dtor | 405 // dtor |
402 llvm::Function* fdtor = build_module_dtor(); | 406 llvm::Function* fdtor = build_module_dtor(); |
403 c = fdtor ? fdtor : gIR->irDsymbol[moduleinfo].irStruct->constInit->getOperand(7); | 407 c = fdtor ? fdtor : moduleinfo->ir.irStruct->constInit->getOperand(7); |
404 initVec.push_back(c); | 408 initVec.push_back(c); |
405 | 409 |
406 // unitTest | 410 // unitTest |
407 llvm::Function* unittest = build_module_unittest(); | 411 llvm::Function* unittest = build_module_unittest(); |
408 c = unittest ? unittest : gIR->irDsymbol[moduleinfo].irStruct->constInit->getOperand(8); | 412 c = unittest ? unittest : moduleinfo->ir.irStruct->constInit->getOperand(8); |
409 initVec.push_back(c); | 413 initVec.push_back(c); |
410 | 414 |
411 // xgetMembers | 415 // xgetMembers |
412 c = gIR->irDsymbol[moduleinfo].irStruct->constInit->getOperand(9); | 416 c = moduleinfo->ir.irStruct->constInit->getOperand(9); |
413 initVec.push_back(c); | 417 initVec.push_back(c); |
414 | 418 |
415 // ictor | 419 // ictor |
416 c = gIR->irDsymbol[moduleinfo].irStruct->constInit->getOperand(10); | 420 c = moduleinfo->ir.irStruct->constInit->getOperand(10); |
417 initVec.push_back(c); | 421 initVec.push_back(c); |
418 | 422 |
419 /*Logger::println("MODULE INFO INITIALIZERS"); | 423 /*Logger::println("MODULE INFO INITIALIZERS"); |
420 for (size_t i=0; i<initVec.size(); ++i) | 424 for (size_t i=0; i<initVec.size(); ++i) |
421 { | 425 { |
511 // we don't want to touch private static members at all !!! | 515 // we don't want to touch private static members at all !!! |
512 if ((prot() == PROTprivate) && getModule() != gIR->dmodule) | 516 if ((prot() == PROTprivate) && getModule() != gIR->dmodule) |
513 return; | 517 return; |
514 | 518 |
515 // don't duplicate work | 519 // don't duplicate work |
516 if (gIR->irDsymbol[this].resolved) return; | 520 if (this->ir.resolved) return; |
517 gIR->irDsymbol[this].resolved = true; | 521 this->ir.resolved = true; |
518 gIR->irDsymbol[this].declared = true; | 522 this->ir.declared = true; |
519 | 523 |
520 gIR->irDsymbol[this].irGlobal = new IrGlobal(this); | 524 this->ir.irGlobal = new IrGlobal(this); |
521 | 525 |
522 Logger::println("parent: %s (%s)", parent->toChars(), parent->kind()); | 526 Logger::println("parent: %s (%s)", parent->toChars(), parent->kind()); |
523 | 527 |
524 // handle static local variables | 528 // handle static local variables |
525 bool static_local = false; | 529 bool static_local = false; |
532 } | 536 } |
533 } | 537 } |
534 | 538 |
535 Logger::println("Creating global variable"); | 539 Logger::println("Creating global variable"); |
536 | 540 |
537 const llvm::Type* _type = gIR->irDsymbol[this].irGlobal->type.get(); | 541 const llvm::Type* _type = this->ir.irGlobal->type.get(); |
538 llvm::GlobalValue::LinkageTypes _linkage = DtoLinkage(this); | 542 llvm::GlobalValue::LinkageTypes _linkage = DtoLinkage(this); |
539 std::string _name(mangle()); | 543 std::string _name(mangle()); |
540 | 544 |
541 llvm::GlobalVariable* gvar = new llvm::GlobalVariable(_type,_isconst,_linkage,NULL,_name,gIR->module); | 545 llvm::GlobalVariable* gvar = new llvm::GlobalVariable(_type,_isconst,_linkage,NULL,_name,gIR->module); |
542 gIR->irDsymbol[this].irGlobal->value = gvar; | 546 this->ir.irGlobal->value = gvar; |
543 | 547 |
544 Logger::cout() << *gvar << '\n'; | 548 Logger::cout() << *gvar << '\n'; |
545 | 549 |
546 if (static_local) | 550 if (static_local) |
547 DtoConstInitGlobal(this); | 551 DtoConstInitGlobal(this); |
553 else | 557 else |
554 { | 558 { |
555 Logger::println("Aggregate var declaration: '%s' offset=%d", toChars(), offset); | 559 Logger::println("Aggregate var declaration: '%s' offset=%d", toChars(), offset); |
556 | 560 |
557 const llvm::Type* _type = DtoType(type); | 561 const llvm::Type* _type = DtoType(type); |
558 gIR->irDsymbol[this].irField = new IrField(this); | 562 this->ir.irField = new IrField(this); |
559 | 563 |
560 // add the field in the IRStruct | 564 // add the field in the IRStruct |
561 gIR->topstruct()->offsets.insert(std::make_pair(offset, IrStruct::Offset(this, _type))); | 565 gIR->topstruct()->offsets.insert(std::make_pair(offset, IrStruct::Offset(this, _type))); |
562 } | 566 } |
563 | 567 |