Skip to content

Commit 8a396cf

Browse files
jmorsedzhidzhoev
authored andcommitted
[DebugMetadata][DwarfDebug] Support function-local types in lexical block scopes (4/7)
RFC https://discourse.llvm.org/t/rfc-dwarfdebug-fix-and-improve-handling-imported-entities-types-and-static-local-in-subprogram-and-lexical-block-scopes/68544 Similar to imported declarations, the patch tracks function-local types in DISubprogram's 'retainedNodes' field. DwarfDebug is adjusted in accordance with the aforementioned metadata change and provided a support of function-local types scoped within a lexical block. The patch assumes that DICompileUnit's 'enums field' no longer tracks local types and DwarfDebug would assert if any locally-scoped types get placed there. Reviewed By: jmmartinez Authored-by: Kristina Bessonova <[email protected]> Differential Revision: https://reviews.llvm.org/D144006 (cherry picked from commit 2953d4a) Signed-off-by: Jeremy Morse <[email protected]> Conflicts: llvm/lib/IR/DIBuilder.cpp llvm/lib/IR/DebugInfo.cpp llvm/lib/Transforms/Utils/CloneFunction.cpp
1 parent 911e5aa commit 8a396cf

29 files changed

+1254
-195
lines changed

clang/test/DebugInfo/CXX/access.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ class B : public A {
1818
static int public_static;
1919

2020
protected:
21+
// CHECK-DAG: !DIDerivedType(tag: DW_TAG_typedef, name: "prot_using",{{.*}} line: [[@LINE+3]],{{.*}} flags: DIFlagProtected)
2122
// CHECK-DAG: !DIDerivedType(tag: DW_TAG_typedef, name: "prot_typedef",{{.*}} line: [[@LINE+1]],{{.*}} flags: DIFlagProtected)
2223
typedef int prot_typedef;
23-
// CHECK-DAG: !DIDerivedType(tag: DW_TAG_typedef, name: "prot_using",{{.*}} line: [[@LINE+1]],{{.*}} flags: DIFlagProtected)
2424
using prot_using = prot_typedef;
2525
prot_using prot_member;
2626

clang/test/DebugInfo/CXX/anon-union-vars.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,13 @@ void instantiate(int x) {
5151
// CHECK: !DIGlobalVariable(name: "b",{{.*}} file: [[FILE]], line: 6,{{.*}} isLocal: true, isDefinition: true
5252
// CHECK: !DIGlobalVariable(name: "result", {{.*}} isLocal: false, isDefinition: true
5353
// CHECK: !DIGlobalVariable(name: "value", {{.*}} isLocal: false, isDefinition: true
54-
// CHECK: !DILocalVariable(name: "i", {{.*}}, flags: DIFlagArtificial
55-
// CHECK: !DILocalVariable(name: "c", {{.*}}, flags: DIFlagArtificial
56-
// CHECK: !DILocalVariable(
57-
// CHECK-NOT: name:
58-
// CHECK: type: ![[UNION:[0-9]+]]
59-
// CHECK: ![[UNION]] = distinct !DICompositeType(tag: DW_TAG_union_type,
54+
// CHECK: ![[UNION:[0-9]+]] = distinct !DICompositeType(tag: DW_TAG_union_type,
6055
// CHECK-NOT: name:
6156
// CHECK: elements
6257
// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "i", scope: ![[UNION]],
6358
// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "c", scope: ![[UNION]],
59+
// CHECK: !DILocalVariable(name: "i", {{.*}}, flags: DIFlagArtificial
60+
// CHECK: !DILocalVariable(name: "c", {{.*}}, flags: DIFlagArtificial
61+
// CHECK: !DILocalVariable(
62+
// CHECK-NOT: name:
63+
// CHECK: type: ![[UNION]]

clang/test/DebugInfo/CXX/codeview-unnamed.cpp

Lines changed: 62 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,72 @@
44

55
int main(int argc, char* argv[], char* arge[]) {
66
//
7+
// LINUX: [[TYPE_OF_ONE:![0-9]+]] = distinct !DICompositeType(
8+
// LINUX-SAME: tag: DW_TAG_structure_type
9+
// LINUX-NOT: name:
10+
// LINUX-NOT: identifier:
11+
// LINUX-SAME: )
12+
//
13+
// MSVC: [[TYPE_OF_ONE:![0-9]+]] = distinct !DICompositeType
14+
// MSVC-SAME: tag: DW_TAG_structure_type
15+
// MSVC-SAME: name: "<unnamed-type-one>"
16+
// MSVC-SAME: identifier: ".?AU<unnamed-type-one>@?1??main@@9@"
17+
// MSVC-SAME: )
18+
19+
20+
//
21+
// LINUX: [[TYPE_OF_TWO:![0-9]+]] = distinct !DICompositeType(
22+
// LINUX-SAME: tag: DW_TAG_structure_type
23+
// LINUX-NOT: name:
24+
// LINUX-NOT: identifier:
25+
// LINUX-SAME: )
26+
//
27+
// MSVC: [[TYPE_OF_TWO:![0-9]+]] = distinct !DICompositeType
28+
// MSVC-SAME: tag: DW_TAG_structure_type
29+
// MSVC-SAME: name: "<unnamed-type-two>"
30+
// MSVC-SAME: identifier: ".?AU<unnamed-type-two>@?2??main@@9@"
31+
// MSVC-SAME: )
32+
33+
34+
//
35+
// LINUX: [[TYPE_OF_THREE:![0-9]+]] = distinct !DICompositeType(
36+
// LINUX-SAME: tag: DW_TAG_structure_type
37+
// LINUX-SAME: name: "named"
38+
// LINUX-NOT: identifier:
39+
// LINUX-SAME: )
40+
//
41+
// MSVC: [[TYPE_OF_THREE:![0-9]+]] = distinct !DICompositeType
42+
// MSVC-SAME: tag: DW_TAG_structure_type
43+
// MSVC-SAME: name: "named"
44+
// MSVC-SAME: identifier: ".?AUnamed@?1??main@@9@"
45+
// MSVC-SAME: )
46+
47+
//
48+
// LINUX: [[TYPE_OF_FOUR:![0-9]+]] = distinct !DICompositeType(
49+
// LINUX-SAME: tag: DW_TAG_class_type
50+
// LINUX-NOT: name:
51+
// LINUX-NOT: identifier:
52+
// LINUX-SAME: )
53+
//
54+
// MSVC: [[TYPE_OF_FOUR:![0-9]+]] = distinct !DICompositeType
55+
// MSVC-SAME: tag: DW_TAG_class_type
56+
// MSVC-SAME: name: "<lambda_0>"
57+
// MSVC-SAME: identifier: ".?AV<lambda_0>@?0??main@@9@"
58+
// MSVC-SAME: )
59+
60+
761
// In CodeView, the LF_MFUNCTION entry for "bar()" refers to the forward
862
// reference of the unnamed struct. Visual Studio requires a unique
963
// identifier to match the LF_STRUCTURE forward reference to the definition.
1064
//
1165
struct { void bar() {} } one;
1266
//
1367
// LINUX: !{{[0-9]+}} = !DILocalVariable(name: "one"
14-
// LINUX-SAME: type: [[TYPE_OF_ONE:![0-9]+]]
15-
// LINUX-SAME: )
16-
// LINUX: [[TYPE_OF_ONE]] = distinct !DICompositeType(
17-
// LINUX-SAME: tag: DW_TAG_structure_type
18-
// LINUX-NOT: name:
19-
// LINUX-NOT: identifier:
68+
// LINUX-SAME: type: [[TYPE_OF_ONE]]
2069
// LINUX-SAME: )
2170
//
2271
// MSVC: !{{[0-9]+}} = !DILocalVariable(name: "one"
23-
// MSVC-SAME: type: [[TYPE_OF_ONE:![0-9]+]]
24-
// MSVC-SAME: )
25-
// MSVC: [[TYPE_OF_ONE]] = distinct !DICompositeType
26-
// MSVC-SAME: tag: DW_TAG_structure_type
27-
// MSVC-SAME: name: "<unnamed-type-one>"
28-
// MSVC-SAME: identifier: ".?AU<unnamed-type-one>@?1??main@@9@"
72+
// MSVC-SAME: type: [[TYPE_OF_ONE]]
2973
// MSVC-SAME: )
3074

3175

@@ -37,21 +81,11 @@ int main(int argc, char* argv[], char* arge[]) {
3781
int decltype(two)::*ptr2unnamed = &decltype(two)::bar;
3882
//
3983
// LINUX: !{{[0-9]+}} = !DILocalVariable(name: "two"
40-
// LINUX-SAME: type: [[TYPE_OF_TWO:![0-9]+]]
41-
// LINUX-SAME: )
42-
// LINUX: [[TYPE_OF_TWO]] = distinct !DICompositeType(
43-
// LINUX-SAME: tag: DW_TAG_structure_type
44-
// LINUX-NOT: name:
45-
// LINUX-NOT: identifier:
84+
// LINUX-SAME: type: [[TYPE_OF_TWO]]
4685
// LINUX-SAME: )
4786
//
4887
// MSVC: !{{[0-9]+}} = !DILocalVariable(name: "two"
49-
// MSVC-SAME: type: [[TYPE_OF_TWO:![0-9]+]]
50-
// MSVC-SAME: )
51-
// MSVC: [[TYPE_OF_TWO]] = distinct !DICompositeType
52-
// MSVC-SAME: tag: DW_TAG_structure_type
53-
// MSVC-SAME: name: "<unnamed-type-two>"
54-
// MSVC-SAME: identifier: ".?AU<unnamed-type-two>@?2??main@@9@"
88+
// MSVC-SAME: type: [[TYPE_OF_TWO]]
5589
// MSVC-SAME: )
5690

5791

@@ -62,21 +96,11 @@ int main(int argc, char* argv[], char* arge[]) {
6296
struct named { int bar; int named::* p2mem; } three = { 42, &named::bar };
6397
//
6498
// LINUX: !{{[0-9]+}} = !DILocalVariable(name: "three"
65-
// LINUX-SAME: type: [[TYPE_OF_THREE:![0-9]+]]
66-
// LINUX-SAME: )
67-
// LINUX: [[TYPE_OF_THREE]] = distinct !DICompositeType(
68-
// LINUX-SAME: tag: DW_TAG_structure_type
69-
// LINUX-SAME: name: "named"
70-
// LINUX-NOT: identifier:
99+
// LINUX-SAME: type: [[TYPE_OF_THREE]]
71100
// LINUX-SAME: )
72101
//
73102
// MSVC: !{{[0-9]+}} = !DILocalVariable(name: "three"
74-
// MSVC-SAME: type: [[TYPE_OF_THREE:![0-9]+]]
75-
// MSVC-SAME: )
76-
// MSVC: [[TYPE_OF_THREE]] = distinct !DICompositeType
77-
// MSVC-SAME: tag: DW_TAG_structure_type
78-
// MSVC-SAME: name: "named"
79-
// MSVC-SAME: identifier: ".?AUnamed@?1??main@@9@"
103+
// MSVC-SAME: type: [[TYPE_OF_THREE]]
80104
// MSVC-SAME: )
81105

82106

@@ -88,21 +112,11 @@ int main(int argc, char* argv[], char* arge[]) {
88112
auto four = [argc](int i) -> int { return argc == i ? 1 : 0; };
89113
//
90114
// LINUX: !{{[0-9]+}} = !DILocalVariable(name: "four"
91-
// LINUX-SAME: type: [[TYPE_OF_FOUR:![0-9]+]]
92-
// LINUX-SAME: )
93-
// LINUX: [[TYPE_OF_FOUR]] = distinct !DICompositeType(
94-
// LINUX-SAME: tag: DW_TAG_class_type
95-
// LINUX-NOT: name:
96-
// LINUX-NOT: identifier:
115+
// LINUX-SAME: type: [[TYPE_OF_FOUR]]
97116
// LINUX-SAME: )
98117
//
99118
// MSVC: !{{[0-9]+}} = !DILocalVariable(name: "four"
100-
// MSVC-SAME: type: [[TYPE_OF_FOUR:![0-9]+]]
101-
// MSVC-SAME: )
102-
// MSVC: [[TYPE_OF_FOUR]] = distinct !DICompositeType
103-
// MSVC-SAME: tag: DW_TAG_class_type
104-
// MSVC-SAME: name: "<lambda_0>"
105-
// MSVC-SAME: identifier: ".?AV<lambda_0>@?0??main@@9@"
119+
// MSVC-SAME: type: [[TYPE_OF_FOUR]]
106120
// MSVC-SAME: )
107121

108122
return 0;

clang/test/DebugInfo/CXX/gline-tables-only-codeview.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,9 @@ void test() {
5151
// CHECK-SAME: name: "<lambda_2_1>",
5252
c.lambda_params();
5353

54-
// CHECK: !DISubprogram(name: "operator()", scope: ![[LAMBDA1:[0-9]+]],
55-
// CHECK: ![[LAMBDA1]] = !DICompositeType(tag: DW_TAG_class_type,
54+
// CHECK: ![[LAMBDA1:[0-9]+]] = !DICompositeType(tag: DW_TAG_class_type,
5655
// CHECK-SAME: name: "<lambda_1>",
5756
// CHECK-SAME: flags: DIFlagFwdDecl
57+
// CHECK: !DISubprogram(name: "operator()", scope: ![[LAMBDA1]],
5858
c.lambda2();
5959
}

clang/test/DebugInfo/CXX/lambda-this.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@ void D::d(int x) {
1313
}
1414

1515
// CHECK: ![[D:[0-9]+]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "D",
16-
// CHECK: ![[POINTER:.*]] = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: ![[D]], size: 64)
1716
// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "this",
1817
// CHECK-SAME: line: 11
19-
// CHECK-SAME: baseType: ![[POINTER]]
18+
// CHECK-SAME: baseType: ![[POINTER:[0-9]+]]
2019
// CHECK-SAME: size: 64
2120
// CHECK-NOT: offset: 0
2221
// CHECK-SAME: ){{$}}
22+
// CHECK: ![[POINTER]] = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: ![[D]], size: 64)

clang/test/DebugInfo/Generic/codeview-unnamed.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,23 @@ int main(int argc, char* argv[], char* arge[]) {
88
//
99
struct { int bar; } one = {42};
1010
//
11-
// LINUX: !{{[0-9]+}} = !DILocalVariable(name: "one"
12-
// LINUX-SAME: type: [[TYPE_OF_ONE:![0-9]+]]
13-
// LINUX-SAME: )
14-
// LINUX: [[TYPE_OF_ONE]] = distinct !DICompositeType(
11+
// LINUX: [[TYPE_OF_ONE:![0-9]+]] = distinct !DICompositeType(
1512
// LINUX-SAME: tag: DW_TAG_structure_type
1613
// LINUX-NOT: name:
1714
// LINUX-NOT: identifier:
1815
// LINUX-SAME: )
16+
// LINUX: !{{[0-9]+}} = !DILocalVariable(name: "one"
17+
// LINUX-SAME: type: [[TYPE_OF_ONE]]
18+
// LINUX-SAME: )
1919
//
20-
// MSVC: !{{[0-9]+}} = !DILocalVariable(name: "one"
21-
// MSVC-SAME: type: [[TYPE_OF_ONE:![0-9]+]]
22-
// MSVC-SAME: )
23-
// MSVC: [[TYPE_OF_ONE]] = distinct !DICompositeType
20+
// MSVC: [[TYPE_OF_ONE:![0-9]+]] = distinct !DICompositeType
2421
// MSVC-SAME: tag: DW_TAG_structure_type
2522
// MSVC-NOT: name:
2623
// MSVC-NOT: identifier:
2724
// MSVC-SAME: )
25+
// MSVC: !{{[0-9]+}} = !DILocalVariable(name: "one"
26+
// MSVC-SAME: type: [[TYPE_OF_ONE]]
27+
// MSVC-SAME: )
2828

2929
return 0;
3030
}

clang/test/DebugInfo/Generic/unused-types.c

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,15 @@ void quux(void) {
1818
// CHECK: !DICompileUnit{{.+}}retainedTypes: [[RETTYPES:![0-9]+]]
1919
// CHECK: [[TYPE0:![0-9]+]] = !DICompositeType(tag: DW_TAG_enumeration_type, name: "bar"
2020
// CHECK: [[TYPE1:![0-9]+]] = !DIEnumerator(name: "BAR"
21-
// CHECK: [[TYPE2:![0-9]+]] = !DICompositeType(tag: DW_TAG_enumeration_type, name: "z"
22-
// CHECK: [[TYPE3:![0-9]+]] = !DIEnumerator(name: "Z"
23-
// CHECK: [[RETTYPES]] = !{[[TYPE4:![0-9]+]], [[TYPE5:![0-9]+]], [[TYPE0]], [[TYPE6:![0-9]+]], {{![0-9]+}}, [[TYPE7:![0-9]+]], [[TYPE2]], [[TYPE8:![0-9]+]]}
24-
// CHECK: [[TYPE4]] = !DIDerivedType(tag: DW_TAG_typedef, name: "my_int"
25-
// CHECK: [[TYPE5]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "foo"
26-
// CHECK: [[TYPE6]] = distinct !DICompositeType(tag: DW_TAG_union_type, name: "baz"
27-
// CHECK: [[TYPE7]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "y"
21+
// CHECK: [[RETTYPES]] = !{[[TYPE2:![0-9]+]], [[TYPE3:![0-9]+]], [[TYPE0]], [[TYPE4:![0-9]+]], {{![0-9]+}}}
22+
// CHECK: [[TYPE2]] = !DIDerivedType(tag: DW_TAG_typedef, name: "my_int"
23+
// CHECK: [[TYPE3]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "foo"
24+
// CHECK: [[TYPE4]] = distinct !DICompositeType(tag: DW_TAG_union_type, name: "baz"
25+
// CHECK: [[SP:![0-9]+]] = distinct !DISubprogram(name: "quux", {{.*}}, retainedNodes: [[SPRETNODES:![0-9]+]]
26+
// CHECK: [[SPRETNODES]] = !{[[TYPE5:![0-9]+]], [[TYPE6:![0-9]+]], [[TYPE8:![0-9]+]]}
27+
// CHECK: [[TYPE5]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "y"
28+
// CHECK: [[TYPE6]] = !DICompositeType(tag: DW_TAG_enumeration_type, name: "z"
29+
// CHECK: [[TYPE7:![0-9]+]] = !DIEnumerator(name: "Z"
2830
// CHECK: [[TYPE8]] = distinct !DICompositeType(tag: DW_TAG_union_type, name: "w"
2931

3032
// Check that debug info is not emitted for the typedef, struct, enum, and

clang/test/DebugInfo/Generic/unused-types.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,14 @@ void quux() {
1313
// CHECK: !DICompileUnit{{.+}}retainedTypes: [[RETTYPES:![0-9]+]]
1414
// CHECK: [[TYPE0:![0-9]+]] = !DICompositeType(tag: DW_TAG_enumeration_type, name: "baz"
1515
// CHECK: [[TYPE1:![0-9]+]] = !DIEnumerator(name: "BAZ"
16-
// CHECK: [[TYPE2:![0-9]+]] = !DICompositeType(tag: DW_TAG_enumeration_type, name: "z"
17-
// CHECK: [[TYPE3:![0-9]+]] = !DIEnumerator(name: "Z"
18-
// CHECK: [[RETTYPES]] = !{[[TYPE4:![0-9]+]], [[TYPE5:![0-9]+]], [[TYPE0]], {{![0-9]+}}, [[TYPE6:![0-9]+]], [[TYPE2]]}
19-
// CHECK: [[TYPE4]] = !DIDerivedType(tag: DW_TAG_typedef, name: "foo"
20-
// CHECK: [[TYPE5]] = distinct !DICompositeType(tag: DW_TAG_class_type, name: "bar"
21-
// CHECK: [[TYPE6]] = distinct !DICompositeType(tag: DW_TAG_class_type, name: "y"
16+
// CHECK: [[RETTYPES]] = !{[[TYPE2:![0-9]+]], [[TYPE3:![0-9]+]], [[TYPE0]], {{![0-9]+}}}
17+
// CHECK: [[TYPE2]] = !DIDerivedType(tag: DW_TAG_typedef, name: "foo"
18+
// CHECK: [[TYPE3]] = distinct !DICompositeType(tag: DW_TAG_class_type, name: "bar"
19+
// CHECK: [[SP:![0-9]+]] = distinct !DISubprogram(name: "quux", {{.*}}, retainedNodes: [[SPRETNODES:![0-9]+]]
20+
// CHECK: [[SPRETNODES]] = !{[[TYPE4:![0-9]+]], [[TYPE5:![0-9]+]]}
21+
// CHECK: [[TYPE4]] = distinct !DICompositeType(tag: DW_TAG_class_type, name: "y", scope: [[SP]]
22+
// CHECK: [[TYPE5]] = !DICompositeType(tag: DW_TAG_enumeration_type, name: "z", scope: [[SP]]
23+
// CHECK: [[TYPE6:![0-9]+]] = !DIEnumerator(name: "Z"
2224

2325
// NODBG-NOT: !DI{{CompositeType|Enumerator|DerivedType}}
2426

llvm/include/llvm/IR/DIBuilder.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ namespace llvm {
4949

5050
DICompileUnit *CUNode; ///< The one compile unit created by this DIBuiler.
5151

52-
SmallVector<TrackingMDNodeRef, 4> AllEnumTypes;
52+
SmallVector<TrackingMDNodeRef, 4> EnumTypes;
5353
/// Track the RetainTypes, since they can be updated later on.
5454
SmallVector<TrackingMDNodeRef, 4> AllRetainTypes;
5555
SmallVector<DISubprogram *, 4> AllSubprograms;
@@ -64,8 +64,8 @@ namespace llvm {
6464
SmallVector<TrackingMDNodeRef, 4> UnresolvedNodes;
6565
bool AllowUnresolvedNodes;
6666

67-
/// Each subprogram's preserved local variables, labels and imported
68-
/// entities.
67+
/// Each subprogram's preserved local variables, labels, imported entities,
68+
/// and types.
6969
///
7070
/// Do not use a std::vector. Some versions of libc++ apparently copy
7171
/// instead of move on grow operations, and TrackingMDRef is expensive to

0 commit comments

Comments
 (0)