David Blaikie | 81a4dc7 | 2013-06-19 21:55:13 +0000 | [diff] [blame] | 1 | ; REQUIRES: object-emission |
| 2 | ; |
David Blaikie | 8300e12 | 2013-06-20 17:31:32 +0000 | [diff] [blame^] | 3 | ; RUN: llc -mtriple=x86_64-unknown-linux-gnu -O0 -filetype=obj < %s > %t |
David Blaikie | 81a4dc7 | 2013-06-19 21:55:13 +0000 | [diff] [blame] | 4 | ; 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 Blaikie | ea2605d | 2013-06-20 00:25:24 +0000 | [diff] [blame] | 16 | ; |
| 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 Blaikie | 81a4dc7 | 2013-06-19 21:55:13 +0000 | [diff] [blame] | 23 | ; } |
| 24 | |
| 25 | ; CHECK: debug_info contents |
| 26 | ; CHECK: DW_AT_name{{.*}} = "f" |
David Blaikie | 81a4dc7 | 2013-06-19 21:55:13 +0000 | [diff] [blame] | 27 | ; 0x74 is DW_OP_breg0 + 4, showing that the parameter is accessed indirectly |
| 28 | ; (with a zero offset) from the register parameter |
David Blaikie | ea2605d | 2013-06-20 00:25:24 +0000 | [diff] [blame] | 29 | ; CHECK: DW_AT_location{{.*}}(<0x02> 74 00 ) |
| 30 | |
| 31 | ; CHECK: DW_AT_name{{.*}} = "g" |
| 32 | ; CHECK: DW_AT_location{{.*}}([[G_LOC:0x[0-9]*]]) |
| 33 | ; CHECK: debug_loc contents |
| 34 | ; CHECK-NEXT: [[G_LOC]]: Beginning |
| 35 | ; CHECK-NEXT: Ending |
David Blaikie | 81a4dc7 | 2013-06-19 21:55:13 +0000 | [diff] [blame] | 36 | ; CHECK-NEXT: Location description: 74 00 |
| 37 | |
| 38 | %"struct.pr14763::foo" = type { i8 } |
| 39 | |
| 40 | ; Function Attrs: uwtable |
| 41 | define void @_ZN7pr147634funcENS_3fooE(%"struct.pr14763::foo"* noalias sret %agg.result, %"struct.pr14763::foo"* %f) #0 { |
| 42 | entry: |
David Blaikie | ea2605d | 2013-06-20 00:25:24 +0000 | [diff] [blame] | 43 | call void @llvm.dbg.declare(metadata !{%"struct.pr14763::foo"* %f}, metadata !22), !dbg !24 |
| 44 | call void @_ZN7pr147633fooC1ERKS0_(%"struct.pr14763::foo"* %agg.result, %"struct.pr14763::foo"* %f), !dbg !25 |
| 45 | ret void, !dbg !25 |
David Blaikie | 81a4dc7 | 2013-06-19 21:55:13 +0000 | [diff] [blame] | 46 | } |
| 47 | |
| 48 | ; Function Attrs: nounwind readnone |
| 49 | declare void @llvm.dbg.declare(metadata, metadata) #1 |
| 50 | |
| 51 | declare void @_ZN7pr147633fooC1ERKS0_(%"struct.pr14763::foo"*, %"struct.pr14763::foo"*) #2 |
| 52 | |
David Blaikie | ea2605d | 2013-06-20 00:25:24 +0000 | [diff] [blame] | 53 | ; Function Attrs: uwtable |
| 54 | define void @_ZN7pr147635func2EbNS_3fooE(i1 zeroext %b, %"struct.pr14763::foo"* %g) #0 { |
| 55 | entry: |
| 56 | %b.addr = alloca i8, align 1 |
| 57 | %frombool = zext i1 %b to i8 |
| 58 | store i8 %frombool, i8* %b.addr, align 1 |
| 59 | call void @llvm.dbg.declare(metadata !{i8* %b.addr}, metadata !26), !dbg !27 |
| 60 | call void @llvm.dbg.declare(metadata !{%"struct.pr14763::foo"* %g}, metadata !28), !dbg !27 |
| 61 | %0 = load i8* %b.addr, align 1, !dbg !29 |
| 62 | %tobool = trunc i8 %0 to i1, !dbg !29 |
| 63 | br i1 %tobool, label %if.then, label %if.end, !dbg !29 |
| 64 | |
| 65 | if.then: ; preds = %entry |
| 66 | %1 = bitcast %"struct.pr14763::foo"* %g to i8*, !dbg !31 |
| 67 | call void @_ZN7pr147634sinkEPv(i8* %1), !dbg !31 |
| 68 | br label %if.end, !dbg !31 |
| 69 | |
| 70 | if.end: ; preds = %if.then, %entry |
| 71 | ret void, !dbg !32 |
| 72 | } |
| 73 | |
| 74 | declare void @_ZN7pr147634sinkEPv(i8*) #2 |
| 75 | |
David Blaikie | 81a4dc7 | 2013-06-19 21:55:13 +0000 | [diff] [blame] | 76 | attributes #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" } |
| 77 | attributes #1 = { nounwind readnone } |
| 78 | attributes #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" } |
| 79 | |
| 80 | !llvm.dbg.cu = !{!0} |
David Blaikie | ea2605d | 2013-06-20 00:25:24 +0000 | [diff] [blame] | 81 | !llvm.module.flags = !{!21} |
David Blaikie | 81a4dc7 | 2013-06-19 21:55:13 +0000 | [diff] [blame] | 82 | |
| 83 | !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] |
| 84 | !1 = metadata !{metadata !"pass.cpp", metadata !"/tmp"} |
| 85 | !2 = metadata !{i32 0} |
David Blaikie | ea2605d | 2013-06-20 00:25:24 +0000 | [diff] [blame] | 86 | !3 = metadata !{metadata !4, metadata !17} |
David Blaikie | 81a4dc7 | 2013-06-19 21:55:13 +0000 | [diff] [blame] | 87 | !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] |
| 88 | !5 = metadata !{i32 786489, metadata !1, null, metadata !"pr14763", i32 1} ; [ DW_TAG_namespace ] [pr14763] [line 1] |
| 89 | !6 = metadata !{i32 786453, i32 0, i32 0, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] |
| 90 | !7 = metadata !{metadata !8, metadata !8} |
| 91 | !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} ; [ DW_TAG_structure_type ] [foo] [line 2, size 8, align 8, offset 0] [from ] |
| 92 | !9 = metadata !{metadata !10} |
| 93 | !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] |
| 94 | !11 = metadata !{i32 786453, i32 0, i32 0, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !12, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] |
| 95 | !12 = metadata !{null, metadata !13, metadata !14} |
| 96 | !13 = metadata !{i32 786447, i32 0, i32 0, 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] |
| 97 | !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 ] |
| 98 | !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] |
| 99 | !16 = metadata !{i32 786468} |
David Blaikie | ea2605d | 2013-06-20 00:25:24 +0000 | [diff] [blame] | 100 | !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] |
| 101 | !18 = metadata !{i32 786453, i32 0, i32 0, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !19, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] |
| 102 | !19 = metadata !{null, metadata !20, metadata !8} |
| 103 | !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] |
| 104 | !21 = metadata !{i32 2, metadata !"Dwarf Version", i32 3} |
| 105 | !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] |
| 106 | !23 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/tmp/pass.cpp] |
| 107 | !24 = metadata !{i32 6, i32 0, metadata !4, null} |
| 108 | !25 = metadata !{i32 7, i32 0, metadata !4, null} |
| 109 | !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] |
| 110 | !27 = metadata !{i32 12, i32 0, metadata !17, null} |
| 111 | !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] |
| 112 | !29 = metadata !{i32 13, i32 0, metadata !30, null} |
| 113 | !30 = metadata !{i32 786443, metadata !1, metadata !17, i32 13, i32 0, i32 0} ; [ DW_TAG_lexical_block ] [/tmp/pass.cpp] |
| 114 | !31 = metadata !{i32 14, i32 0, metadata !30, null} |
| 115 | !32 = metadata !{i32 15, i32 0, metadata !17, null} |