diff gen/todebug.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 8526cf626110
line wrap: on
line diff
--- a/gen/todebug.cpp	Sun Oct 12 11:23:27 2008 +0200
+++ b/gen/todebug.cpp	Sun Oct 12 14:38:55 2008 +0200
@@ -149,6 +149,28 @@
 
 //////////////////////////////////////////////////////////////////////////////////////////////////
 
+static LLGlobalVariable* dwarfSubProgram(llvm::GlobalVariable* emitUnit, llvm::GlobalVariable* defineUnit, const char* prettyname, const char* mangledname, uint linenum, bool isprivate)
+{
+    std::vector<LLConstant*> vals(11);
+    vals[0] = DBG_TAG(DW_TAG_subprogram);
+    vals[1] = DBG_CAST(getDwarfAnchor(DW_TAG_subprogram));
+
+    vals[2] = DBG_CAST(emitUnit);
+    vals[3] = DtoConstStringPtr(prettyname, "llvm.metadata");
+    vals[4] = vals[3];
+    vals[5] = DtoConstStringPtr(mangledname, "llvm.metadata");
+    vals[6] = DBG_CAST(defineUnit);
+    vals[7] = DtoConstUint(linenum);
+    vals[8] = DBG_NULL;
+    vals[9] = DtoConstBool(isprivate);
+    vals[10] = DtoConstBool(emitUnit == defineUnit);
+
+    Logger::println("emitting subprogram global");
+
+    return emitDwarfGlobal(getDwarfSubProgramType(), vals, "llvm.dbg.subprogram");
+}
+
+/*
 static LLGlobalVariable* dwarfSubProgram(FuncDeclaration* fd, llvm::GlobalVariable* compileUnit)
 {
     std::vector<LLConstant*> vals(11);
@@ -168,7 +190,7 @@
     Logger::println("emitting subprogram global");
 
     return emitDwarfGlobal(getDwarfSubProgramType(), vals, "llvm.dbg.subprogram");
-}
+}*/
 
 //////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -648,7 +670,28 @@
     LOG_SCOPE;
 
     // FIXME: duplicates ?
-    return dwarfSubProgram(fd, DtoDwarfCompileUnit(gIR->dmodule));
+    return dwarfSubProgram(
+        DtoDwarfCompileUnit(gIR->dmodule),
+        DtoDwarfCompileUnit(fd->getModule()),
+        fd->toPrettyChars(), fd->mangle(),
+        fd->loc.linnum,
+        fd->protection == PROTprivate);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////
+
+LLGlobalVariable* DtoDwarfSubProgramInternal(const char* prettyname, const char* mangledname)
+{
+    Logger::println("D to dwarf subprogram");
+    LOG_SCOPE;
+
+    // FIXME: duplicates ?
+    return dwarfSubProgram(
+        DtoDwarfCompileUnit(gIR->dmodule),
+        DtoDwarfCompileUnit(gIR->dmodule),
+        prettyname, mangledname,
+        0,
+        true);
 }
 
 //////////////////////////////////////////////////////////////////////////////////////////////////