DebugInfo: PR14763/r183329 correct the location of indirect parameters
[oota-llvm.git] / test / DebugInfo / X86 / parameters.ll
1 ; REQUIRES: object-emission
2 ;
3 ; RUN: llc -O0 -filetype=obj < %s > %t
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 ; }
16 ; }
17
18 ; CHECK: debug_info contents
19 ; CHECK: DW_AT_name{{.*}} = "f"
20 ; CHECK: DW_AT_location{{.*}}([[LOC:0x[0-9]*]])
21 ; CHECK: debug_loc contents
22 ; CHECK-NEXT: [[LOC]]: Begining
23 ; CHECK-NEXT:            Ending
24 ; 0x74 is DW_OP_breg0 + 4, showing that the parameter is accessed indirectly
25 ; (with a zero offset) from the register parameter
26 ; CHECK-NEXT: Location description: 74 00
27
28 %"struct.pr14763::foo" = type { i8 }
29
30 ; Function Attrs: uwtable
31 define void @_ZN7pr147634funcENS_3fooE(%"struct.pr14763::foo"* noalias sret %agg.result, %"struct.pr14763::foo"* %f) #0 {
32 entry:
33   call void @llvm.dbg.declare(metadata !{%"struct.pr14763::foo"* %f}, metadata !17), !dbg !20
34   call void @_ZN7pr147633fooC1ERKS0_(%"struct.pr14763::foo"* %agg.result, %"struct.pr14763::foo"* %f), !dbg !21
35   ret void, !dbg !21
36 }
37
38 ; Function Attrs: nounwind readnone
39 declare void @llvm.dbg.declare(metadata, metadata) #1
40
41 declare void @_ZN7pr147633fooC1ERKS0_(%"struct.pr14763::foo"*, %"struct.pr14763::foo"*) #2
42
43 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" }
44 attributes #1 = { nounwind readnone }
45 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" }
46
47 !llvm.dbg.cu = !{!0}
48
49 !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]
50 !1 = metadata !{metadata !"pass.cpp", metadata !"/tmp"}
51 !2 = metadata !{i32 0}
52 !3 = metadata !{metadata !4}
53 !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]
54 !5 = metadata !{i32 786489, metadata !1, null, metadata !"pr14763", i32 1} ; [ DW_TAG_namespace ] [pr14763] [line 1]
55 !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 ]
56 !7 = metadata !{metadata !8, metadata !8}
57 !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 ]
58 !9 = metadata !{metadata !10}
59 !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]
60 !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 ]
61 !12 = metadata !{null, metadata !13, metadata !14}
62 !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]
63 !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 ]
64 !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]
65 !16 = metadata !{i32 786468}
66 !17 = metadata !{i32 786689, metadata !4, metadata !"f", metadata !18, i32 16777222, metadata !19, i32 8192, i32 0} ; [ DW_TAG_arg_variable ] [f] [line 6]
67 !18 = metadata !{i32 786473, metadata !1}         ; [ DW_TAG_file_type ] [/tmp/pass.cpp]
68 !19 = metadata !{i32 786448, null, null, null, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !8} ; [ DW_TAG_reference_type ] [line 0, size 0, align 0, offset 0] [from foo]
69 !20 = metadata !{i32 6, i32 0, metadata !4, null}
70 !21 = metadata !{i32 7, i32 0, metadata !4, null}