Not sure if it's worth it, but you might be able to abort the loop if you ever reach a namespace (or anything that's not a tag decl maybe? Not sure about function local types)
On Thu, Mar 10, 2016 at 4:09 PM, Adrian Prantl <apra...@apple.com> wrote: > > On Mar 10, 2016, at 3:21 PM, David Blaikie <dblai...@gmail.com> wrote: > > OK, so the idea is that when you see that a tag definition, skip it if any > parent is incomplete - because when the parent's definition is complete, > you'll emit all its children anyway? > > > Yes. If there’s a more direct way top achieve this without walking the > declcontext, that would be even better of course. > > -- adrian > > > On Thu, Mar 10, 2016 at 8:19 AM, Adrian Prantl <apra...@apple.com> wrote: > >> >> > On Mar 9, 2016, at 5:22 PM, David Blaikie <dblai...@gmail.com> wrote: >> > >> > Is this bug only reachable with modules debug info? >> >> Yes, it’s in ObjectFilePCHContainerOperations.cpp, which is only used >> while building a PCH or module with -gmodules. >> >> > Could you describe the nature of the fix (not quite clear to me just by >> looking at it) >> >> In the ASTConsumer callback for a finished TagDecl, we check whether the >> DeclContext is complete and only try to emit debug info for the Decl if the >> DeclContext is available. >> >> -- adrian >> >> > >> > On Mon, Mar 7, 2016 at 12:58 PM, Adrian Prantl via cfe-commits < >> cfe-commits@lists.llvm.org> wrote: >> > Author: adrian >> > Date: Mon Mar 7 14:58:52 2016 >> > New Revision: 262851 >> > >> > URL: http://llvm.org/viewvc/llvm-project?rev=262851&view=rev >> > Log: >> > Module Debugging: Fix a crash when emitting debug info for nested tag >> types >> > whose DeclContext is not yet complete by deferring their emission. >> > >> > rdar://problem/24918680 >> > >> > 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=262851&r1=262850&r2=262851&view=diff >> > >> ============================================================================== >> > --- cfe/trunk/lib/CodeGen/ObjectFilePCHContainerOperations.cpp >> (original) >> > +++ cfe/trunk/lib/CodeGen/ObjectFilePCHContainerOperations.cpp Mon Mar >> 7 14:58:52 2016 >> > @@ -201,6 +201,15 @@ public: >> > if (D->getName().empty()) >> > return; >> > >> > + // Defer tag decls until their declcontext is complete. >> > + auto *DeclCtx = D->getDeclContext(); >> > + while (DeclCtx) { >> > + if (auto *D = dyn_cast<TagDecl>(DeclCtx)) >> > + if (!D->isCompleteDefinition()) >> > + return; >> > + DeclCtx = DeclCtx->getParent(); >> > + } >> > + >> > DebugTypeVisitor DTV(*Builder->getModuleDebugInfo(), *Ctx); >> > 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=262851&r1=262850&r2=262851&view=diff >> > >> ============================================================================== >> > --- cfe/trunk/test/Modules/Inputs/DebugCXX.h (original) >> > +++ cfe/trunk/test/Modules/Inputs/DebugCXX.h Mon Mar 7 14:58:52 2016 >> > @@ -72,3 +72,14 @@ namespace { >> > struct InAnonymousNamespace { int i; }; >> > } >> > } >> > + >> > +class Base; >> > +class A { >> > + virtual Base *getParent() const; >> > +}; >> > +class Base {}; >> > +class Derived : Base { >> > + class B : A { >> > + Derived *getParent() const override; >> > + }; >> > +}; >> > >> > Modified: cfe/trunk/test/Modules/ModuleDebugInfo.cpp >> > URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/ModuleDebugInfo.cpp?rev=262851&r1=262850&r2=262851&view=diff >> > >> ============================================================================== >> > --- cfe/trunk/test/Modules/ModuleDebugInfo.cpp (original) >> > +++ cfe/trunk/test/Modules/ModuleDebugInfo.cpp Mon Mar 7 14:58:52 2016 >> > @@ -71,6 +71,13 @@ >> > // CHECK-NOT: name: >> > // CHECK-SAME: identifier: "_ZTS13TypedefStruct") >> > >> > +// CHECK: !DICompositeType(tag: DW_TAG_class_type, name: "Derived", >> > +// CHECK-SAME: identifier: "_ZTS7Derived") >> > +// CHECK: !DICompositeType(tag: DW_TAG_class_type, name: "B", scope: >> !"_ZTS7Derived", >> > +// CHECK-SAME: elements: ![[B_MBRS:.*]], vtableHolder: >> !"_ZTS1A" >> > +// CHECK: ![[B_MBRS]] = !{{{.*}}, ![[GET_PARENT:.*]]} >> > +// CHECK: ![[GET_PARENT]] = !DISubprogram(name: "getParent" >> > + >> > // CHECK: !DIDerivedType(tag: DW_TAG_typedef, name: "FloatInstatiation" >> > // no mangled name here yet. >> > >> > >> > >> > _______________________________________________ >> > 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