David Blaikie | a1e813d | 2013-05-10 21:52:07 +0000 | [diff] [blame] | 1 | ; REQUIRES: object-emission |
| 2 | |
David Blaikie | f95485a | 2013-05-10 22:14:39 +0000 | [diff] [blame] | 3 | ; RUN: llc -mtriple=x86_64-linux -O0 -filetype=obj < %s > %t |
David Blaikie | a1e813d | 2013-05-10 21:52:07 +0000 | [diff] [blame] | 4 | ; RUN: llvm-dwarfdump %t | FileCheck %s |
| 5 | |
| 6 | ; IR generated with `clang++ -g -emit-llvm -S` from the following code: |
David Blaikie | 2b38023 | 2013-06-22 18:59:11 +0000 | [diff] [blame] | 7 | ; template<int x, int*, template<typename> class y, int ...z> int func() { return 3; } |
David Blaikie | a1ae0e6 | 2013-08-01 20:30:22 +0000 | [diff] [blame^] | 8 | ; template<typename> struct y_impl { struct nested { }; }; |
David Blaikie | 2b38023 | 2013-06-22 18:59:11 +0000 | [diff] [blame] | 9 | ; int glbl = func<3, &glbl, y_impl, 1, 2>(); |
David Blaikie | a1ae0e6 | 2013-08-01 20:30:22 +0000 | [diff] [blame^] | 10 | ; y_impl<int>::nested n; |
David Blaikie | a1e813d | 2013-05-10 21:52:07 +0000 | [diff] [blame] | 11 | |
| 12 | ; CHECK: [[INT:0x[0-9a-f]*]]:{{ *}}DW_TAG_base_type |
| 13 | ; CHECK-NEXT: DW_AT_name{{.*}} = "int" |
| 14 | |
David Blaikie | a1ae0e6 | 2013-08-01 20:30:22 +0000 | [diff] [blame^] | 15 | ; CHECK: DW_TAG_structure_type |
| 16 | ; CHECK-NEXT: DW_AT_name{{.*}}"y_impl<int>" |
| 17 | ; CHECK-NOT: NULL |
| 18 | ; CHECK: DW_TAG_template_type_parameter |
| 19 | |
David Blaikie | 2b38023 | 2013-06-22 18:59:11 +0000 | [diff] [blame] | 20 | ; CHECK: DW_AT_name{{.*}}"func<3, &glbl, y_impl, 1, 2>" |
David Blaikie | a1e813d | 2013-05-10 21:52:07 +0000 | [diff] [blame] | 21 | ; CHECK-NOT: NULL |
| 22 | ; CHECK: DW_TAG_template_value_parameter |
| 23 | ; CHECK-NEXT: DW_AT_type{{.*}}=> {[[INT]]} |
| 24 | ; CHECK-NEXT: DW_AT_name{{.*}}= "x" |
| 25 | |
| 26 | ; This could be made shorter by encoding it as _sdata rather than data4, or |
| 27 | ; even as data1. DWARF strongly urges implementations to prefer |
| 28 | ; _sdata/_udata rather than dataN |
| 29 | |
| 30 | ; CHECK-NEXT: DW_AT_const_value [DW_FORM_data4]{{.*}}(0x00000003) |
| 31 | |
| 32 | ; CHECK: DW_TAG_template_value_parameter |
| 33 | ; CHECK-NEXT: DW_AT_type{{.*}}=> {[[INTPTR:0x[0-9a-f]*]]} |
| 34 | |
| 35 | ; The address of the global 'glbl', followed by DW_OP_stack_value (9f), to use |
| 36 | ; the value immediately, rather than indirecting through the address. |
| 37 | |
| 38 | ; CHECK-NEXT: DW_AT_location [DW_FORM_block1]{{ *}}(<0x0a> 03 00 00 00 00 00 00 00 00 9f ) |
David Blaikie | 2b38023 | 2013-06-22 18:59:11 +0000 | [diff] [blame] | 39 | ; CHECK-NOT: NULL |
| 40 | |
| 41 | ; CHECK: DW_TAG_GNU_template_template_param |
| 42 | ; CHECK-NEXT: DW_AT_name{{.*}}= "y" |
| 43 | ; CHECK-NEXT: DW_AT_GNU_template_name{{.*}}= "y_impl" |
| 44 | ; CHECK-NOT: NULL |
| 45 | |
| 46 | ; CHECK: DW_TAG_GNU_template_parameter_pack |
| 47 | ; CHECK-NOT: NULL |
| 48 | ; CHECK: DW_TAG_template_value_parameter |
| 49 | ; CHECK-NEXT: DW_AT_type{{.*}}=> {[[INT]]} |
| 50 | ; CHECK-NEXT: DW_AT_const_value [DW_FORM_data4]{{.*}}(0x00000001) |
| 51 | ; CHECK-NOT: NULL |
| 52 | ; CHECK: DW_TAG_template_value_parameter |
| 53 | ; CHECK-NEXT: DW_AT_type{{.*}}=> {[[INT]]} |
| 54 | ; CHECK-NEXT: DW_AT_const_value [DW_FORM_data4]{{.*}}(0x00000002) |
David Blaikie | a1e813d | 2013-05-10 21:52:07 +0000 | [diff] [blame] | 55 | |
| 56 | ; CHECK: [[INTPTR]]:{{ *}}DW_TAG_pointer_type |
| 57 | ; CHECK-NEXT: DW_AT_type{{.*}} => {[[INT]]} |
| 58 | |
David Blaikie | a1ae0e6 | 2013-08-01 20:30:22 +0000 | [diff] [blame^] | 59 | %"struct.y_impl<int>::nested" = type { i8 } |
David Blaikie | 2b38023 | 2013-06-22 18:59:11 +0000 | [diff] [blame] | 60 | |
David Blaikie | a1e813d | 2013-05-10 21:52:07 +0000 | [diff] [blame] | 61 | @glbl = global i32 0, align 4 |
David Blaikie | a1ae0e6 | 2013-08-01 20:30:22 +0000 | [diff] [blame^] | 62 | @n = global %"struct.y_impl<int>::nested" zeroinitializer, align 1 |
David Blaikie | a1e813d | 2013-05-10 21:52:07 +0000 | [diff] [blame] | 63 | @llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 65535, void ()* @_GLOBAL__I_a }] |
| 64 | |
| 65 | define internal void @__cxx_global_var_init() section ".text.startup" { |
| 66 | entry: |
David Blaikie | a1ae0e6 | 2013-08-01 20:30:22 +0000 | [diff] [blame^] | 67 | %call = call i32 @_Z4funcILi3EXadL_Z4glblEE6y_implJLi1ELi2EEEiv(), !dbg !37 |
| 68 | store i32 %call, i32* @glbl, align 4, !dbg !37 |
| 69 | ret void, !dbg !37 |
David Blaikie | a1e813d | 2013-05-10 21:52:07 +0000 | [diff] [blame] | 70 | } |
| 71 | |
| 72 | ; Function Attrs: nounwind uwtable |
David Blaikie | 2b38023 | 2013-06-22 18:59:11 +0000 | [diff] [blame] | 73 | define linkonce_odr i32 @_Z4funcILi3EXadL_Z4glblEE6y_implJLi1ELi2EEEiv() #0 { |
David Blaikie | a1e813d | 2013-05-10 21:52:07 +0000 | [diff] [blame] | 74 | entry: |
David Blaikie | a1ae0e6 | 2013-08-01 20:30:22 +0000 | [diff] [blame^] | 75 | ret i32 3, !dbg !38 |
David Blaikie | a1e813d | 2013-05-10 21:52:07 +0000 | [diff] [blame] | 76 | } |
| 77 | |
| 78 | define internal void @_GLOBAL__I_a() section ".text.startup" { |
| 79 | entry: |
David Blaikie | a1ae0e6 | 2013-08-01 20:30:22 +0000 | [diff] [blame^] | 80 | call void @__cxx_global_var_init(), !dbg !39 |
| 81 | ret void, !dbg !39 |
David Blaikie | a1e813d | 2013-05-10 21:52:07 +0000 | [diff] [blame] | 82 | } |
| 83 | |
David Blaikie | a1ae0e6 | 2013-08-01 20:30:22 +0000 | [diff] [blame^] | 84 | attributes #0 = { nounwind 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" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } |
David Blaikie | a1e813d | 2013-05-10 21:52:07 +0000 | [diff] [blame] | 85 | |
| 86 | !llvm.dbg.cu = !{!0} |
David Blaikie | a1ae0e6 | 2013-08-01 20:30:22 +0000 | [diff] [blame^] | 87 | !llvm.module.flags = !{!36} |
David Blaikie | a1e813d | 2013-05-10 21:52:07 +0000 | [diff] [blame] | 88 | |
David Blaikie | 2b38023 | 2013-06-22 18:59:11 +0000 | [diff] [blame] | 89 | !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 !23, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [/tmp/templ.cpp] [DW_LANG_C_plus_plus] |
| 90 | !1 = metadata !{metadata !"templ.cpp", metadata !"/tmp"} |
David Blaikie | a1e813d | 2013-05-10 21:52:07 +0000 | [diff] [blame] | 91 | !2 = metadata !{i32 0} |
David Blaikie | 2b38023 | 2013-06-22 18:59:11 +0000 | [diff] [blame] | 92 | !3 = metadata !{metadata !4, metadata !8, metadata !21} |
| 93 | !4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"__cxx_global_var_init", metadata !"__cxx_global_var_init", metadata !"", i32 3, metadata !6, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @__cxx_global_var_init, null, null, metadata !2, i32 3} ; [ DW_TAG_subprogram ] [line 3] [local] [def] [__cxx_global_var_init] |
| 94 | !5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/tmp/templ.cpp] |
David Blaikie | a1e813d | 2013-05-10 21:52:07 +0000 | [diff] [blame] | 95 | !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 ] |
| 96 | !7 = metadata !{null} |
David Blaikie | 2b38023 | 2013-06-22 18:59:11 +0000 | [diff] [blame] | 97 | !8 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"func<3, &glbl, y_impl, 1, 2>", metadata !"func<3, &glbl, y_impl, 1, 2>", metadata !"_Z4funcILi3EXadL_Z4glblEE6y_implJLi1ELi2EEEiv", i32 1, metadata !9, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 ()* @_Z4funcILi3EXadL_Z4glblEE6y_implJLi1ELi2EEEiv, metadata !12, null, metadata !2, i32 1} ; [ DW_TAG_subprogram ] [line 1] [def] [func<3, &glbl, y_impl, 1, 2>] |
David Blaikie | a1e813d | 2013-05-10 21:52:07 +0000 | [diff] [blame] | 98 | !9 = metadata !{i32 786453, i32 0, i32 0, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !10, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] |
| 99 | !10 = metadata !{metadata !11} |
| 100 | !11 = 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] |
David Blaikie | 2b38023 | 2013-06-22 18:59:11 +0000 | [diff] [blame] | 101 | !12 = metadata !{metadata !13, metadata !14, metadata !16, metadata !17} |
David Blaikie | a1e813d | 2013-05-10 21:52:07 +0000 | [diff] [blame] | 102 | !13 = metadata !{i32 786480, null, metadata !"x", metadata !11, i32 3, null, i32 0, i32 0} ; [ DW_TAG_template_value_parameter ] |
| 103 | !14 = metadata !{i32 786480, null, metadata !"", metadata !15, i32* @glbl, null, i32 0, i32 0} ; [ DW_TAG_template_value_parameter ] |
| 104 | !15 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !11} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from int] |
David Blaikie | 2b38023 | 2013-06-22 18:59:11 +0000 | [diff] [blame] | 105 | !16 = metadata !{i32 803078, null, metadata !"y", null, metadata !"y_impl", null, i32 0, i32 0} ; [ DW_TAG_GNU_template_template_param ] |
| 106 | !17 = metadata !{i32 803079, null, metadata !"z", null, metadata !18, null, i32 0, i32 0} ; [ DW_TAG_GNU_template_parameter_pack ] |
| 107 | !18 = metadata !{metadata !19, metadata !20} |
| 108 | !19 = metadata !{i32 786480, null, metadata !"", metadata !11, i32 1, null, i32 0, i32 0} ; [ DW_TAG_template_value_parameter ] |
| 109 | !20 = metadata !{i32 786480, null, metadata !"", metadata !11, i32 2, null, i32 0, i32 0} ; [ DW_TAG_template_value_parameter ] |
| 110 | !21 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"_GLOBAL__I_a", metadata !"_GLOBAL__I_a", metadata !"", i32 1, metadata !22, i1 true, i1 true, i32 0, i32 0, null, i32 64, i1 false, void ()* @_GLOBAL__I_a, null, null, metadata !2, i32 1} ; [ DW_TAG_subprogram ] [line 1] [local] [def] [_GLOBAL__I_a] |
| 111 | !22 = metadata !{i32 786453, i32 0, i32 0, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !2, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] |
David Blaikie | a1ae0e6 | 2013-08-01 20:30:22 +0000 | [diff] [blame^] | 112 | !23 = metadata !{metadata !24, metadata !25} |
David Blaikie | 2b38023 | 2013-06-22 18:59:11 +0000 | [diff] [blame] | 113 | !24 = metadata !{i32 786484, i32 0, null, metadata !"glbl", metadata !"glbl", metadata !"", metadata !5, i32 3, metadata !11, i32 0, i32 1, i32* @glbl, null} ; [ DW_TAG_variable ] [glbl] [line 3] [def] |
David Blaikie | a1ae0e6 | 2013-08-01 20:30:22 +0000 | [diff] [blame^] | 114 | !25 = metadata !{i32 786484, i32 0, null, metadata !"n", metadata !"n", metadata !"", metadata !5, i32 4, metadata !26, i32 0, i32 1, %"struct.y_impl<int>::nested"* @n, null} ; [ DW_TAG_variable ] [n] [line 4] [def] |
| 115 | !26 = metadata !{i32 786451, metadata !1, metadata !27, metadata !"nested", i32 2, i64 8, i64 8, i32 0, i32 0, null, metadata !30, i32 0, null, null} ; [ DW_TAG_structure_type ] [nested] [line 2, size 8, align 8, offset 0] [def] [from ] |
| 116 | !27 = metadata !{i32 786451, metadata !1, null, metadata !"y_impl<int>", i32 2, i64 8, i64 8, i32 0, i32 0, null, null, i32 0, null, metadata !28} ; [ DW_TAG_structure_type ] [y_impl<int>] [line 2, size 8, align 8, offset 0] [def] [from ] |
| 117 | !28 = metadata !{metadata !29} |
| 118 | !29 = metadata !{i32 786479, null, metadata !"", metadata !11, null, i32 0, i32 0} ; [ DW_TAG_template_type_parameter ] |
| 119 | !30 = metadata !{metadata !31} |
| 120 | !31 = metadata !{i32 786478, metadata !1, metadata !26, metadata !"nested", metadata !"nested", metadata !"", i32 2, metadata !32, i1 false, i1 false, i32 0, i32 0, null, i32 320, i1 false, null, null, i32 0, metadata !35, i32 2} ; [ DW_TAG_subprogram ] [line 2] [nested] |
| 121 | !32 = metadata !{i32 786453, i32 0, i32 0, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !33, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] |
| 122 | !33 = metadata !{null, metadata !34} |
| 123 | !34 = metadata !{i32 786447, i32 0, i32 0, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 1088, metadata !26} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [artificial] [from nested] |
| 124 | !35 = metadata !{i32 786468} |
| 125 | !36 = metadata !{i32 2, metadata !"Dwarf Version", i32 3} |
| 126 | !37 = metadata !{i32 3, i32 0, metadata !4, null} |
| 127 | !38 = metadata !{i32 1, i32 0, metadata !8, null} |
| 128 | !39 = metadata !{i32 1, i32 0, metadata !21, null} |