[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