diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp --- a/clang/lib/CodeGen/CGDebugInfo.cpp +++ b/clang/lib/CodeGen/CGDebugInfo.cpp @@ -637,17 +637,21 @@ SDK = *It; } + llvm::DICompileUnit::DebugNameTableKind NameTableKind = + static_cast( + CGOpts.DebugNameTable); + if (CGM.getTarget().getTriple().isNVPTX()) + NameTableKind = llvm::DICompileUnit::DebugNameTableKind::None; + else if (CGM.getTarget().getTriple().getVendor() == llvm::Triple::Apple) + NameTableKind = llvm::DICompileUnit::DebugNameTableKind::Apple; + // Create new compile unit. TheCU = DBuilder.createCompileUnit( LangTag, CUFile, CGOpts.EmitVersionIdentMetadata ? Producer : "", LO.Optimize || CGOpts.PrepareForLTO || CGOpts.PrepareForThinLTO, CGOpts.DwarfDebugFlags, RuntimeVers, CGOpts.SplitDwarfFile, EmissionKind, DwoId, CGOpts.SplitDwarfInlining, CGOpts.DebugInfoForProfiling, - CGM.getTarget().getTriple().isNVPTX() - ? llvm::DICompileUnit::DebugNameTableKind::None - : static_cast( - CGOpts.DebugNameTable), - CGOpts.DebugRangesBaseAddress, remapDIPath(Sysroot), SDK); + NameTableKind, CGOpts.DebugRangesBaseAddress, remapDIPath(Sysroot), SDK); } llvm::DIType *CGDebugInfo::CreateType(const BuiltinType *BT) { diff --git a/clang/test/CodeGen/debug-info-names.c b/clang/test/CodeGen/debug-info-names.c --- a/clang/test/CodeGen/debug-info-names.c +++ b/clang/test/CodeGen/debug-info-names.c @@ -1,10 +1,12 @@ -// RUN: %clang_cc1 -emit-llvm -debug-info-kind=limited %s -o - | FileCheck %s -// RUN: %clang_cc1 -emit-llvm -debug-info-kind=limited %s -o - -gpubnames | FileCheck --check-prefix=DEFAULT %s -// RUN: %clang_cc1 -emit-llvm -debug-info-kind=limited %s -o - -ggnu-pubnames | FileCheck --check-prefix=GNU %s +// RUN: %clang_cc1 -triple x86_64-unknown-linux -emit-llvm -debug-info-kind=limited %s -o - | FileCheck %s +// RUN: %clang_cc1 -triple x86_64-apple-macosx10.10.0 -emit-llvm -debug-info-kind=limited %s -o - | FileCheck --check-prefix=APPLE %s +// RUN: %clang_cc1 -triple x86_64-unknown-linux -emit-llvm -debug-info-kind=limited %s -o - -gpubnames | FileCheck --check-prefix=DEFAULT %s +// RUN: %clang_cc1 -triple x86_64-unknown-linux -emit-llvm -debug-info-kind=limited %s -o - -ggnu-pubnames | FileCheck --check-prefix=GNU %s // CHECK: !DICompileUnit({{.*}}, nameTableKind: None // DEFAULT-NOT: !DICompileUnit({{.*}}, nameTableKind: // GNU: !DICompileUnit({{.*}}, nameTableKind: GNU +// APPLE: !DICompileUnit({{.*}}, nameTableKind: Apple void f1(void) { } diff --git a/llvm/include/llvm/IR/DebugInfoMetadata.h b/llvm/include/llvm/IR/DebugInfoMetadata.h --- a/llvm/include/llvm/IR/DebugInfoMetadata.h +++ b/llvm/include/llvm/IR/DebugInfoMetadata.h @@ -1377,7 +1377,8 @@ Default = 0, GNU = 1, None = 2, - LastDebugNameTableKind = None + Apple = 3, + LastDebugNameTableKind = Apple }; static std::optional getEmissionKind(StringRef Str); diff --git a/llvm/lib/AsmParser/LLLexer.cpp b/llvm/lib/AsmParser/LLLexer.cpp --- a/llvm/lib/AsmParser/LLLexer.cpp +++ b/llvm/lib/AsmParser/LLLexer.cpp @@ -944,7 +944,8 @@ return lltok::EmissionKind; } - if (Keyword == "GNU" || Keyword == "None" || Keyword == "Default") { + if (Keyword == "GNU" || Keyword == "Apple" || Keyword == "None" || + Keyword == "Default") { StrVal.assign(Keyword.begin(), Keyword.end()); return lltok::NameTableKind; } diff --git a/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp b/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp --- a/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp @@ -549,9 +549,13 @@ SmallVector CUIndex(CUs.size()); int Count = 0; for (const auto &CU : enumerate(CUs)) { - if (CU.value()->getCUNode()->getNameTableKind() != - DICompileUnit::DebugNameTableKind::Default) + switch (CU.value()->getCUNode()->getNameTableKind()) { + case DICompileUnit::DebugNameTableKind::Default: + case DICompileUnit::DebugNameTableKind::Apple: + break; + default: continue; + } CUIndex[CU.index()] = Count++; assert(CU.index() == CU.value()->getUniqueID()); const DwarfCompileUnit *MainCU = diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp --- a/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp @@ -1432,6 +1432,8 @@ // generated for things like Gold's gdb_index generation. case DICompileUnit::DebugNameTableKind::GNU: return true; + case DICompileUnit::DebugNameTableKind::Apple: + return false; case DICompileUnit::DebugNameTableKind::Default: return DD->tuneForGDB() && !includeMinimalInlineScopes() && !CUNode->isDebugDirectivesOnly() && diff --git a/llvm/lib/IR/DebugInfoMetadata.cpp b/llvm/lib/IR/DebugInfoMetadata.cpp --- a/llvm/lib/IR/DebugInfoMetadata.cpp +++ b/llvm/lib/IR/DebugInfoMetadata.cpp @@ -970,6 +970,7 @@ return StringSwitch>(Str) .Case("Default", DebugNameTableKind::Default) .Case("GNU", DebugNameTableKind::GNU) + .Case("Apple", DebugNameTableKind::Apple) .Case("None", DebugNameTableKind::None) .Default(std::nullopt); } @@ -994,6 +995,8 @@ return nullptr; case DebugNameTableKind::GNU: return "GNU"; + case DebugNameTableKind::Apple: + return "Apple"; case DebugNameTableKind::None: return "None"; } diff --git a/llvm/test/DebugInfo/Inputs/name-table-kind-apple-4.ll b/llvm/test/DebugInfo/Inputs/name-table-kind-apple-4.ll new file mode 100644 --- /dev/null +++ b/llvm/test/DebugInfo/Inputs/name-table-kind-apple-4.ll @@ -0,0 +1,35 @@ +@var = thread_local global i32 0, align 4, !dbg !0 + +; Function Attrs: norecurse nounwind readnone uwtable +define void @_Z3funv() local_unnamed_addr #0 !dbg !11 { + ret void, !dbg !14 +} + +; Function Attrs: norecurse uwtable +define weak_odr hidden ptr @_ZTW3var() local_unnamed_addr #1 { + ret ptr @var +} + +attributes #0 = { norecurse nounwind readnone uwtable } +attributes #1 = { norecurse uwtable } + +!llvm.dbg.cu = !{!2} +!llvm.module.flags = !{!7, !8, !9} +!llvm.ident = !{!10} + +!0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression()) +!1 = distinct !DIGlobalVariable(name: "var", scope: !2, file: !3, line: 1, type: !6, isLocal: false, isDefinition: true) +!2 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !3, producer: "clang version 7.0.0 (trunk 322268) (llvm/trunk 322267)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !4, globals: !5, nameTableKind: Apple) +!3 = !DIFile(filename: "debugger-tune.cpp", directory: "/tmp") +!4 = !{} +!5 = !{!0} +!6 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) +!7 = !{i32 2, !"Dwarf Version", i32 4} +!8 = !{i32 2, !"Debug Info Version", i32 3} +!9 = !{i32 1, !"wchar_size", i32 4} +!10 = !{!"clang version 7.0.0 (trunk 322268) (llvm/trunk 322267)"} +!11 = distinct !DISubprogram(name: "fun", linkageName: "_Z3funv", scope: !3, file: !3, line: 2, type: !12, isLocal: false, isDefinition: true, scopeLine: 2, flags: DIFlagPrototyped, isOptimized: true, unit: !2, retainedNodes: !4) +!12 = !DISubroutineType(types: !13) +!13 = !{null} +!14 = !DILocation(line: 2, column: 13, scope: !11) + diff --git a/llvm/test/DebugInfo/Inputs/name-table-kind-apple-5.ll b/llvm/test/DebugInfo/Inputs/name-table-kind-apple-5.ll new file mode 100644 --- /dev/null +++ b/llvm/test/DebugInfo/Inputs/name-table-kind-apple-5.ll @@ -0,0 +1,35 @@ +@var = thread_local global i32 0, align 4, !dbg !0 + +; Function Attrs: norecurse nounwind readnone uwtable +define void @_Z3funv() local_unnamed_addr #0 !dbg !11 { + ret void, !dbg !14 +} + +; Function Attrs: norecurse uwtable +define weak_odr hidden ptr @_ZTW3var() local_unnamed_addr #1 { + ret ptr @var +} + +attributes #0 = { norecurse nounwind readnone uwtable } +attributes #1 = { norecurse uwtable } + +!llvm.dbg.cu = !{!2} +!llvm.module.flags = !{!7, !8, !9} +!llvm.ident = !{!10} + +!0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression()) +!1 = distinct !DIGlobalVariable(name: "var", scope: !2, file: !3, line: 1, type: !6, isLocal: false, isDefinition: true) +!2 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !3, producer: "clang version 7.0.0 (trunk 322268) (llvm/trunk 322267)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !4, globals: !5, nameTableKind: Apple) +!3 = !DIFile(filename: "debugger-tune.cpp", directory: "/tmp") +!4 = !{} +!5 = !{!0} +!6 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) +!7 = !{i32 2, !"Dwarf Version", i32 5} +!8 = !{i32 2, !"Debug Info Version", i32 3} +!9 = !{i32 1, !"wchar_size", i32 4} +!10 = !{!"clang version 7.0.0 (trunk 322268) (llvm/trunk 322267)"} +!11 = distinct !DISubprogram(name: "fun", linkageName: "_Z3funv", scope: !3, file: !3, line: 2, type: !12, isLocal: false, isDefinition: true, scopeLine: 2, flags: DIFlagPrototyped, isOptimized: true, unit: !2, retainedNodes: !4) +!12 = !DISubroutineType(types: !13) +!13 = !{null} +!14 = !DILocation(line: 2, column: 13, scope: !11) + diff --git a/llvm/test/DebugInfo/accel-tables-apple.ll b/llvm/test/DebugInfo/accel-tables-apple.ll new file mode 100644 --- /dev/null +++ b/llvm/test/DebugInfo/accel-tables-apple.ll @@ -0,0 +1,55 @@ +; Verify the emission of accelerator tables for nameTableKind: Apple + +; Darwin has the apple tables unless we specifically tune for gdb +; RUN: llc -mtriple=x86_64-apple-darwin12 -filetype=obj < %S/Inputs/name-table-kind-apple-5.ll \ +; RUN: | llvm-readobj --sections - | FileCheck --check-prefix=DEBUG_NAMES %s +; RUN: llc -mtriple=x86_64-apple-darwin12 -filetype=obj < %S/Inputs/name-table-kind-apple-4.ll \ +; RUN: | llvm-readobj --sections - | FileCheck --check-prefix=APPLE %s + +; APPLE-NOT: debug_names +; APPLE-NOT: debug{{.*}}pub +; APPLE: apple_names +; APPLE-NOT: debug_names +; APPLE-NOT: debug{{.*}}pub + +; DEBUG_NAMES-NOT: apple_names +; DEBUG_NAMES-NOT: pubnames +; DEBUG_NAMES: debug_names +; DEBUG_NAMES-NOT: apple_names +; DEBUG_NAMES-NOT: pubnames + +@var = thread_local global i32 0, align 4, !dbg !0 + +; Function Attrs: norecurse nounwind readnone uwtable +define void @_Z3funv() local_unnamed_addr #0 !dbg !11 { + ret void, !dbg !14 +} + +; Function Attrs: norecurse uwtable +define weak_odr hidden ptr @_ZTW3var() local_unnamed_addr #1 { + ret ptr @var +} + +attributes #0 = { norecurse nounwind readnone uwtable } +attributes #1 = { norecurse uwtable } + +!llvm.dbg.cu = !{!2} +!llvm.module.flags = !{!7, !8, !9} +!llvm.ident = !{!10} + +!0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression()) +!1 = distinct !DIGlobalVariable(name: "var", scope: !2, file: !3, line: 1, type: !6, isLocal: false, isDefinition: true) +!2 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !3, producer: "clang version 7.0.0 (trunk 322268) (llvm/trunk 322267)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !4, globals: !5, nameTableKind: Apple) +!3 = !DIFile(filename: "debugger-tune.cpp", directory: "/tmp") +!4 = !{} +!5 = !{!0} +!6 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) +!7 = !{i32 2, !"Dwarf Version", i32 4} +!8 = !{i32 2, !"Debug Info Version", i32 3} +!9 = !{i32 1, !"wchar_size", i32 4} +!10 = !{!"clang version 7.0.0 (trunk 322268) (llvm/trunk 322267)"} +!11 = distinct !DISubprogram(name: "fun", linkageName: "_Z3funv", scope: !3, file: !3, line: 2, type: !12, isLocal: false, isDefinition: true, scopeLine: 2, flags: DIFlagPrototyped, isOptimized: true, unit: !2, retainedNodes: !4) +!12 = !DISubroutineType(types: !13) +!13 = !{null} +!14 = !DILocation(line: 2, column: 13, scope: !11) +