]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: Fork c++ resorting methods
authorOwen Avery <powerboat9.gamer@gmail.com>
Fri, 18 Aug 2023 20:39:47 +0000 (16:39 -0400)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 16 Jan 2024 18:00:33 +0000 (19:00 +0100)
gcc/rust/ChangeLog:

* backend/rust-tree.cc
(resort_data): Fork from c++ frontend.
(resort_member_name_cmp): Likewise.
(resort_type_member_vec): Likewise.
* backend/rust-tree.h
(resort_type_member_vec): Likewise.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
gcc/rust/backend/rust-tree.cc
gcc/rust/backend/rust-tree.h

index faea66876f2fb7917035e2cd09ba7582c631cddd..16023ff322c6e0fc763ac949c9c0f3f8e7b0767b 100644 (file)
@@ -1657,6 +1657,56 @@ build_min_array_type (tree elt_type, tree index_type)
   return t;
 }
 
+// forked from gcc/cp/name-lookup.cc resort_data
+
+} // namespace Rust
+
+static struct
+{
+  gt_pointer_operator new_value;
+  void *cookie;
+} resort_data;
+
+// forked from gcc/cp/name-lookup.cc resort_member_name_cmp
+
+/* This routine compares two fields like member_name_cmp but using the
+   pointer operator in resort_field_decl_data.  We don't have to deal
+   with duplicates here.  */
+
+static int
+resort_member_name_cmp (const void *a_p, const void *b_p)
+{
+  tree a = *(const tree *) a_p;
+  tree b = *(const tree *) b_p;
+  tree name_a = OVL_NAME (a);
+  tree name_b = OVL_NAME (b);
+
+  resort_data.new_value (&name_a, &name_a, resort_data.cookie);
+  resort_data.new_value (&name_b, &name_b, resort_data.cookie);
+
+  gcc_checking_assert (name_a != name_b);
+
+  return name_a < name_b ? -1 : +1;
+}
+
+// forked from gcc/cp/name-lookup.cc resort_type_member_vec
+
+/* Resort CLASSTYPE_MEMBER_VEC because pointers have been reordered.  */
+
+void
+resort_type_member_vec (void *obj, void * /*orig_obj*/,
+                       gt_pointer_operator new_value, void *cookie)
+{
+  if (vec<tree, va_gc> *member_vec = (vec<tree, va_gc> *) obj)
+    {
+      resort_data.new_value = new_value;
+      resort_data.cookie = cookie;
+      member_vec->qsort (resort_member_name_cmp);
+    }
+}
+
+namespace Rust {
+
 // forked from gcc/cp/name-lookup.cc fields_linear_search
 
 /* Linear search of (partially ordered) fields of KLASS for NAME.  */
index 9a1cb74d6178e5dc1dfd6a6fea33ac06c9ec7737..d6eb77cb65640a48c49b37695a9b2d0e24968d84 100644 (file)
@@ -2069,6 +2069,12 @@ struct GTY (()) rust_cxx_saved_binding
   tree real_type_value;
 };
 
+// forked from gcc/cp/name-lookup.h resort_type_member_vec
+
+/* needed for GTY annotation */
+extern void
+resort_type_member_vec (void *, void *, gt_pointer_operator, void *);
+
 // forked from gcc/cp/cp-tree.h saved_scope
 
 /* Global state.  */