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();