akhuang created this revision. akhuang added reviewers: rnk, dblaikie. Herald added a project: clang. Herald added a subscriber: cfe-commits. akhuang requested review of this revision.
There are some types in libcxx that are used but their constructors are not called (__hash_node, __hash_value_type, __tree_node, __value_type), which means that with constructor homing, the types are not complete. This patch avoids using ctor homing if there are no constructors in the class definition. So it'll mean we emit some extra debug info in places. I also re-measured the size of object files in a clang build -debug-info-kind=limited: 5568746k -debug-info-kind=constructor: 2695028k after this patch: 2685607k So they're ~10mb larger after this change, which is not too bad. In terms of testing, in chromium (on windows) there's visualization for libcxx types and all of those types are displayed correctly after this patch, so I think that means all the STL types are getting emitted now. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D90719 Files: clang/lib/CodeGen/CGDebugInfo.cpp clang/test/CodeGenCXX/debug-info-limited-ctor.cpp Index: clang/test/CodeGenCXX/debug-info-limited-ctor.cpp =================================================================== --- clang/test/CodeGenCXX/debug-info-limited-ctor.cpp +++ clang/test/CodeGenCXX/debug-info-limited-ctor.cpp @@ -74,6 +74,14 @@ auto func = [&]() {}; } +// Test that a class that otherwise should be subject to constructor homing +// is not because its constructor isn't used in this translation unit. +// CHECK-DAG: !DICompositeType({{.*}}name: "M",{{.*}}DIFlagTypePassByValue +class M { + B b; +}; +void f(M m) {} + // Check that types are being added to retained types list. // CHECK-DAG: !DICompileUnit{{.*}}retainedTypes: ![[RETAINED:[0-9]+]] // CHECK-DAG: ![[RETAINED]] = {{.*}}![[C]] Index: clang/lib/CodeGen/CGDebugInfo.cpp =================================================================== --- clang/lib/CodeGen/CGDebugInfo.cpp +++ clang/lib/CodeGen/CGDebugInfo.cpp @@ -2300,7 +2300,16 @@ if (isClassOrMethodDLLImport(RD)) return false; - return !RD->isLambda() && !RD->isAggregate() && + // Attempt to avoid using constructor homing if a class is used but for + // whatever reason is not constructed. Constructors are added to the class + // definition when used, so use the existence of constructors here as a + // heuristic. + bool HasCtor = false; + for (auto *Ctor : RD->ctors()) + if (!Ctor->isCopyOrMoveConstructor() && !Ctor->isDeleted()) + HasCtor = true; + + return HasCtor && !RD->isLambda() && !RD->isAggregate() && !RD->hasTrivialDefaultConstructor() && !RD->hasConstexprNonCopyMoveConstructor(); }
Index: clang/test/CodeGenCXX/debug-info-limited-ctor.cpp =================================================================== --- clang/test/CodeGenCXX/debug-info-limited-ctor.cpp +++ clang/test/CodeGenCXX/debug-info-limited-ctor.cpp @@ -74,6 +74,14 @@ auto func = [&]() {}; } +// Test that a class that otherwise should be subject to constructor homing +// is not because its constructor isn't used in this translation unit. +// CHECK-DAG: !DICompositeType({{.*}}name: "M",{{.*}}DIFlagTypePassByValue +class M { + B b; +}; +void f(M m) {} + // Check that types are being added to retained types list. // CHECK-DAG: !DICompileUnit{{.*}}retainedTypes: ![[RETAINED:[0-9]+]] // CHECK-DAG: ![[RETAINED]] = {{.*}}![[C]] Index: clang/lib/CodeGen/CGDebugInfo.cpp =================================================================== --- clang/lib/CodeGen/CGDebugInfo.cpp +++ clang/lib/CodeGen/CGDebugInfo.cpp @@ -2300,7 +2300,16 @@ if (isClassOrMethodDLLImport(RD)) return false; - return !RD->isLambda() && !RD->isAggregate() && + // Attempt to avoid using constructor homing if a class is used but for + // whatever reason is not constructed. Constructors are added to the class + // definition when used, so use the existence of constructors here as a + // heuristic. + bool HasCtor = false; + for (auto *Ctor : RD->ctors()) + if (!Ctor->isCopyOrMoveConstructor() && !Ctor->isDeleted()) + HasCtor = true; + + return HasCtor && !RD->isLambda() && !RD->isAggregate() && !RD->hasTrivialDefaultConstructor() && !RD->hasConstexprNonCopyMoveConstructor(); }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits