From 177585d1d9bfb1589b5281148bd6c6e2f09f66a3 Mon Sep 17 00:00:00 2001 From: David Blaikie Date: Fri, 14 Feb 2014 01:57:59 +0000 Subject: [PATCH] DebugInfo: Don't include the name of the CU file in the line table file list when it's unneeded Recommitting r201351 and r201355 (reverted in r201351 and r201355) We weren't emitting the an empty (header only) line table when the line table was empty - this made the DWARF invalid (the compile unit would point to the zero-size debug_lines section where there should've been an empty line table but there was nothing at all). Fix that, and as a consequence this works around/addresses PR18809. llvm-svn: 201380 --- llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 3 --- llvm/lib/MC/MCObjectStreamer.cpp | 3 ++- llvm/test/DebugInfo/X86/generate-odr-hash.ll | 8 ++++++++ llvm/test/DebugInfo/empty.ll | 20 ++++++++++++++++++++ 4 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 llvm/test/DebugInfo/empty.ll diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index de2f4c6..4d0eb44 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -756,9 +756,6 @@ DwarfCompileUnit *DwarfDebug::constructDwarfCompileUnit(DICompileUnit DIUnit) { InfoHolder.addUnit(NewCU); FileIDCUMap[NewCU->getUniqueID()] = 0; - // Call this to emit a .file directive if it wasn't emitted for the source - // file this CU comes from yet. - getOrCreateSourceID(FN, CompilationDir, NewCU->getUniqueID()); NewCU->addString(Die, dwarf::DW_AT_producer, DIUnit.getProducer()); NewCU->addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2, diff --git a/llvm/lib/MC/MCObjectStreamer.cpp b/llvm/lib/MC/MCObjectStreamer.cpp index f00231e..bfa3c8c 100644 --- a/llvm/lib/MC/MCObjectStreamer.cpp +++ b/llvm/lib/MC/MCObjectStreamer.cpp @@ -379,7 +379,8 @@ void MCObjectStreamer::EmitZeros(uint64_t NumBytes) { void MCObjectStreamer::FinishImpl() { // Dump out the dwarf file & directory tables and line tables. const MCSymbol *LineSectionSymbol = NULL; - if (getContext().hasDwarfFiles()) + if (!getContext().getMCLineTableSymbols().empty() || + getContext().hasDwarfFiles()) LineSectionSymbol = MCDwarfFileTable::Emit(this); // If we are generating dwarf for assembly source files dump out the sections. diff --git a/llvm/test/DebugInfo/X86/generate-odr-hash.ll b/llvm/test/DebugInfo/X86/generate-odr-hash.ll index 6ddb54e..e7b6210 100644 --- a/llvm/test/DebugInfo/X86/generate-odr-hash.ll +++ b/llvm/test/DebugInfo/X86/generate-odr-hash.ll @@ -125,6 +125,14 @@ ; CHECK: DW_TAG_member ; CHECK-NEXT: DW_AT_name{{.*}}"a" +; CHECK-LABEL: .debug_line contents: +; CHECK: Line table prologue +; CHECK-NOT: file_names[ +; CHECK: file_names{{.*}} bar.h +; CHECK: file_names{{.*}} bar.cpp +; CHECK-NOT: file_names[ +; CHECK-LABEL: .debug_str contents: + ; Use the unit size as a rough hash/identifier for the unit we're dealing with ; it happens to be unambiguous at the moment, but it's hardly ideal. ; CHECK-LABEL: .debug_pubtypes contents: diff --git a/llvm/test/DebugInfo/empty.ll b/llvm/test/DebugInfo/empty.ll new file mode 100644 index 0000000..9f4836f --- /dev/null +++ b/llvm/test/DebugInfo/empty.ll @@ -0,0 +1,20 @@ +; RUN: llc %s -o %t -filetype=obj +; RUN: llvm-dwarfdump -debug-dump=line %t | FileCheck %s + +; PR18809 +; XFAIL: cygwin,mingw32 + +; Expect no line table entry since there are no functions and file references in this compile unit +; CHECK: .debug_line contents: +; CHECK: Line table prologue: +; CHECK: total_length: 0x00000019 +; CHECK-NOT: file_names[ + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!5} + +!0 = metadata !{i32 720913, metadata !4, i32 12, metadata !"clang version 3.1 (trunk 143523)", i1 true, metadata !"", i32 0, metadata !2, metadata !2, metadata !2, metadata !2, null, metadata !""} ; [ DW_TAG_compile_unit ] +!2 = metadata !{} +!3 = metadata !{i32 786473, metadata !4} ; [ DW_TAG_file_type ] +!4 = metadata !{metadata !"empty.c", metadata !"/home/nlewycky"} +!5 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} -- 2.7.4