blob: 8a0e3c568f1c28d58162d141a8b8f877f8191c68 [file] [log] [blame]
David Blaikie1ea9db22014-05-21 23:14:12 +00001; REQUIRES: object-emission
2
David Blaikie87e92eb2014-07-15 21:06:37 +00003; RUN: %llc_dwarf -O0 -filetype=obj < %s | llvm-dwarfdump -debug-dump=info - | FileCheck -implicit-check-not=DW_TAG %s
David Blaikie1ea9db22014-05-21 23:14:12 +00004
5; Build from source:
6; $ clang++ a.cpp b.cpp -g -c -emit-llvm
7; $ llvm-link a.bc b.bc -o ab.bc
8; $ opt -inline ab.bc -o ab-opt.bc
9; $ cat a.cpp
10; extern int i;
11; int func(int);
12; int main() {
13; return func(i);
14; }
15; $ cat b.cpp
16; int __attribute__((always_inline)) func(int x) {
17; return x * 2;
18; }
19
20; Ensure that func inlined into main is described and references the abstract
21; definition in b.cpp's CU.
22
23; CHECK: DW_TAG_compile_unit
24; CHECK: DW_AT_name {{.*}} "a.cpp"
25; CHECK: DW_TAG_subprogram
David Blaikief7221ad2014-05-27 18:37:43 +000026; CHECK: DW_AT_type [DW_FORM_ref_addr] (0x00000000[[INT:.*]])
David Blaikie1ea9db22014-05-21 23:14:12 +000027; CHECK: DW_TAG_inlined_subroutine
David Blaikie482097d2014-05-27 18:37:55 +000028; CHECK: DW_AT_abstract_origin {{.*}}[[ABS_FUNC:........]])
David Blaikie1ea9db22014-05-21 23:14:12 +000029; CHECK: DW_TAG_formal_parameter
David Blaikie482097d2014-05-27 18:37:55 +000030; CHECK: DW_AT_abstract_origin {{.*}}[[ABS_VAR:........]])
David Blaikie1ea9db22014-05-21 23:14:12 +000031
32; Check the abstract definition is in the 'b.cpp' CU and doesn't contain any
33; concrete information (address range or variable location)
34; CHECK: DW_TAG_compile_unit
35; CHECK: DW_AT_name {{.*}} "b.cpp"
36; CHECK: 0x[[ABS_FUNC]]: DW_TAG_subprogram
37; CHECK-NOT: DW_AT_low_pc
38; CHECK: 0x[[ABS_VAR]]: DW_TAG_formal_parameter
David Blaikie96fb9022014-05-23 04:23:06 +000039; CHECK-NOT: DW_AT_location
David Blaikief7221ad2014-05-27 18:37:43 +000040; CHECK: DW_AT_type [DW_FORM_ref4] {{.*}} {0x[[INT]]}
David Blaikie1ea9db22014-05-21 23:14:12 +000041; CHECK-NOT: DW_AT_location
42
David Blaikief7221ad2014-05-27 18:37:43 +000043; CHECK: 0x[[INT]]: DW_TAG_base_type
David Blaikief7221ad2014-05-27 18:37:43 +000044; CHECK: DW_AT_name {{.*}} "int"
45
David Blaikie1ea9db22014-05-21 23:14:12 +000046; Check the concrete out of line definition references the abstract and
47; provides the address range and variable location
48; CHECK: DW_TAG_subprogram
David Blaikie1ea9db22014-05-21 23:14:12 +000049; CHECK: DW_AT_low_pc
David Blaikie482097d2014-05-27 18:37:55 +000050; CHECK: DW_AT_abstract_origin {{.*}} {0x[[ABS_FUNC]]}
David Blaikie1ea9db22014-05-21 23:14:12 +000051; CHECK: DW_TAG_formal_parameter
David Blaikie1ea9db22014-05-21 23:14:12 +000052; CHECK: DW_AT_location
David Blaikieeb1a2722014-06-13 22:18:23 +000053; CHECK: DW_AT_abstract_origin {{.*}} {0x[[ABS_VAR]]}
David Blaikie1ea9db22014-05-21 23:14:12 +000054
55
56@i = external global i32
57
58; Function Attrs: uwtable
59define i32 @main() #0 {
60entry:
61 %x.addr.i = alloca i32, align 4
62 %retval = alloca i32, align 4
63 store i32 0, i32* %retval
64 %0 = load i32* @i, align 4, !dbg !19
65 %1 = bitcast i32* %x.addr.i to i8*
66 call void @llvm.lifetime.start(i64 4, i8* %1)
67 store i32 %0, i32* %x.addr.i, align 4
68 call void @llvm.dbg.declare(metadata !{i32* %x.addr.i}, metadata !20), !dbg !21
69 %2 = load i32* %x.addr.i, align 4, !dbg !22
70 %mul.i = mul nsw i32 %2, 2, !dbg !22
71 %3 = bitcast i32* %x.addr.i to i8*, !dbg !22
72 call void @llvm.lifetime.end(i64 4, i8* %3), !dbg !22
73 ret i32 %mul.i, !dbg !19
74}
75
76; Function Attrs: alwaysinline nounwind uwtable
77define i32 @_Z4funci(i32 %x) #1 {
78entry:
79 %x.addr = alloca i32, align 4
80 store i32 %x, i32* %x.addr, align 4
81 call void @llvm.dbg.declare(metadata !{i32* %x.addr}, metadata !20), !dbg !23
82 %0 = load i32* %x.addr, align 4, !dbg !24
83 %mul = mul nsw i32 %0, 2, !dbg !24
84 ret i32 %mul, !dbg !24
85}
86
87; Function Attrs: nounwind readnone
88declare void @llvm.dbg.declare(metadata, metadata) #2
89
90; Function Attrs: nounwind
91declare void @llvm.lifetime.start(i64, i8* nocapture) #3
92
93; Function Attrs: nounwind
94declare void @llvm.lifetime.end(i64, i8* nocapture) #3
95
96attributes #0 = { uwtable "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" "unsafe-fp-math"="false" "use-soft-float"="false" }
97attributes #1 = { alwaysinline nounwind uwtable "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" "unsafe-fp-math"="false" "use-soft-float"="false" }
98attributes #2 = { nounwind readnone }
99attributes #3 = { nounwind }
100
101!llvm.dbg.cu = !{!0, !9}
102!llvm.module.flags = !{!16, !17}
103!llvm.ident = !{!18, !18}
104
105!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.5.0 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [/tmp/dbginfo/a.cpp] [DW_LANG_C_plus_plus]
106!1 = metadata !{metadata !"a.cpp", metadata !"/tmp/dbginfo"}
107!2 = metadata !{}
108!3 = metadata !{metadata !4}
109!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"main", metadata !"main", metadata !"", i32 3, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 ()* @main, null, null, metadata !2, i32 3} ; [ DW_TAG_subprogram ] [line 3] [def] [main]
110!5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/tmp/dbginfo/a.cpp]
111!6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
112!7 = metadata !{metadata !8}
113!8 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed]
114!9 = metadata !{i32 786449, metadata !10, i32 4, metadata !"clang version 3.5.0 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !11, metadata !2, metadata !2, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [/tmp/dbginfo/b.cpp] [DW_LANG_C_plus_plus]
115!10 = metadata !{metadata !"b.cpp", metadata !"/tmp/dbginfo"}
116!11 = metadata !{metadata !12}
117!12 = metadata !{i32 786478, metadata !10, metadata !13, metadata !"func", metadata !"func", metadata !"_Z4funci", i32 1, metadata !14, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (i32)* @_Z4funci, null, null, metadata !2, i32 1} ; [ DW_TAG_subprogram ] [line 1] [def] [func]
118!13 = metadata !{i32 786473, metadata !10} ; [ DW_TAG_file_type ] [/tmp/dbginfo/b.cpp]
119!14 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !15, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
120!15 = metadata !{metadata !8, metadata !8}
121!16 = metadata !{i32 2, metadata !"Dwarf Version", i32 4}
122!17 = metadata !{i32 2, metadata !"Debug Info Version", i32 1}
123!18 = metadata !{metadata !"clang version 3.5.0 "}
124!19 = metadata !{i32 4, i32 0, metadata !4, null}
125!20 = metadata !{i32 786689, metadata !12, metadata !"x", metadata !13, i32 16777217, metadata !8, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [x] [line 1]
126!21 = metadata !{i32 1, i32 0, metadata !12, metadata !19}
127!22 = metadata !{i32 2, i32 0, metadata !12, metadata !19}
128!23 = metadata !{i32 1, i32 0, metadata !12, null}
129!24 = metadata !{i32 2, i32 0, metadata !12, null}
130