aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/backend/rust-tree.cc
diff options
context:
space:
mode:
authorOwen Avery <powerboat9.gamer@gmail.com>2023-08-18 16:39:47 -0400
committerPhilip Herron <philip.herron@embecosm.com>2023-08-28 17:30:39 +0000
commit1b158384d65a7b1c19ddbad2cbecb5e7f4b671e1 (patch)
treeec44548b3e6598a9406b84a4de529165936fa763 /gcc/rust/backend/rust-tree.cc
parent8e2e7fa0211f49fe8f4c8b156468320ccfa711a0 (diff)
downloadgcc-1b158384d65a7b1c19ddbad2cbecb5e7f4b671e1.zip
gcc-1b158384d65a7b1c19ddbad2cbecb5e7f4b671e1.tar.gz
gcc-1b158384d65a7b1c19ddbad2cbecb5e7f4b671e1.tar.bz2
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>
Diffstat (limited to 'gcc/rust/backend/rust-tree.cc')
-rw-r--r--gcc/rust/backend/rust-tree.cc50
1 files changed, 50 insertions, 0 deletions
diff --git a/gcc/rust/backend/rust-tree.cc b/gcc/rust/backend/rust-tree.cc
index c687f9d..096a7d8 100644
--- a/gcc/rust/backend/rust-tree.cc
+++ b/gcc/rust/backend/rust-tree.cc
@@ -1659,6 +1659,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. */