From 5113cdbfff7df4c7a79a92e5aa971126254202c6 Mon Sep 17 00:00:00 2001 From: Devang Patel Date: Fri, 3 Dec 2010 00:10:48 +0000 Subject: [PATCH] It may not be an option to skip .debug_line if there are file reference in already emitted debug info. So, for now, emit dummy line table entry to make older linker and assemblers happy. This is not a new behavior, original AsmPrinter emitted similar line table entries. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@120760 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/MC/MCContext.h | 3 --- include/llvm/MC/MCDwarf.h | 3 ++- lib/MC/MCAsmStreamer.cpp | 4 ++-- lib/MC/MCDwarf.cpp | 20 +++++++++++++++++++- 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/include/llvm/MC/MCContext.h b/include/llvm/MC/MCContext.h index 575bc3b2971..7968e1e27d9 100644 --- a/include/llvm/MC/MCContext.h +++ b/include/llvm/MC/MCContext.h @@ -180,9 +180,6 @@ namespace llvm { bool hasDwarfFiles() const { return !MCDwarfFiles.empty(); } - bool hasDwarfLines() const { - return !MCLineSectionOrder.empty(); - } const std::vector &getMCDwarfFiles() { return MCDwarfFiles; diff --git a/include/llvm/MC/MCDwarf.h b/include/llvm/MC/MCDwarf.h index 52371f69792..0c0a22eb8ab 100644 --- a/include/llvm/MC/MCDwarf.h +++ b/include/llvm/MC/MCDwarf.h @@ -209,7 +209,8 @@ namespace llvm { // This emits the Dwarf file and the line tables. // static void Emit(MCStreamer *MCOS, const MCSection *DwarfLineSection, - MCSectionData *DLS, int PointerSize); + MCSectionData *DLS, int PointerSize, + const MCSection *TextSection = NULL); }; class MCDwarfLineAddr { diff --git a/lib/MC/MCAsmStreamer.cpp b/lib/MC/MCAsmStreamer.cpp index 30a3105bd79..49bcc936f7a 100644 --- a/lib/MC/MCAsmStreamer.cpp +++ b/lib/MC/MCAsmStreamer.cpp @@ -885,9 +885,9 @@ void MCAsmStreamer::EmitRawText(StringRef String) { void MCAsmStreamer::Finish() { // Dump out the dwarf file & directory tables and line tables. - if (getContext().hasDwarfFiles() && getContext().hasDwarfLines() && TLOF) { + if (getContext().hasDwarfFiles() && TLOF) { MCDwarfFileTable::Emit(this, TLOF->getDwarfLineSection(), NULL, - PointerSize); + PointerSize, TLOF->getTextSection()); } } diff --git a/lib/MC/MCDwarf.cpp b/lib/MC/MCDwarf.cpp index 0daf2959e33..5fe73e2810a 100644 --- a/lib/MC/MCDwarf.cpp +++ b/lib/MC/MCDwarf.cpp @@ -241,7 +241,8 @@ static inline void EmitDwarfLineTable(MCStreamer *MCOS, void MCDwarfFileTable::Emit(MCStreamer *MCOS, const MCSection *DwarfLineSection, MCSectionData *DLS, - int PointerSize) { + int PointerSize, + const MCSection *TextSection) { // Switch to the section where the table will be emitted into. MCOS->SwitchSection(DwarfLineSection); @@ -339,6 +340,23 @@ void MCDwarfFileTable::Emit(MCStreamer *MCOS, delete Line; } + if (TextSection && MCLineSectionOrder.begin() == MCLineSectionOrder.end()) { + // Emit dummy entry if line table is empty. + + MCOS->SwitchSection(TextSection); + MCSymbol *SectionEnd = MCOS->getContext().CreateTempSymbol(); + // Set the value of the symbol, as we are at the end of the section. + MCOS->EmitLabel(SectionEnd); + + // Switch back the the dwarf line section. + MCOS->SwitchSection(DwarfLineSection); + + // emit the sequence to set the address + EmitDwarfSetAddress(MCOS, SectionEnd, PointerSize); + // emit the sequence for the LineDelta (from 1) and a zero address delta. + MCDwarfLineAddr::Emit(MCOS, INT64_MAX, 0); + } + // This is the end of the section, so set the value of the symbol at the end // of this section (that was used in a previous expression). MCOS->EmitLabel(LineEndSym);