xref: /llvm-project/llvm/test/DebugInfo/X86/gnu-public-names.ll (revision b215a2c885871e6ab67ad2f332f41e265959b7b8)
1; RUN: llc -mtriple=x86_64-pc-linux-gnu < %s | FileCheck -check-prefix=ASM %s
2; RUN: llc -mtriple=x86_64-pc-linux-gnu -filetype=obj < %s | llvm-dwarfdump --debug-info --debug-gnu-pubnames --debug-gnu-pubtypes - | FileCheck %s --implicit-check-not "{{DW_TAG|NULL}}"
3; ModuleID = 'dwarf-public-names.cpp'
4;
5; Generated from:
6;
7; struct C {
8;   void member_function();
9;   static int static_member_function();
10;   static int static_member_variable;
11; };
12;
13; int C::static_member_variable = 0;
14;
15; void C::member_function() {
16;   static_member_variable = 0;
17; }
18;
19; int C::static_member_function() {
20;   return static_member_variable;
21; }
22;
23; C global_variable;
24;
25; int global_function() {
26;   return -1;
27; }
28;
29; namespace ns {
30;   void global_namespace_function() {
31;     global_variable.member_function();
32;   }
33;   int global_namespace_variable = 1;
34;   extern int global_namespace_variable_decl;
35;   struct D {
36;     int A;
37;   } d;
38; }
39;
40; using ns::global_namespace_variable_decl;
41;
42; namespace {
43; int i;
44; }
45;
46; int *f3() {
47;   static int z;
48;   return &z;
49; }
50;
51; namespace {
52; namespace inner {
53; int b;
54; }
55; }
56;
57; namespace outer {
58; namespace {
59; int c;
60; }
61; }
62;
63; int f7() {
64;   return i + *f3() + inner::b + outer::c;
65; }
66
67; ASM: .section        .debug_gnu_pubnames
68; ASM: .byte   32                      # Attributes: VARIABLE, EXTERNAL
69; ASM-NEXT: .asciz  "C::static_member_variable"           # External Name
70; ASM: .byte   32                      # Attributes: VARIABLE, EXTERNAL
71; ASM-NEXT: .asciz  "global_variable"       # External Name
72; ASM: .byte   32                      # Attributes: VARIABLE, EXTERNAL
73; ASM-NEXT: .asciz  "ns::global_namespace_variable"       # External Name
74
75; ASM: .section        .debug_gnu_pubtypes
76; ASM: .byte   16                      # Attributes: TYPE, EXTERNAL
77; ASM-NEXT: .asciz  "C"                     # External Name
78
79; CHECK: .debug_info contents:
80; CHECK: DW_TAG_compile_unit
81; CHECK:   DW_AT_GNU_pubnames (true)
82; CHECK-NOT: DW_AT_GNU_pubtypes [
83
84; CHECK:   [[STATIC_MEM_VAR:0x[0-9a-f]+]]: DW_TAG_variable
85; CHECK:     DW_AT_specification {{.*}} "static_member_variable"
86
87; CHECK:   [[C:0x[0-9a-f]+]]: DW_TAG_structure_type
88; CHECK:     DW_AT_name ("C")
89; CHECK:     DW_TAG_member
90; CHECK:       DW_AT_name ("static_member_variable")
91; CHECK:     DW_TAG_subprogram
92; CHECK:       DW_AT_linkage_name
93; CHECK:       DW_AT_name ("member_function")
94; CHECK:       DW_TAG_formal_parameter
95; CHECK:       NULL
96; CHECK:     DW_TAG_subprogram
97; CHECK:       DW_AT_linkage_name
98; CHECK:       DW_AT_name ("static_member_function")
99; CHECK:     NULL
100
101; CHECK:   [[INT:0x[0-9a-f]+]]: DW_TAG_base_type
102; CHECK:     DW_AT_name ("int")
103; CHECK:   DW_TAG_pointer_type
104
105; CHECK:   [[GLOB_VAR:0x[0-9a-f]+]]: DW_TAG_variable
106; CHECK:     DW_AT_name ("global_variable")
107
108; CHECK:   [[NS:0x[0-9a-f]+]]: DW_TAG_namespace
109; CHECK:     DW_AT_name ("ns")
110; CHECK:     [[GLOB_NS_VAR:0x[0-9a-f]+]]: DW_TAG_variable
111; CHECK:       DW_AT_name ("global_namespace_variable")
112; CHECK-NOT:   DW_AT_specification
113; CHECK:       DW_AT_location
114; CHECK-NOT:   DW_AT_specification
115; CHECK:     [[D_VAR:0x[0-9a-f]+]]: DW_TAG_variable
116; CHECK:       DW_AT_name ("d")
117; CHECK-NOT:   DW_AT_specification
118; CHECK:       DW_AT_location
119; CHECK-NOT:   DW_AT_specification
120; CHECK:     [[D:0x[0-9a-f]+]]: DW_TAG_structure_type
121; CHECK:       DW_AT_name ("D")
122; CHECK:       DW_TAG_member
123; CHECK:       NULL
124; CHECK:     [[GLOB_NS_FUNC:0x[0-9a-f]+]]: DW_TAG_subprogram
125; CHECK:       DW_AT_linkage_name
126; CHECK:       DW_AT_name ("global_namespace_function")
127; CHECK:     DW_TAG_variable
128; CHECK:     NULL
129
130; CHECK:   [[F3:0x[0-9a-f]+]]: DW_TAG_subprogram
131; CHECK:     DW_AT_name ("f3")
132; CHECK:     [[F3_Z:.*]]: DW_TAG_variable
133; CHECK:       DW_AT_name ("z")
134; CHECK:       DW_AT_location
135; CHECK:     NULL
136
137; CHECK:   [[ANON:.*]]: DW_TAG_namespace
138; CHECK-NOT: DW_AT_name
139; CHECK:     [[ANON_I:.*]]: DW_TAG_variable
140; CHECK:       DW_AT_name ("i")
141; CHECK:       [[ANON_INNER:.*]]:  DW_TAG_namespace
142; CHECK:         DW_AT_name ("inner")
143; CHECK:         [[ANON_INNER_B:.*]]: DW_TAG_variable
144; CHECK:           DW_AT_name ("b")
145; CHECK:         NULL
146; CHECK:     NULL
147
148; CHECK:   [[OUTER:.*]]: DW_TAG_namespace
149; CHECK:     DW_AT_name ("outer")
150; CHECK:     [[OUTER_ANON:.*]]:  DW_TAG_namespace
151; CHECK-NOT:   DW_AT_name
152; CHECK:       [[OUTER_ANON_C:.*]]: DW_TAG_variable
153; CHECK:         DW_AT_name ("c")
154; CHECK:       NULL
155; CHECK:     NULL
156
157; CHECK:   DW_TAG_enumeration
158; CHECK:     [[UNNAMED_ENUM_ENUMERATOR:0x[0-9a-f]+]]:  DW_TAG_enumerator
159; CHECK:       DW_AT_name ("unnamed_enum_enumerator")
160; CHECK:     NULL
161
162; CHECK:   [[UNSIGNED_INT:0x[0-9a-f]+]]: DW_TAG_base_type
163; CHECK:     DW_AT_name ("unsigned int")
164
165; CHECK:   [[NAMED_ENUM:0x[0-9a-f]+]]: DW_TAG_enumeration
166; CHECK:     DW_AT_name ("named_enum")
167; CHECK:     [[NAMED_ENUM_ENUMERATOR:0x[0-9a-f]+]]:  DW_TAG_enumerator
168; CHECK:       DW_AT_name ("named_enum_enumerator")
169; CHECK:     NULL
170
171; CHECK:   [[NAMED_ENUM_CLASS:0x[0-9a-f]+]]: DW_TAG_enumeration
172; CHECK:     DW_AT_name ("named_enum_class")
173; CHECK:     [[NAMED_ENUM_CLASS_ENUMERATOR:0x[0-9a-f]+]]:  DW_TAG_enumerator
174; CHECK:       DW_AT_name ("named_enum_class_enumerator")
175; CHECK:     NULL
176
177; CHECK:   [[MEM_FUNC:0x[0-9a-f]+]]: DW_TAG_subprogram
178; CHECK:     DW_AT_specification {{.*}} "_ZN1C15member_functionEv"
179; CHECK:     DW_TAG_formal_parameter
180; CHECK:     NULL
181
182; CHECK:   [[STATIC_MEM_FUNC:0x[0-9a-f]+]]: DW_TAG_subprogram
183; CHECK:     DW_AT_specification {{.*}} "_ZN1C22static_member_functionEv"
184
185; CHECK:   [[GLOBAL_FUNC:0x[0-9a-f]+]]: DW_TAG_subprogram
186; CHECK:     DW_AT_linkage_name
187; CHECK:     DW_AT_name ("global_function")
188
189; CHECK:   [[GLOBAL_F7:0x[0-9a-f]+]]: DW_TAG_subprogram
190; CHECK:     DW_AT_linkage_name
191; CHECK:     DW_AT_name ("f7")
192
193; CHECK:   DW_TAG_imported_declaration
194; CHECK:   DW_TAG_pointer_type
195; CHECK:   DW_TAG_pointer_type
196; CHECK:   NULL
197
198; CHECK-LABEL: .debug_gnu_pubnames contents:
199; CHECK-NEXT: length = {{.*}}, version = 0x0002, unit_offset = 0x00000000, unit_size = {{.*}}
200; CHECK-NEXT: Offset     Linkage  Kind     Name
201; CHECK-NEXT:  [[STATIC_MEM_VAR]] EXTERNAL VARIABLE "C::static_member_variable"
202; CHECK-NEXT:  [[GLOB_VAR]] EXTERNAL VARIABLE "global_variable"
203; CHECK-NEXT:  [[NS]] EXTERNAL TYPE     "ns"
204; CHECK-NEXT:  [[GLOB_NS_VAR]] EXTERNAL VARIABLE "ns::global_namespace_variable"
205; CHECK-NEXT:  [[D_VAR]] EXTERNAL VARIABLE "ns::d"
206; CHECK-NEXT:  [[GLOB_NS_FUNC]] EXTERNAL FUNCTION "ns::global_namespace_function"
207; CHECK-NEXT:  [[F3]] EXTERNAL FUNCTION "f3"
208; GCC Doesn't put local statics in pubnames, but it seems not unreasonable and
209; comes out naturally from LLVM's implementation, so I'm OK with it for now. If
210; it's demonstrated that this is a major size concern or degrades debug info
211; consumer behavior, feel free to change it.
212; CHECK-NEXT:  [[F3_Z]] STATIC VARIABLE "f3::z"
213; CHECK-NEXT:  [[ANON]] EXTERNAL TYPE "(anonymous namespace)"
214; CHECK-NEXT:  [[ANON_I]] STATIC VARIABLE "(anonymous namespace)::i"
215; CHECK-NEXT:  [[ANON_INNER]] EXTERNAL TYPE "(anonymous namespace)::inner"
216; CHECK-NEXT:  [[ANON_INNER_B]] STATIC VARIABLE "(anonymous namespace)::inner::b"
217; CHECK-NEXT:  [[OUTER]] EXTERNAL TYPE "outer"
218; CHECK-NEXT:  [[OUTER_ANON]] EXTERNAL TYPE "outer::(anonymous namespace)"
219; CHECK-NEXT:  [[OUTER_ANON_C]] STATIC VARIABLE "outer::(anonymous namespace)::c"
220; CHECK-NEXT:  [[UNNAMED_ENUM_ENUMERATOR]] STATIC VARIABLE  "unnamed_enum_enumerator"
221; CHECK-NEXT:  [[NAMED_ENUM_ENUMERATOR]] STATIC VARIABLE  "named_enum_enumerator"
222; CHECK-NEXT:  [[NAMED_ENUM_CLASS_ENUMERATOR]] STATIC VARIABLE  "named_enum_class_enumerator"
223; CHECK-NEXT:  [[MEM_FUNC]] EXTERNAL FUNCTION "C::member_function"
224; CHECK-NEXT:  [[STATIC_MEM_FUNC]] EXTERNAL FUNCTION "C::static_member_function"
225; FIXME: GCC produces enumerators as EXTERNAL, not STATIC
226; CHECK-NEXT:  [[GLOBAL_FUNC]] EXTERNAL FUNCTION "global_function"
227; CHECK-NEXT:  [[GLOBAL_F7]] EXTERNAL FUNCTION "f7"
228
229; CHECK-LABEL: debug_gnu_pubtypes contents:
230; CHECK: Offset     Linkage  Kind     Name
231; CHECK-NEXT:  [[C]] EXTERNAL TYPE     "C"
232; CHECK-NEXT:  [[INT]] STATIC   TYPE     "int"
233; CHECK-NEXT:  [[D]] EXTERNAL TYPE     "ns::D"
234; CHECK-NEXT:  [[UNSIGNED_INT]] STATIC   TYPE     "unsigned int"
235; CHECK-NEXT:  [[NAMED_ENUM]] EXTERNAL TYPE     "named_enum"
236; CHECK-NEXT:  [[NAMED_ENUM_CLASS]] EXTERNAL TYPE     "named_enum_class"
237
238%struct.C = type { i8 }
239%"struct.ns::D" = type { i32 }
240
241@_ZN1C22static_member_variableE = dso_local global i32 0, align 4, !dbg !0
242@global_variable = dso_local global %struct.C zeroinitializer, align 1, !dbg !18
243@_ZN2ns25global_namespace_variableE = dso_local global i32 1, align 4, !dbg !29
244@_ZN2ns1dE = dso_local global %"struct.ns::D" zeroinitializer, align 4, !dbg !32
245@_ZZ2f3vE1z = internal global i32 0, align 4, !dbg !37
246@_ZN12_GLOBAL__N_11iE = internal global i32 0, align 4, !dbg !44
247@_ZN12_GLOBAL__N_15inner1bE = internal global i32 0, align 4, !dbg !47
248@_ZN5outer12_GLOBAL__N_11cE = internal global i32 0, align 4, !dbg !50
249
250; Function Attrs: noinline nounwind optnone uwtable
251define dso_local void @_ZN1C15member_functionEv(ptr %this) #0 align 2 !dbg !61 {
252entry:
253  %this.addr = alloca ptr, align 8
254  store ptr %this, ptr %this.addr, align 8
255  call void @llvm.dbg.declare(metadata ptr %this.addr, metadata !62, metadata !DIExpression()), !dbg !64
256  %this1 = load ptr, ptr %this.addr, align 8
257  store i32 0, ptr @_ZN1C22static_member_variableE, align 4, !dbg !65
258  ret void, !dbg !66
259}
260
261; Function Attrs: nounwind readnone speculatable
262declare void @llvm.dbg.declare(metadata, metadata, metadata) #1
263
264; Function Attrs: noinline nounwind optnone uwtable
265define dso_local i32 @_ZN1C22static_member_functionEv() #0 align 2 !dbg !67 {
266entry:
267  %0 = load i32, ptr @_ZN1C22static_member_variableE, align 4, !dbg !68
268  ret i32 %0, !dbg !69
269}
270
271; Function Attrs: noinline nounwind optnone uwtable
272define dso_local i32 @_Z15global_functionv() #0 !dbg !70 {
273entry:
274  ret i32 -1, !dbg !71
275}
276
277; Function Attrs: noinline nounwind optnone uwtable
278define dso_local void @_ZN2ns25global_namespace_functionEv() #0 !dbg !72 {
279entry:
280  call void @_ZN1C15member_functionEv(ptr @global_variable), !dbg !75
281  ret void, !dbg !76
282}
283
284; Function Attrs: noinline nounwind optnone uwtable
285define dso_local ptr @_Z2f3v() #0 !dbg !39 {
286entry:
287  ret ptr @_ZZ2f3vE1z, !dbg !77
288}
289
290; Function Attrs: noinline nounwind optnone uwtable
291define dso_local i32 @_Z2f7v() #0 !dbg !78 {
292entry:
293  %0 = load i32, ptr @_ZN12_GLOBAL__N_11iE, align 4, !dbg !79
294  %call = call ptr @_Z2f3v(), !dbg !80
295  %1 = load i32, ptr %call, align 4, !dbg !81
296  %add = add nsw i32 %0, %1, !dbg !82
297  %2 = load i32, ptr @_ZN12_GLOBAL__N_15inner1bE, align 4, !dbg !83
298  %add1 = add nsw i32 %add, %2, !dbg !84
299  %3 = load i32, ptr @_ZN5outer12_GLOBAL__N_11cE, align 4, !dbg !85
300  %add2 = add nsw i32 %add1, %3, !dbg !86
301  %add3 = add nsw i32 %add2, 0, !dbg !87
302  %add4 = add nsw i32 %add3, 0, !dbg !88
303  %add5 = add nsw i32 %add4, 0, !dbg !89
304  ret i32 %add5, !dbg !90
305}
306
307attributes #0 = { noinline nounwind optnone uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "frame-pointer"="all" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
308attributes #1 = { nounwind readnone speculatable }
309
310!llvm.dbg.cu = !{!2}
311!llvm.module.flags = !{!57, !58, !59}
312!llvm.ident = !{!60}
313
314!0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression())
315!1 = distinct !DIGlobalVariable(name: "static_member_variable", linkageName: "_ZN1C22static_member_variableE", scope: !2, file: !3, line: 7, type: !13, isLocal: false, isDefinition: true, declaration: !22)
316!2 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_03, file: !3, producer: "clang version 9.0.0 (trunk 363288) (llvm/trunk 363294)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !4, retainedTypes: !16, globals: !17, imports: !54, nameTableKind: GNU)
317!3 = !DIFile(filename: "names.cpp", directory: "/usr/local/google/home/blaikie/dev/scratch")
318!4 = !{!5, !9, !12}
319!5 = !DICompositeType(tag: DW_TAG_enumeration_type, file: !3, line: 49, baseType: !6, size: 32, elements: !7)
320!6 = !DIBasicType(name: "unsigned int", size: 32, encoding: DW_ATE_unsigned)
321!7 = !{!8}
322!8 = !DIEnumerator(name: "unnamed_enum_enumerator", value: 0, isUnsigned: true)
323!9 = !DICompositeType(tag: DW_TAG_enumeration_type, name: "named_enum", file: !3, line: 52, baseType: !6, size: 32, elements: !10, identifier: "_ZTS10named_enum")
324!10 = !{!11}
325!11 = !DIEnumerator(name: "named_enum_enumerator", value: 0, isUnsigned: true)
326!12 = !DICompositeType(tag: DW_TAG_enumeration_type, name: "named_enum_class", file: !3, line: 55, baseType: !13, size: 32, flags: DIFlagEnumClass, elements: !14, identifier: "_ZTS16named_enum_class")
327!13 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
328!14 = !{!15}
329!15 = !DIEnumerator(name: "named_enum_class_enumerator", value: 0)
330!16 = !{!13}
331!17 = !{!0, !18, !29, !32, !37, !44, !47, !50}
332!18 = !DIGlobalVariableExpression(var: !19, expr: !DIExpression())
333!19 = distinct !DIGlobalVariable(name: "global_variable", scope: !2, file: !3, line: 13, type: !20, isLocal: false, isDefinition: true)
334!20 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "C", file: !3, line: 1, size: 8, flags: DIFlagTypePassByValue, elements: !21, identifier: "_ZTS1C")
335!21 = !{!22, !23, !27}
336!22 = !DIDerivedType(tag: DW_TAG_member, name: "static_member_variable", scope: !20, file: !3, line: 4, baseType: !13, flags: DIFlagStaticMember)
337!23 = !DISubprogram(name: "member_function", linkageName: "_ZN1C15member_functionEv", scope: !20, file: !3, line: 2, type: !24, scopeLine: 2, flags: DIFlagPrototyped, spFlags: 0)
338!24 = !DISubroutineType(types: !25)
339!25 = !{null, !26}
340!26 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !20, size: 64, flags: DIFlagArtificial | DIFlagObjectPointer)
341!27 = !DISubprogram(name: "static_member_function", linkageName: "_ZN1C22static_member_functionEv", scope: !20, file: !3, line: 3, type: !28, scopeLine: 3, flags: DIFlagPrototyped | DIFlagStaticMember, spFlags: 0)
342!28 = !DISubroutineType(types: !16)
343!29 = !DIGlobalVariableExpression(var: !30, expr: !DIExpression())
344!30 = distinct !DIGlobalVariable(name: "global_namespace_variable", linkageName: "_ZN2ns25global_namespace_variableE", scope: !31, file: !3, line: 19, type: !13, isLocal: false, isDefinition: true)
345!31 = !DINamespace(name: "ns", scope: null)
346!32 = !DIGlobalVariableExpression(var: !33, expr: !DIExpression())
347!33 = distinct !DIGlobalVariable(name: "d", linkageName: "_ZN2ns1dE", scope: !31, file: !3, line: 23, type: !34, isLocal: false, isDefinition: true)
348!34 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "D", scope: !31, file: !3, line: 21, size: 32, flags: DIFlagTypePassByValue, elements: !35, identifier: "_ZTSN2ns1DE")
349!35 = !{!36}
350!36 = !DIDerivedType(tag: DW_TAG_member, name: "A", scope: !34, file: !3, line: 22, baseType: !13, size: 32)
351!37 = !DIGlobalVariableExpression(var: !38, expr: !DIExpression())
352!38 = distinct !DIGlobalVariable(name: "z", scope: !39, file: !3, line: 33, type: !13, isLocal: true, isDefinition: true)
353!39 = distinct !DISubprogram(name: "f3", linkageName: "_Z2f3v", scope: !3, file: !3, line: 32, type: !40, scopeLine: 32, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !43)
354!40 = !DISubroutineType(types: !41)
355!41 = !{!42}
356!42 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !13, size: 64)
357!43 = !{}
358!44 = !DIGlobalVariableExpression(var: !45, expr: !DIExpression())
359!45 = distinct !DIGlobalVariable(name: "i", linkageName: "_ZN12_GLOBAL__N_11iE", scope: !46, file: !3, line: 29, type: !13, isLocal: true, isDefinition: true)
360!46 = !DINamespace(scope: null)
361!47 = !DIGlobalVariableExpression(var: !48, expr: !DIExpression())
362!48 = distinct !DIGlobalVariable(name: "b", linkageName: "_ZN12_GLOBAL__N_15inner1bE", scope: !49, file: !3, line: 39, type: !13, isLocal: true, isDefinition: true)
363!49 = !DINamespace(name: "inner", scope: !46)
364!50 = !DIGlobalVariableExpression(var: !51, expr: !DIExpression())
365!51 = distinct !DIGlobalVariable(name: "c", linkageName: "_ZN5outer12_GLOBAL__N_11cE", scope: !52, file: !3, line: 45, type: !13, isLocal: true, isDefinition: true)
366!52 = !DINamespace(scope: !53)
367!53 = !DINamespace(name: "outer", scope: null)
368!54 = !{!55}
369!55 = !DIImportedEntity(tag: DW_TAG_imported_declaration, scope: !2, entity: !56, file: !3, line: 26)
370!56 = !DIGlobalVariable(name: "global_namespace_variable_decl", linkageName: "_ZN2ns30global_namespace_variable_declE", scope: !31, file: !3, line: 20, type: !13, isLocal: false, isDefinition: false)
371!57 = !{i32 2, !"Dwarf Version", i32 4}
372!58 = !{i32 2, !"Debug Info Version", i32 3}
373!59 = !{i32 1, !"wchar_size", i32 4}
374!60 = !{!"clang version 9.0.0 (trunk 363288) (llvm/trunk 363294)"}
375!61 = distinct !DISubprogram(name: "member_function", linkageName: "_ZN1C15member_functionEv", scope: !20, file: !3, line: 9, type: !24, scopeLine: 9, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !2, declaration: !23, retainedNodes: !43)
376!62 = !DILocalVariable(name: "this", arg: 1, scope: !61, type: !63, flags: DIFlagArtificial | DIFlagObjectPointer)
377!63 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !20, size: 64)
378!64 = !DILocation(line: 0, scope: !61)
379!65 = !DILocation(line: 9, column: 52, scope: !61)
380!66 = !DILocation(line: 9, column: 57, scope: !61)
381!67 = distinct !DISubprogram(name: "static_member_function", linkageName: "_ZN1C22static_member_functionEv", scope: !20, file: !3, line: 11, type: !28, scopeLine: 11, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !2, declaration: !27, retainedNodes: !43)
382!68 = !DILocation(line: 11, column: 42, scope: !67)
383!69 = !DILocation(line: 11, column: 35, scope: !67)
384!70 = distinct !DISubprogram(name: "global_function", linkageName: "_Z15global_functionv", scope: !3, file: !3, line: 15, type: !28, scopeLine: 15, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !43)
385!71 = !DILocation(line: 15, column: 25, scope: !70)
386!72 = distinct !DISubprogram(name: "global_namespace_function", linkageName: "_ZN2ns25global_namespace_functionEv", scope: !31, file: !3, line: 18, type: !73, scopeLine: 18, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !43)
387!73 = !DISubroutineType(types: !74)
388!74 = !{null}
389!75 = !DILocation(line: 18, column: 52, scope: !72)
390!76 = !DILocation(line: 18, column: 71, scope: !72)
391!77 = !DILocation(line: 34, column: 3, scope: !39)
392!78 = distinct !DISubprogram(name: "f7", linkageName: "_Z2f7v", scope: !3, file: !3, line: 58, type: !28, scopeLine: 58, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !43)
393!79 = !DILocation(line: 59, column: 10, scope: !78)
394!80 = !DILocation(line: 59, column: 15, scope: !78)
395!81 = !DILocation(line: 59, column: 14, scope: !78)
396!82 = !DILocation(line: 59, column: 12, scope: !78)
397!83 = !DILocation(line: 59, column: 22, scope: !78)
398!84 = !DILocation(line: 59, column: 20, scope: !78)
399!85 = !DILocation(line: 59, column: 33, scope: !78)
400!86 = !DILocation(line: 59, column: 31, scope: !78)
401!87 = !DILocation(line: 59, column: 42, scope: !78)
402!88 = !DILocation(line: 59, column: 68, scope: !78)
403!89 = !DILocation(line: 60, column: 32, scope: !78)
404!90 = !DILocation(line: 59, column: 3, scope: !78)
405