1
; RUN: llc %s -o %t -filetype=obj -O0 -mtriple=x86_64-unknown-linux-gnu -dwarf-version=4
2
; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s -check-prefix=PRESENT
3
; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s -check-prefix=ABSENT
4
; RUN: llc %s -o %t -filetype=obj -O0 -mtriple=x86_64-apple-darwin -dwarf-version=4
5
; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s -check-prefix=DARWINP
6
; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s -check-prefix=DARWINA
7
; Verify that attributes we do want are PRESENT;
8
; verify that attributes we don't want are ABSENT.
9
; It's a lot easier to do this in two passes than in one.
12
; LLVM IR generated using: clang -emit-llvm -S -g
13
; (with the Clang part of this patch applied).
18
; const static bool const_a = true;
21
; const static float const_b = 3.14;
24
; const static int const_c = 18;
39
%class.C = type { i32 }
41
@_ZN1C1aE = global i32 4, align 4
42
@_ZN1C1bE = global i32 2, align 4
43
@_ZN1C1cE = global i32 1, align 4
45
define i32 @main() nounwind uwtable {
47
%retval = alloca i32, align 4
48
%instance_C = alloca %class.C, align 4
49
store i32 0, i32* %retval
50
call void @llvm.dbg.declare(metadata %class.C* %instance_C, metadata !29, metadata !DIExpression()), !dbg !30
51
%d = getelementptr inbounds %class.C, %class.C* %instance_C, i32 0, i32 0, !dbg !31
52
store i32 8, i32* %d, align 4, !dbg !31
53
%0 = load i32, i32* @_ZN1C1cE, align 4, !dbg !32
57
declare void @llvm.dbg.declare(metadata, metadata, metadata) nounwind readnone
60
!llvm.module.flags = !{!34}
62
!0 = !DICompileUnit(language: DW_LANG_C_plus_plus, producer: "clang version 3.3 (trunk 171914)", isOptimized: false, emissionKind: 0, file: !33, enums: !1, retainedTypes: !1, subprograms: !3, globals: !10, imports: !1)
65
!5 = !DISubprogram(name: "main", line: 18, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, scopeLine: 23, file: !33, scope: !6, type: !7, function: i32 ()* @main, variables: !1)
66
!6 = !DIFile(filename: "/usr/local/google/home/blaikie/Development/llvm/src/tools/clang/test/CodeGenCXX/debug-info-static-member.cpp", directory: "/home/blaikie/local/Development/llvm/build/clang/x86-64/Debug/llvm")
67
!7 = !DISubroutineType(types: !8)
69
!9 = !DIBasicType(tag: DW_TAG_base_type, name: "int", size: 32, align: 32, encoding: DW_ATE_signed)
70
!10 = !{!12, !27, !28}
71
!12 = !DIGlobalVariable(name: "a", linkageName: "_ZN1C1aE", line: 14, isLocal: false, isDefinition: true, scope: null, file: !6, type: !9, variable: i32* @_ZN1C1aE, declaration: !15)
72
!13 = !DICompositeType(tag: DW_TAG_class_type, name: "C", line: 1, size: 32, align: 32, file: !33, elements: !14)
73
!14 = !{!15, !16, !19, !20, !23, !24, !26}
74
!15 = !DIDerivedType(tag: DW_TAG_member, name: "a", line: 3, flags: DIFlagPrivate | DIFlagStaticMember, file: !33, scope: !13, baseType: !9)
75
!16 = !DIDerivedType(tag: DW_TAG_member, name: "const_a", line: 4, flags: DIFlagPrivate | DIFlagStaticMember, file: !33, scope: !13, baseType: !17, extraData: i1 true)
76
!17 = !DIDerivedType(tag: DW_TAG_const_type, baseType: !18)
77
!18 = !DIBasicType(tag: DW_TAG_base_type, name: "bool", size: 8, align: 8, encoding: DW_ATE_boolean)
78
!19 = !DIDerivedType(tag: DW_TAG_member, name: "b", line: 6, flags: DIFlagProtected | DIFlagStaticMember, file: !33, scope: !13, baseType: !9)
79
!20 = !DIDerivedType(tag: DW_TAG_member, name: "const_b", line: 7, flags: DIFlagProtected | DIFlagStaticMember, file: !33, scope: !13, baseType: !21, extraData: float 0x40091EB860000000)
80
!21 = !DIDerivedType(tag: DW_TAG_const_type, baseType: !22)
81
!22 = !DIBasicType(tag: DW_TAG_base_type, name: "float", size: 32, align: 32, encoding: DW_ATE_float)
82
!23 = !DIDerivedType(tag: DW_TAG_member, name: "c", line: 9, flags: DIFlagPublic | DIFlagStaticMember, file: !33, scope: !13, baseType: !9)
83
!24 = !DIDerivedType(tag: DW_TAG_member, name: "const_c", line: 10, flags: DIFlagPublic | DIFlagStaticMember, file: !33, scope: !13, baseType: !25, extraData: i32 18)
84
!25 = !DIDerivedType(tag: DW_TAG_const_type, baseType: !9)
85
!26 = !DIDerivedType(tag: DW_TAG_member, name: "d", line: 11, size: 32, align: 32, flags: DIFlagPublic, file: !33, scope: !13, baseType: !9)
86
!27 = !DIGlobalVariable(name: "b", linkageName: "_ZN1C1bE", line: 15, isLocal: false, isDefinition: true, scope: null, file: !6, type: !9, variable: i32* @_ZN1C1bE, declaration: !19)
87
!28 = !DIGlobalVariable(name: "c", linkageName: "_ZN1C1cE", line: 16, isLocal: false, isDefinition: true, scope: null, file: !6, type: !9, variable: i32* @_ZN1C1cE, declaration: !23)
88
!29 = !DILocalVariable(tag: DW_TAG_auto_variable, name: "instance_C", line: 20, scope: !5, file: !6, type: !13)
89
!30 = !DILocation(line: 20, scope: !5)
90
!31 = !DILocation(line: 21, scope: !5)
91
!32 = !DILocation(line: 22, scope: !5)
92
!33 = !DIFile(filename: "/usr/local/google/home/blaikie/Development/llvm/src/tools/clang/test/CodeGenCXX/debug-info-static-member.cpp", directory: "/home/blaikie/local/Development/llvm/build/clang/x86-64/Debug/llvm")
93
; PRESENT verifies that static member declarations have these attributes:
94
; external, declaration, accessibility, and either DW_AT_linkage_name
95
; (for variables) or DW_AT_const_value (for constants).
97
; PRESENT: .debug_info contents:
98
; PRESENT: DW_TAG_variable
99
; PRESENT-NEXT: DW_AT_specification {{.*}} "a"
100
; PRESENT-NEXT: DW_AT_location
101
; PRESENT-NEXT: DW_AT_linkage_name {{.*}} "_ZN1C1aE"
102
; PRESENT: DW_TAG_class_type
103
; PRESENT-NEXT: DW_AT_name {{.*}} "C"
104
; PRESENT: DW_TAG_member
105
; PRESENT-NEXT: DW_AT_name {{.*}} "a"
106
; PRESENT: DW_AT_external
107
; PRESENT: DW_AT_declaration
108
; PRESENT: DW_AT_accessibility [DW_FORM_data1] (DW_ACCESS_private)
109
; PRESENT: DW_TAG_member
110
; PRESENT-NEXT: DW_AT_name {{.*}} "const_a"
111
; PRESENT: DW_AT_external
112
; PRESENT: DW_AT_declaration
113
; PRESENT: DW_AT_accessibility [DW_FORM_data1] (DW_ACCESS_private)
114
; PRESENT: DW_AT_const_value {{.*}} (1)
115
; PRESENT: DW_TAG_member
116
; PRESENT-NEXT: DW_AT_name {{.*}} "b"
117
; PRESENT: DW_AT_accessibility [DW_FORM_data1] (DW_ACCESS_protected)
118
; PRESENT: DW_TAG_member
119
; PRESENT-NEXT: DW_AT_name {{.*}} "const_b"
120
; PRESENT: DW_AT_accessibility [DW_FORM_data1] (DW_ACCESS_protected)
121
; PRESENT: DW_AT_const_value [DW_FORM_udata] (1078523331)
122
; PRESENT: DW_TAG_member
123
; PRESENT-NEXT: DW_AT_name {{.*}} "c"
124
; PRESENT: DW_AT_accessibility [DW_FORM_data1] (DW_ACCESS_public)
125
; PRESENT: DW_TAG_member
126
; PRESENT-NEXT: DW_AT_name {{.*}} "const_c"
127
; PRESENT: DW_AT_accessibility [DW_FORM_data1] (DW_ACCESS_public)
128
; PRESENT: DW_AT_const_value {{.*}} (18)
129
; While we're here, a normal member has data_member_location and
130
; accessibility attributes.
131
; PRESENT: DW_TAG_member
132
; PRESENT-NEXT: DW_AT_name {{.*}} "d"
133
; PRESENT: DW_AT_data_member_location
134
; PRESENT: DW_AT_accessibility [DW_FORM_data1] (DW_ACCESS_public)
136
; Definitions point back to their declarations, and have a location.
137
; PRESENT: DW_TAG_variable
138
; PRESENT-NEXT: DW_AT_specification {{.*}} "b"
139
; PRESENT-NEXT: DW_AT_location
140
; PRESENT-NEXT: DW_AT_linkage_name {{.*}} "_ZN1C1bE"
141
; PRESENT: DW_TAG_variable
142
; PRESENT-NEXT: DW_AT_specification {{.*}} "c"
143
; PRESENT-NEXT: DW_AT_location
144
; PRESENT-NEXT: DW_AT_linkage_name {{.*}} "_ZN1C1cE"
147
; DARWINP: .debug_info contents:
148
; DARWINP: DW_TAG_variable
149
; DARWINP-NEXT: DW_AT_specification {{.*}} "a"
150
; DARWINP-NEXT: DW_AT_location
151
; DARWINP-NEXT: DW_AT_linkage_name {{.*}} "_ZN1C1aE"
152
; DARWINP: DW_TAG_class_type
153
; DARWINP-NEXT: DW_AT_name {{.*}} "C"
154
; DARWINP: DW_TAG_member
155
; DARWINP-NEXT: DW_AT_name {{.*}} "a"
156
; DARWINP: DW_AT_external
157
; DARWINP: DW_AT_declaration
158
; DARWINP: DW_AT_accessibility [DW_FORM_data1] (DW_ACCESS_private)
159
; DARWINP: DW_TAG_member
160
; DARWINP-NEXT: DW_AT_name {{.*}} "const_a"
161
; DARWINP: DW_AT_external
162
; DARWINP: DW_AT_declaration
163
; DARWINP: DW_AT_accessibility [DW_FORM_data1] (DW_ACCESS_private)
164
; DARWINP: DW_AT_const_value {{.*}} (1)
165
; DARWINP: DW_TAG_member
166
; DARWINP-NEXT: DW_AT_name {{.*}} "b"
167
; DARWINP: DW_AT_accessibility [DW_FORM_data1] (DW_ACCESS_protected)
168
; DARWINP: DW_TAG_member
169
; DARWINP-NEXT: DW_AT_name {{.*}} "const_b"
170
; DARWINP: DW_AT_accessibility [DW_FORM_data1] (DW_ACCESS_protected)
171
; DARWINP: DW_AT_const_value [DW_FORM_udata] (1078523331)
172
; DARWINP: DW_TAG_member
173
; DARWINP-NEXT: DW_AT_name {{.*}} "c"
174
; DARWINP: DW_AT_accessibility [DW_FORM_data1] (DW_ACCESS_public)
175
; DARWINP: DW_TAG_member
176
; DARWINP-NEXT: DW_AT_name {{.*}} "const_c"
177
; DARWINP: DW_AT_accessibility [DW_FORM_data1] (DW_ACCESS_public)
178
; DARWINP: DW_AT_const_value {{.*}} (18)
179
; While we're here, a normal member has data_member_location and
180
; accessibility attributes.
181
; DARWINP: DW_TAG_member
182
; DARWINP-NEXT: DW_AT_name {{.*}} "d"
183
; DARWINP: DW_AT_data_member_location
184
; DARWINP: DW_AT_accessibility [DW_FORM_data1] (DW_ACCESS_public)
186
; Definitions point back to their declarations, and have a location.
187
; DARWINP: DW_TAG_variable
188
; DARWINP-NEXT: DW_AT_specification {{.*}} "b"
189
; DARWINP-NEXT: DW_AT_location
190
; DARWINP-NEXT: DW_AT_linkage_name {{.*}} "_ZN1C1bE"
191
; DARWINP: DW_TAG_variable
192
; DARWINP-NEXT: DW_AT_specification {{.*}} "c"
193
; DARWINP-NEXT: DW_AT_location
194
; DARWINP-NEXT: DW_AT_linkage_name {{.*}} "_ZN1C1cE"
196
; ABSENT verifies that static member declarations do not have either
197
; DW_AT_location or DW_AT_data_member_location; also, variables do not
198
; have DW_AT_const_value and constants do not have DW_AT_linkage_name.
200
; ABSENT: .debug_info contents:
201
; ABSENT: DW_TAG_member
202
; ABSENT: DW_AT_name {{.*}} "a"
203
; ABSENT-NOT: DW_AT_const_value
204
; ABSENT-NOT: location
205
; ABSENT: DW_AT_name {{.*}} "const_a"
206
; ABSENT-NOT: DW_AT_linkage_name
207
; ABSENT-NOT: location
208
; ABSENT: DW_AT_name {{.*}} "b"
209
; ABSENT-NOT: DW_AT_const_value
210
; ABSENT-NOT: location
211
; ABSENT: DW_AT_name {{.*}} "const_b"
212
; ABSENT-NOT: DW_AT_linkage_name
213
; ABSENT-NOT: location
214
; ABSENT: DW_AT_name {{.*}} "c"
215
; ABSENT-NOT: DW_AT_const_value
216
; ABSENT-NOT: location
217
; ABSENT: DW_AT_name {{.*}} "const_c"
218
; ABSENT-NOT: DW_AT_linkage_name
219
; ABSENT-NOT: location
220
; While we're here, a normal member does not have a linkage name, constant
221
; value, or DW_AT_location.
222
; ABSENT: DW_AT_name {{.*}} "d"
223
; ABSENT-NOT: DW_AT_linkage_name
224
; ABSENT-NOT: DW_AT_const_value
225
; ABSENT-NOT: DW_AT_location
229
; DARWINA: .debug_info contents:
230
; DARWINA: DW_TAG_member
231
; DARWINA: DW_AT_name {{.*}} "a"
232
; DARWINA-NOT: DW_AT_const_value
233
; DARWINA-NOT: location
234
; DARWINA: DW_AT_name {{.*}} "const_a"
235
; DARWINA-NOT: DW_AT_linkage_name
236
; DARWINA-NOT: location
237
; DARWINA: DW_AT_name {{.*}} "b"
238
; DARWINA-NOT: DW_AT_const_value
239
; DARWINA-NOT: location
240
; DARWINA: DW_AT_name {{.*}} "const_b"
241
; DARWINA-NOT: DW_AT_linkage_name
242
; DARWINA-NOT: location
243
; DARWINA: DW_AT_name {{.*}} "c"
244
; DARWINA-NOT: DW_AT_const_value
245
; DARWINA-NOT: location
246
; DARWINA: DW_AT_name {{.*}} "const_c"
247
; DARWINA-NOT: DW_AT_linkage_name
248
; DARWINA-NOT: location
249
; While we're here, a normal member does not have a linkage name, constant
250
; value, or DW_AT_location.
251
; DARWINA: DW_AT_name {{.*}} "d"
252
; DARWINA-NOT: DW_AT_linkage_name
253
; DARWINA-NOT: DW_AT_const_value
254
; DARWINA-NOT: DW_AT_location
256
!34 = !{i32 1, !"Debug Info Version", i32 3}