llvm.org GIT mirror llvm / dd2cb9c
[dwarfdump] Resolve also variable specifications/abstract_origins. DW_AT_specification and DW_AT_abstract_origin resolving was only performed on subroutine DIEs because it used the getSubroutineName method. Introduce a more generic getName() and use it to dump the reference attributes. Testcases have been updated to check the printed names instead of the offsets except when the name could be ambiguous. Reviewers: dblaikie, samsonov Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D5625 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@219506 91177308-0d34-0410-b5e6-96231b3b80d8 Frederic Riss 5 years ago
11 changed file(s) with 68 addition(s) and 55 deletion(s). Raw diff Collapse all Expand all
6565 }
6666 };
6767
68 /// A DINameKind is passed to name search methods to specify a
69 /// preference regarding the type of name resolution the caller wants.
70 enum class DINameKind { None, ShortName, LinkageName };
71
6872 /// DILineInfoSpecifier - controls which fields of DILineInfo container
6973 /// should be filled with data.
7074 struct DILineInfoSpecifier {
7175 enum class FileLineInfoKind { None, Default, AbsoluteFilePath };
72 enum class FunctionNameKind { None, ShortName, LinkageName };
76 typedef DINameKind FunctionNameKind;
7377
7478 FileLineInfoKind FLIKind;
7579 FunctionNameKind FNKind;
1717 #include "llvm/Support/raw_ostream.h"
1818 using namespace llvm;
1919 using namespace dwarf;
20 typedef DILineInfoSpecifier::FunctionNameKind FunctionNameKind;
2120
2221 // Small helper to extract a DIE pointed by a reference
2322 // attribute. It looks up the Unit containing the DIE and calls
128127 uint32_t Ref = formValue.getAsReference(u).getValue();
129128 DWARFDebugInfoEntryMinimal DIE;
130129 if (const DWARFUnit *RefU = findUnitAndExtractFast(DIE, u, &Ref))
131 if (const char *Ref = DIE.getSubroutineName(RefU,
132 FunctionNameKind::LinkageName))
130 if (const char *Ref = DIE.getName(RefU, DINameKind::LinkageName))
133131 OS << " \"" << Ref << '\"';
134132 }
135133
330328
331329 const char *
332330 DWARFDebugInfoEntryMinimal::getSubroutineName(const DWARFUnit *U,
333 FunctionNameKind Kind) const {
334 if (!isSubroutineDIE() || Kind == FunctionNameKind::None)
331 DINameKind Kind) const {
332 if (!isSubroutineDIE())
333 return nullptr;
334 return getName(U, Kind);
335 }
336
337 const char *
338 DWARFDebugInfoEntryMinimal::getName(const DWARFUnit *U,
339 DINameKind Kind) const {
340 if (Kind == DINameKind::None)
335341 return nullptr;
336342 // Try to get mangled name only if it was asked for.
337 if (Kind == FunctionNameKind::LinkageName) {
343 if (Kind == DINameKind::LinkageName) {
338344 if (const char *name =
339345 getAttributeValueAsString(U, DW_AT_MIPS_linkage_name, nullptr))
340346 return name;
350356 if (spec_ref != -1U) {
351357 DWARFDebugInfoEntryMinimal spec_die;
352358 if (const DWARFUnit *RefU = findUnitAndExtractFast(spec_die, U, &spec_ref)) {
353 if (const char *name = spec_die.getSubroutineName(RefU, Kind))
359 if (const char *name = spec_die.getName(RefU, Kind))
354360 return name;
355361 }
356362 }
361367 DWARFDebugInfoEntryMinimal abs_origin_die;
362368 if (const DWARFUnit *RefU = findUnitAndExtractFast(abs_origin_die, U,
363369 &abs_origin_ref)) {
364 if (const char *name = abs_origin_die.getSubroutineName(RefU, Kind))
370 if (const char *name = abs_origin_die.getName(RefU, Kind))
365371 return name;
366372 }
367373 }
124124 /// returns its mangled name (or short name, if mangled is missing).
125125 /// This name may be fetched from specification or abstract origin
126126 /// for this subprogram. Returns null if no name is found.
127 const char *
128 getSubroutineName(const DWARFUnit *U,
129 DILineInfoSpecifier::FunctionNameKind Kind) const;
127 const char *getSubroutineName(const DWARFUnit *U, DINameKind Kind) const;
128
129 /// Return the DIE name resolving DW_AT_sepcification or
130 /// DW_AT_abstract_origin references if necessary.
131 /// Returns null if no name is found.
132 const char *getName(const DWARFUnit *U, DINameKind Kind) const;
130133
131134 /// Retrieves values of DW_AT_call_file, DW_AT_call_line and
132135 /// DW_AT_call_column from DIE (or zeroes if they are missing).
1313 ; CHECK-NOT: DW_TAG
1414 ; CHECK: DW_AT_name {{.*}} "C"
1515 ; CHECK-NOT: {{DW_TAG|NULL}}
16 ; CHECK: [[C_DTOR_DECL:.*]]: DW_TAG_subprogram
16 ; CHECK: DW_TAG_subprogram
1717 ; CHECK-NOT: DW_TAG
1818 ; CHECK: DW_AT_name {{.*}} "~C"
1919
2121 ; CHECK-NOT: DW_TAG
2222 ; CHECK: DW_AT_MIPS_linkage_name {{.*}} "_ZN1CD1Ev"
2323 ; CHECK-NOT: {{DW_TAG|NULL}}
24 ; CHECK: [[D1_THIS_ABS:.*]]: DW_TAG_formal_parameter
24 ; CHECK: DW_TAG_formal_parameter
2525 ; CHECK-NOT: DW_TAG
2626 ; CHECK: DW_AT_name {{.*}} "this"
2727
3535 ; CHECK-NOT: {{DW_TAG|NULL}}
3636 ; CHECK: DW_TAG_formal_parameter
3737 ; CHECK-NOT: DW_TAG
38 ; CHECK: DW_AT_abstract_origin {{.*}} {[[D1_THIS_ABS]]}
38 ; CHECK: DW_AT_abstract_origin {{.*}} "this"
3939
4040 ; FIXME: D2 is actually inlined into D1 but doesn't show up here, possibly due
4141 ; to there being no work in D2 (calling another member function from the dtor
5252 ; CHECK: DW_AT_abstract_origin {{.*}} "_ZN17nsAutoRefCntD1Ev"
5353 ; CHECK: DW_TAG_formal_parameter
5454 ; CHECK-NOT: DW_TAG
55 ; CHECK: DW_AT_abstract_origin {{.*}} {[[D1_THIS_ABS]]}
55 ; CHECK: DW_AT_abstract_origin {{.*}} {[[D1_THIS_ABS]]} "this"
5656 ; CHECK: DW_TAG_inlined_subroutine
5757 ; CHECK-NEXT: DW_AT_abstract_origin {{.*}} "_ZN17nsAutoRefCntD2Ev"
5858
88 ; CHECK: DW_AT_abstract_origin {{.*}} "foo"
99 ; CHECK: DW_TAG_formal_parameter
1010 ; CHECK-NOT: DW_TAG
11 ; CHECK: DW_AT_abstract_origin {{.*}}{[[ABS_SP:.*]]}
11 ; CHECK: DW_AT_abstract_origin {{.*}} "sp"
1212 ; CHECK: DW_TAG_formal_parameter
1313 ; CHECK-NOT: DW_TAG
14 ; CHECK: DW_AT_abstract_origin {{.*}}{[[ABS_NUMS:.*]]}
14 ; CHECK: DW_AT_abstract_origin {{.*}} "nums"
1515
1616 ; CHECK: DW_TAG_subprogram
1717 ; CHECK-NOT: DW_TAG
1818 ; CHECK: DW_AT_name {{.*}} "foo"
19 ; CHECK: [[ABS_SP]]: DW_TAG_formal_parameter
19 ; CHECK: DW_TAG_formal_parameter
2020 ; CHECK-NOT: DW_TAG
2121 ; CHECK: DW_AT_name {{.*}} "sp"
22 ; CHECK: [[ABS_NUMS]]: DW_TAG_formal_parameter
22 ; CHECK: DW_TAG_formal_parameter
2323 ; CHECK-NOT: DW_TAG
2424 ; CHECK: DW_AT_name {{.*}} "nums"
2525
3333 ;CHECK: DW_TAG_formal_parameter
3434 ;FIXME: Linux shouldn't drop this parameter either...
3535 ;CHECK-NOT: DW_TAG
36 ;DARWIN: DW_AT_abstract_origin {{.*}}{[[ABS_SP]]}
36 ;DARWIN: DW_AT_abstract_origin {{.*}} "sp"
3737 ;DARWIN: DW_TAG_formal_parameter
38 ;CHECK: DW_AT_abstract_origin {{.*}}{[[ABS_NUMS]]}
38 ;CHECK: DW_AT_abstract_origin {{.*}} "nums"
3939 ;CHECK-NOT: DW_TAG_formal_parameter
4040
4141 %struct.S1 = type { float*, i32 }
9696 ; PRESENT: .debug_info contents:
9797 ; PRESENT: DW_TAG_class_type
9898 ; PRESENT-NEXT: DW_AT_name {{.*}} "C"
99 ; PRESENT: 0x[[DECL_A:[0-9a-f]+]]: DW_TAG_member
99 ; PRESENT: DW_TAG_member
100100 ; PRESENT-NEXT: DW_AT_name {{.*}} "a"
101101 ; PRESENT: DW_AT_external
102102 ; PRESENT: DW_AT_declaration
107107 ; PRESENT: DW_AT_declaration
108108 ; PRESENT: DW_AT_accessibility [DW_FORM_data1] (DW_ACCESS_private)
109109 ; PRESENT: DW_AT_const_value {{.*}} (1)
110 ; PRESENT: 0x[[DECL_B:[0-9a-f]+]]: DW_TAG_member
110 ; PRESENT: DW_TAG_member
111111 ; PRESENT-NEXT: DW_AT_name {{.*}} "b"
112112 ; PRESENT: DW_AT_accessibility [DW_FORM_data1] (DW_ACCESS_protected)
113113 ; PRESENT: DW_TAG_member
114114 ; PRESENT-NEXT: DW_AT_name {{.*}} "const_b"
115115 ; PRESENT: DW_AT_accessibility [DW_FORM_data1] (DW_ACCESS_protected)
116116 ; PRESENT: DW_AT_const_value [DW_FORM_udata] (1078523331)
117 ; PRESENT: 0x[[DECL_C:[0-9a-f]+]]: DW_TAG_member
117 ; PRESENT: DW_TAG_member
118118 ; PRESENT-NEXT: DW_AT_name {{.*}} "c"
119119 ; PRESENT: DW_AT_accessibility [DW_FORM_data1] (DW_ACCESS_public)
120120 ; PRESENT: DW_TAG_member
130130 ; PRESENT: NULL
131131 ; Definitions point back to their declarations, and have a location.
132132 ; PRESENT: DW_TAG_variable
133 ; PRESENT-NEXT: DW_AT_specification {{.*}} {0x[[DECL_A]]}
133 ; PRESENT-NEXT: DW_AT_specification {{.*}} "a"
134134 ; PRESENT-NEXT: DW_AT_location
135135 ; PRESENT-NEXT: DW_AT_linkage_name {{.*}} "_ZN1C1aE"
136136 ; PRESENT: DW_TAG_variable
137 ; PRESENT-NEXT: DW_AT_specification {{.*}} {0x[[DECL_B]]}
137 ; PRESENT-NEXT: DW_AT_specification {{.*}} "b"
138138 ; PRESENT-NEXT: DW_AT_location
139139 ; PRESENT-NEXT: DW_AT_linkage_name {{.*}} "_ZN1C1bE"
140140 ; PRESENT: DW_TAG_variable
141 ; PRESENT-NEXT: DW_AT_specification {{.*}} {0x[[DECL_C]]}
141 ; PRESENT-NEXT: DW_AT_specification {{.*}} "c"
142142 ; PRESENT-NEXT: DW_AT_location
143143 ; PRESENT-NEXT: DW_AT_linkage_name {{.*}} "_ZN1C1cE"
144144
146146 ; DARWINP: .debug_info contents:
147147 ; DARWINP: DW_TAG_class_type
148148 ; DARWINP-NEXT: DW_AT_name {{.*}} "C"
149 ; DARWINP: 0x[[DECL_A:[0-9a-f]+]]: DW_TAG_member
149 ; DARWINP: DW_TAG_member
150150 ; DARWINP-NEXT: DW_AT_name {{.*}} "a"
151151 ; DARWINP: DW_AT_external
152152 ; DARWINP: DW_AT_declaration
157157 ; DARWINP: DW_AT_declaration
158158 ; DARWINP: DW_AT_accessibility [DW_FORM_data1] (DW_ACCESS_private)
159159 ; DARWINP: DW_AT_const_value {{.*}} (1)
160 ; DARWINP: 0x[[DECL_B:[0-9a-f]+]]: DW_TAG_member
160 ; DARWINP: DW_TAG_member
161161 ; DARWINP-NEXT: DW_AT_name {{.*}} "b"
162162 ; DARWINP: DW_AT_accessibility [DW_FORM_data1] (DW_ACCESS_protected)
163163 ; DARWINP: DW_TAG_member
164164 ; DARWINP-NEXT: DW_AT_name {{.*}} "const_b"
165165 ; DARWINP: DW_AT_accessibility [DW_FORM_data1] (DW_ACCESS_protected)
166166 ; DARWINP: DW_AT_const_value [DW_FORM_udata] (1078523331)
167 ; DARWINP: 0x[[DECL_C:[0-9a-f]+]]: DW_TAG_member
167 ; DARWINP: DW_TAG_member
168168 ; DARWINP-NEXT: DW_AT_name {{.*}} "c"
169169 ; DARWINP: DW_AT_accessibility [DW_FORM_data1] (DW_ACCESS_public)
170170 ; DARWINP: DW_TAG_member
180180 ; DARWINP: NULL
181181 ; Definitions point back to their declarations, and have a location.
182182 ; DARWINP: DW_TAG_variable
183 ; DARWINP-NEXT: DW_AT_specification {{.*}} {0x[[DECL_A]]}
183 ; DARWINP-NEXT: DW_AT_specification {{.*}} "a"
184184 ; DARWINP-NEXT: DW_AT_location
185185 ; DARWINP-NEXT: DW_AT_linkage_name {{.*}} "_ZN1C1aE"
186186 ; DARWINP: DW_TAG_variable
187 ; DARWINP-NEXT: DW_AT_specification {{.*}} {0x[[DECL_B]]}
187 ; DARWINP-NEXT: DW_AT_specification {{.*}} "b"
188188 ; DARWINP-NEXT: DW_AT_location
189189 ; DARWINP-NEXT: DW_AT_linkage_name {{.*}} "_ZN1C1bE"
190190 ; DARWINP: DW_TAG_variable
191 ; DARWINP-NEXT: DW_AT_specification {{.*}} {0x[[DECL_C]]}
191 ; DARWINP-NEXT: DW_AT_specification {{.*}} "c"
192192 ; DARWINP-NEXT: DW_AT_location
193193 ; DARWINP-NEXT: DW_AT_linkage_name {{.*}} "_ZN1C1cE"
194194
5151 ; CHECK: [[C:0x[0-9a-f]+]]: DW_TAG_structure_type
5252 ; CHECK-NEXT: DW_AT_name {{.*}} "C"
5353
54 ; CHECK: [[STATIC_MEM_DECL:0x[0-9a-f]+]]: DW_TAG_member
54 ; CHECK: DW_TAG_member
5555 ; CHECK-NEXT: DW_AT_name {{.*}} "static_member_variable"
5656
5757 ; CHECK: DW_TAG_subprogram
6666 ; CHECK-NEXT: DW_AT_name {{.*}} "int"
6767
6868 ; CHECK: [[STATIC_MEM_VAR:0x[0-9a-f]+]]: DW_TAG_variable
69 ; CHECK-NEXT: DW_AT_specification {{.*}} {[[STATIC_MEM_DECL]]}
69 ; CHECK-NEXT: DW_AT_specification {{.*}} "static_member_variable"
7070
7171 ; CHECK: [[GLOB_VAR:0x[0-9a-f]+]]: DW_TAG_variable
7272 ; CHECK-NEXT: DW_AT_name {{.*}} "global_variable"
7474 ; CHECK: [[NS:0x[0-9a-f]+]]: DW_TAG_namespace
7575 ; CHECK-NEXT: DW_AT_name {{.*}} "ns"
7676
77 ; CHECK: [[GLOB_NS_VAR_DECL:0x[0-9a-f]+]]: DW_TAG_variable
77 ; CHECK: DW_TAG_variable
7878 ; CHECK-NEXT: DW_AT_name {{.*}} "global_namespace_variable"
7979
80 ; CHECK: [[D_VAR_DECL:0x[0-9a-f]+]]: DW_TAG_variable
80 ; CHECK: DW_TAG_variable
8181 ; CHECK-NEXT: DW_AT_name {{.*}} "d"
8282
8383 ; CHECK: [[D:0x[0-9a-f]+]]: DW_TAG_structure_type
9090 ; CHECK: DW_AT_name {{.*}} "global_namespace_function"
9191
9292 ; CHECK: [[GLOB_NS_VAR:0x[0-9a-f]+]]: DW_TAG_variable
93 ; CHECK-NEXT: DW_AT_specification {{.*}} {[[GLOB_NS_VAR_DECL]]}
93 ; CHECK-NEXT: DW_AT_specification {{.*}} "_ZN2ns25global_namespace_variableE"
9494
9595 ; CHECK: [[D_VAR:0x[0-9a-f]+]]: DW_TAG_variable
96 ; CHECK-NEXT: DW_AT_specification {{.*}} {[[D_VAR_DECL]]}
96 ; CHECK-NEXT: DW_AT_specification {{.*}} "_ZN2ns1dE"
9797
9898 ; CHECK: DW_TAG_subprogram
9999 ; CHECK-NOT: DW_TAG
115115 ; CHECK: [[OUTER_ANON:.*]]: DW_TAG_namespace
116116 ; CHECK-NOT: {{DW_TAG|NULL}}
117117 ; CHECK-NOT: DW_AT_name
118 ; CHECK: [[OUTER_ANON_C_DECL:.*]]: DW_TAG_variable
118 ; CHECK: DW_TAG_variable
119119 ; CHECK-NOT: DW_TAG
120120 ; CHECK: DW_AT_name {{.*}} "c"
121121 ; CHECK-NOT: {{DW_TAG|NULL}}
130130 ; CHECK-NOT: {{DW_TAG|NULL}}
131131 ; CHECK: [[OUTER_ANON_C:.*]]: DW_TAG_variable
132132 ; CHECK-NOT: DW_TAG
133 ; CHECK-NEXT: DW_AT_specification {{.*}} {[[OUTER_ANON_C_DECL]]}
133 ; CHECK-NEXT: DW_AT_specification {{.*}} "_ZN5outer12_GLOBAL__N_11cE"
134134
135135 ; CHECK: [[ANON:.*]]: DW_TAG_namespace
136136 ; CHECK-NOT: DW_AT_name
138138 ; CHECK-NOT: DW_TAG
139139 ; CHECK: DW_AT_name {{.*}} "inner"
140140 ; CHECK-NOT: {{DW_TAG|NULL}}
141 ; CHECK: [[ANON_INNER_B_DECL:.*]]: DW_TAG_variable
141 ; CHECK: DW_TAG_variable
142142 ; CHECK-NOT: DW_TAG
143143 ; CHECK: DW_AT_name {{.*}} "b"
144144 ; CHECK-NOT: {{DW_TAG|NULL}}
145145 ; CHECK: NULL
146146 ; CHECK-NOT: {{DW_TAG|NULL}}
147 ; CHECK: [[ANON_I_DECL:.*]]: DW_TAG_variable
147 ; CHECK: DW_TAG_variable
148148 ; CHECK-NOT: DW_TAG
149149 ; CHECK: DW_AT_name {{.*}} "i"
150150 ; CHECK-NOT: {{DW_TAG|NULL}}
152152 ; CHECK-NOT: {{DW_TAG|NULL}}
153153 ; CHECK: [[ANON_INNER_B:.*]]: DW_TAG_variable
154154 ; CHECK-NOT: DW_TAG
155 ; CHECK-NEXT: DW_AT_specification {{.*}} {[[ANON_INNER_B_DECL]]}
155 ; CHECK-NEXT: DW_AT_specification {{.*}} "_ZN12_GLOBAL__N_15inner1bE"
156156 ; CHECK: [[ANON_I:.*]]: DW_TAG_variable
157157 ; CHECK-NOT: DW_TAG
158 ; CHECK-NEXT: DW_AT_specification {{.*}} {[[ANON_I_DECL]]}
158 ; CHECK-NEXT: DW_AT_specification {{.*}} "_ZN12_GLOBAL__N_11iE"
159159
160160 ; CHECK: [[MEM_FUNC:0x[0-9a-f]+]]: DW_TAG_subprogram
161161 ; CHECK-NOT: DW_TAG
2626 ; CHECK: DW_TAG_inlined_subroutine
2727 ; CHECK: DW_AT_abstract_origin {{.*}}[[ABS_FUNC:........]] "_Z4funci"
2828 ; CHECK: DW_TAG_formal_parameter
29 ; CHECK: DW_AT_abstract_origin {{.*}}[[ABS_VAR:........]])
29 ; CHECK: DW_AT_abstract_origin {{.*}}[[ABS_VAR:........]] "x"
3030
3131 ; Check the abstract definition is in the 'b.cpp' CU and doesn't contain any
3232 ; concrete information (address range or variable location)
4949 ; CHECK: DW_AT_abstract_origin {{.*}} {0x[[ABS_FUNC]]} "_Z4funci"
5050 ; CHECK: DW_TAG_formal_parameter
5151 ; CHECK: DW_AT_location
52 ; CHECK: DW_AT_abstract_origin {{.*}} {0x[[ABS_VAR]]}
52 ; CHECK: DW_AT_abstract_origin {{.*}} {0x[[ABS_VAR]]} "x"
5353
5454
5555 @i = external global i32
4040 ; CHECK-NOT: DW_TAG
4141 ; CHECK: DW_AT_name {{.*}} "x"
4242 ; CHECK-NOT: {{DW_TAG|NULL}}
43 ; CHECK: [[ABS_B:.*]]: DW_TAG_formal_parameter
43 ; CHECK: DW_TAG_formal_parameter
4444 ; CHECK-NOT: DW_TAG
4545 ; CHECK: DW_AT_name {{.*}} "b"
4646 ; CHECK-NOT: {{DW_TAG|NULL}}
4747 ; CHECK: DW_TAG_lexical_block
4848 ; CHECK-NOT: {{DW_TAG|NULL}}
49 ; CHECK: [[ABS_S:.*]]: DW_TAG_variable
49 ; CHECK: DW_TAG_variable
5050 ; CHECK-NOT: DW_TAG
5151 ; CHECK: DW_AT_name {{.*}} "s"
5252
6060 ; CHECK-NOT: {{DW_TAG|NULL}}
6161 ; CHECK: DW_TAG_formal_parameter
6262 ; CHECK-NOT: DW_TAG
63 ; CHECK: DW_AT_abstract_origin {{.*}} {[[ABS_B]]}
63 ; CHECK: DW_AT_abstract_origin {{.*}} "b"
6464 ; Notice 'x's local variable 's' is missing. Not necessarily a bug here,
6565 ; since it's been optimized entirely away and it should be described in
6666 ; abstract subprogram.
8484 ; fastisel succeeds).
8585 ; CHECK: DW_TAG_formal_parameter
8686 ; CHECK-NOT: DW_TAG
87 ; CHECK: DW_AT_abstract_origin {{.*}} {[[ABS_B]]}
87 ; CHECK: DW_AT_abstract_origin {{.*}} "b"
8888
8989 ; CHECK-NOT: {{DW_TAG|NULL}}
9090 ; CHECK: DW_TAG_lexical_block
9191 ; CHECK-NOT: {{DW_TAG|NULL}}
9292 ; CHECK: DW_TAG_variable
9393 ; CHECK-NOT: DW_TAG
94 ; CHECK: DW_AT_abstract_origin {{.*}} {[[ABS_S]]}
94 ; CHECK: DW_AT_abstract_origin {{.*}} "s"
9595
9696 @t = external global i32
9797
1818 ; CHECK-NOT: DW_TAG
1919 ; CHECK: DW_AT_MIPS_linkage_name {{.*}} "_ZN2ns4funcEi"
2020 ; CHECK-NOT: DW_TAG
21 ; CHECK: [[ABS_PRM:0x.*]]: DW_TAG_formal_parameter
21 ; CHECK: DW_TAG_formal_parameter
2222 ; CHECK: NULL
2323 ; CHECK-NOT: NULL
2424 ; CHECK: DW_TAG_subprogram
2626 ; CHECK: DW_AT_abstract_origin {{.*}} "_ZN2ns4funcEi"
2727 ; CHECK-NOT: DW_TAG
2828 ; CHECK: DW_TAG_formal_parameter
29 ; CHECK: DW_AT_abstract_origin {{.*}} {[[ABS_PRM]]}
29 ; CHECK: DW_AT_abstract_origin {{.*}} "i"
3030 ; CHECK: NULL
3131 ; CHECK: NULL
3232 ; CHECK: NULL