1 /* Rust language support routines for GDB, the GNU debugger.
3 Copyright (C) 2016-2025 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
26 #include "cp-support.h"
28 #include "event-top.h"
32 #include "rust-lang.h"
33 #include "typeprint.h"
39 #include "cli/cli-style.h"
40 #include "parser-defs.h"
43 /* See rust-lang.h. */
46 rust_last_path_segment (const char *path
)
48 const char *result
= strrchr (path
, ':');
55 /* See rust-lang.h. */
58 rust_crate_for_block (const struct block
*block
)
60 const char *scope
= block
->scope ();
63 return std::string ();
65 return std::string (scope
, cp_find_first_component (scope
));
68 /* Return true if TYPE, which must be a struct type, represents a Rust
72 rust_enum_p (struct type
*type
)
74 /* is_dynamic_type will return true if any field has a dynamic
75 attribute -- but we only want to check the top level. */
76 return TYPE_HAS_VARIANT_PARTS (type
);
79 /* Return true if TYPE, which must be an already-resolved enum type,
83 rust_empty_enum_p (const struct type
*type
)
85 return type
->num_fields () == 0;
88 /* Given an already-resolved enum type and contents, find which
92 rust_enum_variant (struct type
*type
)
94 /* The active variant is simply the first non-artificial field. */
95 for (int i
= 0; i
< type
->num_fields (); ++i
)
96 if (!type
->field (i
).is_artificial ())
99 /* Perhaps we could get here by trying to print an Ada variant
100 record in Rust mode. Unlikely, but an error is safer than an
102 error (_("Could not find active enum variant"));
105 /* See rust-lang.h. */
108 rust_tuple_type_p (struct type
*type
)
110 /* The current implementation is a bit of a hack, but there's
111 nothing else in the debuginfo to distinguish a tuple from a
113 return (type
->code () == TYPE_CODE_STRUCT
114 && type
->name () != NULL
115 && type
->name ()[0] == '(');
118 /* Return true if all non-static fields of a structlike type are in a
119 sequence like 0, 1, 2. "__" prefixes are also accepted -- rustc
120 emits "__0" but gccrs emits "0". */
123 rust_underscore_fields (struct type
*type
)
125 int field_number
= 0;
127 if (type
->code () != TYPE_CODE_STRUCT
)
129 for (int i
= 0; i
< type
->num_fields (); ++i
)
131 if (!type
->field (i
).is_static ())
135 xsnprintf (buf
, sizeof (buf
), "%d", field_number
);
137 const char *field_name
= type
->field (i
).name ();
138 if (startswith (field_name
, "__"))
140 if (strcmp (buf
, field_name
) != 0)
148 /* See rust-lang.h. */
151 rust_tuple_struct_type_p (struct type
*type
)
153 /* This is just an approximation until DWARF can represent Rust more
154 precisely. We exclude zero-length structs because they may not
155 be tuple structs, and there's no way to tell. */
156 return type
->num_fields () > 0 && rust_underscore_fields (type
);
159 /* Return true if TYPE is "slice-like"; false otherwise. */
162 rust_slice_type_p (const struct type
*type
)
164 if (type
->code () == TYPE_CODE_STRUCT
165 && type
->name () != NULL
166 && type
->num_fields () == 2)
168 /* The order of fields doesn't matter. While it would be nice
169 to check for artificiality here, the Rust compiler doesn't
170 emit this information. */
171 const char *n1
= type
->field (0).name ();
172 const char *n2
= type
->field (1).name ();
173 return ((streq (n1
, "data_ptr") && streq (n2
, "length"))
174 || (streq (n2
, "data_ptr") && streq (n1
, "length")));
179 /* Return true if TYPE is a range type, otherwise false. */
182 rust_range_type_p (struct type
*type
)
184 if (type
->code () != TYPE_CODE_STRUCT
185 || type
->num_fields () > 2
186 || type
->name () == NULL
187 || strstr (type
->name (), "::Range") == NULL
)
190 if (type
->num_fields () == 0)
194 if (strcmp (type
->field (0).name (), "start") == 0)
196 if (type
->num_fields () == 1)
200 else if (type
->num_fields () == 2)
202 /* First field had to be "start". */
206 return strcmp (type
->field (field_num
).name (), "end") == 0;
209 /* Return true if TYPE is an inclusive range type, otherwise false.
210 This is only valid for types which are already known to be range
214 rust_inclusive_range_type_p (struct type
*type
)
216 return (strstr (type
->name (), "::RangeInclusive") != NULL
217 || strstr (type
->name (), "::RangeToInclusive") != NULL
);
220 /* Return true if TYPE seems to be the type "u8", otherwise false. */
223 rust_u8_type_p (struct type
*type
)
225 return (type
->code () == TYPE_CODE_INT
226 && type
->is_unsigned ()
227 && type
->length () == 1);
230 /* Return true if TYPE is a Rust character type. */
233 rust_chartype_p (struct type
*type
)
235 return (type
->code () == TYPE_CODE_CHAR
236 && type
->length () == 4
237 && type
->is_unsigned ());
240 /* If VALUE represents a trait object pointer, return the underlying
241 pointer with the correct (i.e., runtime) type. Otherwise, return
244 static struct value
*
245 rust_get_trait_object_pointer (struct value
*value
)
247 struct type
*type
= check_typedef (value
->type ());
249 if (type
->code () != TYPE_CODE_STRUCT
|| type
->num_fields () != 2)
252 /* Try to be a bit resilient if the ABI changes. */
253 int vtable_field
= 0;
254 for (int i
= 0; i
< 2; ++i
)
256 if (strcmp (type
->field (i
).name (), "vtable") == 0)
258 else if (strcmp (type
->field (i
).name (), "pointer") != 0)
262 CORE_ADDR vtable
= value_as_address (value_field (value
, vtable_field
));
263 struct symbol
*symbol
= find_symbol_at_address (vtable
);
264 if (symbol
== NULL
|| symbol
->subclass
!= SYMBOL_RUST_VTABLE
)
267 struct rust_vtable_symbol
*vtable_sym
268 = static_cast<struct rust_vtable_symbol
*> (symbol
);
269 struct type
*pointer_type
= lookup_pointer_type (vtable_sym
->concrete_type
);
270 return value_cast (pointer_type
, value_field (value
, 1 - vtable_field
));
273 /* Find and possibly rewrite the unsized part of a slice-like type.
275 This function has two modes. If the out parameters are both NULL,
276 it will return true if an unsized member of IN_TYPE is found.
278 If the out parameters are both non-NULL, it will do the same, but
279 will also rewrite the unsized member's type to be an array of the
280 appropriate type. BOUND is the upper bound of the new array.
282 See convert_slice to understand the different kinds of unsized type
283 and how they are represented.
286 rewrite_slice_type (struct type
*in_type
, struct type
**new_type
,
287 LONGEST bound
, ULONGEST
*additional_length
)
289 if (in_type
->code () != TYPE_CODE_STRUCT
)
292 unsigned nfields
= in_type
->num_fields ();
296 struct type
*rewritten
;
297 const field
&field
= in_type
->field (nfields
- 1);
298 struct type
*field_type
= field
.type ();
299 if (field
.loc_kind () == FIELD_LOC_KIND_BITPOS
300 && field
.loc_bitpos () == 8 * in_type
->length ())
302 if (additional_length
== nullptr)
304 rewritten
= lookup_array_range_type (field_type
, 0, bound
);
305 *additional_length
= rewritten
->length ();
309 if (!rewrite_slice_type (field_type
, &rewritten
, bound
,
312 if (additional_length
== nullptr)
316 struct type
*result
= copy_type (in_type
);
317 result
->copy_fields (in_type
);
318 result
->field (nfields
- 1).set_type (rewritten
);
319 result
->set_length (result
->length () + *additional_length
);
325 /* Convert a Rust slice to its "true" representation.
327 The Rust compiler emits slices as "fat" pointers like:
329 struct { payload *data_ptr; usize length }
331 Any sort of unsized type is emitted this way.
333 If 'payload' is a struct type, then it must be searched to see if
334 the trailing field is unsized. This has to be done recursively (as
335 in, if the final field in the struct type itself has struct type,
336 then that type must be searched). In this scenario, the unsized
337 field can be recognized because it does not contribute to the
340 If 'payload' does not have a trailing unsized type, or if it is not
341 of struct type, then this slice is "array-like". In this case
342 rewriting will return an array.
344 static struct value
*
345 convert_slice (struct value
*val
)
347 struct type
*type
= check_typedef (val
->type ());
348 /* This must have been checked by the caller. */
349 gdb_assert (rust_slice_type_p (type
));
351 struct value
*len
= value_struct_elt (&val
, {}, "length", nullptr,
353 LONGEST llen
= value_as_long (len
);
355 struct value
*ptr
= value_struct_elt (&val
, {}, "data_ptr", nullptr,
357 struct type
*original_type
= ptr
->type ()->target_type ();
358 ULONGEST new_length_storage
= 0;
359 struct type
*new_type
= nullptr;
360 if (!rewrite_slice_type (original_type
, &new_type
, llen
- 1,
361 &new_length_storage
))
362 new_type
= lookup_array_range_type (original_type
, 0, llen
- 1);
364 struct value
*result
= value::allocate_lazy (new_type
);
365 result
->set_lval (lval_memory
);
366 result
->set_address (value_as_address (ptr
));
367 result
->fetch_lazy ();
372 /* If TYPE is an array-like slice, return the element type; otherwise
375 rust_array_like_element_type (struct type
*type
)
377 /* Caller must check this. */
378 gdb_assert (rust_slice_type_p (type
));
379 for (int i
= 0; i
< type
->num_fields (); ++i
)
381 if (strcmp (type
->field (i
).name (), "data_ptr") == 0)
383 struct type
*base_type
= type
->field (i
).type ()->target_type ();
384 if (rewrite_slice_type (base_type
, nullptr, 0, nullptr))
394 /* See language.h. */
397 rust_language::printstr (struct ui_file
*stream
, struct type
*type
,
398 const gdb_byte
*string
, unsigned int length
,
399 const char *user_encoding
, int force_ellipses
,
400 const struct value_print_options
*options
) const
402 /* Rust always uses UTF-8, but let the caller override this if need
404 const char *encoding
= user_encoding
;
405 if (user_encoding
== NULL
|| !*user_encoding
)
407 /* In Rust strings, characters are "u8". */
408 if (rust_u8_type_p (type
))
412 /* This is probably some C string, so let's let C deal with
414 language_defn::printstr (stream
, type
, string
, length
,
415 user_encoding
, force_ellipses
,
421 /* This is not ideal as it doesn't use our character printer. */
422 generic_printstr (stream
, type
, string
, length
, encoding
, force_ellipses
,
428 static const struct generic_val_print_decorations rust_decorations
=
430 /* Complex isn't used in Rust, but we provide C-ish values just in
442 /* See rust-lang.h. */
445 rust_slice_to_array (struct value
*val
)
447 val
= convert_slice (val
);
448 if (val
->type ()->code () != TYPE_CODE_ARRAY
)
453 /* Helper function to print a slice. */
456 rust_language::val_print_slice
457 (struct value
*val
, struct ui_file
*stream
, int recurse
,
458 const struct value_print_options
*options
) const
460 struct type
*orig_type
= check_typedef (val
->type ());
462 val
= convert_slice (val
);
463 struct type
*type
= check_typedef (val
->type ());
465 /* &str is handled here; but for all other slice types it is fine to
466 simply print the contents. */
467 if (orig_type
->name () != nullptr
468 && strcmp (orig_type
->name (), "&str") == 0)
470 LONGEST low_bound
, high_bound
;
471 if (get_array_bounds (type
, &low_bound
, &high_bound
))
473 val_print_string (type
->target_type (), "UTF-8",
474 val
->address (), high_bound
- low_bound
+ 1,
480 /* Print the slice type here. This was gdb's historical behavior
481 (from before unsized types were generically handled) and helps
482 make it clear that the user is seeing a slice, not an array.
483 Only arrays must be handled as the other cases are handled by
484 value_print_inner. */
485 if (type
->code () == TYPE_CODE_ARRAY
)
487 type_print (orig_type
, "", stream
, -1);
488 gdb_printf (stream
, " ");
491 value_print_inner (val
, stream
, recurse
, options
);
494 /* See rust-lang.h. */
497 rust_language::val_print_struct
498 (struct value
*val
, struct ui_file
*stream
, int recurse
,
499 const struct value_print_options
*options
) const
502 struct type
*type
= check_typedef (val
->type ());
504 if (rust_slice_type_p (type
))
506 val_print_slice (val
, stream
, recurse
, options
);
510 bool is_tuple
= rust_tuple_type_p (type
);
511 bool is_tuple_struct
= !is_tuple
&& rust_tuple_struct_type_p (type
);
512 struct value_print_options opts
;
516 if (type
->name () != NULL
)
517 gdb_printf (stream
, "%s", type
->name ());
519 if (type
->num_fields () == 0)
522 if (type
->name () != NULL
)
523 gdb_puts (" ", stream
);
526 if (is_tuple
|| is_tuple_struct
)
527 gdb_puts ("(", stream
);
529 gdb_puts ("{", stream
);
532 opts
.deref_ref
= false;
535 for (int i
= 0; i
< type
->num_fields (); ++i
)
537 if (type
->field (i
).is_static ())
541 gdb_puts (",", stream
);
543 if (options
->prettyformat
)
545 gdb_puts ("\n", stream
);
546 print_spaces (2 + 2 * recurse
, stream
);
548 else if (!first_field
)
549 gdb_puts (" ", stream
);
553 if (!is_tuple
&& !is_tuple_struct
)
555 fputs_styled (type
->field (i
).name (),
556 variable_name_style
.style (), stream
);
557 gdb_puts (": ", stream
);
560 common_val_print (value_field (val
, i
), stream
, recurse
+ 1, &opts
,
564 if (options
->prettyformat
)
566 gdb_puts ("\n", stream
);
567 print_spaces (2 * recurse
, stream
);
570 if (is_tuple
|| is_tuple_struct
)
571 gdb_puts (")", stream
);
573 gdb_puts ("}", stream
);
576 /* See rust-lang.h. */
579 rust_language::print_enum (struct value
*val
, struct ui_file
*stream
,
581 const struct value_print_options
*options
) const
583 struct value_print_options opts
= *options
;
584 struct type
*type
= check_typedef (val
->type ());
586 opts
.deref_ref
= false;
588 gdb_assert (rust_enum_p (type
));
589 gdb::array_view
<const gdb_byte
> view
590 (val
->contents_for_printing ().data (),
591 val
->type ()->length ());
592 type
= resolve_dynamic_type (type
, view
, val
->address ());
594 if (rust_empty_enum_p (type
))
596 /* Print the enum type name here to be more clear. */
597 gdb_printf (stream
, _("%s {%p[<No data fields>%p]}"),
599 metadata_style
.style ().ptr (), nullptr);
603 int variant_fieldno
= rust_enum_variant (type
);
604 val
= val
->primitive_field (0, variant_fieldno
, type
);
605 struct type
*variant_type
= type
->field (variant_fieldno
).type ();
607 int nfields
= variant_type
->num_fields ();
609 bool is_tuple
= rust_tuple_struct_type_p (variant_type
);
611 gdb_printf (stream
, "%s", variant_type
->name ());
614 /* In case of a nullary variant like 'None', just output
619 /* In case of a non-nullary variant, we output 'Foo(x,y,z)'. */
621 gdb_printf (stream
, "(");
624 /* struct variant. */
625 gdb_printf (stream
, "{");
628 bool first_field
= true;
629 for (int j
= 0; j
< nfields
; j
++)
632 gdb_puts (", ", stream
);
636 gdb_printf (stream
, "%ps: ",
637 styled_string (variable_name_style
.style (),
638 variant_type
->field (j
).name ()));
640 common_val_print (value_field (val
, j
), stream
, recurse
+ 1, &opts
,
645 gdb_puts (")", stream
);
647 gdb_puts ("}", stream
);
650 /* See language.h. */
653 rust_language::value_print_inner
654 (struct value
*val
, struct ui_file
*stream
, int recurse
,
655 const struct value_print_options
*options
) const
657 struct value_print_options opts
= *options
;
658 opts
.deref_ref
= true;
660 if (opts
.prettyformat
== Val_prettyformat_default
)
661 opts
.prettyformat
= (opts
.prettyformat_structs
662 ? Val_prettyformat
: Val_no_prettyformat
);
664 struct type
*type
= check_typedef (val
->type ());
665 switch (type
->code ())
669 LONGEST low_bound
, high_bound
;
671 if (type
->target_type ()->code () == TYPE_CODE_ARRAY
672 && rust_u8_type_p (type
->target_type ()->target_type ())
673 && get_array_bounds (type
->target_type (), &low_bound
,
676 /* We have a pointer to a byte string, so just print
678 struct type
*elttype
= check_typedef (type
->target_type ());
679 CORE_ADDR addr
= value_as_address (val
);
680 struct gdbarch
*arch
= type
->arch ();
682 if (opts
.addressprint
)
684 gdb_puts (paddress (arch
, addr
), stream
);
685 gdb_puts (" ", stream
);
688 gdb_puts ("b", stream
);
689 val_print_string (elttype
->target_type (), "ASCII", addr
,
690 high_bound
- low_bound
+ 1, stream
,
698 /* Recognize the unit type. */
699 if (type
->is_unsigned () && type
->length () == 0
700 && type
->name () != NULL
&& strcmp (type
->name (), "()") == 0)
702 gdb_puts ("()", stream
);
707 case TYPE_CODE_STRING
:
709 LONGEST low_bound
, high_bound
;
711 if (!get_array_bounds (type
, &low_bound
, &high_bound
))
712 error (_("Could not determine the array bounds"));
714 /* If we see a plain TYPE_CODE_STRING, then we're printing a
715 byte string, hence the choice of "ASCII" as the
717 gdb_puts ("b", stream
);
718 printstr (stream
, type
->target_type (),
719 val
->contents_for_printing ().data (),
720 high_bound
- low_bound
+ 1, "ASCII", 0, &opts
);
724 case TYPE_CODE_ARRAY
:
726 LONGEST low_bound
, high_bound
;
728 if (get_array_bounds (type
, &low_bound
, &high_bound
)
729 && high_bound
- low_bound
+ 1 == 0)
730 gdb_puts ("[]", stream
);
736 case TYPE_CODE_UNION
:
737 /* Untagged unions are printed as if they are structs. Since
738 the field bit positions overlap in the debuginfo, the code
739 for printing a union is same as that for a struct, the only
740 difference is that the input type will have overlapping
742 val_print_struct (val
, stream
, recurse
, &opts
);
745 case TYPE_CODE_STRUCT
:
746 if (rust_enum_p (type
))
747 print_enum (val
, stream
, recurse
, &opts
);
749 val_print_struct (val
, stream
, recurse
, &opts
);
754 /* Nothing special yet. */
755 generic_value_print (val
, stream
, recurse
, &opts
, &rust_decorations
);
759 /* See language.h. */
762 rust_language::value_print
763 (struct value
*val
, struct ui_file
*stream
,
764 const struct value_print_options
*options
) const
766 value_print_options opts
= *options
;
767 opts
.deref_ref
= true;
769 struct type
*type
= check_typedef (val
->type ());
770 if (type
->is_pointer_or_reference ())
772 gdb_printf (stream
, "(");
773 type_print (val
->type (), "", stream
, -1);
774 gdb_printf (stream
, ") ");
777 return common_val_print (val
, stream
, 0, &opts
, this);
783 rust_internal_print_type (struct type
*type
, const char *varstring
,
784 struct ui_file
*stream
, int show
, int level
,
785 const struct type_print_options
*flags
,
786 bool for_rust_enum
, print_offset_data
*podata
);
788 /* Print a struct or union typedef. */
790 rust_print_struct_def (struct type
*type
, const char *varstring
,
791 struct ui_file
*stream
, int show
, int level
,
792 const struct type_print_options
*flags
,
793 bool for_rust_enum
, print_offset_data
*podata
)
795 /* Print a tuple type simply. */
796 if (rust_tuple_type_p (type
))
798 gdb_puts (type
->name (), stream
);
802 /* If we see a base class, delegate to C. */
803 if (TYPE_N_BASECLASSES (type
) > 0)
804 c_print_type (type
, varstring
, stream
, show
, level
, language_rust
, flags
);
806 if (flags
->print_offsets
)
808 /* Temporarily bump the level so that the output lines up
813 /* Compute properties of TYPE here because, in the enum case, the
814 rest of the code ends up looking only at the variant part. */
815 const char *tagname
= type
->name ();
816 bool is_tuple_struct
= rust_tuple_struct_type_p (type
);
817 bool is_tuple
= rust_tuple_type_p (type
);
818 bool is_enum
= rust_enum_p (type
);
822 /* Already printing an outer enum, so nothing to print here. */
826 /* This code path is also used by unions and enums. */
829 gdb_puts ("enum ", stream
);
830 dynamic_prop
*prop
= type
->dyn_prop (DYN_PROP_VARIANT_PARTS
);
831 if (prop
!= nullptr && prop
->kind () == PROP_TYPE
)
832 type
= prop
->original_type ();
834 else if (type
->code () == TYPE_CODE_STRUCT
)
835 gdb_puts ("struct ", stream
);
837 gdb_puts ("union ", stream
);
840 gdb_puts (tagname
, stream
);
843 if (type
->num_fields () == 0 && !is_tuple
)
845 if (for_rust_enum
&& !flags
->print_offsets
)
846 gdb_puts (is_tuple_struct
? "(" : "{", stream
);
848 gdb_puts (is_tuple_struct
? " (\n" : " {\n", stream
);
850 /* When printing offsets, we rearrange the fields into storage
851 order. This lets us show holes more clearly. We work using
852 field indices here because it simplifies calls to
853 print_offset_data::update below. */
854 std::vector
<int> fields
;
855 for (int i
= 0; i
< type
->num_fields (); ++i
)
857 if (type
->field (i
).is_static ())
859 if (is_enum
&& type
->field (i
).is_artificial ())
861 fields
.push_back (i
);
863 if (flags
->print_offsets
)
864 std::sort (fields
.begin (), fields
.end (),
867 return (type
->field (a
).loc_bitpos ()
868 < type
->field (b
).loc_bitpos ());
875 gdb_assert (!type
->field (i
).is_static ());
876 gdb_assert (! (is_enum
&& type
->field (i
).is_artificial ()));
878 if (flags
->print_offsets
)
879 podata
->update (type
, i
, stream
);
881 /* We'd like to print "pub" here as needed, but rustc
882 doesn't emit the debuginfo, and our types don't have
883 cplus_struct_type attached. */
885 /* For a tuple struct we print the type but nothing
887 if (!for_rust_enum
|| flags
->print_offsets
)
888 print_spaces (level
+ 2, stream
);
890 fputs_styled (type
->field (i
).name (), variable_name_style
.style (),
892 else if (!is_tuple_struct
)
893 gdb_printf (stream
, "%ps: ",
894 styled_string (variable_name_style
.style (),
895 type
->field (i
).name ()));
897 rust_internal_print_type (type
->field (i
).type (), NULL
,
898 stream
, (is_enum
? show
: show
- 1),
899 level
+ 2, flags
, is_enum
, podata
);
900 if (!for_rust_enum
|| flags
->print_offsets
)
901 gdb_puts (",\n", stream
);
902 /* Note that this check of "I" is ok because we only sorted the
903 fields by offset when print_offsets was set, so we won't take
904 this branch in that case. */
905 else if (i
+ 1 < type
->num_fields ())
906 gdb_puts (", ", stream
);
909 if (flags
->print_offsets
)
911 /* Undo the temporary level increase we did above. */
913 podata
->finish (type
, level
, stream
);
914 print_spaces (print_offset_data::indentation
, stream
);
916 print_spaces (2, stream
);
918 if (!for_rust_enum
|| flags
->print_offsets
)
919 print_spaces (level
, stream
);
920 gdb_puts (is_tuple_struct
? ")" : "}", stream
);
923 /* la_print_type implementation for Rust. */
926 rust_internal_print_type (struct type
*type
, const char *varstring
,
927 struct ui_file
*stream
, int show
, int level
,
928 const struct type_print_options
*flags
,
929 bool for_rust_enum
, print_offset_data
*podata
)
933 && type
->name () != NULL
)
935 /* Rust calls the unit type "void" in its debuginfo,
936 but we don't want to print it as that. */
937 if (type
->code () == TYPE_CODE_VOID
)
938 gdb_puts ("()", stream
);
940 gdb_puts (type
->name (), stream
);
944 type
= check_typedef (type
);
945 switch (type
->code ())
948 /* If we have an enum, we've already printed the type's
949 unqualified name, and there is nothing else to print
952 gdb_puts ("()", stream
);
956 /* Delegate varargs to the C printer. */
957 if (type
->has_varargs ())
960 gdb_puts ("fn ", stream
);
961 if (varstring
!= NULL
)
962 gdb_puts (varstring
, stream
);
963 gdb_puts ("(", stream
);
964 for (int i
= 0; i
< type
->num_fields (); ++i
)
968 gdb_puts (", ", stream
);
969 rust_internal_print_type (type
->field (i
).type (), "", stream
,
970 -1, 0, flags
, false, podata
);
972 gdb_puts (")", stream
);
973 /* If it returns unit, we can omit the return type. */
974 if (type
->target_type ()->code () != TYPE_CODE_VOID
)
976 gdb_puts (" -> ", stream
);
977 rust_internal_print_type (type
->target_type (), "", stream
,
978 -1, 0, flags
, false, podata
);
982 case TYPE_CODE_ARRAY
:
984 LONGEST low_bound
, high_bound
;
986 gdb_puts ("[", stream
);
987 rust_internal_print_type (type
->target_type (), NULL
,
988 stream
, show
- 1, level
, flags
, false,
991 if (type
->bounds ()->high
.kind () == PROP_LOCEXPR
992 || type
->bounds ()->high
.kind () == PROP_LOCLIST
)
993 gdb_printf (stream
, "; variable length");
994 else if (get_array_bounds (type
, &low_bound
, &high_bound
))
995 gdb_printf (stream
, "; %s",
996 plongest (high_bound
- low_bound
+ 1));
997 gdb_puts ("]", stream
);
1001 case TYPE_CODE_UNION
:
1002 case TYPE_CODE_STRUCT
:
1003 rust_print_struct_def (type
, varstring
, stream
, show
, level
, flags
,
1004 for_rust_enum
, podata
);
1007 case TYPE_CODE_ENUM
:
1011 gdb_puts ("enum ", stream
);
1012 if (type
->name () != NULL
)
1014 gdb_puts (type
->name (), stream
);
1015 gdb_puts (" ", stream
);
1016 len
= strlen (type
->name ());
1018 gdb_puts ("{\n", stream
);
1020 for (int i
= 0; i
< type
->num_fields (); ++i
)
1022 const char *name
= type
->field (i
).name ();
1027 && strncmp (name
, type
->name (), len
) == 0
1029 && name
[len
+ 1] == ':')
1031 gdb_printf (stream
, "%*s%ps,\n",
1033 styled_string (variable_name_style
.style (),
1037 gdb_puts ("}", stream
);
1043 if (type
->name () != nullptr)
1044 gdb_puts (type
->name (), stream
);
1047 /* We currently can't distinguish between pointers and
1049 gdb_puts ("*mut ", stream
);
1050 type_print (type
->target_type (), "", stream
, 0);
1057 c_print_type (type
, varstring
, stream
, show
, level
, language_rust
,
1064 /* Like arch_composite_type, but uses TYPE to decide how to allocate
1065 -- either on an obstack or on a gdbarch. */
1067 static struct type
*
1068 rust_composite_type (struct type
*original
,
1070 const char *field1
, struct type
*type1
,
1071 const char *field2
, struct type
*type2
)
1073 struct type
*result
= type_allocator (original
).new_type ();
1074 int i
, nfields
, bitpos
;
1082 result
->set_code (TYPE_CODE_STRUCT
);
1083 result
->set_name (name
);
1085 result
->alloc_fields (nfields
);
1091 struct field
*field
= &result
->field (i
);
1093 field
->set_loc_bitpos (bitpos
);
1094 bitpos
+= type1
->length () * TARGET_CHAR_BIT
;
1096 field
->set_name (field1
);
1097 field
->set_type (type1
);
1102 struct field
*field
= &result
->field (i
);
1103 unsigned align
= type_align (type2
);
1109 align
*= TARGET_CHAR_BIT
;
1110 delta
= bitpos
% align
;
1112 bitpos
+= align
- delta
;
1114 field
->set_loc_bitpos (bitpos
);
1116 field
->set_name (field2
);
1117 field
->set_type (type2
);
1122 result
->set_length (result
->field (i
- 1).loc_bitpos () / TARGET_CHAR_BIT
1123 + result
->field (i
- 1).type ()->length ());
1127 /* See rust-lang.h. */
1130 rust_slice_type (const char *name
, struct type
*elt_type
,
1131 struct type
*usize_type
)
1135 elt_type
= lookup_pointer_type (elt_type
);
1136 type
= rust_composite_type (elt_type
, name
,
1137 "data_ptr", elt_type
,
1138 "length", usize_type
);
1149 rust_range_operation::evaluate (struct type
*expect_type
,
1150 struct expression
*exp
,
1153 auto kind
= std::get
<0> (m_storage
);
1154 value
*low
= nullptr;
1155 if (std::get
<1> (m_storage
) != nullptr)
1156 low
= std::get
<1> (m_storage
)->evaluate (nullptr, exp
, noside
);
1157 value
*high
= nullptr;
1158 if (std::get
<2> (m_storage
) != nullptr)
1159 high
= std::get
<2> (m_storage
)->evaluate (nullptr, exp
, noside
);
1161 struct value
*addrval
, *result
;
1163 struct type
*range_type
;
1164 struct type
*index_type
;
1165 struct type
*temp_type
;
1168 bool inclusive
= !(kind
& RANGE_HIGH_BOUND_EXCLUSIVE
);
1175 name
= "std::ops::RangeFull";
1179 index_type
= high
->type ();
1181 ? "std::ops::RangeToInclusive" : "std::ops::RangeTo");
1188 index_type
= low
->type ();
1189 name
= "std::ops::RangeFrom";
1193 if (!types_equal (low
->type (), high
->type ()))
1194 error (_("Range expression with different types"));
1195 index_type
= low
->type ();
1196 name
= inclusive
? "std::ops::RangeInclusive" : "std::ops::Range";
1200 /* If we don't have an index type, just allocate this on the
1201 arch. Here any type will do. */
1202 temp_type
= (index_type
== NULL
1203 ? language_bool_type (exp
->language_defn
, exp
->gdbarch
)
1205 /* It would be nicer to cache the range type. */
1206 range_type
= rust_composite_type (temp_type
, name
,
1207 low
== NULL
? NULL
: "start", index_type
,
1208 high
== NULL
? NULL
: "end", index_type
);
1210 if (noside
== EVAL_AVOID_SIDE_EFFECTS
)
1211 return value::zero (range_type
, lval_memory
);
1213 addrval
= value_allocate_space_in_inferior (range_type
->length ());
1214 addr
= value_as_long (addrval
);
1215 result
= value_at_lazy (range_type
, addr
);
1219 struct value
*start
= value_struct_elt (&result
, {}, "start", NULL
,
1222 value_assign (start
, low
);
1227 struct value
*end
= value_struct_elt (&result
, {}, "end", NULL
,
1230 value_assign (end
, high
);
1233 result
= value_at_lazy (range_type
, addr
);
1237 } /* namespace expr */
1239 /* A helper function to compute the range and kind given a range
1240 value. TYPE is the type of the range value. RANGE is the range
1241 value. LOW, HIGH, and KIND are out parameters. The LOW and HIGH
1242 parameters might be filled in, or might not be, depending on the
1243 kind of range this is. KIND will always be set to the appropriate
1244 value describing the kind of range, and this can be used to
1245 determine whether LOW or HIGH are valid. */
1248 rust_compute_range (struct type
*type
, struct value
*range
,
1249 LONGEST
*low
, LONGEST
*high
,
1256 *kind
= RANGE_LOW_BOUND_DEFAULT
| RANGE_HIGH_BOUND_DEFAULT
;
1258 if (type
->num_fields () == 0)
1262 if (strcmp (type
->field (0).name (), "start") == 0)
1264 *kind
= RANGE_HIGH_BOUND_DEFAULT
;
1265 *low
= value_as_long (value_field (range
, 0));
1268 if (type
->num_fields () > i
1269 && strcmp (type
->field (i
).name (), "end") == 0)
1271 *kind
= (*kind
== (RANGE_LOW_BOUND_DEFAULT
| RANGE_HIGH_BOUND_DEFAULT
)
1272 ? RANGE_LOW_BOUND_DEFAULT
: RANGE_STANDARD
);
1273 *high
= value_as_long (value_field (range
, i
));
1275 if (rust_inclusive_range_type_p (type
))
1284 rust_subscript_operation::subscript (struct expression
*exp
,
1285 enum noside noside
, bool for_addr
)
1287 value
*lhs
= std::get
<0> (m_storage
)->evaluate (nullptr, exp
, noside
);
1288 value
*rhs
= std::get
<1> (m_storage
)->evaluate (nullptr, exp
, noside
);
1290 struct value
*result
;
1291 struct type
*rhstype
;
1292 LONGEST low
, high_bound
;
1293 /* Initialized to appease the compiler. */
1294 range_flags kind
= RANGE_LOW_BOUND_DEFAULT
| RANGE_HIGH_BOUND_DEFAULT
;
1296 bool want_slice
= false;
1298 rhstype
= check_typedef (rhs
->type ());
1299 if (rust_range_type_p (rhstype
))
1302 error (_("Can't take slice of array without '&'"));
1303 rust_compute_range (rhstype
, rhs
, &low
, &high
, &kind
);
1307 low
= value_as_long (rhs
);
1309 struct type
*type
= check_typedef (lhs
->type ());
1310 struct type
*orig_type
= type
;
1311 if (noside
== EVAL_AVOID_SIDE_EFFECTS
)
1313 struct type
*base_type
= nullptr;
1314 if (type
->code () == TYPE_CODE_ARRAY
)
1315 base_type
= type
->target_type ();
1316 else if (rust_slice_type_p (type
))
1318 base_type
= rust_array_like_element_type (type
);
1319 if (base_type
== nullptr)
1320 error (_("Cannot subscript non-array-like slice"));
1322 else if (type
->code () == TYPE_CODE_PTR
)
1323 base_type
= type
->target_type ();
1325 error (_("Cannot subscript non-array type"));
1327 struct type
*new_type
;
1330 if (rust_slice_type_p (type
))
1335 = language_lookup_primitive_type (exp
->language_defn
,
1338 new_type
= rust_slice_type ("&[*gdb*]", base_type
, usize
);
1342 new_type
= base_type
;
1344 return value::zero (new_type
, lhs
->lval ());
1351 if (rust_slice_type_p (type
))
1353 lhs
= convert_slice (lhs
);
1354 type
= check_typedef (lhs
->type ());
1357 if (type
->code () == TYPE_CODE_ARRAY
)
1360 if (!get_array_bounds (type
, &low_bound
, &high_bound
))
1361 error (_("Can't compute array bounds"));
1363 error (_("Found array with non-zero lower bound"));
1366 else if (type
->code () == TYPE_CODE_PTR
)
1370 high_bound
= LONGEST_MAX
;
1373 error (_("Cannot subscript non-array type"));
1375 if (want_slice
&& (kind
& RANGE_LOW_BOUND_DEFAULT
))
1378 error (_("Index less than zero"));
1379 if (low
> high_bound
)
1380 error (_("Index greater than length"));
1382 result
= value_subscript (base
, low
);
1389 struct type
*usize
, *slice
;
1391 struct value
*addrval
, *tem
;
1393 if (kind
& RANGE_HIGH_BOUND_DEFAULT
)
1396 error (_("High index less than zero"));
1398 error (_("Low index greater than high index"));
1399 if (high
> high_bound
)
1400 error (_("High index greater than length"));
1402 usize
= language_lookup_primitive_type (exp
->language_defn
,
1405 /* Preserve the name for slice-of-slice; this lets
1406 string-printing work a bit more nicely. */
1407 const char *new_name
= ((orig_type
!= nullptr
1408 && rust_slice_type_p (orig_type
))
1409 ? orig_type
->name () : "&[*gdb*]");
1411 slice
= rust_slice_type (new_name
, result
->type (), usize
);
1413 addrval
= value_allocate_space_in_inferior (slice
->length ());
1414 addr
= value_as_long (addrval
);
1415 tem
= value_at_lazy (slice
, addr
);
1417 value_assign (value_field (tem
, 0), value_addr (result
));
1418 value_assign (value_field (tem
, 1),
1419 value_from_longest (usize
, high
- low
));
1421 result
= value_at_lazy (slice
, addr
);
1424 result
= value_addr (result
);
1431 rust_unop_ind_operation::evaluate (struct type
*expect_type
,
1432 struct expression
*exp
,
1435 if (noside
!= EVAL_NORMAL
)
1436 return unop_ind_operation::evaluate (expect_type
, exp
, noside
);
1438 struct value
*value
= std::get
<0> (m_storage
)->evaluate (nullptr, exp
,
1440 struct value
*trait_ptr
= rust_get_trait_object_pointer (value
);
1441 if (trait_ptr
!= NULL
)
1444 return value_ind (value
);
1447 } /* namespace expr */
1449 /* A helper function for UNOP_COMPLEMENT. */
1452 eval_op_rust_complement (struct type
*expect_type
, struct expression
*exp
,
1454 enum exp_opcode opcode
,
1455 struct value
*value
)
1457 if (value
->type ()->code () == TYPE_CODE_BOOL
)
1458 return value_from_longest (value
->type (), value_logical_not (value
));
1459 return value_complement (value
);
1462 /* A helper function for OP_ARRAY. */
1465 eval_op_rust_array (struct type
*expect_type
, struct expression
*exp
,
1467 enum exp_opcode opcode
,
1468 struct value
*elt
, struct value
*ncopies
)
1470 int copies
= value_as_long (ncopies
);
1472 error (_("Array with negative number of elements"));
1474 if (noside
== EVAL_NORMAL
&& copies
> 0)
1475 return value_array (0, std::vector
<value
*> (copies
, elt
));
1478 struct type
*arraytype
1479 = lookup_array_range_type (elt
->type (), 0, copies
- 1);
1480 return value::allocate (arraytype
);
1488 rust_struct_anon::evaluate (struct type
*expect_type
,
1489 struct expression
*exp
,
1492 value
*lhs
= std::get
<1> (m_storage
)->evaluate (nullptr, exp
, noside
);
1493 int field_number
= std::get
<0> (m_storage
);
1495 struct type
*type
= check_typedef (lhs
->type ());
1497 if (type
->code () == TYPE_CODE_STRUCT
)
1499 struct type
*outer_type
= NULL
;
1501 if (rust_enum_p (type
))
1503 type
= resolve_dynamic_type (type
, lhs
->contents (),
1506 if (rust_empty_enum_p (type
))
1507 error (_("Cannot access field %d of empty enum %s"),
1508 field_number
, type
->name ());
1510 int fieldno
= rust_enum_variant (type
);
1511 lhs
= lhs
->primitive_field (0, fieldno
, type
);
1513 type
= lhs
->type ();
1516 /* Tuples and tuple structs */
1517 int nfields
= type
->num_fields ();
1519 if (field_number
>= nfields
|| field_number
< 0)
1521 if (outer_type
!= NULL
)
1522 error(_("Cannot access field %d of variant %s::%s, "
1523 "there are only %d fields"),
1524 field_number
, outer_type
->name (),
1525 rust_last_path_segment (type
->name ()),
1528 error(_("Cannot access field %d of %s, "
1529 "there are only %d fields"),
1530 field_number
, type
->name (), nfields
);
1533 /* Tuples are tuple structs too. */
1534 if (!rust_tuple_struct_type_p (type
))
1536 if (outer_type
!= NULL
)
1537 error(_("Variant %s::%s is not a tuple variant"),
1538 outer_type
->name (),
1539 rust_last_path_segment (type
->name ()));
1541 error(_("Attempting to access anonymous field %d "
1542 "of %s, which is not a tuple, tuple struct, or "
1543 "tuple-like variant"),
1544 field_number
, type
->name ());
1547 return lhs
->primitive_field (0, field_number
, type
);
1550 error(_("Anonymous field access is only allowed on tuples, \
1551 tuple structs, and tuple-like enum variants"));
1555 rust_structop::evaluate (struct type
*expect_type
,
1556 struct expression
*exp
,
1559 value
*lhs
= std::get
<0> (m_storage
)->evaluate (nullptr, exp
, noside
);
1560 const char *field_name
= std::get
<1> (m_storage
).c_str ();
1562 struct value
*result
;
1563 struct type
*type
= lhs
->type ();
1564 if (type
->code () == TYPE_CODE_STRUCT
&& rust_enum_p (type
))
1566 type
= resolve_dynamic_type (type
, lhs
->contents (),
1569 if (rust_empty_enum_p (type
))
1570 error (_("Cannot access field %s of empty enum %s"),
1571 field_name
, type
->name ());
1573 int fieldno
= rust_enum_variant (type
);
1574 lhs
= lhs
->primitive_field (0, fieldno
, type
);
1576 struct type
*outer_type
= type
;
1577 type
= lhs
->type ();
1578 if (rust_tuple_type_p (type
) || rust_tuple_struct_type_p (type
))
1579 error (_("Attempting to access named field %s of tuple "
1580 "variant %s::%s, which has only anonymous fields"),
1581 field_name
, outer_type
->name (),
1582 rust_last_path_segment (type
->name ()));
1586 result
= value_struct_elt (&lhs
, {}, field_name
,
1589 catch (const gdb_exception_error
&except
)
1591 error (_("Could not find field %s of struct variant %s::%s"),
1592 field_name
, outer_type
->name (),
1593 rust_last_path_segment (type
->name ()));
1598 if (rust_slice_type_p (type
))
1599 lhs
= convert_slice (lhs
);
1600 result
= value_struct_elt (&lhs
, {}, field_name
, NULL
, "structure");
1602 if (noside
== EVAL_AVOID_SIDE_EFFECTS
)
1603 result
= value::zero (result
->type (), result
->lval ());
1608 rust_aggregate_operation::evaluate (struct type
*expect_type
,
1609 struct expression
*exp
,
1612 struct type
*type
= std::get
<0> (m_storage
);
1614 struct value
*addrval
= NULL
;
1617 if (noside
== EVAL_NORMAL
)
1619 addrval
= value_allocate_space_in_inferior (type
->length ());
1620 addr
= value_as_long (addrval
);
1621 result
= value_at_lazy (type
, addr
);
1624 if (std::get
<1> (m_storage
) != nullptr)
1626 struct value
*init
= std::get
<1> (m_storage
)->evaluate (nullptr, exp
,
1629 if (noside
== EVAL_NORMAL
)
1631 /* This isn't quite right but will do for the time
1632 being, seeing that we can't implement the Copy
1634 value_assign (result
, init
);
1638 for (const auto &item
: std::get
<2> (m_storage
))
1640 value
*val
= item
.second
->evaluate (nullptr, exp
, noside
);
1641 if (noside
== EVAL_NORMAL
)
1643 const char *fieldname
= item
.first
.c_str ();
1644 value
*field
= value_struct_elt (&result
, {}, fieldname
,
1645 nullptr, "structure");
1646 value_assign (field
, val
);
1650 if (noside
== EVAL_AVOID_SIDE_EFFECTS
)
1651 result
= value::allocate (type
);
1653 result
= value_at_lazy (type
, addr
);
1659 rust_structop::evaluate_funcall (struct type
*expect_type
,
1660 struct expression
*exp
,
1662 const std::vector
<operation_up
> &ops
)
1664 std::vector
<struct value
*> args (ops
.size () + 1);
1666 /* Evaluate the argument to STRUCTOP_STRUCT, then find its
1667 type in order to look up the method. */
1668 args
[0] = std::get
<0> (m_storage
)->evaluate (nullptr, exp
, noside
);
1669 /* We don't yet implement real Deref semantics. */
1670 while (args
[0]->type ()->code () == TYPE_CODE_PTR
)
1671 args
[0] = value_ind (args
[0]);
1673 struct type
*type
= args
[0]->type ();
1674 if ((type
->code () != TYPE_CODE_STRUCT
1675 && type
->code () != TYPE_CODE_UNION
1676 && type
->code () != TYPE_CODE_ENUM
)
1677 || rust_tuple_type_p (type
))
1678 error (_("Method calls only supported on struct or enum types"));
1679 if (type
->name () == NULL
)
1680 error (_("Method call on nameless type"));
1682 std::string name
= (std::string (type
->name ()) + "::"
1683 + std::get
<1> (m_storage
));
1685 const struct block
*block
= get_selected_block (0);
1686 struct block_symbol sym
= lookup_symbol (name
.c_str (), block
,
1687 SEARCH_FUNCTION_DOMAIN
,
1689 if (sym
.symbol
== NULL
)
1690 error (_("Could not find function named '%s'"), name
.c_str ());
1692 struct type
*fn_type
= sym
.symbol
->type ();
1693 if (fn_type
->num_fields () == 0)
1694 error (_("Function '%s' takes no arguments"), name
.c_str ());
1696 if (fn_type
->field (0).type ()->code () == TYPE_CODE_PTR
)
1697 args
[0] = value_addr (args
[0]);
1699 value
*function
= address_of_variable (sym
.symbol
, block
);
1701 for (int i
= 0; i
< ops
.size (); ++i
)
1702 args
[i
+ 1] = ops
[i
]->evaluate (nullptr, exp
, noside
);
1704 if (noside
== EVAL_AVOID_SIDE_EFFECTS
)
1705 return value::zero (fn_type
->target_type (), not_lval
);
1706 return call_function_by_hand (function
, NULL
, args
);
1713 /* See language.h. */
1716 rust_language::language_arch_info (struct gdbarch
*gdbarch
,
1717 struct language_arch_info
*lai
) const
1719 const struct builtin_type
*builtin
= builtin_type (gdbarch
);
1721 /* Helper function to allow shorter lines below. */
1722 auto add
= [&] (struct type
* t
) -> struct type
*
1724 lai
->add_primitive_type (t
);
1728 type_allocator
alloc (gdbarch
);
1729 struct type
*bool_type
1730 = add (init_boolean_type (alloc
, 8, 1, "bool"));
1731 add (init_character_type (alloc
, 32, 1, "char"));
1732 add (init_integer_type (alloc
, 8, 0, "i8"));
1733 struct type
*u8_type
1734 = add (init_integer_type (alloc
, 8, 1, "u8"));
1735 add (init_integer_type (alloc
, 16, 0, "i16"));
1736 add (init_integer_type (alloc
, 16, 1, "u16"));
1737 add (init_integer_type (alloc
, 32, 0, "i32"));
1738 add (init_integer_type (alloc
, 32, 1, "u32"));
1739 add (init_integer_type (alloc
, 64, 0, "i64"));
1740 add (init_integer_type (alloc
, 64, 1, "u64"));
1741 add (init_integer_type (alloc
, 128, 0, "i128"));
1742 add (init_integer_type (alloc
, 128, 1, "u128"));
1744 unsigned int length
= 8 * builtin
->builtin_data_ptr
->length ();
1745 add (init_integer_type (alloc
, length
, 0, "isize"));
1746 struct type
*usize_type
1747 = add (init_integer_type (alloc
, length
, 1, "usize"));
1749 add (init_float_type (alloc
, 32, "f32", floatformats_ieee_single
));
1750 add (init_float_type (alloc
, 64, "f64", floatformats_ieee_double
));
1751 add (init_integer_type (alloc
, 0, 1, "()"));
1753 struct type
*tem
= make_cv_type (1, 0, u8_type
, NULL
);
1754 add (rust_slice_type ("&str", tem
, usize_type
));
1756 lai
->set_bool_type (bool_type
);
1757 lai
->set_string_char_type (u8_type
);
1760 /* See language.h. */
1763 rust_language::print_type (struct type
*type
, const char *varstring
,
1764 struct ui_file
*stream
, int show
, int level
,
1765 const struct type_print_options
*flags
) const
1767 print_offset_data
podata (flags
);
1768 rust_internal_print_type (type
, varstring
, stream
, show
, level
,
1769 flags
, false, &podata
);
1772 /* See language.h. */
1775 rust_language::emitchar (int ch
, struct type
*chtype
,
1776 struct ui_file
*stream
, int quoter
) const
1778 if (!rust_chartype_p (chtype
))
1779 generic_emit_char (ch
, chtype
, stream
, quoter
,
1780 target_charset (chtype
->arch ()));
1781 else if (ch
== '\\' || ch
== quoter
)
1782 gdb_printf (stream
, "\\%c", ch
);
1783 else if (ch
== '\n')
1784 gdb_puts ("\\n", stream
);
1785 else if (ch
== '\r')
1786 gdb_puts ("\\r", stream
);
1787 else if (ch
== '\t')
1788 gdb_puts ("\\t", stream
);
1789 else if (ch
== '\0')
1790 gdb_puts ("\\0", stream
);
1791 else if (ch
>= 32 && ch
<= 127 && isprint (ch
))
1792 gdb_putc (ch
, stream
);
1794 gdb_printf (stream
, "\\x%02x", ch
);
1796 gdb_printf (stream
, "\\u{%06x}", ch
);
1799 /* See language.h. */
1802 rust_language::is_array_like (struct type
*type
) const
1804 if (!rust_slice_type_p (type
))
1806 return rust_array_like_element_type (type
) != nullptr;
1809 /* See language.h. */
1812 rust_language::is_string_type_p (struct type
*type
) const
1814 LONGEST low_bound
, high_bound
;
1816 type
= check_typedef (type
);
1817 return ((type
->code () == TYPE_CODE_STRING
)
1818 || (type
->code () == TYPE_CODE_PTR
1819 && (type
->target_type ()->code () == TYPE_CODE_ARRAY
1820 && rust_u8_type_p (type
->target_type ()->target_type ())
1821 && get_array_bounds (type
->target_type (), &low_bound
,
1823 || (type
->code () == TYPE_CODE_STRUCT
1824 && !rust_enum_p (type
)
1825 && rust_slice_type_p (type
)
1826 && strcmp (type
->name (), "&str") == 0));
1829 /* See language.h. */
1832 rust_language::lookup_symbol_nonlocal
1833 (const char *name
, const struct block
*block
,
1834 const domain_search_flags domain
) const
1836 struct block_symbol result
= {};
1838 const char *scope
= block
== nullptr ? "" : block
->scope ();
1839 symbol_lookup_debug_printf
1840 ("rust_lookup_symbol_non_local (%s, %s (scope %s), %s)",
1841 name
, host_address_to_string (block
), scope
,
1842 domain_name (domain
).c_str ());
1844 /* Look up bare names in the block's scope. */
1845 std::string scopedname
;
1846 if (name
[cp_find_first_component (name
)] == '\0')
1848 if (scope
[0] != '\0')
1850 scopedname
= std::string (scope
) + "::" + name
;
1851 name
= scopedname
.c_str ();
1859 result
= lookup_symbol_in_static_block (name
, block
, domain
);
1860 if (result
.symbol
== NULL
)
1861 result
= lookup_global_symbol (name
, block
, domain
);
1866 /* Single instance of the Rust language class. */
1868 static rust_language rust_language_defn
;