[PATCH] D75574: RFC: Implement objc_direct_protocol attribute to remove protocol metadata
John McCall via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Sep 24 20:53:54 PDT 2020
rjmccall added inline comments.
================
Comment at: clang/lib/CodeGen/CGObjC.cpp:490
+ llvm::UniqueVector<ObjCProtocolDecl *> FoundProtocols;
+ std::set<ObjCProtocolDecl *> DeclaredProtocols;
+
----------------
You should use llvm::DenseSet for this. But in general there are more sets here than I think you really need, and you're building them eagerly when you don't have to. I would suggest:
1. Walk the list of declared protocols, adding the runtime protocols to the main result list and the first runtime protocols implied by the non-runtime protocols to a different list.
2. If there are any protocols in the first-implied list (which is unlikely), build the implied-protocols set for all the protocols in the main list (inclusive of the protocols there) and the first-implied list (exclusive). It would be totally reasonable to add a method to make this easier: `void ObjCProtocolDecl::getImpliedProtocols(llvm::DenseSet<const ObjCProtocolDecl*> &) const;`
3. Add any protocols that are in the first-implied list but not the implied set back to the main list.
Also, protocols can be redeclared, so you should make sure to map to the canonical decl before adding them to a set (or UniqueVector).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D75574/new/
https://reviews.llvm.org/D75574
More information about the cfe-commits
mailing list