Mercurial > projects > ldc
comparison gen/toobj.cpp @ 686:363bb6c0cc80
Emit stub debug info for generated functions to work around LLVM bug 2172.
author | Christian Kamm <kamm incasoftware de> |
---|---|
date | Sun, 12 Oct 2008 14:38:55 +0200 |
parents | b411c41a9716 |
children | 06c05906b054 |
comparison
equal
deleted
inserted
replaced
685:8d7e58801c82 | 686:363bb6c0cc80 |
---|---|
447 delete [] clean_env; | 447 delete [] clean_env; |
448 } | 448 } |
449 | 449 |
450 | 450 |
451 /* ================================================================== */ | 451 /* ================================================================== */ |
452 | |
453 // the following code generates functions and needs to output | |
454 // debug info. these macros are useful for that | |
455 #define DBG_TYPE ( getPtrToType(llvm::StructType::get(NULL,NULL)) ) | |
456 #define DBG_CAST(X) ( llvm::ConstantExpr::getBitCast(X, DBG_TYPE) ) | |
457 | |
452 // build module ctor | 458 // build module ctor |
453 | 459 |
454 llvm::Function* build_module_ctor() | 460 llvm::Function* build_module_ctor() |
455 { | 461 { |
456 if (gIR->ctors.empty()) | 462 if (gIR->ctors.empty()) |
471 fn->setCallingConv(llvm::CallingConv::Fast); | 477 fn->setCallingConv(llvm::CallingConv::Fast); |
472 | 478 |
473 llvm::BasicBlock* bb = llvm::BasicBlock::Create("entry", fn); | 479 llvm::BasicBlock* bb = llvm::BasicBlock::Create("entry", fn); |
474 IRBuilder<> builder(bb); | 480 IRBuilder<> builder(bb); |
475 | 481 |
482 // debug info | |
483 LLGlobalVariable* subprog; | |
484 if(global.params.symdebug) { | |
485 subprog = DtoDwarfSubProgramInternal(name.c_str(), name.c_str()); | |
486 builder.CreateCall(gIR->module->getFunction("llvm.dbg.func.start"), DBG_CAST(subprog)); | |
487 } | |
488 | |
476 for (size_t i=0; i<n; i++) { | 489 for (size_t i=0; i<n; i++) { |
477 llvm::Function* f = gIR->ctors[i]->ir.irFunc->func; | 490 llvm::Function* f = gIR->ctors[i]->ir.irFunc->func; |
478 llvm::CallInst* call = builder.CreateCall(f,""); | 491 llvm::CallInst* call = builder.CreateCall(f,""); |
479 call->setCallingConv(llvm::CallingConv::Fast); | 492 call->setCallingConv(llvm::CallingConv::Fast); |
480 } | 493 } |
494 | |
495 // debug info end | |
496 if(global.params.symdebug) | |
497 builder.CreateCall(gIR->module->getFunction("llvm.dbg.region.end"), DBG_CAST(subprog)); | |
481 | 498 |
482 builder.CreateRetVoid(); | 499 builder.CreateRetVoid(); |
483 return fn; | 500 return fn; |
484 } | 501 } |
485 | 502 |
505 fn->setCallingConv(llvm::CallingConv::Fast); | 522 fn->setCallingConv(llvm::CallingConv::Fast); |
506 | 523 |
507 llvm::BasicBlock* bb = llvm::BasicBlock::Create("entry", fn); | 524 llvm::BasicBlock* bb = llvm::BasicBlock::Create("entry", fn); |
508 IRBuilder<> builder(bb); | 525 IRBuilder<> builder(bb); |
509 | 526 |
527 // debug info | |
528 LLGlobalVariable* subprog; | |
529 if(global.params.symdebug) { | |
530 subprog = DtoDwarfSubProgramInternal(name.c_str(), name.c_str()); | |
531 builder.CreateCall(gIR->module->getFunction("llvm.dbg.func.start"), DBG_CAST(subprog)); | |
532 } | |
533 | |
510 for (size_t i=0; i<n; i++) { | 534 for (size_t i=0; i<n; i++) { |
511 llvm::Function* f = gIR->dtors[i]->ir.irFunc->func; | 535 llvm::Function* f = gIR->dtors[i]->ir.irFunc->func; |
512 llvm::CallInst* call = builder.CreateCall(f,""); | 536 llvm::CallInst* call = builder.CreateCall(f,""); |
513 call->setCallingConv(llvm::CallingConv::Fast); | 537 call->setCallingConv(llvm::CallingConv::Fast); |
514 } | 538 } |
539 | |
540 // debug info end | |
541 if(global.params.symdebug) | |
542 builder.CreateCall(gIR->module->getFunction("llvm.dbg.region.end"), DBG_CAST(subprog)); | |
515 | 543 |
516 builder.CreateRetVoid(); | 544 builder.CreateRetVoid(); |
517 return fn; | 545 return fn; |
518 } | 546 } |
519 | 547 |
539 fn->setCallingConv(llvm::CallingConv::Fast); | 567 fn->setCallingConv(llvm::CallingConv::Fast); |
540 | 568 |
541 llvm::BasicBlock* bb = llvm::BasicBlock::Create("entry", fn); | 569 llvm::BasicBlock* bb = llvm::BasicBlock::Create("entry", fn); |
542 IRBuilder<> builder(bb); | 570 IRBuilder<> builder(bb); |
543 | 571 |
572 // debug info | |
573 LLGlobalVariable* subprog; | |
574 if(global.params.symdebug) { | |
575 subprog = DtoDwarfSubProgramInternal(name.c_str(), name.c_str()); | |
576 builder.CreateCall(gIR->module->getFunction("llvm.dbg.func.start"), DBG_CAST(subprog)); | |
577 } | |
578 | |
544 for (size_t i=0; i<n; i++) { | 579 for (size_t i=0; i<n; i++) { |
545 llvm::Function* f = gIR->unitTests[i]->ir.irFunc->func; | 580 llvm::Function* f = gIR->unitTests[i]->ir.irFunc->func; |
546 llvm::CallInst* call = builder.CreateCall(f,""); | 581 llvm::CallInst* call = builder.CreateCall(f,""); |
547 call->setCallingConv(llvm::CallingConv::Fast); | 582 call->setCallingConv(llvm::CallingConv::Fast); |
548 } | 583 } |
584 | |
585 // debug info end | |
586 if(global.params.symdebug) | |
587 builder.CreateCall(gIR->module->getFunction("llvm.dbg.region.end"), DBG_CAST(subprog)); | |
549 | 588 |
550 builder.CreateRetVoid(); | 589 builder.CreateRetVoid(); |
551 return fn; | 590 return fn; |
552 } | 591 } |
553 | 592 |
585 | 624 |
586 // make the function insert this moduleinfo as the beginning of the _Dmodule_ref linked list | 625 // make the function insert this moduleinfo as the beginning of the _Dmodule_ref linked list |
587 llvm::BasicBlock* bb = llvm::BasicBlock::Create("moduleinfoCtorEntry", ctor); | 626 llvm::BasicBlock* bb = llvm::BasicBlock::Create("moduleinfoCtorEntry", ctor); |
588 IRBuilder<> builder(bb); | 627 IRBuilder<> builder(bb); |
589 | 628 |
629 // debug info | |
630 LLGlobalVariable* subprog; | |
631 if(global.params.symdebug) { | |
632 subprog = DtoDwarfSubProgramInternal(fname.c_str(), fname.c_str()); | |
633 builder.CreateCall(gIR->module->getFunction("llvm.dbg.func.start"), DBG_CAST(subprog)); | |
634 } | |
635 | |
590 // get current beginning | 636 // get current beginning |
591 LLValue* curbeg = builder.CreateLoad(mref, "current"); | 637 LLValue* curbeg = builder.CreateLoad(mref, "current"); |
592 | 638 |
593 // put current beginning as the next of this one | 639 // put current beginning as the next of this one |
594 LLValue* gep = builder.CreateStructGEP(thismref, 0, "next"); | 640 LLValue* gep = builder.CreateStructGEP(thismref, 0, "next"); |
595 builder.CreateStore(curbeg, gep); | 641 builder.CreateStore(curbeg, gep); |
596 | 642 |
597 // replace beginning | 643 // replace beginning |
598 builder.CreateStore(thismref, mref); | 644 builder.CreateStore(thismref, mref); |
645 | |
646 // debug info end | |
647 if(global.params.symdebug) | |
648 builder.CreateCall(gIR->module->getFunction("llvm.dbg.region.end"), DBG_CAST(subprog)); | |
599 | 649 |
600 // return | 650 // return |
601 builder.CreateRetVoid(); | 651 builder.CreateRetVoid(); |
602 | 652 |
603 return ctor; | 653 return ctor; |