From: Tom Tromey Date: Fri, 4 Aug 2023 19:46:44 +0000 (-0600) Subject: Refactor Rust code for slice-to-array operation X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=49ed499c44d9368d2b954697f362452d1447eecf;p=binutils-gdb.git Refactor Rust code for slice-to-array operation This patch exposes rust_slice_type_p and introduces rust_slice_to_array, in preparation for subsequent patches that will need these. --- diff --git a/gdb/rust-lang.c b/gdb/rust-lang.c index 57bef01d343..aa106b44bd9 100644 --- a/gdb/rust-lang.c +++ b/gdb/rust-lang.c @@ -153,10 +153,10 @@ rust_tuple_struct_type_p (struct type *type) return type->num_fields () > 0 && rust_underscore_fields (type); } -/* Return true if TYPE is a slice type, otherwise false. */ +/* See rust-lang.h. */ -static bool -rust_slice_type_p (struct type *type) +bool +rust_slice_type_p (const struct type *type) { if (type->code () == TYPE_CODE_STRUCT && type->name () != NULL @@ -319,6 +319,30 @@ static const struct generic_val_print_decorations rust_decorations = "]" }; +/* See rust-lang.h. */ + +struct value * +rust_slice_to_array (struct value *val) +{ + struct type *type = check_typedef (val->type ()); + /* This must have been checked by the caller. */ + gdb_assert (rust_slice_type_p (type)); + + struct value *base = value_struct_elt (&val, {}, "data_ptr", NULL, + "slice"); + struct value *len = value_struct_elt (&val, {}, "length", NULL, "slice"); + LONGEST llen = value_as_long (len); + + struct type *elt_type = base->type ()->target_type (); + struct type *array_type = lookup_array_range_type (elt_type, 0, + llen - 1); + struct value *array = value::allocate_lazy (array_type); + array->set_lval (lval_memory); + array->set_address (value_as_address (base)); + + return array; +} + /* Helper function to print a slice. */ static void @@ -345,12 +369,7 @@ rust_val_print_slice (struct value *val, struct ui_file *stream, int recurse, gdb_printf (stream, "[]"); else { - struct type *elt_type = base->type ()->target_type (); - struct type *array_type = lookup_array_range_type (elt_type, 0, - llen - 1); - struct value *array = value::allocate_lazy (array_type); - array->set_lval (lval_memory); - array->set_address (value_as_address (base)); + struct value *array = rust_slice_to_array (val); array->fetch_lazy (); generic_value_print (array, stream, recurse, options, &rust_decorations); diff --git a/gdb/rust-lang.h b/gdb/rust-lang.h index 85c93a9dcec..2c7ccb93bcf 100644 --- a/gdb/rust-lang.h +++ b/gdb/rust-lang.h @@ -34,6 +34,9 @@ extern bool rust_tuple_type_p (struct type *type); /* Return true if TYPE is a tuple struct type; otherwise false. */ extern bool rust_tuple_struct_type_p (struct type *type); +/* Return true if TYPE is a slice type, otherwise false. */ +extern bool rust_slice_type_p (const struct type *type); + /* Given a block, find the name of the block's crate. Returns an empty stringif no crate name can be found. */ extern std::string rust_crate_for_block (const struct block *block); @@ -50,6 +53,10 @@ extern const char *rust_last_path_segment (const char *path); extern struct type *rust_slice_type (const char *name, struct type *elt_type, struct type *usize_type); +/* Return a new array that holds the contents of the given slice, + VAL. */ +extern struct value *rust_slice_to_array (struct value *val); + /* Class representing the Rust language. */ class rust_language : public language_defn