diff options
author | Owen Avery <powerboat9.gamer@gmail.com> | 2023-08-18 16:39:47 -0400 |
---|---|---|
committer | Philip Herron <philip.herron@embecosm.com> | 2023-08-28 17:30:39 +0000 |
commit | 1b158384d65a7b1c19ddbad2cbecb5e7f4b671e1 (patch) | |
tree | ec44548b3e6598a9406b84a4de529165936fa763 /gcc/rust/backend/rust-tree.cc | |
parent | 8e2e7fa0211f49fe8f4c8b156468320ccfa711a0 (diff) | |
download | gcc-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.cc | 50 |
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. */ |