Index: lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp =================================================================== --- lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp +++ lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp @@ -846,6 +846,9 @@ } bool DwarfCompileUnit::hasDwarfPubSections() const { + if (!DD->useGnuPubSections()) + return false; + // Opting in to GNU Pubnames/types overrides the default to ensure these are // generated for things like Gold's gdb_index generation. if (CUNode->getGnuPubnames()) Index: lib/CodeGen/AsmPrinter/DwarfDebug.h =================================================================== --- lib/CodeGen/AsmPrinter/DwarfDebug.h +++ lib/CodeGen/AsmPrinter/DwarfDebug.h @@ -258,6 +258,9 @@ /// Use inlined strings. bool UseInlineStrings = false; + /// Emit GNU pub sections. + bool UseGnuPubSections = true; + /// DWARF5 Experimental Options /// @{ bool HasDwarfAccelTables; @@ -501,6 +504,9 @@ /// Returns whether to use inline strings. bool useInlineStrings() const { return UseInlineStrings; } + /// Returns whether GNU oub sections should be emitted. + bool useGnuPubSections() const { return UseGnuPubSections; } + // Experimental DWARF5 features. /// Returns whether or not to emit tables that dwarf consumers can Index: lib/CodeGen/AsmPrinter/DwarfDebug.cpp =================================================================== --- lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -123,6 +123,11 @@ clEnumVal(Disable, "Disabled")), cl::init(Default)); +static cl::opt + NoDwarfGnuPubSections("no-dwarf-gnu-pub-sections", cl::Hidden, + cl::desc("Disable emission of GNU pub sections."), + cl::init(false)); + enum LinkageNameOption { DefaultLinkageNames, AllLinkageNames, @@ -310,6 +315,8 @@ // Use dwarf 4 by default if nothing is requested. DwarfVersion = DwarfVersion ? DwarfVersion : dwarf::DWARF_VERSION; + UseGnuPubSections = !NoDwarfGnuPubSections; + // Work around a GDB bug. GDB doesn't support the standard opcode; // SCE doesn't support GNU's; LLDB prefers the standard opcode, which // is defined as of DWARF 3. Index: test/DebugInfo/X86/no-gnu-public-sections.ll =================================================================== --- /dev/null +++ test/DebugInfo/X86/no-gnu-public-sections.ll @@ -0,0 +1,31 @@ +; RUN: llc -mtriple=x86_64-pc-linux-gnu -debugger-tune=gdb -filetype=asm < %s -no-dwarf-gnu-pub-sections | FileCheck %s --check-prefix=DISABLED +; RUN: llc -mtriple=x86_64-pc-linux-gnu -debugger-tune=gdb -filetype=asm < %s | FileCheck %s + +; DISABLED-NOT: {{.debug_gnu_pubnames|.debug_gnu_pubtypes}} +; CHECK-DAG: .section .debug_gnu_pubnames +; CHECK-DAG: .section .debug_gnu_pubtypes + +%struct.bar = type { %"struct.ns::foo" } +%"struct.ns::foo" = type { i8 } + +@b = global %struct.bar zeroinitializer, align 1, !dbg !0 + +!llvm.dbg.cu = !{!2} +!llvm.module.flags = !{!11, !12} +!llvm.ident = !{!13} + +!0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression()) +!1 = distinct !DIGlobalVariable(name: "b", scope: !2, file: !3, line: 8, type: !6, isLocal: false, isDefinition: true) +!2 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !3, producer: "clang", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !4, globals: !5, gnuPubnames: true) +!3 = !DIFile(filename: "type.cpp", directory: "/tmp/dbginfo") +!4 = !{} +!5 = !{!0} +!6 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "bar", file: !3, line: 5, size: 8, elements: !7, identifier: "_ZTS3bar") +!7 = !{!8} +!8 = !DIDerivedType(tag: DW_TAG_member, name: "f", scope: !6, file: !3, line: 6, baseType: !9, size: 8) +!9 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "foo", scope: !10, file: !3, line: 2, size: 8, elements: !4, identifier: "_ZTSN2ns3fooE") +!10 = !DINamespace(name: "ns", scope: null) +!11 = !{i32 2, !"Dwarf Version", i32 4} +!12 = !{i32 2, !"Debug Info Version", i32 3} +!13 = !{!"clang"} +