erichkeane wrote: > FYI, Erich and I dumped the layout. > > ``` > *** Dumping AST Record Layout > 0 | class clang::Decl > 0 | (Decl vtable pointer) > 8 | class llvm::PointerIntPair<class clang::Decl *, 3, enum > clang::Decl::ModuleOwnershipKind> NextInContextAndBits > 8 | struct llvm::detail::PunnedPointer<class clang::Decl *> Value > 8 | unsigned char[8] Data > 16 | class llvm::PointerUnion<class clang::DeclContext *, struct > clang::Decl::MultipleDC *> DeclCtx > 16 | class llvm::pointer_union_detail::PointerUnionMembers<class > llvm::PointerUnion<class clang::DeclContext *, struct clang::Decl::MultipleDC > *>, 0, class clang::DeclContext *, struct clang::Decl::MultipleDC *> (base) > 16 | class > llvm::pointer_union_detail::PointerUnionMembers<class > llvm::PointerUnion<class clang::DeclContext *, struct clang::Decl::MultipleDC > *>, 1, struct clang::Decl::MultipleDC *> (base) > 16 | class > llvm::pointer_union_detail::PointerUnionMembers<class > llvm::PointerUnion<class clang::DeclContext *, struct clang::Decl::MultipleDC > *>, 2> (base) > 16 | struct llvm::detail::PunnedPointer<void *> Val > 16 | unsigned char[8] Data > 24 | class clang::SourceLocation Loc > 24 | UIntTy ID > 28:0-6 | unsigned int DeclKind > 28:7-7 | unsigned int InvalidDecl > 29:0-0 | unsigned int HasAttrs > 29:1-1 | unsigned int Implicit > 29:2-2 | unsigned int Used > 29:3-3 | unsigned int Referenced > 29:4-4 | unsigned int TopLevelDeclInObjCContainer > 29:5-6 | unsigned int Access > 29:7-7 | unsigned int FromASTFile > 30:0-13 | unsigned int IdentifierNamespace > 32:0-2 | unsigned int CacheValidAndLinkage > | [sizeof=40, dsize=33, align=8, > | nvsize=33, nvalign=8] > ``` > > Based on that, the change probably makes sense. We should note that we are > gonna be pretty bit-starved afterwards, the new pointer could have its > alignment bits stolen and we probably can reduce IdentifierNamespace by a > couple of bits, but that's it
IMO, we are LONG overdue for removing the `NextInContext` and replace it with a collection of some sort in `DeclContext`. The linked-list functionality has some distinct problems (costing us a pointer in EVERY decl is just the beginning, we end up having to instantiate stuff we otherwise don't need to as a result), but it is a pretty big task. AFTER this patch, it doesn't actually save us anything anymore I think (since we still have the `ModuleOwnershipKind` in there that we would need to add to the bitfield), but it would free up a TON of bits. https://github.com/llvm/llvm-project/pull/219138 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
