1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-22 18:54:02 +01:00

[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.

Differential Revision: https://reviews.llvm.org/D51908

llvm-svn: 342943
This commit is contained in:
Hsiangkai Wang 2018-09-25 06:09:50 +00:00
parent c175a1ad14
commit e307d30c46
2 changed files with 42 additions and 4 deletions

View File

@ -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) {

View File

@ -0,0 +1,39 @@
; Test unreachable llvm.dbg.label
;
; RUN: llc -filetype=obj -split-dwarf-file debug.dwo -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)