xref: /llvm-project/llvm/test/DebugInfo/X86/tu-to-non-tu.ll (revision 20b15e645cdbde07ae46aefe46ede5ff4d1e8ba3)
1; RUN: llc -filetype=obj -O0 -generate-type-units -mtriple=x86_64-unknown-linux-gnu < %s \
2; RUN:     | llvm-dwarfdump -debug-info -debug-types - | FileCheck %s
3
4; This test was originally for testing references to non-TU types from TUs, but
5; it's currently too complicated to get that right reliably - non-TU types may
6; have local linkage so declaring them in a TU is unreliable (consumers would
7; have to be context-dependent to know which CU the TU is referenced from to
8; know which type definition to match the declaration in the TU up to)
9
10; Might as well keep the complex cases here in case we revisit this (with a flag
11; on the type to indicate whether it should be in a type unit or not, distinct
12; from the mangled name indicating whether the type has linkage or not perhaps
13; (rather than checing the namespace scopes to see if any are internal (which
14; doesn't handle the linkage of, say, a template instantiated with an internal
15; type))
16
17; Built from the following source, compiled with this command:
18; $ clang++-tot decl.cpp -g -fdebug-types-section -c
19; And modified (as noted in the comments) to produce some "simplified" and "mangled"
20; simplified template names, to ensure they get template parameters in declarations
21; created in type units.
22
23; struct non_tu {
24;   virtual void f1();
25; };
26; void non_tu::f1() {}
27; struct tu_ref_non_tu {
28;   non_tu v1;
29; };
30; tu_ref_non_tu v1;
31;
32; // Reference internal
33; namespace {
34; struct internal {};
35; }  // namespace
36; struct ref_internal {
37;   internal i;
38; };
39; ref_internal v5;
40;
41;
42; template <typename T>
43; struct templ_non_tu;
44;
45; // Reference to (normal, non-mangled/simplified) non-tu type with template
46; // parameters.
47; template <>
48; struct templ_non_tu<int> {
49;   virtual void f1();
50; };
51; void templ_non_tu<int>::f1() {}
52; struct ref_templ_non_tu {
53;   templ_non_tu<int> v1;
54; };
55; ref_templ_non_tu v2;
56;
57; // Modify templ_non_tu<long>'s name to be simplified (strip template parameter
58; // list from the "name" attribute)
59; template <>
60; struct templ_non_tu<long> {
61;   virtual void f1();
62; };
63; void templ_non_tu<long>::f1() {}
64; struct ref_templ_non_tu_simple {
65;   templ_non_tu<long> v1;
66; };
67; ref_templ_non_tu_simple v3;
68;
69; // Modify templ_non_tu<bool>'s name to be mangled ('_STN|' name '|' args)
70; template <>
71; struct templ_non_tu<bool> {
72;   virtual void f1();
73; };
74; void templ_non_tu<bool>::f1() {}
75; struct ref_templ_non_tu_mangled {
76;   templ_non_tu<bool> v1;
77; };
78; ref_templ_non_tu_mangled v4;
79
80
81
82
83; CHECK-LABEL: Type Unit:
84; CHECK: DW_TAG_class_type
85; CHECK-NOT: DW_TAG
86; CHECK: DW_AT_name {{.*}}"ref_from_ref_internal_template"
87
88
89; CHECK-LABEL: Compile Unit:
90
91; CHECK: DW_TAG_structure_type
92; CHECK-NOT: DW_TAG
93; CHECK: DW_AT_name {{.*}}"tu_ref_non_tu"
94
95; CHECK: DW_TAG_structure_type
96; CHECK-NOT: DW_TAG
97; CHECK: DW_AT_name {{.*}}"non_tu"
98
99; CHECK: DW_TAG_structure_type
100; CHECK-NOT: DW_TAG
101; CHECK: DW_AT_name {{.*}}"ref_internal"
102; CHECK-NOT: DW_TAG
103; CHECK: DW_AT_byte_size
104
105; CHECK: DW_TAG_namespace
106; CHECK-NOT: {{DW_TAG|DW_AT}}
107; CHECK: DW_TAG_structure_type
108; CHECK-NOT: DW_TAG
109; CHECK: DW_AT_name {{.*}}"internal"
110
111; CHECK: DW_TAG_structure_type
112; CHECK-NOT: DW_TAG
113; CHECK: DW_AT_name {{.*}}"internal_template<ref_from_ref_internal_template>"
114
115; CHECK: DW_TAG_structure_type
116; CHECK-NOT: DW_TAG
117; CHECK: DW_AT_name {{.*}}"ref_templ_non_tu"
118; CHECK: DW_TAG_structure_type
119; CHECK-NOT: DW_TAG
120; CHECK: DW_AT_name {{.*}}"_STN|templ_non_tu|<int>"
121
122; CHECK: DW_TAG_structure_type
123; CHECK-NOT: DW_TAG
124; CHECK: DW_AT_name {{.*}}"ref_templ_non_tu_simple"
125; CHECK: DW_TAG_structure_type
126; CHECK-NOT: DW_TAG
127; CHECK: DW_AT_name      ("templ_non_tu")
128; CHECK-NOT: DW_TAG
129; CHECK: DW_TAG_template_type_parameter
130; CHECK-NEXT: DW_AT_type    {{.*}}"long"
131
132; CHECK: DW_TAG_structure_type
133; CHECK-NOT: DW_TAG
134; CHECK: DW_AT_name {{.*}}"ref_templ_non_tu_mangled"
135; CHECK: DW_TAG_structure_type
136; CHECK-NOT: DW_TAG
137; CHECK: DW_AT_name      ("_STN|templ_non_tu|<bool>")
138; CHECK-NOT: DW_TAG
139; CHECK: DW_TAG_template_type_parameter
140; CHECK-NEXT: DW_AT_type    {{.*}}"bool"
141; CHECK: DW_TAG_class_type
142; CHECK-NOT: DW_TAG
143; CHECK: DW_AT_name {{.*}}"ref_internal_template"
144; CHECK: DW_TAG_class_type
145; CHECK-NEXT:   DW_AT_declaration       (true)
146; CHECK-NEXT:   DW_AT_signature (0x30c4e2370930c7ad)
147
148%struct.ref_internal = type { %"struct.(anonymous namespace)::internal" }
149%"struct.(anonymous namespace)::internal" = type { i8 }
150%class.ref_internal_template = type { %"struct.(anonymous namespace)::internal_template" }
151%"struct.(anonymous namespace)::internal_template" = type { i8 }
152%class.ref_from_ref_internal_template = type { i8 }
153%struct.non_tu = type { ptr }
154%struct.templ_non_tu = type { ptr }
155%struct.templ_non_tu.0 = type { ptr }
156%struct.templ_non_tu.1 = type { ptr }
157
158@_ZTV6non_tu = dso_local unnamed_addr constant { [3 x ptr] } { [3 x ptr] [ptr null, ptr @_ZTI6non_tu, ptr @_ZN6non_tu2f1Ev] }, align 8
159@v1 = dso_local global { { ptr } } { { ptr } { ptr getelementptr inbounds ({ [3 x ptr] }, ptr @_ZTV6non_tu, i32 0, i32 0, i32 2) } }, align 8, !dbg !0
160@v5 = dso_local global %struct.ref_internal zeroinitializer, align 1, !dbg !5
161@_ZTV12templ_non_tuIiE = dso_local unnamed_addr constant { [3 x ptr] } { [3 x ptr] [ptr null, ptr @_ZTI12templ_non_tuIiE, ptr @_ZN12templ_non_tuIiE2f1Ev] }, align 8
162@v2 = dso_local global { { ptr } } { { ptr } { ptr getelementptr inbounds ({ [3 x ptr] }, ptr @_ZTV12templ_non_tuIiE, i32 0, i32 0, i32 2) } }, align 8, !dbg !13
163@_ZTV12templ_non_tuIlE = dso_local unnamed_addr constant { [3 x ptr] } { [3 x ptr] [ptr null, ptr @_ZTI12templ_non_tuIlE, ptr @_ZN12templ_non_tuIlE2f1Ev] }, align 8
164@v3 = dso_local global { { ptr } } { { ptr } { ptr getelementptr inbounds ({ [3 x ptr] }, ptr @_ZTV12templ_non_tuIlE, i32 0, i32 0, i32 2) } }, align 8, !dbg !32
165@_ZTV12templ_non_tuIbE = dso_local unnamed_addr constant { [3 x ptr] } { [3 x ptr] [ptr null, ptr @_ZTI12templ_non_tuIbE, ptr @_ZN12templ_non_tuIbE2f1Ev] }, align 8
166@v4 = dso_local global { { ptr } } { { ptr } { ptr getelementptr inbounds ({ [3 x ptr] }, ptr @_ZTV12templ_non_tuIbE, i32 0, i32 0, i32 2) } }, align 8, !dbg !46
167@v6 = dso_local global %class.ref_internal_template zeroinitializer, align 1, !dbg !60
168@v7 = dso_local global %class.ref_from_ref_internal_template zeroinitializer, align 1, !dbg !69
169@_ZTVN10__cxxabiv117__class_type_infoE = external dso_local global ptr
170@_ZTS6non_tu = dso_local constant [8 x i8] c"6non_tu\00", align 1
171@_ZTI6non_tu = dso_local constant { ptr, ptr } { ptr getelementptr inbounds (ptr, ptr @_ZTVN10__cxxabiv117__class_type_infoE, i64 2), ptr @_ZTS6non_tu }, align 8
172@_ZTS12templ_non_tuIiE = dso_local constant [18 x i8] c"12templ_non_tuIiE\00", align 1
173@_ZTI12templ_non_tuIiE = dso_local constant { ptr, ptr } { ptr getelementptr inbounds (ptr, ptr @_ZTVN10__cxxabiv117__class_type_infoE, i64 2), ptr @_ZTS12templ_non_tuIiE }, align 8
174@_ZTS12templ_non_tuIlE = dso_local constant [18 x i8] c"12templ_non_tuIlE\00", align 1
175@_ZTI12templ_non_tuIlE = dso_local constant { ptr, ptr } { ptr getelementptr inbounds (ptr, ptr @_ZTVN10__cxxabiv117__class_type_infoE, i64 2), ptr @_ZTS12templ_non_tuIlE }, align 8
176@_ZTS12templ_non_tuIbE = dso_local constant [18 x i8] c"12templ_non_tuIbE\00", align 1
177@_ZTI12templ_non_tuIbE = dso_local constant { ptr, ptr } { ptr getelementptr inbounds (ptr, ptr @_ZTVN10__cxxabiv117__class_type_infoE, i64 2), ptr @_ZTS12templ_non_tuIbE }, align 8
178
179; Function Attrs: mustprogress noinline nounwind optnone uwtable
180define dso_local void @_ZN6non_tu2f1Ev(ptr noundef nonnull align 8 dereferenceable(8) %this) unnamed_addr #0 align 2 !dbg !87 {
181entry:
182  %this.addr = alloca ptr, align 8
183  store ptr %this, ptr %this.addr, align 8
184  call void @llvm.dbg.declare(metadata ptr %this.addr, metadata !88, metadata !DIExpression()), !dbg !90
185  %this1 = load ptr, ptr %this.addr, align 8
186  ret void, !dbg !91
187}
188
189; Function Attrs: nofree nosync nounwind readnone speculatable willreturn
190declare void @llvm.dbg.declare(metadata, metadata, metadata) #1
191
192; Function Attrs: mustprogress noinline nounwind optnone uwtable
193define dso_local void @_ZN12templ_non_tuIiE2f1Ev(ptr noundef nonnull align 8 dereferenceable(8) %this) unnamed_addr #0 align 2 !dbg !92 {
194entry:
195  %this.addr = alloca ptr, align 8
196  store ptr %this, ptr %this.addr, align 8
197  call void @llvm.dbg.declare(metadata ptr %this.addr, metadata !93, metadata !DIExpression()), !dbg !95
198  %this1 = load ptr, ptr %this.addr, align 8
199  ret void, !dbg !96
200}
201
202; Function Attrs: mustprogress noinline nounwind optnone uwtable
203define dso_local void @_ZN12templ_non_tuIlE2f1Ev(ptr noundef nonnull align 8 dereferenceable(8) %this) unnamed_addr #0 align 2 !dbg !97 {
204entry:
205  %this.addr = alloca ptr, align 8
206  store ptr %this, ptr %this.addr, align 8
207  call void @llvm.dbg.declare(metadata ptr %this.addr, metadata !98, metadata !DIExpression()), !dbg !100
208  %this1 = load ptr, ptr %this.addr, align 8
209  ret void, !dbg !101
210}
211
212; Function Attrs: mustprogress noinline nounwind optnone uwtable
213define dso_local void @_ZN12templ_non_tuIbE2f1Ev(ptr noundef nonnull align 8 dereferenceable(8) %this) unnamed_addr #0 align 2 !dbg !102 {
214entry:
215  %this.addr = alloca ptr, align 8
216  store ptr %this, ptr %this.addr, align 8
217  call void @llvm.dbg.declare(metadata ptr %this.addr, metadata !103, metadata !DIExpression()), !dbg !105
218  %this1 = load ptr, ptr %this.addr, align 8
219  ret void, !dbg !106
220}
221
222attributes #0 = { mustprogress noinline nounwind optnone uwtable "frame-pointer"="all" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
223attributes #1 = { nofree nosync nounwind readnone speculatable willreturn }
224
225!llvm.dbg.cu = !{!2}
226!llvm.module.flags = !{!81, !82, !83, !84, !85}
227!llvm.ident = !{!86}
228
229!0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression())
230!1 = distinct !DIGlobalVariable(name: "v1", scope: !2, file: !3, line: 8, type: !71, isLocal: false, isDefinition: true)
231!2 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !3, producer: "clang version 15.0.0 (git@github.com:llvm/llvm-project.git 862896df6210f6660514f9f68051cd0371832f37)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, globals: !4, splitDebugInlining: false, nameTableKind: None)
232!3 = !DIFile(filename: "test.cpp", directory: "/usr/local/google/home/blaikie/dev/scratch", checksumkind: CSK_MD5, checksum: "84728cc618f91cd3bdecda0aa2d09c2d")
233!4 = !{!0, !5, !13, !32, !46, !60, !69}
234!5 = !DIGlobalVariableExpression(var: !6, expr: !DIExpression())
235!6 = distinct !DIGlobalVariable(name: "v5", scope: !2, file: !3, line: 17, type: !7, isLocal: false, isDefinition: true)
236!7 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "ref_internal", file: !3, line: 14, size: 8, flags: DIFlagTypePassByValue, elements: !8, identifier: "_ZTS12ref_internal")
237!8 = !{!9}
238!9 = !DIDerivedType(tag: DW_TAG_member, name: "i", scope: !7, file: !3, line: 15, baseType: !10, size: 8)
239!10 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "internal", scope: !11, file: !3, line: 12, size: 8, flags: DIFlagTypePassByValue, elements: !12)
240!11 = !DINamespace(scope: null)
241!12 = !{}
242!13 = !DIGlobalVariableExpression(var: !14, expr: !DIExpression())
243!14 = distinct !DIGlobalVariable(name: "v2", scope: !2, file: !3, line: 33, type: !15, isLocal: false, isDefinition: true)
244!15 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "ref_templ_non_tu", file: !3, line: 30, size: 64, flags: DIFlagTypePassByReference | DIFlagNonTrivial, elements: !16, identifier: "_ZTS16ref_templ_non_tu")
245!16 = !{!17}
246!17 = !DIDerivedType(tag: DW_TAG_member, name: "v1", scope: !15, file: !3, line: 31, baseType: !18, size: 64)
247!18 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "_STN|templ_non_tu|<int>", file: !3, line: 26, size: 64, flags: DIFlagTypePassByReference | DIFlagNonTrivial, elements: !19, vtableHolder: !18, templateParams: !30)
248!19 = !{!20, !26}
249!20 = !DIDerivedType(tag: DW_TAG_member, name: "_vptr$templ_non_tu", scope: !3, file: !3, baseType: !21, size: 64, flags: DIFlagArtificial)
250!21 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !22, size: 64)
251!22 = !DIDerivedType(tag: DW_TAG_pointer_type, name: "__vtbl_ptr_type", baseType: !23, size: 64)
252!23 = !DISubroutineType(types: !24)
253!24 = !{!25}
254!25 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
255!26 = !DISubprogram(name: "f1", linkageName: "_ZN12templ_non_tuIiE2f1Ev", scope: !18, file: !3, line: 27, type: !27, scopeLine: 27, containingType: !18, virtualIndex: 0, flags: DIFlagPrototyped, spFlags: DISPFlagVirtual)
256!27 = !DISubroutineType(types: !28)
257!28 = !{null, !29}
258!29 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !18, size: 64, flags: DIFlagArtificial | DIFlagObjectPointer)
259!30 = !{!31}
260!31 = !DITemplateTypeParameter(name: "T", type: !25)
261!32 = !DIGlobalVariableExpression(var: !33, expr: !DIExpression())
262!33 = distinct !DIGlobalVariable(name: "v3", scope: !2, file: !3, line: 45, type: !34, isLocal: false, isDefinition: true)
263!34 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "ref_templ_non_tu_simple", file: !3, line: 42, size: 64, flags: DIFlagTypePassByReference | DIFlagNonTrivial, elements: !35, identifier: "_ZTS23ref_templ_non_tu_simple")
264!35 = !{!36}
265!36 = !DIDerivedType(tag: DW_TAG_member, name: "v1", scope: !34, file: !3, line: 43, baseType: !37, size: 64)
266!37 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "templ_non_tu", file: !3, line: 38, size: 64, flags: DIFlagTypePassByReference | DIFlagNonTrivial, elements: !38, vtableHolder: !37, templateParams: !43)
267!38 = !{!20, !39}
268!39 = !DISubprogram(name: "f1", linkageName: "_ZN12templ_non_tuIlE2f1Ev", scope: !37, file: !3, line: 39, type: !40, scopeLine: 39, containingType: !37, virtualIndex: 0, flags: DIFlagPrototyped, spFlags: DISPFlagVirtual)
269!40 = !DISubroutineType(types: !41)
270!41 = !{null, !42}
271!42 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !37, size: 64, flags: DIFlagArtificial | DIFlagObjectPointer)
272!43 = !{!44}
273!44 = !DITemplateTypeParameter(name: "T", type: !45)
274!45 = !DIBasicType(name: "long", size: 64, encoding: DW_ATE_signed)
275!46 = !DIGlobalVariableExpression(var: !47, expr: !DIExpression())
276!47 = distinct !DIGlobalVariable(name: "v4", scope: !2, file: !3, line: 56, type: !48, isLocal: false, isDefinition: true)
277!48 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "ref_templ_non_tu_mangled", file: !3, line: 53, size: 64, flags: DIFlagTypePassByReference | DIFlagNonTrivial, elements: !49, identifier: "_ZTS24ref_templ_non_tu_mangled")
278!49 = !{!50}
279!50 = !DIDerivedType(tag: DW_TAG_member, name: "v1", scope: !48, file: !3, line: 54, baseType: !51, size: 64)
280!51 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "_STN|templ_non_tu|<bool>", file: !3, line: 49, size: 64, flags: DIFlagTypePassByReference | DIFlagNonTrivial, elements: !52, vtableHolder: !51, templateParams: !57)
281!52 = !{!20, !53}
282!53 = !DISubprogram(name: "f1", linkageName: "_ZN12templ_non_tuIbE2f1Ev", scope: !51, file: !3, line: 50, type: !54, scopeLine: 50, containingType: !51, virtualIndex: 0, flags: DIFlagPrototyped, spFlags: DISPFlagVirtual)
283!54 = !DISubroutineType(types: !55)
284!55 = !{null, !56}
285!56 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !51, size: 64, flags: DIFlagArtificial | DIFlagObjectPointer)
286!57 = !{!58}
287!58 = !DITemplateTypeParameter(name: "T", type: !59)
288!59 = !DIBasicType(name: "bool", size: 8, encoding: DW_ATE_boolean)
289!60 = !DIGlobalVariableExpression(var: !61, expr: !DIExpression())
290!61 = distinct !DIGlobalVariable(name: "v6", scope: !2, file: !3, line: 66, type: !62, isLocal: false, isDefinition: true)
291!62 = distinct !DICompositeType(tag: DW_TAG_class_type, name: "ref_internal_template", file: !3, line: 63, size: 8, flags: DIFlagTypePassByValue, elements: !63, identifier: "_ZTS21ref_internal_template")
292!63 = !{!64}
293!64 = !DIDerivedType(tag: DW_TAG_member, name: "ax", scope: !62, file: !3, line: 64, baseType: !65, size: 8)
294!65 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "internal_template<ref_from_ref_internal_template>", scope: !11, file: !3, line: 59, size: 8, flags: DIFlagTypePassByValue, elements: !12, templateParams: !66)
295!66 = !{!67}
296!67 = !DITemplateTypeParameter(type: !68)
297!68 = distinct !DICompositeType(tag: DW_TAG_class_type, name: "ref_from_ref_internal_template", file: !3, line: 61, size: 8, flags: DIFlagTypePassByValue, elements: !12, identifier: "_ZTS30ref_from_ref_internal_template")
298!69 = !DIGlobalVariableExpression(var: !70, expr: !DIExpression())
299!70 = distinct !DIGlobalVariable(name: "v7", scope: !2, file: !3, line: 67, type: !68, isLocal: false, isDefinition: true)
300!71 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "tu_ref_non_tu", file: !3, line: 5, size: 64, flags: DIFlagTypePassByReference | DIFlagNonTrivial, elements: !72, identifier: "_ZTS13tu_ref_non_tu")
301!72 = !{!73}
302!73 = !DIDerivedType(tag: DW_TAG_member, name: "v1", scope: !71, file: !3, line: 6, baseType: !74, size: 64)
303!74 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "non_tu", file: !3, line: 1, size: 64, flags: DIFlagTypePassByReference | DIFlagNonTrivial, elements: !75, vtableHolder: !74)
304!75 = !{!76, !77}
305!76 = !DIDerivedType(tag: DW_TAG_member, name: "_vptr$non_tu", scope: !3, file: !3, baseType: !21, size: 64, flags: DIFlagArtificial)
306!77 = !DISubprogram(name: "f1", linkageName: "_ZN6non_tu2f1Ev", scope: !74, file: !3, line: 2, type: !78, scopeLine: 2, containingType: !74, virtualIndex: 0, flags: DIFlagPrototyped, spFlags: DISPFlagVirtual)
307!78 = !DISubroutineType(types: !79)
308!79 = !{null, !80}
309!80 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !74, size: 64, flags: DIFlagArtificial | DIFlagObjectPointer)
310!81 = !{i32 7, !"Dwarf Version", i32 5}
311!82 = !{i32 2, !"Debug Info Version", i32 3}
312!83 = !{i32 1, !"wchar_size", i32 4}
313!84 = !{i32 7, !"uwtable", i32 2}
314!85 = !{i32 7, !"frame-pointer", i32 2}
315!86 = !{!"clang version 15.0.0 (git@github.com:llvm/llvm-project.git 862896df6210f6660514f9f68051cd0371832f37)"}
316!87 = distinct !DISubprogram(name: "f1", linkageName: "_ZN6non_tu2f1Ev", scope: !74, file: !3, line: 4, type: !78, scopeLine: 4, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !2, declaration: !77, retainedNodes: !12)
317!88 = !DILocalVariable(name: "this", arg: 1, scope: !87, type: !89, flags: DIFlagArtificial | DIFlagObjectPointer)
318!89 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !74, size: 64)
319!90 = !DILocation(line: 0, scope: !87)
320!91 = !DILocation(line: 4, column: 20, scope: !87)
321!92 = distinct !DISubprogram(name: "f1", linkageName: "_ZN12templ_non_tuIiE2f1Ev", scope: !18, file: !3, line: 29, type: !27, scopeLine: 29, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !2, declaration: !26, retainedNodes: !12)
322!93 = !DILocalVariable(name: "this", arg: 1, scope: !92, type: !94, flags: DIFlagArtificial | DIFlagObjectPointer)
323!94 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !18, size: 64)
324!95 = !DILocation(line: 0, scope: !92)
325!96 = !DILocation(line: 29, column: 31, scope: !92)
326!97 = distinct !DISubprogram(name: "f1", linkageName: "_ZN12templ_non_tuIlE2f1Ev", scope: !37, file: !3, line: 41, type: !40, scopeLine: 41, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !2, declaration: !39, retainedNodes: !12)
327!98 = !DILocalVariable(name: "this", arg: 1, scope: !97, type: !99, flags: DIFlagArtificial | DIFlagObjectPointer)
328!99 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !37, size: 64)
329!100 = !DILocation(line: 0, scope: !97)
330!101 = !DILocation(line: 41, column: 32, scope: !97)
331!102 = distinct !DISubprogram(name: "f1", linkageName: "_ZN12templ_non_tuIbE2f1Ev", scope: !51, file: !3, line: 52, type: !54, scopeLine: 52, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !2, declaration: !53, retainedNodes: !12)
332!103 = !DILocalVariable(name: "this", arg: 1, scope: !102, type: !104, flags: DIFlagArtificial | DIFlagObjectPointer)
333!104 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !51, size: 64)
334!105 = !DILocation(line: 0, scope: !102)
335!106 = !DILocation(line: 52, column: 32, scope: !102)
336