[cfe-dev] [lldb-dev] stable layout bug for imported record decls.
Alexey Sidorin via cfe-dev
cfe-dev at lists.llvm.org
Fri Aug 10 06:47:48 PDT 2018
(+ Gabor and Gabor)
Hi Lang,
We faced a very similar issue with record fields where import order can
change the order of imported FieldDecls resulting in broken
ASTRecordLayout. The patch for this issue is on review:
https://reviews.llvm.org/D44100. It just reorders the fields after
structure import is finished. CSA guys also reported the same problem
with FriendDecls in the same review.The order of methods was not a
problem for us but your report adds a new item to support. It looks like
_all_ decls inside RecordDecl have to be reordered. I'll try to
resurrect the patch this weekend (it is a bit outdated due to my
workload, sorry) and add you as a reviewer so you can check if it solves
the problem or not.
09.08.2018 20:46, Lang Hames via lldb-dev пишет:
> Hi clang-dev, lldb-dev,
>
> It looks like my clang commit r305850, which modified ASTImporter to
> import method override tables from an external context, introduced a
> new bug which manifests as incorrect vtable layouts for LLDB
> expression code.
>
> The bug itself is fairly straightforward. In r305850 I introduced the
> following method, which is called from ASTNodeImporter::VisitFunctionDecl:
>
> void ASTNodeImporter::ImportOverrides(CXXMethodDecl *ToMethod,
> CXXMethodDecl *FromMethod) {
> for (auto *FromOverriddenMethod : FromMethod->overridden_methods())
> ToMethod->addOverriddenMethod(
> cast<CXXMethodDecl>(Importer.Import(const_cast<CXXMethodDecl*>(
> FromOverriddenMethod))));
> }
>
> This will produce the correct override table, but can also cause
> methods in the Base class to be visited in the wrong order. Consider:
>
> class Base {
> public:
> virtual void bar() {}
> virtual void foo() {}
> };
>
> class Derived : public Base {
> public:
> void foo() override {}
> };
>
> If Derived is imported into a new context before Base, then the
> importer will visit Derived::foo, and (via ImportOverrides)
> immediately import Base::foo, but this happens before Base::bar is
> imported. As a consequence, the decl order on the imported Base class
> will end up being [ foo, bar ], instead of [ bar, foo ]. In LLDB
> expression evaluation this manifests as an incorrect vtable layout for
> Base, with foo occupying the first slot.
>
> I am looking for suggestions on the right way to fix this. A brute
> force solution might be to always have
> ASTNodeImporter::VisitRecordDecl visit all base classes, then all
> virtual methods, which would ensure they are visited in the original
> decl order. However I do not know whether this covers all paths by
> which a CXXRecordDecl might be imported, nor whether the performance
> of this solution would be acceptable (it seems like it would preclude
> a lot of laziness).
>
> Alternatively we might be able to associate an index with each
> imported decl and sort on that when we complete the type, but that
> would leave imported decls in the wrong order until the type was
> complete, and since I do not know all the use cases for the importer
> I'm concerned people may rely on the decl order before type is complete.
>
> Any insight from ASTImporter experts would be greatly appreciated. :)
>
> Cheers,
> Lang.
>
>
> _______________________________________________
> lldb-dev mailing list
> lldb-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20180810/9c658450/attachment.html>
More information about the cfe-dev
mailing list