rsmith added a comment. Thank you! I'm happy with this implementation (other than some data structure improvements), and cxx-abi-dev discussion seems to be settling on this approach (mangling the return type / variable type to extract attributes) being the right one.
(Minor nit: please make sure that your comments start with a capital letter and end in a period.) ================ Comment at: lib/AST/ItaniumMangle.cpp:352-355 @@ +351,6 @@ + UsedAbiTags.insert(Tag); + if (std::find(TagList.begin(), TagList.end(), Tag) == TagList.end()) { + // don't insert duplicates + TagList.push_back(Tag); + } + } ---------------- You're going to sort the result list anyway, so how about adding the tag here without checking if it's already present, then using `std::unique` to weed out duplicates after you sort? ================ Comment at: lib/AST/ItaniumMangle.cpp:679-683 @@ +678,7 @@ + // Get tags from return type that are not present in function name or encoding + AbiTagList AdditionalAbiTags; + for (const auto &Tag : ReturnTypeAbiTags) { + if (!FunctionEncodingMangler.AbiTagsRoot.getUsedAbiTags().count(Tag)) + AdditionalAbiTags.push_back(Tag); + } + ---------------- Instead of keeping the `UsedAbiTags` as a `SmallSetVector`, you can just keep a `SmallVector` of them, and sort/unique it here. Since you keep the list of emitted ABI tags sorted, you can then use `std::set_difference` to extract the additional tags in linear time. http://reviews.llvm.org/D18035 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits