[gcc r14-7942] gccrs: Fork c++ resorting methods

Arthur Cohen cohenarthur@gcc.gnu.org
Tue Jan 16 18:09:18 GMT 2024


https://gcc.gnu.org/g:3d59270c819f1e2876b3ca97bcd0c9ac2fbf57f6

commit r14-7942-g3d59270c819f1e2876b3ca97bcd0c9ac2fbf57f6
Author: Owen Avery <powerboat9.gamer@gmail.com>
Date:   Fri Aug 18 16:39:47 2023 -0400

    gccrs: Fork c++ resorting methods
    
    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>

Diff:
---
 gcc/rust/backend/rust-tree.cc | 50 +++++++++++++++++++++++++++++++++++++++++++
 gcc/rust/backend/rust-tree.h  |  6 ++++++
 2 files changed, 56 insertions(+)

diff --git a/gcc/rust/backend/rust-tree.cc b/gcc/rust/backend/rust-tree.cc
index faea66876f2..16023ff322c 100644
--- a/gcc/rust/backend/rust-tree.cc
+++ b/gcc/rust/backend/rust-tree.cc
@@ -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.  */
diff --git a/gcc/rust/backend/rust-tree.h b/gcc/rust/backend/rust-tree.h
index 9a1cb74d617..d6eb77cb656 100644
--- a/gcc/rust/backend/rust-tree.h
+++ b/gcc/rust/backend/rust-tree.h
@@ -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.  */


More information about the Gcc-cvs mailing list