blob: 4215c21721efc67b760308f9d06f5ed9c94acc99 [file] [log] [blame]
David Blaikie81a4dc72013-06-19 21:55:13 +00001; REQUIRES: object-emission
2;
David Blaikie8300e122013-06-20 17:31:32 +00003; RUN: llc -mtriple=x86_64-unknown-linux-gnu -O0 -filetype=obj < %s > %t
David Blaikie81a4dc72013-06-19 21:55:13 +00004; RUN: llvm-dwarfdump %t | FileCheck %s
5
6; Test case derived from compiling the following source with clang -g:
7;
8; namespace pr14763 {
9; struct foo {
10; foo(const foo&);
11; };
12;
13; foo func(foo f) {
14; return f; // reference 'f' for now because otherwise we hit another bug
15; }
David Blaikieea2605d2013-06-20 00:25:24 +000016;
17; void sink(void*);
18;
19; void func2(bool b, foo g) {
20; if (b)
21; sink(&g); // reference 'f' for now because otherwise we hit another bug
22; }
David Blaikie81a4dc72013-06-19 21:55:13 +000023; }
24
25; CHECK: debug_info contents
Adrian Prantl418d1d12013-07-09 20:28:37 +000026; 0x74 is DW_OP_breg4, showing that the parameter is accessed indirectly
David Blaikie81a4dc72013-06-19 21:55:13 +000027; (with a zero offset) from the register parameter
Adrian Prantl418d1d12013-07-09 20:28:37 +000028; CHECK: DW_AT_location{{.*}}(<0x0{{.}}> 74 00
David Blaikieeb1a2722014-06-13 22:18:23 +000029; CHECK-NOT: DW_TAG
30; CHECK: DW_AT_name{{.*}} = "f"
David Blaikieea2605d2013-06-20 00:25:24 +000031
David Blaikieea2605d2013-06-20 00:25:24 +000032; CHECK: DW_AT_location{{.*}}([[G_LOC:0x[0-9]*]])
David Blaikieeb1a2722014-06-13 22:18:23 +000033; CHECK-NOT: DW_TAG
34; CHECK: DW_AT_name{{.*}} = "g"
David Blaikieea2605d2013-06-20 00:25:24 +000035; CHECK: debug_loc contents
36; CHECK-NEXT: [[G_LOC]]: Beginning
37; CHECK-NEXT: Ending
David Blaikie81a4dc72013-06-19 21:55:13 +000038; CHECK-NEXT: Location description: 74 00
39
40%"struct.pr14763::foo" = type { i8 }
41
42; Function Attrs: uwtable
43define void @_ZN7pr147634funcENS_3fooE(%"struct.pr14763::foo"* noalias sret %agg.result, %"struct.pr14763::foo"* %f) #0 {
44entry:
David Blaikieea2605d2013-06-20 00:25:24 +000045 call void @llvm.dbg.declare(metadata !{%"struct.pr14763::foo"* %f}, metadata !22), !dbg !24
46 call void @_ZN7pr147633fooC1ERKS0_(%"struct.pr14763::foo"* %agg.result, %"struct.pr14763::foo"* %f), !dbg !25
47 ret void, !dbg !25
David Blaikie81a4dc72013-06-19 21:55:13 +000048}
49
50; Function Attrs: nounwind readnone
51declare void @llvm.dbg.declare(metadata, metadata) #1
52
53declare void @_ZN7pr147633fooC1ERKS0_(%"struct.pr14763::foo"*, %"struct.pr14763::foo"*) #2
54
David Blaikieea2605d2013-06-20 00:25:24 +000055; Function Attrs: uwtable
56define void @_ZN7pr147635func2EbNS_3fooE(i1 zeroext %b, %"struct.pr14763::foo"* %g) #0 {
57entry:
58 %b.addr = alloca i8, align 1
59 %frombool = zext i1 %b to i8
60 store i8 %frombool, i8* %b.addr, align 1
61 call void @llvm.dbg.declare(metadata !{i8* %b.addr}, metadata !26), !dbg !27
62 call void @llvm.dbg.declare(metadata !{%"struct.pr14763::foo"* %g}, metadata !28), !dbg !27
63 %0 = load i8* %b.addr, align 1, !dbg !29
64 %tobool = trunc i8 %0 to i1, !dbg !29
65 br i1 %tobool, label %if.then, label %if.end, !dbg !29
66
67if.then: ; preds = %entry
68 %1 = bitcast %"struct.pr14763::foo"* %g to i8*, !dbg !31
69 call void @_ZN7pr147634sinkEPv(i8* %1), !dbg !31
70 br label %if.end, !dbg !31
71
72if.end: ; preds = %if.then, %entry
73 ret void, !dbg !32
74}
75
76declare void @_ZN7pr147634sinkEPv(i8*) #2
77
David Blaikie81a4dc72013-06-19 21:55:13 +000078attributes #0 = { uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }
79attributes #1 = { nounwind readnone }
80attributes #2 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }
81
82!llvm.dbg.cu = !{!0}
Manman Ren409558f2013-11-22 21:49:45 +000083!llvm.module.flags = !{!21, !33}
David Blaikie81a4dc72013-06-19 21:55:13 +000084
85!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.4 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [/tmp/pass.cpp] [DW_LANG_C_plus_plus]
86!1 = metadata !{metadata !"pass.cpp", metadata !"/tmp"}
David Blaikie5e390e42014-02-04 01:23:52 +000087!2 = metadata !{}
David Blaikieea2605d2013-06-20 00:25:24 +000088!3 = metadata !{metadata !4, metadata !17}
David Blaikie81a4dc72013-06-19 21:55:13 +000089!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"func", metadata !"func", metadata !"_ZN7pr147634funcENS_3fooE", i32 6, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%"struct.pr14763::foo"*, %"struct.pr14763::foo"*)* @_ZN7pr147634funcENS_3fooE, null, null, metadata !2, i32 6} ; [ DW_TAG_subprogram ] [line 6] [def] [func]
90!5 = metadata !{i32 786489, metadata !1, null, metadata !"pr14763", i32 1} ; [ DW_TAG_namespace ] [pr14763] [line 1]
Manman Rendeeafd82013-09-06 21:03:58 +000091!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 ]
David Blaikie81a4dc72013-06-19 21:55:13 +000092!7 = metadata !{metadata !8, metadata !8}
Manman Ren0ed70ae2013-08-26 22:39:55 +000093!8 = metadata !{i32 786451, metadata !1, metadata !5, metadata !"foo", i32 2, i64 8, i64 8, i32 0, i32 0, null, metadata !9, i32 0, null, null, null} ; [ DW_TAG_structure_type ] [foo] [line 2, size 8, align 8, offset 0] [def] [from ]
David Blaikie81a4dc72013-06-19 21:55:13 +000094!9 = metadata !{metadata !10}
95!10 = metadata !{i32 786478, metadata !1, metadata !8, metadata !"foo", metadata !"foo", metadata !"", i32 3, metadata !11, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, null, i32 0, metadata !16, i32 3} ; [ DW_TAG_subprogram ] [line 3] [foo]
Manman Rendeeafd82013-09-06 21:03:58 +000096!11 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !12, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
David Blaikie81a4dc72013-06-19 21:55:13 +000097!12 = metadata !{null, metadata !13, metadata !14}
Manman Rendeeafd82013-09-06 21:03:58 +000098!13 = metadata !{i32 786447, i32 0, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 1088, metadata !8} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [artificial] [from foo]
David Blaikie81a4dc72013-06-19 21:55:13 +000099!14 = metadata !{i32 786448, null, null, null, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !15} ; [ DW_TAG_reference_type ] [line 0, size 0, align 0, offset 0] [from ]
100!15 = metadata !{i32 786470, null, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, metadata !8} ; [ DW_TAG_const_type ] [line 0, size 0, align 0, offset 0] [from foo]
101!16 = metadata !{i32 786468}
David Blaikieea2605d2013-06-20 00:25:24 +0000102!17 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"func2", metadata !"func2", metadata !"_ZN7pr147635func2EbNS_3fooE", i32 12, metadata !18, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (i1, %"struct.pr14763::foo"*)* @_ZN7pr147635func2EbNS_3fooE, null, null, metadata !2, i32 12} ; [ DW_TAG_subprogram ] [line 12] [def] [func2]
Manman Rendeeafd82013-09-06 21:03:58 +0000103!18 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !19, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
David Blaikieea2605d2013-06-20 00:25:24 +0000104!19 = metadata !{null, metadata !20, metadata !8}
105!20 = metadata !{i32 786468, null, null, metadata !"bool", i32 0, i64 8, i64 8, i64 0, i32 0, i32 2} ; [ DW_TAG_base_type ] [bool] [line 0, size 8, align 8, offset 0, enc DW_ATE_boolean]
106!21 = metadata !{i32 2, metadata !"Dwarf Version", i32 3}
107!22 = metadata !{i32 786689, metadata !4, metadata !"f", metadata !23, i32 16777222, metadata !8, i32 8192, i32 0} ; [ DW_TAG_arg_variable ] [f] [line 6]
108!23 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/tmp/pass.cpp]
109!24 = metadata !{i32 6, i32 0, metadata !4, null}
110!25 = metadata !{i32 7, i32 0, metadata !4, null}
111!26 = metadata !{i32 786689, metadata !17, metadata !"b", metadata !23, i32 16777228, metadata !20, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [b] [line 12]
112!27 = metadata !{i32 12, i32 0, metadata !17, null}
113!28 = metadata !{i32 786689, metadata !17, metadata !"g", metadata !23, i32 33554444, metadata !8, i32 8192, i32 0} ; [ DW_TAG_arg_variable ] [g] [line 12]
114!29 = metadata !{i32 13, i32 0, metadata !30, null}
115!30 = metadata !{i32 786443, metadata !1, metadata !17, i32 13, i32 0, i32 0} ; [ DW_TAG_lexical_block ] [/tmp/pass.cpp]
116!31 = metadata !{i32 14, i32 0, metadata !30, null}
117!32 = metadata !{i32 15, i32 0, metadata !17, null}
Manman Ren409558f2013-11-22 21:49:45 +0000118!33 = metadata !{i32 1, metadata !"Debug Info Version", i32 1}