From 55321d82bd329bb88799e5a853a256b4a70e4106 Mon Sep 17 00:00:00 2001 From: Hsiangkai Wang Date: Wed, 26 Sep 2018 04:19:23 +0000 Subject: [PATCH] [DebugInfo] Do not generate address info for removed debug labels. In some senario, LLVM will remove llvm.dbg.labels in IR. For example, when the labels are in unreachable blocks, these labels will not be generated in LLVM IR. In the case, these debug labels will have address zero as their address. It is not legal address for debugger to set breakpoints or query sources. So, the patch inhibits the address info (DW_AT_low_pc) of removed labels. Fix build failed in BuildBot, clang-stage1-cmake-RA-incremental, on macOS. Differential Revision: https://reviews.llvm.org/D51908 llvm-svn: 343062 --- llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp | 7 ++--- llvm/test/DebugInfo/X86/debug-label-unreached.ll | 39 ++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 llvm/test/DebugInfo/X86/debug-label-unreached.ll diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp index ee68219..496c80a 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp @@ -865,10 +865,9 @@ void DwarfCompileUnit::finishEntityDefinition(const DbgEntity *Entity) { llvm_unreachable("DbgEntity must be DbgVariable or DbgLabel."); } - if (Label) { - const MCSymbol *Sym = Label->getSymbol(); - addLabelAddress(*Die, dwarf::DW_AT_low_pc, Sym); - } + if (Label) + if (const auto *Sym = Label->getSymbol()) + addLabelAddress(*Die, dwarf::DW_AT_low_pc, Sym); } DbgEntity *DwarfCompileUnit::getExistingAbstractEntity(const DINode *Node) { diff --git a/llvm/test/DebugInfo/X86/debug-label-unreached.ll b/llvm/test/DebugInfo/X86/debug-label-unreached.ll new file mode 100644 index 0000000..b84fb07 --- /dev/null +++ b/llvm/test/DebugInfo/X86/debug-label-unreached.ll @@ -0,0 +1,39 @@ +; Test unreachable llvm.dbg.label +; +; RUN: llc -filetype=obj -split-dwarf-file debug.dwo -mtriple=x86_64-unknown-linux-gnu -o - %s | llvm-dwarfdump -v - | FileCheck %s +; +; CHECK: .debug_info.dwo contents: +; CHECK: DW_TAG_label +; CHECK-NEXT: DW_AT_name {{.*}}"done" +; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK: DW_AT_low_pc +; CHECK: DW_TAG_label +; CHECK-NEXT: DW_AT_name {{.*}}"removed" +; CHECK-NOT: DW_AT_low_pc +source_filename = "debug-label-unreached.c" + +define dso_local i32 @foo(i32 %a, i32 %b) !dbg !8 { +entry: + %sum = add nsw i32 %a, %b, !dbg !12 + call void @llvm.dbg.label(metadata !11), !dbg !12 + ret i32 %sum, !dbg !13 +} + +declare void @llvm.dbg.label(metadata) + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!4} + +!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, isOptimized: true, emissionKind: FullDebug, enums: !2) +!1 = !DIFile(filename: "debug-label-unreached.c", directory: "./") +!2 = !{} +!4 = !{i32 2, !"Debug Info Version", i32 3} +!5 = !DISubroutineType(types: !6) +!6 = !{!7} +!7 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) +!8 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 8, type: !5, isLocal: false, isDefinition: true, scopeLine: 9, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !9) +!9 = !{!10, !11} +!10 = !DILabel(scope: !8, name: "removed", file: !1, line: 11) +!11 = !DILabel(scope: !8, name: "done", file: !1, line: 13) +!12 = !DILocation(line: 13, column: 1, scope: !8) +!13 = !DILocation(line: 14, column: 5, scope: !8) -- 2.7.4