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;