Mercurial > projects > ldc
diff 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 |
line wrap: on
line diff
--- a/gen/toobj.cpp Sun Oct 12 11:23:27 2008 +0200 +++ b/gen/toobj.cpp Sun Oct 12 14:38:55 2008 +0200 @@ -449,6 +449,12 @@ /* ================================================================== */ + +// the following code generates functions and needs to output +// debug info. these macros are useful for that +#define DBG_TYPE ( getPtrToType(llvm::StructType::get(NULL,NULL)) ) +#define DBG_CAST(X) ( llvm::ConstantExpr::getBitCast(X, DBG_TYPE) ) + // build module ctor llvm::Function* build_module_ctor() @@ -473,12 +479,23 @@ llvm::BasicBlock* bb = llvm::BasicBlock::Create("entry", fn); IRBuilder<> builder(bb); + // debug info + LLGlobalVariable* subprog; + if(global.params.symdebug) { + subprog = DtoDwarfSubProgramInternal(name.c_str(), name.c_str()); + builder.CreateCall(gIR->module->getFunction("llvm.dbg.func.start"), DBG_CAST(subprog)); + } + for (size_t i=0; i<n; i++) { llvm::Function* f = gIR->ctors[i]->ir.irFunc->func; llvm::CallInst* call = builder.CreateCall(f,""); call->setCallingConv(llvm::CallingConv::Fast); } + // debug info end + if(global.params.symdebug) + builder.CreateCall(gIR->module->getFunction("llvm.dbg.region.end"), DBG_CAST(subprog)); + builder.CreateRetVoid(); return fn; } @@ -507,12 +524,23 @@ llvm::BasicBlock* bb = llvm::BasicBlock::Create("entry", fn); IRBuilder<> builder(bb); + // debug info + LLGlobalVariable* subprog; + if(global.params.symdebug) { + subprog = DtoDwarfSubProgramInternal(name.c_str(), name.c_str()); + builder.CreateCall(gIR->module->getFunction("llvm.dbg.func.start"), DBG_CAST(subprog)); + } + for (size_t i=0; i<n; i++) { llvm::Function* f = gIR->dtors[i]->ir.irFunc->func; llvm::CallInst* call = builder.CreateCall(f,""); call->setCallingConv(llvm::CallingConv::Fast); } + // debug info end + if(global.params.symdebug) + builder.CreateCall(gIR->module->getFunction("llvm.dbg.region.end"), DBG_CAST(subprog)); + builder.CreateRetVoid(); return fn; } @@ -541,12 +569,23 @@ llvm::BasicBlock* bb = llvm::BasicBlock::Create("entry", fn); IRBuilder<> builder(bb); + // debug info + LLGlobalVariable* subprog; + if(global.params.symdebug) { + subprog = DtoDwarfSubProgramInternal(name.c_str(), name.c_str()); + builder.CreateCall(gIR->module->getFunction("llvm.dbg.func.start"), DBG_CAST(subprog)); + } + for (size_t i=0; i<n; i++) { llvm::Function* f = gIR->unitTests[i]->ir.irFunc->func; llvm::CallInst* call = builder.CreateCall(f,""); call->setCallingConv(llvm::CallingConv::Fast); } + // debug info end + if(global.params.symdebug) + builder.CreateCall(gIR->module->getFunction("llvm.dbg.region.end"), DBG_CAST(subprog)); + builder.CreateRetVoid(); return fn; } @@ -587,6 +626,13 @@ llvm::BasicBlock* bb = llvm::BasicBlock::Create("moduleinfoCtorEntry", ctor); IRBuilder<> builder(bb); + // debug info + LLGlobalVariable* subprog; + if(global.params.symdebug) { + subprog = DtoDwarfSubProgramInternal(fname.c_str(), fname.c_str()); + builder.CreateCall(gIR->module->getFunction("llvm.dbg.func.start"), DBG_CAST(subprog)); + } + // get current beginning LLValue* curbeg = builder.CreateLoad(mref, "current"); @@ -597,6 +643,10 @@ // replace beginning builder.CreateStore(thismref, mref); + // debug info end + if(global.params.symdebug) + builder.CreateCall(gIR->module->getFunction("llvm.dbg.region.end"), DBG_CAST(subprog)); + // return builder.CreateRetVoid();