[PATCH] D18035: [GCC] PR23529 Mangler part of attrbute abi_tag support

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Tue Jun 28 12:51:16 PDT 2016

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.


More information about the cfe-commits mailing list