diff options
Diffstat (limited to 'llvm/lib/MC/MCDwarf.cpp')
-rw-r--r-- | llvm/lib/MC/MCDwarf.cpp | 30 |
1 files changed, 20 insertions, 10 deletions
diff --git a/llvm/lib/MC/MCDwarf.cpp b/llvm/lib/MC/MCDwarf.cpp index e7c0d37..e8f000a 100644 --- a/llvm/lib/MC/MCDwarf.cpp +++ b/llvm/lib/MC/MCDwarf.cpp @@ -181,7 +181,7 @@ void MCDwarfLineTable::emitOne( unsigned FileNum, LastLine, Column, Flags, Isa, Discriminator; bool IsAtStartSeq; - MCSymbol *LastLabel; + MCSymbol *PrevLabel; auto init = [&]() { FileNum = 1; LastLine = 1; @@ -189,21 +189,31 @@ void MCDwarfLineTable::emitOne( Flags = DWARF2_LINE_DEFAULT_IS_STMT ? DWARF2_FLAG_IS_STMT : 0; Isa = 0; Discriminator = 0; - LastLabel = nullptr; + PrevLabel = nullptr; IsAtStartSeq = true; }; init(); // Loop through each MCDwarfLineEntry and encode the dwarf line number table. bool EndEntryEmitted = false; - for (const MCDwarfLineEntry &LineEntry : LineEntries) { - MCSymbol *Label = LineEntry.getLabel(); + for (auto It = LineEntries.begin(); It != LineEntries.end(); ++It) { + auto LineEntry = *It; + MCSymbol *CurrLabel = LineEntry.getLabel(); const MCAsmInfo *asmInfo = MCOS->getContext().getAsmInfo(); if (LineEntry.LineStreamLabel) { if (!IsAtStartSeq) { - MCOS->emitDwarfLineEndEntry(Section, LastLabel, - /*EndLabel =*/LastLabel); + auto *Label = CurrLabel; + auto NextIt = It + 1; + // LineEntry with a null Label is probably a fake LineEntry we added + // when `-emit-func-debug-line-table-offsets` in order to terminate the + // sequence. Look for the next Label if possible, otherwise we will set + // the PC to the end of the section. + if (!Label && NextIt != LineEntries.end()) { + Label = NextIt->getLabel(); + } + MCOS->emitDwarfLineEndEntry(Section, PrevLabel, + /*EndLabel =*/Label); init(); } MCOS->emitLabel(LineEntry.LineStreamLabel, LineEntry.StreamLabelDefLoc); @@ -211,7 +221,7 @@ void MCDwarfLineTable::emitOne( } if (LineEntry.IsEndEntry) { - MCOS->emitDwarfAdvanceLineAddr(INT64_MAX, LastLabel, Label, + MCOS->emitDwarfAdvanceLineAddr(INT64_MAX, PrevLabel, CurrLabel, asmInfo->getCodePointerSize()); init(); EndEntryEmitted = true; @@ -258,12 +268,12 @@ void MCDwarfLineTable::emitOne( // At this point we want to emit/create the sequence to encode the delta in // line numbers and the increment of the address from the previous Label // and the current Label. - MCOS->emitDwarfAdvanceLineAddr(LineDelta, LastLabel, Label, + MCOS->emitDwarfAdvanceLineAddr(LineDelta, PrevLabel, CurrLabel, asmInfo->getCodePointerSize()); Discriminator = 0; LastLine = LineEntry.getLine(); - LastLabel = Label; + PrevLabel = CurrLabel; IsAtStartSeq = false; } @@ -273,7 +283,7 @@ void MCDwarfLineTable::emitOne( // does not track ranges nor terminate the line table. In that case, // conservatively use the section end symbol to end the line table. if (!EndEntryEmitted && !IsAtStartSeq) - MCOS->emitDwarfLineEndEntry(Section, LastLabel); + MCOS->emitDwarfLineEndEntry(Section, PrevLabel); } void MCDwarfLineTable::endCurrentSeqAndEmitLineStreamLabel(MCStreamer *MCOS, |