From: David Blaikie Date: Fri, 14 Feb 2014 22:41:51 +0000 (+0000) Subject: DwarfUnit: Refactor out DW_AT_stmt_list creation into common function for fission... X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=705991f2fc3da40afc0e79c905ebe972bfba69b5;p=oota-llvm.git DwarfUnit: Refactor out DW_AT_stmt_list creation into common function for fission and non-fission cases This probably also addresses the FIXME in the fission case regarding multiple compile units, though I haven't tested that. This code still confuses me (the literal zero offset makes little sense, the limitations surrounding asm output I'm not sure about either - but perhaps we should just always emit one line table? Or should we not rely on .loc/.file even in assembly so we can produce the same output between asm and object output?) but this maintains the existing functionality. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@201441 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 4d0eb445d34..4c5fe2ecb99 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -762,31 +762,9 @@ DwarfCompileUnit *DwarfDebug::constructDwarfCompileUnit(DICompileUnit DIUnit) { DIUnit.getLanguage()); NewCU->addString(Die, dwarf::DW_AT_name, FN); - // Define start line table label for each Compile Unit. - MCSymbol *LineTableStartSym = - Asm->GetTempSymbol("line_table_start", NewCU->getUniqueID()); - Asm->OutStreamer.getContext().setMCLineTableSymbol(LineTableStartSym, - NewCU->getUniqueID()); - - // Use a single line table if we are generating assembly. - bool UseTheFirstCU = - Asm->OutStreamer.hasRawTextSupport() || (NewCU->getUniqueID() == 0); if (!useSplitDwarf()) { - // DW_AT_stmt_list is a offset of line number information for this - // compile unit in debug_line section. For split dwarf this is - // left in the skeleton CU and so not included. - // The line table entries are not always emitted in assembly, so it - // is not okay to use line_table_start here. - if (Asm->MAI->doesDwarfUseRelocationsAcrossSections()) - NewCU->addSectionLabel(Die, dwarf::DW_AT_stmt_list, - UseTheFirstCU ? DwarfLineSectionSym - : LineTableStartSym); - else if (UseTheFirstCU) - NewCU->addSectionOffset(Die, dwarf::DW_AT_stmt_list, 0); - else - NewCU->addSectionDelta(Die, dwarf::DW_AT_stmt_list, LineTableStartSym, - DwarfLineSectionSym); + NewCU->initStmtList(DwarfLineSectionSym); // If we're using split dwarf the compilation dir is going to be in the // skeleton CU and so we don't need to duplicate it here. @@ -2956,13 +2934,7 @@ DwarfCompileUnit *DwarfDebug::constructSkeletonCU(const DwarfCompileUnit *CU) { NewCU->initSection(Asm->getObjFileLowering().getDwarfInfoSection(), DwarfInfoSectionSym); - // DW_AT_stmt_list is a offset of line number information for this - // compile unit in debug_line section. - // FIXME: Should handle multiple compile units. - if (Asm->MAI->doesDwarfUseRelocationsAcrossSections()) - NewCU->addSectionLabel(Die, dwarf::DW_AT_stmt_list, DwarfLineSectionSym); - else - NewCU->addSectionOffset(Die, dwarf::DW_AT_stmt_list, 0); + NewCU->initStmtList(DwarfLineSectionSym); initSkeletonUnit(CU, Die, NewCU); diff --git a/lib/CodeGen/AsmPrinter/DwarfUnit.cpp b/lib/CodeGen/AsmPrinter/DwarfUnit.cpp index db354e6f161..57e8abe04c0 100644 --- a/lib/CodeGen/AsmPrinter/DwarfUnit.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfUnit.cpp @@ -1981,6 +1981,33 @@ void DwarfUnit::emitHeader(const MCSection *ASection, } DwarfCompileUnit::~DwarfCompileUnit() {} + +void DwarfCompileUnit::initStmtList(MCSymbol *DwarfLineSectionSym) { + // Define start line table label for each Compile Unit. + MCSymbol *LineTableStartSym = + Asm->GetTempSymbol("line_table_start", getUniqueID()); + Asm->OutStreamer.getContext().setMCLineTableSymbol(LineTableStartSym, + getUniqueID()); + + // Use a single line table if we are generating assembly. + bool UseTheFirstCU = + Asm->OutStreamer.hasRawTextSupport() || (getUniqueID() == 0); + + // DW_AT_stmt_list is a offset of line number information for this + // compile unit in debug_line section. For split dwarf this is + // left in the skeleton CU and so not included. + // The line table entries are not always emitted in assembly, so it + // is not okay to use line_table_start here. + if (Asm->MAI->doesDwarfUseRelocationsAcrossSections()) + addSectionLabel(UnitDie.get(), dwarf::DW_AT_stmt_list, + UseTheFirstCU ? DwarfLineSectionSym : LineTableStartSym); + else if (UseTheFirstCU) + addSectionOffset(UnitDie.get(), dwarf::DW_AT_stmt_list, 0); + else + addSectionDelta(UnitDie.get(), dwarf::DW_AT_stmt_list, LineTableStartSym, + DwarfLineSectionSym); +} + DwarfTypeUnit::~DwarfTypeUnit() {} void DwarfTypeUnit::emitHeader(const MCSection *ASection, diff --git a/lib/CodeGen/AsmPrinter/DwarfUnit.h b/lib/CodeGen/AsmPrinter/DwarfUnit.h index 60e86c5d828..4eabeaf00fd 100644 --- a/lib/CodeGen/AsmPrinter/DwarfUnit.h +++ b/lib/CodeGen/AsmPrinter/DwarfUnit.h @@ -544,6 +544,8 @@ public: DwarfDebug *DW, DwarfFile *DWU); virtual ~DwarfCompileUnit() LLVM_OVERRIDE; + void initStmtList(MCSymbol *DwarfLineSectionSym); + /// createGlobalVariableDIE - create global variable DIE. void createGlobalVariableDIE(DIGlobalVariable GV);