2019-09-10 18:37:28 +08:00
; RUN: llc -debug-entry-values %s -o - -filetype=obj \
; RUN: | llvm-dwarfdump -statistics - | FileCheck %s
;
; CHECK: "entry value scope bytes covered":5
; CHECK: "formal params scope bytes total":20
; CHECK: "formal params scope bytes covered":20
; CHECK: "formal params entry value scope bytes covered":5
2019-11-19 18:28:21 +08:00
; CHECK: "vars scope bytes total":90
2019-09-10 18:37:28 +08:00
; CHECK: "vars scope bytes covered":60
; CHECK: "vars entry value scope bytes covered":0
; CHECK: "total variables procesed by location statistics":6
; CHECK: "variables with 0% of its scope covered":1
2019-12-05 21:45:57 +08:00
; CHECK: "variables with (0%,10%) of its scope covered":0
2019-12-12 01:52:49 +08:00
; CHECK: "variables with [10%,20%) of its scope covered":0
; CHECK: "variables with [20%,30%) of its scope covered":0
; CHECK: "variables with [30%,40%) of its scope covered":0
; CHECK: "variables with [40%,50%) of its scope covered":0
; CHECK: "variables with [50%,60%) of its scope covered":1
; CHECK: "variables with [60%,70%) of its scope covered":0
; CHECK: "variables with [70%,80%) of its scope covered":0
; CHECK: "variables with [80%,90%) of its scope covered":1
; CHECK: "variables with [90%,100%) of its scope covered":0
2019-09-10 18:37:28 +08:00
; CHECK: "variables with 100% of its scope covered":3
; CHECK: "variables (excluding the debug entry values) with 0% of its scope covered":1
2019-12-05 21:45:57 +08:00
; CHECK: "variables (excluding the debug entry values) with (0%,10%) of its scope covered":0
2019-12-12 01:52:49 +08:00
; CHECK: "variables (excluding the debug entry values) with [10%,20%) of its scope covered":0
; CHECK: "variables (excluding the debug entry values) with [20%,30%) of its scope covered":0
; CHECK: "variables (excluding the debug entry values) with [30%,40%) of its scope covered":0
; CHECK: "variables (excluding the debug entry values) with [40%,50%) of its scope covered":0
; CHECK: "variables (excluding the debug entry values) with [50%,60%) of its scope covered":2
; CHECK: "variables (excluding the debug entry values) with [60%,70%) of its scope covered":0
; CHECK: "variables (excluding the debug entry values) with [70%,80%) of its scope covered":0
; CHECK: "variables (excluding the debug entry values) with [80%,90%) of its scope covered":1
; CHECK: "variables (excluding the debug entry values) with [90%,100%) of its scope covered":0
2019-09-10 18:37:28 +08:00
; CHECK: "variables (excluding the debug entry values) with 100% of its scope covered":2
; CHECK: "total params procesed by location statistics":2
; CHECK: "params with 0% of its scope covered":0
2019-12-05 21:45:57 +08:00
; CHECK: "params with (0%,10%) of its scope covered":0
2019-12-12 01:52:49 +08:00
; CHECK: "params with [10%,20%) of its scope covered":0
; CHECK: "params with [20%,30%) of its scope covered":0
; CHECK: "params with [30%,40%) of its scope covered":0
; CHECK: "params with [40%,50%) of its scope covered":0
; CHECK: "params with [50%,60%) of its scope covered":0
; CHECK: "params with [60%,70%) of its scope covered":0
; CHECK: "params with [70%,80%) of its scope covered":0
; CHECK: "params with [80%,90%) of its scope covered":0
; CHECK: "params with [90%,100%) of its scope covered":0
2019-09-10 18:37:28 +08:00
; CHECK: "params with 100% of its scope covered":2
; CHECK: "params (excluding the debug entry values) with 0% of its scope covered":0
2019-12-05 21:45:57 +08:00
; CHECK: "params (excluding the debug entry values) with (0%,10%) of its scope covered":0
2019-12-12 01:52:49 +08:00
; CHECK: "params (excluding the debug entry values) with [10%,20%) of its scope covered":0
; CHECK: "params (excluding the debug entry values) with [20%,30%) of its scope covered":0
; CHECK: "params (excluding the debug entry values) with [30%,40%) of its scope covered":0
; CHECK: "params (excluding the debug entry values) with [40%,50%) of its scope covered":0
; CHECK: "params (excluding the debug entry values) with [50%,60%) of its scope covered":1
; CHECK: "params (excluding the debug entry values) with [60%,70%) of its scope covered":0
; CHECK: "params (excluding the debug entry values) with [70%,80%) of its scope covered":0
; CHECK: "params (excluding the debug entry values) with [80%,90%) of its scope covered":0
; CHECK: "params (excluding the debug entry values) with [90%,100%) of its scope covered":0
2019-09-10 18:37:28 +08:00
; CHECK: "params (excluding the debug entry values) with 100% of its scope covered":1
; CHECK: "total vars procesed by location statistics":4
; CHECK: "vars with 0% of its scope covered":1
2019-12-05 21:45:57 +08:00
; CHECK: "vars with (0%,10%) of its scope covered":0
2019-12-12 01:52:49 +08:00
; CHECK: "vars with [10%,20%) of its scope covered":0
; CHECK: "vars with [20%,30%) of its scope covered":0
; CHECK: "vars with [30%,40%) of its scope covered":0
; CHECK: "vars with [40%,50%) of its scope covered":0
; CHECK: "vars with [50%,60%) of its scope covered":1
; CHECK: "vars with [60%,70%) of its scope covered":0
; CHECK: "vars with [70%,80%) of its scope covered":0
; CHECK: "vars with [80%,90%) of its scope covered":1
; CHECK: "vars with [90%,100%) of its scope covered":0
2019-09-10 18:37:28 +08:00
; CHECK: "vars with 100% of its scope covered":1
2019-10-02 21:24:45 +08:00
; CHECK: "vars (excluding the debug entry values) with 0% of its scope covered":1
2019-12-05 21:45:57 +08:00
; CHECK: "vars (excluding the debug entry values) with (0%,10%) of its scope covered":0
2019-12-12 01:52:49 +08:00
; CHECK: "vars (excluding the debug entry values) with [10%,20%) of its scope covered":0
; CHECK: "vars (excluding the debug entry values) with [20%,30%) of its scope covered":0
; CHECK: "vars (excluding the debug entry values) with [30%,40%) of its scope covered":0
; CHECK: "vars (excluding the debug entry values) with [40%,50%) of its scope covered":0
; CHECK: "vars (excluding the debug entry values) with [50%,60%) of its scope covered":1
; CHECK: "vars (excluding the debug entry values) with [60%,70%) of its scope covered":0
; CHECK: "vars (excluding the debug entry values) with [70%,80%) of its scope covered":0
; CHECK: "vars (excluding the debug entry values) with [80%,90%) of its scope covered":1
; CHECK: "vars (excluding the debug entry values) with [90%,100%) of its scope covered":0
2019-10-02 21:24:45 +08:00
; CHECK: "vars (excluding the debug entry values) with 100% of its scope covered":1
2019-09-10 18:37:28 +08:00
;
; The source code of the test case:
; extern void fn3(int *);
; extern void fn2 (int);
; __attribute__((noinline))
; void
; fn1 (int x, int y)
; {
; int u = x + y;
; if (x > 1)
; u += 1;
; else
; u += 2;
; if (y > 4)
; u += x;
; int a = 7;
; fn2 (a);
; u --;
; }
;
; __attribute__((noinline))
; int f()
; {
; int l, k;
; fn3(&l);
; fn3(&k);
; fn1 (l, k);
; return 0;
; }
;
; ModuleID = 'test.c'
source_filename = "test.c"
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
; Function Attrs: noinline nounwind uwtable
define d s o _ l o c a l void @fn1 ( i32 %x , i32 %y ) local_unnamed_addr !dbg !16 {
entry:
call void @llvm.dbg.value ( metadata i32 %x , metadata !20 , metadata !DIExpression ( ) ) , !dbg !24
call void @llvm.dbg.value ( metadata i32 %y , metadata !21 , metadata !DIExpression ( ) ) , !dbg !24
call void @llvm.dbg.value ( metadata i32 undef , metadata !22 , metadata !DIExpression ( ) ) , !dbg !24
call void @llvm.dbg.value ( metadata i32 undef , metadata !22 , metadata !DIExpression ( ) ) , !dbg !24
call void @llvm.dbg.value ( metadata i32 7 , metadata !23 , metadata !DIExpression ( ) ) , !dbg !24
tail call void @fn2 ( i32 7 ) , !dbg !25
call void @llvm.dbg.value ( metadata i32 undef , metadata !22 , metadata !DIExpression ( D W _ O P _ c o n s t u , 1 , D W _ O P _ m i n u s , D W _ O P _ s t a c k _ v a l u e ) ) , !dbg !24
ret void , !dbg !26
}
; Function Attrs: argmemonly nounwind willreturn
declare void @llvm.lifetime.start.p0i8 ( i64 i m m a r g , i8 * nocapture )
declare !dbg !4 d s o _ l o c a l void @fn2 ( i32 ) local_unnamed_addr
; Function Attrs: argmemonly nounwind willreturn
declare void @llvm.lifetime.end.p0i8 ( i64 i m m a r g , i8 * nocapture )
; Function Attrs: noinline nounwind uwtable
define d s o _ l o c a l i32 @f ( ) local_unnamed_addr !dbg !27 {
entry:
%l = alloca i32 , align 4
%k = alloca i32 , align 4
%0 = bitcast i32 * %l to i8 * , !dbg !33
call void @llvm.lifetime.start.p0i8 ( i64 4 , i8 * nonnull %0 ) , !dbg !33
%1 = bitcast i32 * %k to i8 * , !dbg !33
call void @llvm.lifetime.start.p0i8 ( i64 4 , i8 * nonnull %1 ) , !dbg !33
call void @llvm.dbg.value ( metadata i32 * %l , metadata !31 , metadata !DIExpression ( D W _ O P _ d e r e f ) ) , !dbg !34
call void @fn3 ( i32 * nonnull %l ) , !dbg !35
call void @llvm.dbg.value ( metadata i32 * %k , metadata !32 , metadata !DIExpression ( D W _ O P _ d e r e f ) ) , !dbg !34
call void @fn3 ( i32 * nonnull %k ) , !dbg !36
%2 = load i32 , i32 * %l , align 4 , !dbg !37
call void @llvm.dbg.value ( metadata i32 %2 , metadata !31 , metadata !DIExpression ( ) ) , !dbg !34
%3 = load i32 , i32 * %k , align 4 , !dbg !37
call void @llvm.dbg.value ( metadata i32 %3 , metadata !32 , metadata !DIExpression ( ) ) , !dbg !34
call void @fn1 ( i32 %2 , i32 %3 ) , !dbg !37
call void @llvm.lifetime.end.p0i8 ( i64 4 , i8 * nonnull %1 ) , !dbg !37
call void @llvm.lifetime.end.p0i8 ( i64 4 , i8 * nonnull %0 ) , !dbg !37
ret i32 0 , !dbg !37
}
declare !dbg !8 d s o _ l o c a l void @fn3 ( i32 * ) local_unnamed_addr
; Function Attrs: nounwind readnone speculatable willreturn
declare void @llvm.dbg.value ( metadata , metadata , metadata )
!llvm.dbg.cu = ! { !0 }
!llvm.module.flags = ! { !12 , !13 , !14 }
!llvm.ident = ! { !15 }
!0 = distinct !DICompileUnit ( language: D W _ L A N G _ C 99 , file: !1 , producer: "clang version 10.0.0" , isOptimized: true , runtimeVersion: 0 , emissionKind: F u l l D e b u g , enums: !2 , retainedTypes: !3 , nameTableKind: N one )
!1 = !DIFile ( filename: "test.c" , directory: "/" )
!2 = ! { }
!3 = ! { !4 , !8 }
!4 = !DISubprogram ( name: "fn2" , scope: !1 , file: !1 , line: 2 , type: !5 , flags: D I F l a g P r o t o t y p e d , spFlags: D I S P F l a g O p t i m i z e d , retainedNodes: !2 )
!5 = !DISubroutineType ( types: !6 )
!6 = ! { null , !7 }
!7 = !DIBasicType ( name: "int" , size: 32 , encoding: D W _ A T E _ s i g n e d )
!8 = !DISubprogram ( name: "fn3" , scope: !1 , file: !1 , line: 1 , type: !9 , flags: D I F l a g P r o t o t y p e d , spFlags: D I S P F l a g O p t i m i z e d , retainedNodes: !2 )
!9 = !DISubroutineType ( types: !10 )
!10 = ! { null , !11 }
!11 = !DIDerivedType ( tag: D W _ T A G _ p o i n t e r _ type , baseType: !7 , size: 64 )
!12 = ! { i32 2 , !"Dwarf Version" , i32 4 }
!13 = ! { i32 2 , !"Debug Info Version" , i32 3 }
!14 = ! { i32 1 , !"wchar_size" , i32 4 }
!15 = ! { !"clang version 10.0.0" }
!16 = distinct !DISubprogram ( name: "fn1" , scope: !1 , file: !1 , line: 6 , type: !17 , scopeLine: 7 , flags: D I F l a g P r o t o t y p e d | D I F l a g A l l C a l l s D e s c r i b e d , spFlags: D I S P F l a g D e f i n i t i o n | D I S P F l a g O p t i m i z e d , unit: !0 , retainedNodes: !19 )
!17 = !DISubroutineType ( types: !18 )
!18 = ! { null , !7 , !7 }
!19 = ! { !20 , !21 , !22 , !23 }
2019-11-20 19:20:53 +08:00
!20 = !DILocalVariable ( name: "x" , arg: 1 , scope: !16 , file: !1 , line: 6 , type: !7 )
!21 = !DILocalVariable ( name: "y" , arg: 2 , scope: !16 , file: !1 , line: 6 , type: !7 )
2019-09-10 18:37:28 +08:00
!22 = !DILocalVariable ( name: "u" , scope: !16 , file: !1 , line: 8 , type: !7 )
!23 = !DILocalVariable ( name: "a" , scope: !16 , file: !1 , line: 18 , type: !7 )
!24 = !DILocation ( line: 0 , scope: !16 )
!25 = !DILocation ( line: 20 , column: 3 , scope: !16 )
!26 = !DILocation ( line: 22 , column: 1 , scope: !16 )
!27 = distinct !DISubprogram ( name: "f" , scope: !1 , file: !1 , line: 25 , type: !28 , scopeLine: 26 , flags: D I F l a g A l l C a l l s D e s c r i b e d , spFlags: D I S P F l a g D e f i n i t i o n | D I S P F l a g O p t i m i z e d , unit: !0 , retainedNodes: !30 )
!28 = !DISubroutineType ( types: !29 )
!29 = ! { !7 }
!30 = ! { !31 , !32 }
!31 = !DILocalVariable ( name: "l" , scope: !27 , file: !1 , line: 27 , type: !7 )
!32 = !DILocalVariable ( name: "k" , scope: !27 , file: !1 , line: 27 , type: !7 )
!33 = !DILocation ( line: 27 , column: 3 , scope: !27 )
!34 = !DILocation ( line: 0 , scope: !27 )
!35 = !DILocation ( line: 29 , column: 3 , scope: !27 )
!36 = !DILocation ( line: 30 , column: 3 , scope: !27 )
!37 = !DILocation ( line: 32 , column: 8 , scope: !27 )