diff options
author | David Blaikie <dblaikie@gmail.com> | 2019-04-25 20:05:47 +0000 |
---|---|---|
committer | David Blaikie <dblaikie@gmail.com> | 2019-04-25 20:05:47 +0000 |
commit | f0d66559ea345db4b2116cae044aaf3399d7e829 (patch) | |
tree | 7c7ad761257af5023d0de8af9608872faf084618 /clang | |
parent | 3775794812e582769e2ed1b53c00650a6b21387c (diff) | |
download | bcm5719-llvm-f0d66559ea345db4b2116cae044aaf3399d7e829.tar.gz bcm5719-llvm-f0d66559ea345db4b2116cae044aaf3399d7e829.zip |
Skip type units/type uniquing when we know we're only emitting the type once (vtable-based emission when triggered by a strong vtable, with -fno-standalone-debug)
(this would regress size without a corresponding LLVM change that avoids
putting other user defined types inside type units when they aren't in
their own type units - instead emitting declarations inside the type
unit and a definition in the primary CU)
Reviewers: aprantl
Differential Revision: https://reviews.llvm.org/D61079
llvm-svn: 359235
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/CodeGen/CGDebugInfo.cpp | 5 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/debug-info-class.cpp | 30 | ||||
-rw-r--r-- | clang/test/Modules/ExtDebugInfo.cpp | 2 | ||||
-rw-r--r-- | clang/test/Modules/ModuleDebugInfo.cpp | 3 |
4 files changed, 30 insertions, 10 deletions
diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp index d62757ec917..80d34846232 100644 --- a/clang/lib/CodeGen/CGDebugInfo.cpp +++ b/clang/lib/CodeGen/CGDebugInfo.cpp @@ -915,6 +915,11 @@ static SmallString<256> getTypeIdentifier(const TagType *Ty, CodeGenModule &CGM, if (!needsTypeIdentifier(TD, CGM, TheCU)) return Identifier; + if (const auto *RD = dyn_cast<CXXRecordDecl>(TD)) + if (RD->getDefinition()) + if (RD->isDynamicClass() && + CGM.getVTableLinkage(RD) == llvm::GlobalValue::ExternalLinkage) + return Identifier; // TODO: This is using the RTTI name. Is there a better way to get // a unique string for a type? diff --git a/clang/test/CodeGenCXX/debug-info-class.cpp b/clang/test/CodeGenCXX/debug-info-class.cpp index 747b377ffb2..b3e79c37923 100644 --- a/clang/test/CodeGenCXX/debug-info-class.cpp +++ b/clang/test/CodeGenCXX/debug-info-class.cpp @@ -57,6 +57,11 @@ struct I : virtual H {}; struct J : I {}; J j; +struct K { + virtual void func() { + } +}; + struct A { int one; static const int HdrSize = 52; @@ -72,6 +77,8 @@ void f1() { E y; int i = F::i; F::inner z; + K k; + k.func(); } int main(int argc, char **argv) { @@ -98,7 +105,8 @@ int main(int argc, char **argv) { // CHECK: [[F:![0-9]*]] = !DICompositeType(tag: DW_TAG_structure_type, name: "F" // CHECK-SAME: DIFlagFwdDecl -// CHECK-SAME: identifier: "_ZTS1F" +// CHECK-NOT: identifier: +// CHECK-SAME: ){{$}} // CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "I" // CHECK-NOT: DIFlagFwdDecl // CHECK-SAME: ){{$}} @@ -117,7 +125,8 @@ int main(int argc, char **argv) { // CHECK-NOT: DIFlagFwdDecl // CHECK-SAME: elements: [[C_MEM:![0-9]*]] // CHECK-SAME: vtableHolder: [[C]] -// CHECK-SAME: identifier: "_ZTS1C" +// CHECK-NOT: identifier: +// CHECK-SAME: ){{$}} // CHECK: [[C_MEM]] = !{[[C_VPTR:![0-9]*]], [[C_S:![0-9]*]], [[C_DTOR:![0-9]*]]} // CHECK: [[C_VPTR]] = !DIDerivedType(tag: DW_TAG_member, name: "_vptr$C" // CHECK-SAME: DIFlagArtificial @@ -129,10 +138,16 @@ int main(int argc, char **argv) { // CHECK: [[D:![0-9]+]] = !DICompositeType(tag: DW_TAG_structure_type, name: "D" // CHECK-NOT: size: // CHECK-SAME: DIFlagFwdDecl -// CHECK-SAME: identifier: "_ZTS1D" +// CHECK-NOT: identifier: +// CHECK-SAME: ){{$}} // CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "E" // CHECK-SAME: DIFlagFwdDecl -// CHECK-SAME: identifier: "_ZTS1E" +// CHECK-NOT: identifier: +// CHECK-SAME: ){{$}} + +// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "K" +// CHECK-SAME: identifier: "_ZTS1K" +// CHECK-SAME: ){{$}} // CHECK: !DISubprogram(name: "func",{{.*}} scope: [[D]] // CHECK-SAME: DISPFlagDefinition @@ -146,7 +161,8 @@ int main(int argc, char **argv) { // CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "G" // CHECK-SAME: DIFlagFwdDecl -// CHECK-SAME: identifier: "_ZTS1G" +// CHECK-NOT: identifier: +// CHECK-SAME: ){{$}} // CHECK: [[G_INNER_MEM]] = !{[[G_INNER_I:![0-9]*]]} // CHECK: [[G_INNER_I]] = !DIDerivedType(tag: DW_TAG_member, name: "j" // CHECK-SAME: baseType: ![[INT]] @@ -154,5 +170,5 @@ int main(int argc, char **argv) { // CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "A" // CHECK: !DIDerivedType(tag: DW_TAG_member, name: "HdrSize" // -// CHECK: ![[EXCEPTLOC]] = !DILocation(line: 84, -// CHECK: ![[RETLOC]] = !DILocation(line: 83, +// CHECK: ![[EXCEPTLOC]] = !DILocation(line: 91, +// CHECK: ![[RETLOC]] = !DILocation(line: 90, diff --git a/clang/test/Modules/ExtDebugInfo.cpp b/clang/test/Modules/ExtDebugInfo.cpp index 592612b9a5d..5d2921cd995 100644 --- a/clang/test/Modules/ExtDebugInfo.cpp +++ b/clang/test/Modules/ExtDebugInfo.cpp @@ -214,7 +214,7 @@ void foo() { // CHECK-PCH: dwoId: 18446744073709551614 // CHECK: !DICompositeType(tag: DW_TAG_class_type, name: "A", -// CHECK-SAME: DIFlagFwdDecl, identifier: "_ZTS1A") +// CHECK-SAME: DIFlagFwdDecl) // There is a full definition of the type available in the module. // CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "Virtual", diff --git a/clang/test/Modules/ModuleDebugInfo.cpp b/clang/test/Modules/ModuleDebugInfo.cpp index 116aa5fc310..6fe546f7013 100644 --- a/clang/test/Modules/ModuleDebugInfo.cpp +++ b/clang/test/Modules/ModuleDebugInfo.cpp @@ -119,8 +119,7 @@ // CHECK: ![[A:.*]] = {{.*}}!DICompositeType(tag: DW_TAG_class_type, name: "A", // CHECK-SAME: elements: -// CHECK-SAME: vtableHolder: ![[A]], -// CHECK-SAME: identifier: "_ZTS1A") +// CHECK-SAME: vtableHolder: ![[A]]) // CHECK: ![[DERIVED:.*]] = {{.*}}!DICompositeType(tag: DW_TAG_class_type, name: "Derived", // CHECK-SAME: identifier: "_ZTS7Derived") |