diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp --- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -2334,14 +2334,36 @@ const StringMap &Globals) { if (auto *Skeleton = TheU->getSkeleton()) TheU = Skeleton; + MCSymbol *BeginLabel, *EndLabel; - // Emit the header. - MCSymbol *BeginLabel = Asm->createTempSymbol("pub" + Name + "_begin"); - MCSymbol *EndLabel = Asm->createTempSymbol("pub" + Name + "_end"); - Asm->emitDwarfUnitLength(EndLabel, BeginLabel, - "Length of Public " + Name + " Info"); - - Asm->OutStreamer->emitLabel(BeginLabel); + if (useSectionsAsReferences()) { + unsigned OffsetByteSize = Asm->getDwarfOffsetByteSize(); + unsigned UnitLengthFieldByteSize = Asm->getUnitLengthFieldByteSize(); + // Emit size of content not including length itself. + unsigned ContentSize = sizeof(int16_t) + // DWARF version number + OffsetByteSize + // Offset of CU in the .debug_info + // section + UnitLengthFieldByteSize + // Compilation Unit Length + Globals.size() * OffsetByteSize + // DIE Offsets + OffsetByteSize; // End Mark + for (const auto &GI : Globals) { + // External Name string + null terminator + ContentSize += GI.getKeyLength() + 1; + } + if (GnuStyle) { + // GNU Attributes + ContentSize += Globals.size() * sizeof(int8_t); + } + // Emit the header. + Asm->emitDwarfUnitLength(ContentSize, "Length of Public " + Name + " Info"); + } else { + BeginLabel = Asm->createTempSymbol("pub" + Name + "_begin"); + EndLabel = Asm->createTempSymbol("pub" + Name + "_end"); + // Emit the header. + Asm->emitDwarfUnitLength(EndLabel, BeginLabel, + "Length of Public " + Name + " Info"); + Asm->OutStreamer->emitLabel(BeginLabel); + } Asm->OutStreamer->AddComment("DWARF Version"); Asm->emitInt16(dwarf::DW_PUBNAMES_VERSION); @@ -2374,7 +2396,8 @@ Asm->OutStreamer->AddComment("End Mark"); Asm->emitDwarfLengthOrOffset(0); - Asm->OutStreamer->emitLabel(EndLabel); + if (!useSectionsAsReferences()) + Asm->OutStreamer->emitLabel(EndLabel); } /// Emit null-terminated strings into a debug str section. diff --git a/llvm/test/DebugInfo/NVPTX/debug-pub.ll b/llvm/test/DebugInfo/NVPTX/debug-pub.ll new file mode 100644 --- /dev/null +++ b/llvm/test/DebugInfo/NVPTX/debug-pub.ll @@ -0,0 +1,229 @@ +; RUN: llc -mtriple=nvptx64-nvidia-cuda < %s | FileCheck %s + +define ptx_kernel void @kernel() !dbg !5 { +start: + br label %bb1 + +bb1: + br label %bb1 +} + +!llvm.module.flags = !{!0, !1} +!llvm.dbg.cu = !{!2} + +!0 = !{i32 7, !"PIC Level", i32 2} +!1 = !{i32 2, !"Debug Info Version", i32 3} +!2 = distinct !DICompileUnit(language: DW_LANG_Rust, file: !3, producer: "clang LLVM (rustc version 1.48.0-nightly (99111606f 2020-09-11))", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !4) +!3 = !DIFile(filename: "lib.rs", directory: "") +!4 = !{} +!5 = distinct !DISubprogram(name: "kernel", scope: !7, file: !6, line: 10, type: !8, scopeLine: 10, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !2, templateParams: !4, retainedNodes: !4) +!6 = !DIFile(filename: "lib.rs", directory: "", checksumkind: CSK_MD5, checksum: "5c76434cae4ba8670c6cce70da6b7d0e") +!7 = !DINamespace(name: "", scope: null) +!8 = !DISubroutineType(types: !4) +!9 = !DILocation(line: 11, column: 5, scope: !5) + +; CHECK: .file 1 "lib.rs" + +; CHECK: .section .debug_abbrev +; CHECK-NEXT: { +; CHECK-NEXT:.b8 1 // Abbreviation Code +; CHECK-NEXT:.b8 17 // DW_TAG_compile_unit +; CHECK-NEXT:.b8 1 // DW_CHILDREN_yes +; CHECK-NEXT:.b8 37 // DW_AT_producer +; CHECK-NEXT:.b8 8 // DW_FORM_string +; CHECK-NEXT:.b8 19 // DW_AT_language +; CHECK-NEXT:.b8 5 // DW_FORM_data2 +; CHECK-NEXT:.b8 3 // DW_AT_name +; CHECK-NEXT:.b8 8 // DW_FORM_string +; CHECK-NEXT:.b8 16 // DW_AT_stmt_list +; CHECK-NEXT:.b8 6 // DW_FORM_data4 +; CHECK-NEXT:.b8 180 // DW_AT_GNU_pubnames +; CHECK-NEXT:.b8 66 +; CHECK-NEXT:.b8 12 // DW_FORM_flag +; CHECK-NEXT:.b8 17 // DW_AT_low_pc +; CHECK-NEXT:.b8 1 // DW_FORM_addr +; CHECK-NEXT:.b8 18 // DW_AT_high_pc +; CHECK-NEXT:.b8 1 // DW_FORM_addr +; CHECK-NEXT:.b8 0 // EOM(1) +; CHECK-NEXT:.b8 0 // EOM(2) +; CHECK-NEXT:.b8 2 // Abbreviation Code +; CHECK-NEXT:.b8 57 // DW_TAG_namespace +; CHECK-NEXT:.b8 1 // DW_CHILDREN_yes +; CHECK-NEXT:.b8 0 // EOM(1) +; CHECK-NEXT:.b8 0 // EOM(2) +; CHECK-NEXT:.b8 3 // Abbreviation Code +; CHECK-NEXT:.b8 46 // DW_TAG_subprogram +; CHECK-NEXT:.b8 0 // DW_CHILDREN_no +; CHECK-NEXT:.b8 17 // DW_AT_low_pc +; CHECK-NEXT:.b8 1 // DW_FORM_addr +; CHECK-NEXT:.b8 18 // DW_AT_high_pc +; CHECK-NEXT:.b8 1 // DW_FORM_addr +; CHECK-NEXT:.b8 64 // DW_AT_frame_base +; CHECK-NEXT:.b8 10 // DW_FORM_block1 +; CHECK-NEXT:.b8 3 // DW_AT_name +; CHECK-NEXT:.b8 8 // DW_FORM_string +; CHECK-NEXT:.b8 58 // DW_AT_decl_file +; CHECK-NEXT:.b8 11 // DW_FORM_data1 +; CHECK-NEXT:.b8 59 // DW_AT_decl_line +; CHECK-NEXT:.b8 11 // DW_FORM_data1 +; CHECK-NEXT:.b8 63 // DW_AT_external +; CHECK-NEXT:.b8 12 // DW_FORM_flag +; CHECK-NEXT:.b8 0 // EOM(1) +; CHECK-NEXT:.b8 0 // EOM(2) +; CHECK-NEXT:.b8 0 // EOM(3) +; CHECK-NEXT: } +; CHECK-NEXT: .section .debug_info +; CHECK-NEXT: { +; CHECK-NEXT:.b32 135 // Length of Unit +; CHECK-NEXT:.b8 2 // DWARF version number +; CHECK-NEXT:.b8 0 +; CHECK-NEXT:.b32 .debug_abbrev // Offset Into Abbrev. Section +; CHECK-NEXT:.b8 8 // Address Size (in bytes) +; CHECK-NEXT:.b8 1 // Abbrev [1] 0xb:0x80 DW_TAG_compile_unit +; CHECK-NEXT:.b8 99 // DW_AT_producer +; CHECK-NEXT:.b8 108 +; CHECK-NEXT:.b8 97 +; CHECK-NEXT:.b8 110 +; CHECK-NEXT:.b8 103 +; CHECK-NEXT:.b8 32 +; CHECK-NEXT:.b8 76 +; CHECK-NEXT:.b8 76 +; CHECK-NEXT:.b8 86 +; CHECK-NEXT:.b8 77 +; CHECK-NEXT:.b8 32 +; CHECK-NEXT:.b8 40 +; CHECK-NEXT:.b8 114 +; CHECK-NEXT:.b8 117 +; CHECK-NEXT:.b8 115 +; CHECK-NEXT:.b8 116 +; CHECK-NEXT:.b8 99 +; CHECK-NEXT:.b8 32 +; CHECK-NEXT:.b8 118 +; CHECK-NEXT:.b8 101 +; CHECK-NEXT:.b8 114 +; CHECK-NEXT:.b8 115 +; CHECK-NEXT:.b8 105 +; CHECK-NEXT:.b8 111 +; CHECK-NEXT:.b8 110 +; CHECK-NEXT:.b8 32 +; CHECK-NEXT:.b8 49 +; CHECK-NEXT:.b8 46 +; CHECK-NEXT:.b8 52 +; CHECK-NEXT:.b8 56 +; CHECK-NEXT:.b8 46 +; CHECK-NEXT:.b8 48 +; CHECK-NEXT:.b8 45 +; CHECK-NEXT:.b8 110 +; CHECK-NEXT:.b8 105 +; CHECK-NEXT:.b8 103 +; CHECK-NEXT:.b8 104 +; CHECK-NEXT:.b8 116 +; CHECK-NEXT:.b8 108 +; CHECK-NEXT:.b8 121 +; CHECK-NEXT:.b8 32 +; CHECK-NEXT:.b8 40 +; CHECK-NEXT:.b8 57 +; CHECK-NEXT:.b8 57 +; CHECK-NEXT:.b8 49 +; CHECK-NEXT:.b8 49 +; CHECK-NEXT:.b8 49 +; CHECK-NEXT:.b8 54 +; CHECK-NEXT:.b8 48 +; CHECK-NEXT:.b8 54 +; CHECK-NEXT:.b8 102 +; CHECK-NEXT:.b8 32 +; CHECK-NEXT:.b8 50 +; CHECK-NEXT:.b8 48 +; CHECK-NEXT:.b8 50 +; CHECK-NEXT:.b8 48 +; CHECK-NEXT:.b8 45 +; CHECK-NEXT:.b8 48 +; CHECK-NEXT:.b8 57 +; CHECK-NEXT:.b8 45 +; CHECK-NEXT:.b8 49 +; CHECK-NEXT:.b8 49 +; CHECK-NEXT:.b8 41 +; CHECK-NEXT:.b8 41 +; CHECK-NEXT:.b8 0 +; CHECK-NEXT:.b8 28 // DW_AT_language +; CHECK-NEXT:.b8 0 +; CHECK-NEXT:.b8 108 // DW_AT_name +; CHECK-NEXT:.b8 105 +; CHECK-NEXT:.b8 98 +; CHECK-NEXT:.b8 46 +; CHECK-NEXT:.b8 114 +; CHECK-NEXT:.b8 115 +; CHECK-NEXT:.b8 0 +; CHECK-NEXT:.b32 .debug_line // DW_AT_stmt_list +; CHECK-NEXT:.b8 1 // DW_AT_GNU_pubnames +; CHECK-NEXT:.b64 Lfunc_begin0 // DW_AT_low_pc +; CHECK-NEXT:.b64 Lfunc_end0 // DW_AT_high_pc +; CHECK-NEXT:.b8 2 // Abbrev [2] 0x6b:0x1f DW_TAG_namespace +; CHECK-NEXT:.b8 3 // Abbrev [3] 0x6c:0x1d DW_TAG_subprogram +; CHECK-NEXT:.b64 Lfunc_begin0 // DW_AT_low_pc +; CHECK-NEXT:.b64 Lfunc_end0 // DW_AT_high_pc +; CHECK-NEXT:.b8 1 // DW_AT_frame_base +; CHECK-NEXT:.b8 156 +; CHECK-NEXT:.b8 107 // DW_AT_name +; CHECK-NEXT:.b8 101 +; CHECK-NEXT:.b8 114 +; CHECK-NEXT:.b8 110 +; CHECK-NEXT:.b8 101 +; CHECK-NEXT:.b8 108 +; CHECK-NEXT:.b8 0 +; CHECK-NEXT:.b8 1 // DW_AT_decl_file +; CHECK-NEXT:.b8 10 // DW_AT_decl_line +; CHECK-NEXT:.b8 1 // DW_AT_external +; CHECK-NEXT:.b8 0 // End Of Children Mark +; CHECK-NEXT:.b8 0 // End Of Children Mark +; CHECK-NEXT: } +; CHECK-NEXT: .section .debug_pubnames +; CHECK-NEXT: { +; CHECK-NEXT:.b32 51 // Length of Public Names Info +; CHECK-NEXT:.b8 2 // DWARF Version +; CHECK-NEXT:.b8 0 +; CHECK-NEXT:.b32 .debug_info // Offset of Compilation Unit Info +; CHECK-NEXT:.b32 139 // Compilation Unit Length +; CHECK-NEXT:.b32 108 // DIE offset +; CHECK-NEXT:.b8 107 // External Name +; CHECK-NEXT:.b8 101 +; CHECK-NEXT:.b8 114 +; CHECK-NEXT:.b8 110 +; CHECK-NEXT:.b8 101 +; CHECK-NEXT:.b8 108 +; CHECK-NEXT:.b8 0 +; CHECK-NEXT:.b32 107 // DIE offset +; CHECK-NEXT:.b8 40 // External Name +; CHECK-NEXT:.b8 97 +; CHECK-NEXT:.b8 110 +; CHECK-NEXT:.b8 111 +; CHECK-NEXT:.b8 110 +; CHECK-NEXT:.b8 121 +; CHECK-NEXT:.b8 109 +; CHECK-NEXT:.b8 111 +; CHECK-NEXT:.b8 117 +; CHECK-NEXT:.b8 115 +; CHECK-NEXT:.b8 32 +; CHECK-NEXT:.b8 110 +; CHECK-NEXT:.b8 97 +; CHECK-NEXT:.b8 109 +; CHECK-NEXT:.b8 101 +; CHECK-NEXT:.b8 115 +; CHECK-NEXT:.b8 112 +; CHECK-NEXT:.b8 97 +; CHECK-NEXT:.b8 99 +; CHECK-NEXT:.b8 101 +; CHECK-NEXT:.b8 41 +; CHECK-NEXT:.b8 0 +; CHECK-NEXT:.b32 0 // End Mark +; CHECK-NEXT: } +; CHECK-NEXT: .section .debug_pubtypes +; CHECK-NEXT: { +; CHECK-NEXT:.b32 14 // Length of Public Types Info +; CHECK-NEXT:.b8 2 // DWARF Version +; CHECK-NEXT:.b8 0 +; CHECK-NEXT:.b32 .debug_info // Offset of Compilation Unit Info +; CHECK-NEXT:.b32 139 // Compilation Unit Length +; CHECK-NEXT:.b32 0 // End Mark +; CHECK-NEXT: } +; CHECK-NEXT: .section .debug_loc { }