r262851 - Module Debugging: Fix a crash when emitting debug info for nested tag types
David Blaikie via cfe-commits
cfe-commits at lists.llvm.org
Thu Mar 10 15:21:45 PST 2016
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?
On Thu, Mar 10, 2016 at 8:19 AM, Adrian Prantl <aprantl at apple.com> wrote:
>
> > On Mar 9, 2016, at 5:22 PM, David Blaikie <dblaikie at 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 at 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 at lists.llvm.org
> > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
> >
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160310/cb8c0a8b/attachment-0001.html>
More information about the cfe-commits
mailing list