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
This commit is contained in:
Devang Patel 2010-12-03 00:10:48 +00:00
parent 3fda44f276
commit 5113cdbfff
4 changed files with 23 additions and 7 deletions

View File

@ -180,9 +180,6 @@ namespace llvm {
bool hasDwarfFiles() const {
return !MCDwarfFiles.empty();
}
bool hasDwarfLines() const {
return !MCLineSectionOrder.empty();
}
const std::vector<MCDwarfFile *> &getMCDwarfFiles() {
return MCDwarfFiles;

View File

@ -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 {

View File

@ -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());
}
}

View File

@ -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);