Fix PR19239 - Add support for generating debug info for functions without lexical scopes and/or debug info at all

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@204790 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Timur Iskhodzhanov 2014-03-26 09:50:36 +00:00
parent c61ec18f1b
commit d4c442f12a
2 changed files with 12 additions and 16 deletions

View File

@ -131,9 +131,12 @@ void WinCodeViewLineTables::emitDebugInfoForFunction(const Function *GV) {
// For each function there is a separate subsection
// which holds the PC to file:line table.
const MCSymbol *Fn = Asm->getSymbol(GV);
const FunctionInfo &FI = FnDebugInfo[GV];
assert(Fn);
assert(FI.Instrs.size() > 0);
const FunctionInfo &FI = FnDebugInfo[GV];
if (FI.Instrs.empty())
return;
assert(FI.End && "Don't know where the function ends?");
// PCs/Instructions are grouped into segments sharing the same filename.
// Pre-calculate the lengths (in instructions) of these segments and store
@ -264,12 +267,6 @@ void WinCodeViewLineTables::beginFunction(const MachineFunction *MF) {
if (!Asm || !Asm->MMI->hasDebugInfo())
return;
// Grab the lexical scopes for the function, if we don't have any of those
// then we're not going to be able to do anything.
LScopes.initialize(*MF);
if (LScopes.empty())
return;
const Function *GV = MF->getFunction();
assert(FnDebugInfo.count(GV) == false);
VisitedFunctions.push_back(GV);
@ -311,13 +308,12 @@ void WinCodeViewLineTables::endFunction(const MachineFunction *) {
if (!Asm || !CurFn) // We haven't created any debug info for this function.
return;
if (CurFn->Instrs.empty())
llvm_unreachable("Can this ever happen?");
// Define end label for subprogram.
MCSymbol *FunctionEndSym = Asm->OutStreamer.getContext().CreateTempSymbol();
Asm->OutStreamer.EmitLabel(FunctionEndSym);
CurFn->End = FunctionEndSym;
if (!CurFn->Instrs.empty()) {
// Define end label for subprogram.
MCSymbol *FunctionEndSym = Asm->OutStreamer.getContext().CreateTempSymbol();
Asm->OutStreamer.EmitLabel(FunctionEndSym);
CurFn->End = FunctionEndSym;
}
CurFn = 0;
}

View File

@ -32,13 +32,13 @@ namespace llvm {
class WinCodeViewLineTables : public AsmPrinterHandler {
AsmPrinter *Asm;
DebugLoc PrevInstLoc;
LexicalScopes LScopes;
// For each function, store a vector of labels to its instructions, as well as
// to the end of the function.
struct FunctionInfo {
SmallVector<MCSymbol *, 10> Instrs;
MCSymbol *End;
FunctionInfo() : End(0) {}
} *CurFn;
typedef DenseMap<const Function *, FunctionInfo> FnDebugInfoTy;