Index: llvm/trunk/include/llvm/IR/DebugInfoMetadata.h =================================================================== --- llvm/trunk/include/llvm/IR/DebugInfoMetadata.h +++ llvm/trunk/include/llvm/IR/DebugInfoMetadata.h @@ -1162,7 +1162,8 @@ NoDebug = 0, FullDebug, LineTablesOnly, - LastEmissionKind = LineTablesOnly + DebugDirectivesOnly, + LastEmissionKind = DebugDirectivesOnly }; static Optional getEmissionKind(StringRef Str); @@ -1268,6 +1269,9 @@ DebugEmissionKind getEmissionKind() const { return (DebugEmissionKind)EmissionKind; } + bool isDebugDirectivesOnly() const { + return EmissionKind == DebugDirectivesOnly; + } bool getDebugInfoForProfiling() const { return DebugInfoForProfiling; } bool getGnuPubnames() const { return GnuPubnames; } StringRef getProducer() const { return getStringOperand(1); } Index: llvm/trunk/lib/AsmParser/LLLexer.cpp =================================================================== --- llvm/trunk/lib/AsmParser/LLLexer.cpp +++ llvm/trunk/lib/AsmParser/LLLexer.cpp @@ -905,7 +905,7 @@ } if (Keyword == "NoDebug" || Keyword == "FullDebug" || - Keyword == "LineTablesOnly") { + Keyword == "LineTablesOnly" || Keyword == "DebugDirectivesOnly") { StrVal.assign(Keyword.begin(), Keyword.end()); return lltok::EmissionKind; } Index: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp =================================================================== --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp @@ -275,6 +275,9 @@ } void DwarfCompileUnit::initStmtList() { + if (CUNode->isDebugDirectivesOnly()) + return; + // Define start line table label for each Compile Unit. MCSymbol *LineTableStartSym; const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering(); @@ -882,7 +885,7 @@ return true; return DD->tuneForGDB() && DD->usePubSections() && - !includeMinimalInlineScopes(); + !includeMinimalInlineScopes() && !CUNode->isDebugDirectivesOnly(); } /// addGlobalName - Add a new global name to the compile unit. Index: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp =================================================================== --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -768,6 +768,8 @@ // all other generation. for (const auto &P : CUMap) { auto &TheCU = *P.second; + if (TheCU.getCUNode()->isDebugDirectivesOnly()) + continue; // Emit DW_AT_containing_type attribute to connect types with their // vtable holding type. TheCU.constructContainingTypeDIEs(); @@ -1416,6 +1418,11 @@ LexicalScope *FnScope = LScopes.getCurrentFunctionScope(); assert(!FnScope || SP == FnScope->getScopeNode()); DwarfCompileUnit &TheCU = *CUMap.lookup(SP->getUnit()); + if (TheCU.getCUNode()->isDebugDirectivesOnly()) { + PrevLabel = nullptr; + CurFn = nullptr; + return; + } DenseSet ProcessedVars; collectVariableInfo(TheCU, SP, ProcessedVars); @@ -2132,6 +2139,13 @@ }); }; + if (llvm::all_of(CUMap, [](const decltype(CUMap)::value_type &Pair) { + return Pair.second->getCUNode()->isDebugDirectivesOnly(); + })) { + assert(NoRangesPresent() && "No debug ranges expected."); + return; + } + if (!useRangesSection()) { assert(NoRangesPresent() && "No debug ranges expected."); return; @@ -2154,6 +2168,8 @@ // Grab the specific ranges for the compile units in the module. for (const auto &I : CUMap) { DwarfCompileUnit *TheCU = I.second; + if (TheCU->getCUNode()->isDebugDirectivesOnly()) + continue; if (auto *Skel = TheCU->getSkeleton()) TheCU = Skel; @@ -2206,12 +2222,19 @@ if (CUMap.empty()) return; + if (llvm::all_of(CUMap, [](const decltype(CUMap)::value_type &Pair) { + return Pair.second->getCUNode()->isDebugDirectivesOnly(); + })) + return; + // Start the dwarf macinfo section. Asm->OutStreamer->SwitchSection( Asm->getObjFileLowering().getDwarfMacinfoSection()); for (const auto &P : CUMap) { auto &TheCU = *P.second; + if (TheCU.getCUNode()->isDebugDirectivesOnly()) + continue; auto *SkCU = TheCU.getSkeleton(); DwarfCompileUnit &U = SkCU ? *SkCU : TheCU; auto *CUNode = cast(P.first); Index: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfFile.cpp =================================================================== --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfFile.cpp +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfFile.cpp @@ -36,6 +36,9 @@ } void DwarfFile::emitUnit(DwarfUnit *TheU, bool UseOffsets) { + if (TheU->getCUNode()->isDebugDirectivesOnly()) + return; + DIE &Die = TheU->getUnitDie(); MCSection *USection = TheU->getSection(); Asm->OutStreamer->SwitchSection(USection); @@ -53,6 +56,9 @@ // Iterate over each compile unit and set the size and offsets for each // DIE within each compile unit. All offsets are CU relative. for (const auto &TheU : CUs) { + if (TheU->getCUNode()->isDebugDirectivesOnly()) + continue; + TheU->setDebugSectionOffset(SecOffset); SecOffset += computeSizeAndOffsetsForUnit(TheU.get()); } Index: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp =================================================================== --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp @@ -234,6 +234,9 @@ void DwarfUnit::addString(DIE &Die, dwarf::Attribute Attribute, StringRef String) { + if (CUNode->isDebugDirectivesOnly()) + return; + if (DD->useInlineStrings()) { Die.addValue(DIEValueAllocator, Attribute, dwarf::DW_FORM_string, new (DIEValueAllocator) Index: llvm/trunk/lib/IR/DebugInfoMetadata.cpp =================================================================== --- llvm/trunk/lib/IR/DebugInfoMetadata.cpp +++ llvm/trunk/lib/IR/DebugInfoMetadata.cpp @@ -472,6 +472,7 @@ .Case("NoDebug", NoDebug) .Case("FullDebug", FullDebug) .Case("LineTablesOnly", LineTablesOnly) + .Case("DebugDirectivesOnly", DebugDirectivesOnly) .Default(None); } @@ -480,6 +481,7 @@ case NoDebug: return "NoDebug"; case FullDebug: return "FullDebug"; case LineTablesOnly: return "LineTablesOnly"; + case DebugDirectivesOnly: return "DebugDirectviesOnly"; } return nullptr; } Index: llvm/trunk/test/DebugInfo/Generic/directives-only.ll =================================================================== --- llvm/trunk/test/DebugInfo/Generic/directives-only.ll +++ llvm/trunk/test/DebugInfo/Generic/directives-only.ll @@ -0,0 +1,59 @@ +; RUN: llc -filetype=asm -asm-verbose=0 -O0 < %s | FileCheck %s + +; Generated with clang from multiline.c: +; void f1(); +; void f2() { +; f1(); f1(); f1(); +; f1(); f1(); f1(); +; } + + +; CHECK: .file 1 "/tmp/dbginfo{{.*}}multiline.c" +; CHECK: .loc 1 2 0 +; CHECK: .loc 1 3 3 +; CHECK: .loc 1 3 9 +; CHECK: .loc 1 3 15 +; CHECK: .loc 1 4 3 +; CHECK: .loc 1 4 9 +; CHECK: .loc 1 4 15 +; CHECK: .loc 1 5 1 + +; CHECK-NOT: .section .{{debug.*}} + +; Function Attrs: nounwind uwtable +define void @f2() #0 !dbg !4 { +entry: + call void (...) @f1(), !dbg !11 + call void (...) @f1(), !dbg !12 + call void (...) @f1(), !dbg !13 + call void (...) @f1(), !dbg !14 + call void (...) @f1(), !dbg !15 + call void (...) @f1(), !dbg !16 + ret void, !dbg !17 +} + +declare void @f1(...) #1 + +attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!8, !9} +!llvm.ident = !{!10} + +!0 = distinct !DICompileUnit(language: DW_LANG_C99, producer: "clang version 3.6.0 (trunk 225000) (llvm/trunk 224999)", isOptimized: false, emissionKind: DebugDirectivesOnly, file: !1) +!1 = !DIFile(filename: "multiline.c", directory: "/tmp/dbginfo") +!4 = distinct !DISubprogram(name: "f2", line: 2, isLocal: false, isDefinition: true, isOptimized: false, unit: !0, scopeLine: 2, file: !1, scope: !5, type: !6) +!5 = !DIFile(filename: "multiline.c", directory: "/tmp/dbginfo") +!6 = !DISubroutineType(types: !7) +!7 = !{null} +!8 = !{i32 2, !"Dwarf Version", i32 4} +!9 = !{i32 2, !"Debug Info Version", i32 3} +!10 = !{!"clang version 3.6.0 (trunk 225000) (llvm/trunk 224999)"} +!11 = !DILocation(line: 3, column: 3, scope: !4) +!12 = !DILocation(line: 3, column: 9, scope: !4) +!13 = !DILocation(line: 3, column: 15, scope: !4) +!14 = !DILocation(line: 4, column: 3, scope: !4) +!15 = !DILocation(line: 4, column: 9, scope: !4) +!16 = !DILocation(line: 4, column: 15, scope: !4) +!17 = !DILocation(line: 5, column: 1, scope: !4)