[DebugInfo] Debug locations for constant SD nodes

Several updates for [DebugInfo] Add debug locations to constant SD nodes (r235989).
Includes:

 *  re-enabling the change (disabled recently);
 *  missing change for FP constants;
 *  resetting debug location of constant node if it's used more than at one place
    to prevent emission of wrong locations in case of coalesced constants;
 *  a couple of additional tests.

Now all look ups in CSEMap are wrapped by additional method.

Comment in D9084 suggests that debug locations aren't useful for "target constants",
so there might be one more change related to this API (namely, dropping debug
locations for getTarget*Constant methods).

Differential Revision: http://reviews.llvm.org/D9604

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@237237 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Sergey Dmitrouk
2015-05-13 08:58:03 +00:00
parent 1336daad86
commit 6eb9a62fe0
9 changed files with 242 additions and 52 deletions

View File

@@ -1,6 +1,4 @@
; RUN: llc -filetype=asm %s -o - | FileCheck %s
; XFAIL: *
; disabled until constant coalescing is resolved
target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
target triple = "armv7--linux-gnueabihf"

View File

@@ -0,0 +1,54 @@
; RUN: llc -filetype=asm -asm-verbose=0 < %s | FileCheck %s
; char ch;
; int b;
;
; void proc (void)
; {
; ch = 'A';
; b = 0; // <== this should have correct location
; }
; CHECK: .loc 1 7 7
; CHECK: mov r{{[0-9]}}, #0
target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
target triple = "armv7--linux-gnueabihf"
@ch = common global i8 0, align 1
@b = common global i32 0, align 4
; Function Attrs: nounwind
define void @proc() #0 {
entry:
store i8 65, i8* @ch, align 1, !dbg !17
store i32 0, i32* @b, align 4, !dbg !18
ret void, !dbg !19
}
attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="cortex-a8" "target-features"="+neon,+vfp3" "unsafe-fp-math"="false" "use-soft-float"="false" }
!llvm.dbg.cu = !{!0}
!llvm.module.flags = !{!12, !13, !14, !15}
!llvm.ident = !{!16}
!0 = !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "", isOptimized: false, subprograms: !3)
!1 = !DIFile(filename: "test.c", directory: "/home/user/clang/build")
!2 = !{}
!3 = !{!4}
!4 = !DISubprogram(name: "proc", scope: !1, file: !1, line: 4, type: !5, isLocal: false, isDefinition: true, scopeLine: 5, flags: DIFlagPrototyped, isOptimized: false, function: void ()* @proc, variables: !2)
!5 = !DISubroutineType(types: !6)
!6 = !{null}
!7 = !{!8, !10}
!8 = !DIGlobalVariable(name: "ch", scope: !0, file: !1, line: 1, type: !9, isLocal: false, isDefinition: true, variable: i8* @ch)
!9 = !DIBasicType(name: "char", size: 8, align: 8, encoding: DW_ATE_unsigned_char)
!10 = !DIGlobalVariable(name: "b", scope: !0, file: !1, line: 2, type: !11, isLocal: false, isDefinition: true, variable: i32* @b)
!11 = !DIBasicType(name: "int", size: 32, align: 32, encoding: DW_ATE_signed)
!12 = !{i32 2, !"Dwarf Version", i32 4}
!13 = !{i32 2, !"Debug Info Version", i32 3}
!14 = !{i32 1, !"wchar_size", i32 4}
!15 = !{i32 1, !"min_enum_size", i32 4}
!16 = !{!"clang version 3.7.0 (http://llvm.org/git/clang.git 9b0abb9df531ef7928c8182120e1869affca17d5) (http://llvm.org/git/llvm.git b1e759524dd94f7ce1e24935daed8383927e96c1)"}
!17 = !DILocation(line: 6, column: 8, scope: !4)
!18 = !DILocation(line: 7, column: 7, scope: !4)
!19 = !DILocation(line: 8, column: 1, scope: !4)

View File

@@ -0,0 +1,72 @@
; RUN: llc -filetype=asm -asm-verbose=0 < %s | FileCheck %s
; int main()
; {
; int x = 0;
; if (x > 0)
; return x;
; x = -1; // <== this line should have correct debug location
; return -1;
; }
; CHECK: .loc 1 6 7
; CHECK: mvn
target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
target triple = "armv7--linux-gnueabihf"
; Function Attrs: nounwind
define i32 @main() {
entry:
%retval = alloca i32, align 4
%x = alloca i32, align 4
store i32 0, i32* %retval
call void @llvm.dbg.declare(metadata i32* %x, metadata !10, metadata !11), !dbg !12
store i32 0, i32* %x, align 4, !dbg !12
%0 = load i32, i32* %x, align 4, !dbg !13
%cmp = icmp sgt i32 %0, 0, !dbg !15
br i1 %cmp, label %if.then, label %if.end, !dbg !16
if.then: ; preds = %entry
%1 = load i32, i32* %x, align 4, !dbg !17
store i32 %1, i32* %retval, !dbg !18
br label %return, !dbg !18
if.end: ; preds = %entry
store i32 -1, i32* %x, align 4, !dbg !19
store i32 -1, i32* %retval, !dbg !20
br label %return, !dbg !20
return: ; preds = %if.end, %if.then
%2 = load i32, i32* %retval, !dbg !21
ret i32 %2, !dbg !21
}
; Function Attrs: nounwind readnone
declare void @llvm.dbg.declare(metadata, metadata, metadata)
!llvm.dbg.cu = !{!0}
!llvm.module.flags = !{!8, !9}
!0 = !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "", isOptimized: false, subprograms: !3)
!1 = !DIFile(filename: "test.c", directory: "/home/user/clang/build")
!2 = !{}
!3 = !{!4}
!4 = !DISubprogram(name: "main", scope: !1, file: !1, line: 1, type: !5, isLocal: false, isDefinition: true, scopeLine: 2, isOptimized: false, function: i32 ()* @main, variables: !2)
!5 = !DISubroutineType(types: !6)
!6 = !{!7}
!7 = !DIBasicType(name: "int", size: 32, align: 32, encoding: DW_ATE_signed)
!8 = !{i32 2, !"Dwarf Version", i32 4}
!9 = !{i32 2, !"Debug Info Version", i32 3}
!10 = !DILocalVariable(tag: DW_TAG_auto_variable, name: "x", scope: !4, file: !1, line: 3, type: !7)
!11 = !DIExpression()
!12 = !DILocation(line: 3, column: 9, scope: !4)
!13 = !DILocation(line: 4, column: 9, scope: !14)
!14 = distinct !DILexicalBlock(scope: !4, file: !1, line: 4, column: 9)
!15 = !DILocation(line: 4, column: 11, scope: !14)
!16 = !DILocation(line: 4, column: 9, scope: !4)
!17 = !DILocation(line: 5, column: 13, scope: !14)
!18 = !DILocation(line: 5, column: 9, scope: !14)
!19 = !DILocation(line: 6, column: 7, scope: !4)
!20 = !DILocation(line: 7, column: 5, scope: !4)
!21 = !DILocation(line: 8, column: 1, scope: !4)