> 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