Thanks! On Fri, Jan 8, 2016 at 5:15 PM, Adrian Prantl <apra...@apple.com> wrote:
> > > On Jan 8, 2016, at 2:18 PM, Adrian Prantl via cfe-commits < > cfe-commits@lists.llvm.org> wrote: > > > >> > >> On Jan 8, 2016, at 1:59 PM, David Blaikie <dblai...@gmail.com> wrote: > >> > >> > >> > >> On Fri, Jan 8, 2016 at 1:34 PM, Adrian Prantl <apra...@apple.com> > wrote: > >> > >>> On Jan 8, 2016, at 1:31 PM, David Blaikie <dblai...@gmail.com> wrote: > >>> > >>> > >>> > >>> On Wed, Jan 6, 2016 at 11:22 AM, Adrian Prantl via cfe-commits < > cfe-commits@lists.llvm.org> wrote: > >>> Author: adrian > >>> Date: Wed Jan 6 13:22:19 2016 > >>> New Revision: 256962 > >>> > >>> URL: http://llvm.org/viewvc/llvm-project?rev=256962&view=rev > >>> Log: > >>> Module debugging: Defer emitting tag types until their definition > >>> was visited and all decls have been merged. > >>> > >>> We only get a single chance to emit the types for virtual classes > because > >>> CGDebugInfo::completeRequiredType() categorically doesn't complete > them. > >>> > >>> Not sure I'm following this comment. Could you explain this in other > words/detail? > >>> > >>> If we visit a declaration we shouldn't do anything, right? (no point > putting declarations in the modules debug info, unless it's needed for > something else?) & then when we see the definition we'd build the debug > info for it? > >> > >> Yes. Your statement pretty much summarizes this commit :-) > >> > >> Then I'm still confused - were we emitting type declarations in modules > prior to this change? > > > > Yes. Dsymutil used to expect every forward declaration in a skeleton CU > to have a corresponding declaration in the module dwo. I just verified that > dsymutil does no longer prune forward declarations from skeleton CUs that > don’t have a definition in the DWO, so everything should be fine now. > > > >> Perhaps a test case for a lone declaration (with no follow up > definition) would be in order, then? > > > > Yes, that would make sense. I’ll add one. > > Done in r257241. > -- adrian > > > >> > >> -- adrian > >> > >>> > >>> > >>> Modified: > >>> cfe/trunk/lib/CodeGen/ObjectFilePCHContainerOperations.cpp > >>> cfe/trunk/test/Modules/Inputs/DebugCXX.h > >>> cfe/trunk/test/Modules/ModuleDebugInfo.cpp > >>> > >>> Modified: cfe/trunk/lib/CodeGen/ObjectFilePCHContainerOperations.cpp > >>> URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/ObjectFilePCHContainerOperations.cpp?rev=256962&r1=256961&r2=256962&view=diff > >>> > ============================================================================== > >>> --- cfe/trunk/lib/CodeGen/ObjectFilePCHContainerOperations.cpp > (original) > >>> +++ cfe/trunk/lib/CodeGen/ObjectFilePCHContainerOperations.cpp Wed > Jan 6 13:22:19 2016 > >>> @@ -59,8 +59,10 @@ class PCHContainerGenerator : public AST > >>> struct DebugTypeVisitor : public > RecursiveASTVisitor<DebugTypeVisitor> { > >>> clang::CodeGen::CGDebugInfo &DI; > >>> ASTContext &Ctx; > >>> - DebugTypeVisitor(clang::CodeGen::CGDebugInfo &DI, ASTContext &Ctx) > >>> - : DI(DI), Ctx(Ctx) {} > >>> + bool SkipTagDecls; > >>> + DebugTypeVisitor(clang::CodeGen::CGDebugInfo &DI, ASTContext &Ctx, > >>> + bool SkipTagDecls) > >>> + : DI(DI), Ctx(Ctx), SkipTagDecls(SkipTagDecls) {} > >>> > >>> /// Determine whether this type can be represented in DWARF. > >>> static bool CanRepresent(const Type *Ty) { > >>> @@ -75,6 +77,12 @@ class PCHContainerGenerator : public AST > >>> } > >>> > >>> bool VisitTypeDecl(TypeDecl *D) { > >>> + // TagDecls may be deferred until after all decls have been > merged and we > >>> + // know the complete type. Pure forward declarations will be > skipped, but > >>> + // they don't need to be emitted into the module anyway. > >>> + if (SkipTagDecls && isa<TagDecl>(D)) > >>> + return true; > >>> + > >>> QualType QualTy = Ctx.getTypeDeclType(D); > >>> if (!QualTy.isNull() && CanRepresent(QualTy.getTypePtr())) > >>> DI.getOrCreateStandaloneType(QualTy, D->getLocation()); > >>> @@ -165,7 +173,7 @@ public: > >>> // Collect debug info for all decls in this group. > >>> for (auto *I : D) > >>> if (!I->isFromASTFile()) { > >>> - DebugTypeVisitor DTV(*Builder->getModuleDebugInfo(), *Ctx); > >>> + DebugTypeVisitor DTV(*Builder->getModuleDebugInfo(), *Ctx, > true); > >>> DTV.TraverseDecl(I); > >>> } > >>> return true; > >>> @@ -179,6 +187,11 @@ public: > >>> if (Diags.hasErrorOccurred()) > >>> return; > >>> > >>> + if (D->isFromASTFile()) > >>> + return; > >>> + > >>> + DebugTypeVisitor DTV(*Builder->getModuleDebugInfo(), *Ctx, false); > >>> + DTV.TraverseDecl(D); > >>> Builder->UpdateCompletedType(D); > >>> } > >>> > >>> > >>> Modified: cfe/trunk/test/Modules/Inputs/DebugCXX.h > >>> URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/DebugCXX.h?rev=256962&r1=256961&r2=256962&view=diff > >>> > ============================================================================== > >>> --- cfe/trunk/test/Modules/Inputs/DebugCXX.h (original) > >>> +++ cfe/trunk/test/Modules/Inputs/DebugCXX.h Wed Jan 6 13:22:19 2016 > >>> @@ -50,3 +50,9 @@ namespace DebugCXX { > >>> typedef A<void> B; > >>> void foo(B) {} > >>> } > >>> + > >>> +// Virtual class with a forward declaration. > >>> +class FwdVirtual; > >>> +class FwdVirtual { > >>> + virtual ~FwdVirtual() {} > >>> +}; > >>> > >>> Modified: cfe/trunk/test/Modules/ModuleDebugInfo.cpp > >>> URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/ModuleDebugInfo.cpp?rev=256962&r1=256961&r2=256962&view=diff > >>> > ============================================================================== > >>> --- cfe/trunk/test/Modules/ModuleDebugInfo.cpp (original) > >>> +++ cfe/trunk/test/Modules/ModuleDebugInfo.cpp Wed Jan 6 13:22:19 2016 > >>> @@ -7,13 +7,11 @@ > >>> // RUN: rm -rf %t > >>> // RUN: %clang_cc1 -triple %itanium_abi_triple -x objective-c++ > -std=c++11 -debug-info-kind=limited -fmodules -fmodule-format=obj > -fimplicit-module-maps -DMODULES -fmodules-cache-path=%t %s -I %S/Inputs -I > %t -emit-llvm -o %t.ll -mllvm -debug-only=pchcontainer &>%t-mod.ll > >>> // RUN: cat %t-mod.ll | FileCheck %s > >>> -// RUN: cat %t-mod.ll | FileCheck --check-prefix=CHECK-NEG %s > >>> // RUN: cat %t-mod.ll | FileCheck --check-prefix=CHECK-DWO %s > >>> > >>> // PCH: > >>> // RUN: %clang_cc1 -triple %itanium_abi_triple -x c++ -std=c++11 > -emit-pch -fmodule-format=obj -I %S/Inputs -o %t.pch %S/Inputs/DebugCXX.h > -mllvm -debug-only=pchcontainer &>%t-pch.ll > >>> // RUN: cat %t-pch.ll | FileCheck %s > >>> -// RUN: cat %t-pch.ll | FileCheck --check-prefix=CHECK-NEG %s > >>> > >>> #ifdef MODULES > >>> @import DebugCXX; > >>> @@ -23,22 +21,32 @@ > >>> // CHECK-SAME: isOptimized: false, > >>> // CHECK-SAME-NOT: splitDebugFilename: > >>> // CHECK-DWO: dwoId: > >>> + > >>> // CHECK: !DICompositeType(tag: DW_TAG_enumeration_type, name: "Enum" > >>> // CHECK-SAME: identifier: "_ZTSN8DebugCXX4EnumE") > >>> // CHECK: !DINamespace(name: "DebugCXX" > >>> + > >>> // CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "Struct" > >>> // CHECK-SAME: identifier: "_ZTSN8DebugCXX6StructE") > >>> + > >>> // CHECK: !DICompositeType(tag: DW_TAG_class_type, > >>> // CHECK-SAME: name: "Template<int, DebugCXX::traits<int> > >" > >>> // CHECK-SAME: identifier: > "_ZTSN8DebugCXX8TemplateIiNS_6traitsIiEEEE") > >>> + > >>> +// CHECK: !DICompositeType(tag: DW_TAG_class_type, name: "A<void>" > >>> +// CHECK-SAME: identifier: "_ZTSN8DebugCXX1AIJvEEE") > >>> + > >>> // CHECK: !DICompositeType(tag: DW_TAG_class_type, > >>> // CHECK-SAME: name: "Template<float, > DebugCXX::traits<float> >" > >>> // CHECK-SAME: identifier: > "_ZTSN8DebugCXX8TemplateIfNS_6traitsIfEEEE") > >>> -// CHECK: !DICompositeType(tag: DW_TAG_class_type, name: "A<void>" > >>> -// CHECK-SAME: identifier: "_ZTSN8DebugCXX1AIJvEEE") > >>> + > >>> +// CHECK: !DICompositeType(tag: DW_TAG_class_type, name: "FwdVirtual" > >>> +// CHECK-SAME: elements: > >>> +// CHECK-SAME: identifier: "_ZTS10FwdVirtual") > >>> +// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "_vptr$FwdVirtual" > >>> + > >>> // CHECK: !DIDerivedType(tag: DW_TAG_typedef, name: > "FloatInstatiation" > >>> // no mangled name here yet. > >>> + > >>> // CHECK: !DIDerivedType(tag: DW_TAG_typedef, name: "B", > >>> // no mangled name here yet. > >>> - > >>> -// CHECK-NEG-NOT: "_ZTSN8DebugCXX8TemplateIlNS_6traitsIlEEEE" > >>> > >>> > >>> _______________________________________________ > >>> cfe-commits mailing list > >>> cfe-commits@lists.llvm.org > >>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits > >>> > >> > >> > > > > _______________________________________________ > > cfe-commits mailing list > > cfe-commits@lists.llvm.org > > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits > >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits