mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-02 22:04:55 +00:00
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
This commit is contained in:
parent
d4762e88fd
commit
705991f2fc
@ -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);
|
||||
|
||||
|
@ -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,
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user