Mercurial > projects > ldc
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); } //////////////////////////////////////////////////////////////////////////////////////////////////