1 /* Rust language support routines for GDB, the GNU debugger.
3 Copyright (C) 2016-2019 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/>. */
27 #include "cp-support.h"
33 #include "rust-lang.h"
34 #include "typeprint.h"
41 /* See rust-lang.h. */
44 rust_last_path_segment (const char *path
)
46 const char *result
= strrchr (path
, ':');
53 /* See rust-lang.h. */
56 rust_crate_for_block (const struct block
*block
)
58 const char *scope
= block_scope (block
);
61 return std::string ();
63 return std::string (scope
, cp_find_first_component (scope
));
66 /* Return true if TYPE, which must be a struct type, represents a Rust
70 rust_enum_p (const struct type
*type
)
72 return (TYPE_CODE (type
) == TYPE_CODE_STRUCT
73 && TYPE_NFIELDS (type
) == 1
74 && TYPE_FLAG_DISCRIMINATED_UNION (TYPE_FIELD_TYPE (type
, 0)));
77 /* Return true if TYPE, which must be an enum type, has no
81 rust_empty_enum_p (const struct type
*type
)
83 gdb_assert (rust_enum_p (type
));
84 /* In Rust the enum always fills the containing structure. */
85 gdb_assert (TYPE_FIELD_BITPOS (type
, 0) == 0);
87 return TYPE_NFIELDS (TYPE_FIELD_TYPE (type
, 0)) == 0;
90 /* Given an enum type and contents, find which variant is active. */
93 rust_enum_variant (struct type
*type
, const gdb_byte
*contents
)
95 /* In Rust the enum always fills the containing structure. */
96 gdb_assert (TYPE_FIELD_BITPOS (type
, 0) == 0);
98 struct type
*union_type
= TYPE_FIELD_TYPE (type
, 0);
100 int fieldno
= value_union_variant (union_type
, contents
);
101 return &TYPE_FIELD (union_type
, fieldno
);
104 /* See rust-lang.h. */
107 rust_tuple_type_p (struct type
*type
)
109 /* The current implementation is a bit of a hack, but there's
110 nothing else in the debuginfo to distinguish a tuple from a
112 return (TYPE_CODE (type
) == TYPE_CODE_STRUCT
113 && TYPE_NAME (type
) != NULL
114 && TYPE_NAME (type
)[0] == '(');
117 /* Return true if all non-static fields of a structlike type are in a
118 sequence like __0, __1, __2. */
121 rust_underscore_fields (struct type
*type
)
127 if (TYPE_CODE (type
) != TYPE_CODE_STRUCT
)
129 for (i
= 0; i
< TYPE_NFIELDS (type
); ++i
)
131 if (!field_is_static (&TYPE_FIELD (type
, i
)))
135 xsnprintf (buf
, sizeof (buf
), "__%d", field_number
);
136 if (strcmp (buf
, TYPE_FIELD_NAME (type
, i
)) != 0)
144 /* See rust-lang.h. */
147 rust_tuple_struct_type_p (struct type
*type
)
149 /* This is just an approximation until DWARF can represent Rust more
150 precisely. We exclude zero-length structs because they may not
151 be tuple structs, and there's no way to tell. */
152 return TYPE_NFIELDS (type
) > 0 && rust_underscore_fields (type
);
155 /* Return true if TYPE is a slice type, otherwise false. */
158 rust_slice_type_p (struct type
*type
)
160 return (TYPE_CODE (type
) == TYPE_CODE_STRUCT
161 && TYPE_NAME (type
) != NULL
162 && (strncmp (TYPE_NAME (type
), "&[", 2) == 0
163 || strcmp (TYPE_NAME (type
), "&str") == 0));
166 /* Return true if TYPE is a range type, otherwise false. */
169 rust_range_type_p (struct type
*type
)
173 if (TYPE_CODE (type
) != TYPE_CODE_STRUCT
174 || TYPE_NFIELDS (type
) > 2
175 || TYPE_NAME (type
) == NULL
176 || strstr (TYPE_NAME (type
), "::Range") == NULL
)
179 if (TYPE_NFIELDS (type
) == 0)
183 if (strcmp (TYPE_FIELD_NAME (type
, 0), "start") == 0)
185 if (TYPE_NFIELDS (type
) == 1)
189 else if (TYPE_NFIELDS (type
) == 2)
191 /* First field had to be "start". */
195 return strcmp (TYPE_FIELD_NAME (type
, i
), "end") == 0;
198 /* Return true if TYPE is an inclusive range type, otherwise false.
199 This is only valid for types which are already known to be range
203 rust_inclusive_range_type_p (struct type
*type
)
205 return (strstr (TYPE_NAME (type
), "::RangeInclusive") != NULL
206 || strstr (TYPE_NAME (type
), "::RangeToInclusive") != NULL
);
209 /* Return true if TYPE seems to be the type "u8", otherwise false. */
212 rust_u8_type_p (struct type
*type
)
214 return (TYPE_CODE (type
) == TYPE_CODE_INT
215 && TYPE_UNSIGNED (type
)
216 && TYPE_LENGTH (type
) == 1);
219 /* Return true if TYPE is a Rust character type. */
222 rust_chartype_p (struct type
*type
)
224 return (TYPE_CODE (type
) == TYPE_CODE_CHAR
225 && TYPE_LENGTH (type
) == 4
226 && TYPE_UNSIGNED (type
));
229 /* Return true if TYPE is a string type. */
232 rust_is_string_type_p (struct type
*type
)
234 LONGEST low_bound
, high_bound
;
236 type
= check_typedef (type
);
237 return ((TYPE_CODE (type
) == TYPE_CODE_STRING
)
238 || (TYPE_CODE (type
) == TYPE_CODE_PTR
239 && (TYPE_CODE (TYPE_TARGET_TYPE (type
)) == TYPE_CODE_ARRAY
240 && rust_u8_type_p (TYPE_TARGET_TYPE (TYPE_TARGET_TYPE (type
)))
241 && get_array_bounds (TYPE_TARGET_TYPE (type
), &low_bound
,
243 || (TYPE_CODE (type
) == TYPE_CODE_STRUCT
244 && !rust_enum_p (type
)
245 && rust_slice_type_p (type
)
246 && strcmp (TYPE_NAME (type
), "&str") == 0));
249 /* If VALUE represents a trait object pointer, return the underlying
250 pointer with the correct (i.e., runtime) type. Otherwise, return
253 static struct value
*
254 rust_get_trait_object_pointer (struct value
*value
)
256 struct type
*type
= check_typedef (value_type (value
));
258 if (TYPE_CODE (type
) != TYPE_CODE_STRUCT
|| TYPE_NFIELDS (type
) != 2)
261 /* Try to be a bit resilient if the ABI changes. */
262 int vtable_field
= 0;
263 for (int i
= 0; i
< 2; ++i
)
265 if (strcmp (TYPE_FIELD_NAME (type
, i
), "vtable") == 0)
267 else if (strcmp (TYPE_FIELD_NAME (type
, i
), "pointer") != 0)
271 CORE_ADDR vtable
= value_as_address (value_field (value
, vtable_field
));
272 struct symbol
*symbol
= find_symbol_at_address (vtable
);
273 if (symbol
== NULL
|| symbol
->subclass
!= SYMBOL_RUST_VTABLE
)
276 struct rust_vtable_symbol
*vtable_sym
277 = static_cast<struct rust_vtable_symbol
*> (symbol
);
278 struct type
*pointer_type
= lookup_pointer_type (vtable_sym
->concrete_type
);
279 return value_cast (pointer_type
, value_field (value
, 1 - vtable_field
));
284 /* la_emitchar implementation for Rust. */
287 rust_emitchar (int c
, struct type
*type
, struct ui_file
*stream
, int quoter
)
289 if (!rust_chartype_p (type
))
290 generic_emit_char (c
, type
, stream
, quoter
,
291 target_charset (get_type_arch (type
)));
292 else if (c
== '\\' || c
== quoter
)
293 fprintf_filtered (stream
, "\\%c", c
);
295 fputs_filtered ("\\n", stream
);
297 fputs_filtered ("\\r", stream
);
299 fputs_filtered ("\\t", stream
);
301 fputs_filtered ("\\0", stream
);
302 else if (c
>= 32 && c
<= 127 && isprint (c
))
303 fputc_filtered (c
, stream
);
305 fprintf_filtered (stream
, "\\x%02x", c
);
307 fprintf_filtered (stream
, "\\u{%06x}", c
);
310 /* la_printchar implementation for Rust. */
313 rust_printchar (int c
, struct type
*type
, struct ui_file
*stream
)
315 fputs_filtered ("'", stream
);
316 LA_EMIT_CHAR (c
, type
, stream
, '\'');
317 fputs_filtered ("'", stream
);
320 /* la_printstr implementation for Rust. */
323 rust_printstr (struct ui_file
*stream
, struct type
*type
,
324 const gdb_byte
*string
, unsigned int length
,
325 const char *user_encoding
, int force_ellipses
,
326 const struct value_print_options
*options
)
328 /* Rust always uses UTF-8, but let the caller override this if need
330 const char *encoding
= user_encoding
;
331 if (user_encoding
== NULL
|| !*user_encoding
)
333 /* In Rust strings, characters are "u8". */
334 if (rust_u8_type_p (type
))
338 /* This is probably some C string, so let's let C deal with
340 c_printstr (stream
, type
, string
, length
, user_encoding
,
341 force_ellipses
, options
);
346 /* This is not ideal as it doesn't use our character printer. */
347 generic_printstr (stream
, type
, string
, length
, encoding
, force_ellipses
,
353 /* Helper function to print a string slice. */
356 rust_val_print_str (struct ui_file
*stream
, struct value
*val
,
357 const struct value_print_options
*options
)
359 struct value
*base
= value_struct_elt (&val
, NULL
, "data_ptr", NULL
,
361 struct value
*len
= value_struct_elt (&val
, NULL
, "length", NULL
, "slice");
363 val_print_string (TYPE_TARGET_TYPE (value_type (base
)), "UTF-8",
364 value_as_address (base
), value_as_long (len
), stream
,
368 /* rust_val_print helper for structs and untagged unions. */
371 val_print_struct (struct type
*type
, int embedded_offset
,
372 CORE_ADDR address
, struct ui_file
*stream
,
373 int recurse
, struct value
*val
,
374 const struct value_print_options
*options
)
379 if (rust_slice_type_p (type
) && strcmp (TYPE_NAME (type
), "&str") == 0)
381 /* If what we are printing here is actually a string within a
382 structure then VAL will be the original parent value, while TYPE
383 will be the type of the structure representing the string we want
385 However, RUST_VAL_PRINT_STR looks up the fields of the string
386 inside VAL, assuming that VAL is the string.
387 So, recreate VAL as a value representing just the string. */
388 val
= value_at_lazy (type
, value_address (val
) + embedded_offset
);
389 rust_val_print_str (stream
, val
, options
);
393 bool is_tuple
= rust_tuple_type_p (type
);
394 bool is_tuple_struct
= !is_tuple
&& rust_tuple_struct_type_p (type
);
395 struct value_print_options opts
;
399 if (TYPE_NAME (type
) != NULL
)
400 fprintf_filtered (stream
, "%s", TYPE_NAME (type
));
402 if (TYPE_NFIELDS (type
) == 0)
405 if (TYPE_NAME (type
) != NULL
)
406 fputs_filtered (" ", stream
);
409 if (is_tuple
|| is_tuple_struct
)
410 fputs_filtered ("(", stream
);
412 fputs_filtered ("{", stream
);
418 for (i
= 0; i
< TYPE_NFIELDS (type
); ++i
)
420 if (field_is_static (&TYPE_FIELD (type
, i
)))
424 fputs_filtered (",", stream
);
426 if (options
->prettyformat
)
428 fputs_filtered ("\n", stream
);
429 print_spaces_filtered (2 + 2 * recurse
, stream
);
431 else if (!first_field
)
432 fputs_filtered (" ", stream
);
436 if (!is_tuple
&& !is_tuple_struct
)
438 fputs_filtered (TYPE_FIELD_NAME (type
, i
), stream
);
439 fputs_filtered (": ", stream
);
442 val_print (TYPE_FIELD_TYPE (type
, i
),
443 embedded_offset
+ TYPE_FIELD_BITPOS (type
, i
) / 8,
445 stream
, recurse
+ 1, val
, &opts
,
449 if (options
->prettyformat
)
451 fputs_filtered ("\n", stream
);
452 print_spaces_filtered (2 * recurse
, stream
);
455 if (is_tuple
|| is_tuple_struct
)
456 fputs_filtered (")", stream
);
458 fputs_filtered ("}", stream
);
461 /* rust_val_print helper for discriminated unions (Rust enums). */
464 rust_print_enum (struct type
*type
, int embedded_offset
,
465 CORE_ADDR address
, struct ui_file
*stream
,
466 int recurse
, struct value
*val
,
467 const struct value_print_options
*options
)
469 struct value_print_options opts
= *options
;
473 if (rust_empty_enum_p (type
))
475 /* Print the enum type name here to be more clear. */
476 fprintf_filtered (stream
, _("%s {<No data fields>}"), TYPE_NAME (type
));
480 const gdb_byte
*valaddr
= value_contents_for_printing (val
);
481 struct field
*variant_field
= rust_enum_variant (type
, valaddr
);
482 embedded_offset
+= FIELD_BITPOS (*variant_field
) / 8;
483 struct type
*variant_type
= FIELD_TYPE (*variant_field
);
485 int nfields
= TYPE_NFIELDS (variant_type
);
487 bool is_tuple
= rust_tuple_struct_type_p (variant_type
);
489 fprintf_filtered (stream
, "%s", TYPE_NAME (variant_type
));
492 /* In case of a nullary variant like 'None', just output
497 /* In case of a non-nullary variant, we output 'Foo(x,y,z)'. */
499 fprintf_filtered (stream
, "(");
502 /* struct variant. */
503 fprintf_filtered (stream
, "{");
506 bool first_field
= true;
507 for (int j
= 0; j
< TYPE_NFIELDS (variant_type
); j
++)
510 fputs_filtered (", ", stream
);
514 fprintf_filtered (stream
, "%s: ",
515 TYPE_FIELD_NAME (variant_type
, j
));
517 val_print (TYPE_FIELD_TYPE (variant_type
, j
),
519 + TYPE_FIELD_BITPOS (variant_type
, j
) / 8),
521 stream
, recurse
+ 1, val
, &opts
,
526 fputs_filtered (")", stream
);
528 fputs_filtered ("}", stream
);
531 static const struct generic_val_print_decorations rust_decorations
=
533 /* Complex isn't used in Rust, but we provide C-ish values just in
545 /* la_val_print implementation for Rust. */
548 rust_val_print (struct type
*type
, int embedded_offset
,
549 CORE_ADDR address
, struct ui_file
*stream
, int recurse
,
551 const struct value_print_options
*options
)
553 const gdb_byte
*valaddr
= value_contents_for_printing (val
);
555 type
= check_typedef (type
);
556 switch (TYPE_CODE (type
))
560 LONGEST low_bound
, high_bound
;
562 if (TYPE_CODE (TYPE_TARGET_TYPE (type
)) == TYPE_CODE_ARRAY
563 && rust_u8_type_p (TYPE_TARGET_TYPE (TYPE_TARGET_TYPE (type
)))
564 && get_array_bounds (TYPE_TARGET_TYPE (type
), &low_bound
,
566 /* We have a pointer to a byte string, so just print
568 struct type
*elttype
= check_typedef (TYPE_TARGET_TYPE (type
));
570 struct gdbarch
*arch
= get_type_arch (type
);
571 int unit_size
= gdbarch_addressable_memory_unit_size (arch
);
573 addr
= unpack_pointer (type
, valaddr
+ embedded_offset
* unit_size
);
574 if (options
->addressprint
)
576 fputs_filtered (paddress (arch
, addr
), stream
);
577 fputs_filtered (" ", stream
);
580 fputs_filtered ("b", stream
);
581 val_print_string (TYPE_TARGET_TYPE (elttype
), "ASCII", addr
,
582 high_bound
- low_bound
+ 1, stream
,
589 case TYPE_CODE_METHODPTR
:
590 case TYPE_CODE_MEMBERPTR
:
591 c_val_print (type
, embedded_offset
, address
, stream
,
592 recurse
, val
, options
);
596 /* Recognize the unit type. */
597 if (TYPE_UNSIGNED (type
) && TYPE_LENGTH (type
) == 0
598 && TYPE_NAME (type
) != NULL
&& strcmp (TYPE_NAME (type
), "()") == 0)
600 fputs_filtered ("()", stream
);
605 case TYPE_CODE_STRING
:
607 struct gdbarch
*arch
= get_type_arch (type
);
608 int unit_size
= gdbarch_addressable_memory_unit_size (arch
);
609 LONGEST low_bound
, high_bound
;
611 if (!get_array_bounds (type
, &low_bound
, &high_bound
))
612 error (_("Could not determine the array bounds"));
614 /* If we see a plain TYPE_CODE_STRING, then we're printing a
615 byte string, hence the choice of "ASCII" as the
617 fputs_filtered ("b", stream
);
618 rust_printstr (stream
, TYPE_TARGET_TYPE (type
),
619 valaddr
+ embedded_offset
* unit_size
,
620 high_bound
- low_bound
+ 1, "ASCII", 0, options
);
624 case TYPE_CODE_ARRAY
:
626 LONGEST low_bound
, high_bound
;
628 if (get_array_bounds (type
, &low_bound
, &high_bound
)
629 && high_bound
- low_bound
+ 1 == 0)
630 fputs_filtered ("[]", stream
);
636 case TYPE_CODE_UNION
:
637 /* Untagged unions are printed as if they are structs. Since
638 the field bit positions overlap in the debuginfo, the code
639 for printing a union is same as that for a struct, the only
640 difference is that the input type will have overlapping
642 val_print_struct (type
, embedded_offset
, address
, stream
,
643 recurse
, val
, options
);
646 case TYPE_CODE_STRUCT
:
647 if (rust_enum_p (type
))
648 rust_print_enum (type
, embedded_offset
, address
, stream
,
649 recurse
, val
, options
);
651 val_print_struct (type
, embedded_offset
, address
, stream
,
652 recurse
, val
, options
);
657 /* Nothing special yet. */
658 generic_val_print (type
, embedded_offset
, address
, stream
,
659 recurse
, val
, options
, &rust_decorations
);
666 rust_internal_print_type (struct type
*type
, const char *varstring
,
667 struct ui_file
*stream
, int show
, int level
,
668 const struct type_print_options
*flags
,
669 bool for_rust_enum
, print_offset_data
*podata
);
671 /* Print a struct or union typedef. */
673 rust_print_struct_def (struct type
*type
, const char *varstring
,
674 struct ui_file
*stream
, int show
, int level
,
675 const struct type_print_options
*flags
,
676 bool for_rust_enum
, print_offset_data
*podata
)
678 /* Print a tuple type simply. */
679 if (rust_tuple_type_p (type
))
681 fputs_filtered (TYPE_NAME (type
), stream
);
685 /* If we see a base class, delegate to C. */
686 if (TYPE_N_BASECLASSES (type
) > 0)
687 c_print_type (type
, varstring
, stream
, show
, level
, flags
);
689 if (flags
->print_offsets
)
691 /* Temporarily bump the level so that the output lines up
696 /* Compute properties of TYPE here because, in the enum case, the
697 rest of the code ends up looking only at the variant part. */
698 const char *tagname
= TYPE_NAME (type
);
699 bool is_tuple_struct
= rust_tuple_struct_type_p (type
);
700 bool is_tuple
= rust_tuple_type_p (type
);
701 bool is_enum
= rust_enum_p (type
);
703 int enum_discriminant_index
= -1;
707 /* Already printing an outer enum, so nothing to print here. */
711 /* This code path is also used by unions and enums. */
714 fputs_filtered ("enum ", stream
);
716 if (rust_empty_enum_p (type
))
720 fputs_filtered (tagname
, stream
);
721 fputs_filtered (" ", stream
);
723 fputs_filtered ("{}", stream
);
727 type
= TYPE_FIELD_TYPE (type
, 0);
729 struct dynamic_prop
*discriminant_prop
730 = get_dyn_prop (DYN_PROP_DISCRIMINATED
, type
);
731 struct discriminant_info
*info
732 = (struct discriminant_info
*) discriminant_prop
->data
.baton
;
733 enum_discriminant_index
= info
->discriminant_index
;
735 else if (TYPE_CODE (type
) == TYPE_CODE_STRUCT
)
736 fputs_filtered ("struct ", stream
);
738 fputs_filtered ("union ", stream
);
741 fputs_filtered (tagname
, stream
);
744 if (TYPE_NFIELDS (type
) == 0 && !is_tuple
)
746 if (for_rust_enum
&& !flags
->print_offsets
)
747 fputs_filtered (is_tuple_struct
? "(" : "{", stream
);
749 fputs_filtered (is_tuple_struct
? " (\n" : " {\n", stream
);
751 /* When printing offsets, we rearrange the fields into storage
752 order. This lets us show holes more clearly. We work using
753 field indices here because it simplifies calls to
754 print_offset_data::update below. */
755 std::vector
<int> fields
;
756 for (int i
= 0; i
< TYPE_NFIELDS (type
); ++i
)
758 if (field_is_static (&TYPE_FIELD (type
, i
)))
760 if (is_enum
&& i
== enum_discriminant_index
)
762 fields
.push_back (i
);
764 if (flags
->print_offsets
)
765 std::sort (fields
.begin (), fields
.end (),
768 return (TYPE_FIELD_BITPOS (type
, a
)
769 < TYPE_FIELD_BITPOS (type
, b
));
776 gdb_assert (!field_is_static (&TYPE_FIELD (type
, i
)));
777 gdb_assert (! (is_enum
&& i
== enum_discriminant_index
));
779 if (flags
->print_offsets
)
780 podata
->update (type
, i
, stream
);
782 /* We'd like to print "pub" here as needed, but rustc
783 doesn't emit the debuginfo, and our types don't have
784 cplus_struct_type attached. */
786 /* For a tuple struct we print the type but nothing
788 if (!for_rust_enum
|| flags
->print_offsets
)
789 print_spaces_filtered (level
+ 2, stream
);
791 fputs_filtered (TYPE_FIELD_NAME (type
, i
), stream
);
792 else if (!is_tuple_struct
)
793 fprintf_filtered (stream
, "%s: ", TYPE_FIELD_NAME (type
, i
));
795 rust_internal_print_type (TYPE_FIELD_TYPE (type
, i
), NULL
,
796 stream
, (is_enum
? show
: show
- 1),
797 level
+ 2, flags
, is_enum
, podata
);
798 if (!for_rust_enum
|| flags
->print_offsets
)
799 fputs_filtered (",\n", stream
);
800 /* Note that this check of "I" is ok because we only sorted the
801 fields by offset when print_offsets was set, so we won't take
802 this branch in that case. */
803 else if (i
+ 1 < TYPE_NFIELDS (type
))
804 fputs_filtered (", ", stream
);
807 if (flags
->print_offsets
)
809 /* Undo the temporary level increase we did above. */
811 podata
->finish (type
, level
, stream
);
812 print_spaces_filtered (print_offset_data::indentation
, stream
);
814 print_spaces_filtered (2, stream
);
816 if (!for_rust_enum
|| flags
->print_offsets
)
817 print_spaces_filtered (level
, stream
);
818 fputs_filtered (is_tuple_struct
? ")" : "}", stream
);
821 /* la_print_typedef implementation for Rust. */
824 rust_print_typedef (struct type
*type
,
825 struct symbol
*new_symbol
,
826 struct ui_file
*stream
)
828 type
= check_typedef (type
);
829 fprintf_filtered (stream
, "type %s = ", SYMBOL_PRINT_NAME (new_symbol
));
830 type_print (type
, "", stream
, 0);
831 fprintf_filtered (stream
, ";\n");
834 /* la_print_type implementation for Rust. */
837 rust_internal_print_type (struct type
*type
, const char *varstring
,
838 struct ui_file
*stream
, int show
, int level
,
839 const struct type_print_options
*flags
,
840 bool for_rust_enum
, print_offset_data
*podata
)
844 && TYPE_NAME (type
) != NULL
)
846 /* Rust calls the unit type "void" in its debuginfo,
847 but we don't want to print it as that. */
848 if (TYPE_CODE (type
) == TYPE_CODE_VOID
)
849 fputs_filtered ("()", stream
);
851 fputs_filtered (TYPE_NAME (type
), stream
);
855 type
= check_typedef (type
);
856 switch (TYPE_CODE (type
))
859 /* If we have an enum, we've already printed the type's
860 unqualified name, and there is nothing else to print
863 fputs_filtered ("()", stream
);
867 /* Delegate varargs to the C printer. */
868 if (TYPE_VARARGS (type
))
871 fputs_filtered ("fn ", stream
);
872 if (varstring
!= NULL
)
873 fputs_filtered (varstring
, stream
);
874 fputs_filtered ("(", stream
);
875 for (int i
= 0; i
< TYPE_NFIELDS (type
); ++i
)
879 fputs_filtered (", ", stream
);
880 rust_internal_print_type (TYPE_FIELD_TYPE (type
, i
), "", stream
,
881 -1, 0, flags
, false, podata
);
883 fputs_filtered (")", stream
);
884 /* If it returns unit, we can omit the return type. */
885 if (TYPE_CODE (TYPE_TARGET_TYPE (type
)) != TYPE_CODE_VOID
)
887 fputs_filtered (" -> ", stream
);
888 rust_internal_print_type (TYPE_TARGET_TYPE (type
), "", stream
,
889 -1, 0, flags
, false, podata
);
893 case TYPE_CODE_ARRAY
:
895 LONGEST low_bound
, high_bound
;
897 fputs_filtered ("[", stream
);
898 rust_internal_print_type (TYPE_TARGET_TYPE (type
), NULL
,
899 stream
, show
- 1, level
, flags
, false,
902 if (TYPE_HIGH_BOUND_KIND (TYPE_INDEX_TYPE (type
)) == PROP_LOCEXPR
903 || TYPE_HIGH_BOUND_KIND (TYPE_INDEX_TYPE (type
)) == PROP_LOCLIST
)
904 fprintf_filtered (stream
, "; variable length");
905 else if (get_array_bounds (type
, &low_bound
, &high_bound
))
906 fprintf_filtered (stream
, "; %s",
907 plongest (high_bound
- low_bound
+ 1));
908 fputs_filtered ("]", stream
);
912 case TYPE_CODE_UNION
:
913 case TYPE_CODE_STRUCT
:
914 rust_print_struct_def (type
, varstring
, stream
, show
, level
, flags
,
915 for_rust_enum
, podata
);
922 fputs_filtered ("enum ", stream
);
923 if (TYPE_NAME (type
) != NULL
)
925 fputs_filtered (TYPE_NAME (type
), stream
);
926 fputs_filtered (" ", stream
);
927 len
= strlen (TYPE_NAME (type
));
929 fputs_filtered ("{\n", stream
);
931 for (int i
= 0; i
< TYPE_NFIELDS (type
); ++i
)
933 const char *name
= TYPE_FIELD_NAME (type
, i
);
938 && strncmp (name
, TYPE_NAME (type
), len
) == 0
940 && name
[len
+ 1] == ':')
942 fprintfi_filtered (level
+ 2, stream
, "%s,\n", name
);
945 fputs_filtered ("}", stream
);
951 if (TYPE_NAME (type
) != nullptr)
952 fputs_filtered (TYPE_NAME (type
), stream
);
955 /* We currently can't distinguish between pointers and
957 fputs_filtered ("*mut ", stream
);
958 type_print (TYPE_TARGET_TYPE (type
), "", stream
, 0);
965 c_print_type (type
, varstring
, stream
, show
, level
, flags
);
970 rust_print_type (struct type
*type
, const char *varstring
,
971 struct ui_file
*stream
, int show
, int level
,
972 const struct type_print_options
*flags
)
974 print_offset_data podata
;
975 rust_internal_print_type (type
, varstring
, stream
, show
, level
,
976 flags
, false, &podata
);
981 /* Like arch_composite_type, but uses TYPE to decide how to allocate
982 -- either on an obstack or on a gdbarch. */
985 rust_composite_type (struct type
*original
,
987 const char *field1
, struct type
*type1
,
988 const char *field2
, struct type
*type2
)
990 struct type
*result
= alloc_type_copy (original
);
991 int i
, nfields
, bitpos
;
999 TYPE_CODE (result
) = TYPE_CODE_STRUCT
;
1000 TYPE_NAME (result
) = name
;
1002 TYPE_NFIELDS (result
) = nfields
;
1003 TYPE_FIELDS (result
)
1004 = (struct field
*) TYPE_ZALLOC (result
, nfields
* sizeof (struct field
));
1010 struct field
*field
= &TYPE_FIELD (result
, i
);
1012 SET_FIELD_BITPOS (*field
, bitpos
);
1013 bitpos
+= TYPE_LENGTH (type1
) * TARGET_CHAR_BIT
;
1015 FIELD_NAME (*field
) = field1
;
1016 FIELD_TYPE (*field
) = type1
;
1021 struct field
*field
= &TYPE_FIELD (result
, i
);
1022 unsigned align
= type_align (type2
);
1028 align
*= TARGET_CHAR_BIT
;
1029 delta
= bitpos
% align
;
1031 bitpos
+= align
- delta
;
1033 SET_FIELD_BITPOS (*field
, bitpos
);
1035 FIELD_NAME (*field
) = field2
;
1036 FIELD_TYPE (*field
) = type2
;
1041 TYPE_LENGTH (result
)
1042 = (TYPE_FIELD_BITPOS (result
, i
- 1) / TARGET_CHAR_BIT
+
1043 TYPE_LENGTH (TYPE_FIELD_TYPE (result
, i
- 1)));
1047 /* See rust-lang.h. */
1050 rust_slice_type (const char *name
, struct type
*elt_type
,
1051 struct type
*usize_type
)
1055 elt_type
= lookup_pointer_type (elt_type
);
1056 type
= rust_composite_type (elt_type
, name
,
1057 "data_ptr", elt_type
,
1058 "length", usize_type
);
1063 enum rust_primitive_types
1065 rust_primitive_bool
,
1066 rust_primitive_char
,
1075 rust_primitive_isize
,
1076 rust_primitive_usize
,
1079 rust_primitive_unit
,
1081 nr_rust_primitive_types
1084 /* la_language_arch_info implementation for Rust. */
1087 rust_language_arch_info (struct gdbarch
*gdbarch
,
1088 struct language_arch_info
*lai
)
1090 const struct builtin_type
*builtin
= builtin_type (gdbarch
);
1092 struct type
**types
;
1093 unsigned int length
;
1095 types
= GDBARCH_OBSTACK_CALLOC (gdbarch
, nr_rust_primitive_types
+ 1,
1098 types
[rust_primitive_bool
] = arch_boolean_type (gdbarch
, 8, 1, "bool");
1099 types
[rust_primitive_char
] = arch_character_type (gdbarch
, 32, 1, "char");
1100 types
[rust_primitive_i8
] = arch_integer_type (gdbarch
, 8, 0, "i8");
1101 types
[rust_primitive_u8
] = arch_integer_type (gdbarch
, 8, 1, "u8");
1102 types
[rust_primitive_i16
] = arch_integer_type (gdbarch
, 16, 0, "i16");
1103 types
[rust_primitive_u16
] = arch_integer_type (gdbarch
, 16, 1, "u16");
1104 types
[rust_primitive_i32
] = arch_integer_type (gdbarch
, 32, 0, "i32");
1105 types
[rust_primitive_u32
] = arch_integer_type (gdbarch
, 32, 1, "u32");
1106 types
[rust_primitive_i64
] = arch_integer_type (gdbarch
, 64, 0, "i64");
1107 types
[rust_primitive_u64
] = arch_integer_type (gdbarch
, 64, 1, "u64");
1109 length
= 8 * TYPE_LENGTH (builtin
->builtin_data_ptr
);
1110 types
[rust_primitive_isize
] = arch_integer_type (gdbarch
, length
, 0, "isize");
1111 types
[rust_primitive_usize
] = arch_integer_type (gdbarch
, length
, 1, "usize");
1113 types
[rust_primitive_f32
] = arch_float_type (gdbarch
, 32, "f32",
1114 floatformats_ieee_single
);
1115 types
[rust_primitive_f64
] = arch_float_type (gdbarch
, 64, "f64",
1116 floatformats_ieee_double
);
1118 types
[rust_primitive_unit
] = arch_integer_type (gdbarch
, 0, 1, "()");
1120 tem
= make_cv_type (1, 0, types
[rust_primitive_u8
], NULL
);
1121 types
[rust_primitive_str
] = rust_slice_type ("&str", tem
,
1122 types
[rust_primitive_usize
]);
1124 lai
->primitive_type_vector
= types
;
1125 lai
->bool_type_default
= types
[rust_primitive_bool
];
1126 lai
->string_char_type
= types
[rust_primitive_u8
];
1131 /* A helper for rust_evaluate_subexp that handles OP_FUNCALL. */
1133 static struct value
*
1134 rust_evaluate_funcall (struct expression
*exp
, int *pos
, enum noside noside
)
1137 int num_args
= exp
->elts
[*pos
+ 1].longconst
;
1139 struct value
*function
, *result
, *arg0
;
1140 struct type
*type
, *fn_type
;
1141 const struct block
*block
;
1142 struct block_symbol sym
;
1144 /* For an ordinary function call we can simply defer to the
1145 generic implementation. */
1146 if (exp
->elts
[*pos
+ 3].opcode
!= STRUCTOP_STRUCT
)
1147 return evaluate_subexp_standard (NULL
, exp
, pos
, noside
);
1149 /* Skip over the OP_FUNCALL and the STRUCTOP_STRUCT. */
1151 method
= &exp
->elts
[*pos
+ 1].string
;
1152 *pos
+= 3 + BYTES_TO_EXP_ELEM (exp
->elts
[*pos
].longconst
+ 1);
1154 /* Evaluate the argument to STRUCTOP_STRUCT, then find its
1155 type in order to look up the method. */
1156 arg0
= evaluate_subexp (NULL_TYPE
, exp
, pos
, noside
);
1158 if (noside
== EVAL_SKIP
)
1160 for (i
= 0; i
< num_args
; ++i
)
1161 evaluate_subexp (NULL_TYPE
, exp
, pos
, noside
);
1165 std::vector
<struct value
*> args (num_args
+ 1);
1168 /* We don't yet implement real Deref semantics. */
1169 while (TYPE_CODE (value_type (args
[0])) == TYPE_CODE_PTR
)
1170 args
[0] = value_ind (args
[0]);
1172 type
= value_type (args
[0]);
1173 if ((TYPE_CODE (type
) != TYPE_CODE_STRUCT
1174 && TYPE_CODE (type
) != TYPE_CODE_UNION
1175 && TYPE_CODE (type
) != TYPE_CODE_ENUM
)
1176 || rust_tuple_type_p (type
))
1177 error (_("Method calls only supported on struct or enum types"));
1178 if (TYPE_NAME (type
) == NULL
)
1179 error (_("Method call on nameless type"));
1181 std::string name
= std::string (TYPE_NAME (type
)) + "::" + method
;
1183 block
= get_selected_block (0);
1184 sym
= lookup_symbol (name
.c_str (), block
, VAR_DOMAIN
, NULL
);
1185 if (sym
.symbol
== NULL
)
1186 error (_("Could not find function named '%s'"), name
.c_str ());
1188 fn_type
= SYMBOL_TYPE (sym
.symbol
);
1189 if (TYPE_NFIELDS (fn_type
) == 0)
1190 error (_("Function '%s' takes no arguments"), name
.c_str ());
1192 if (TYPE_CODE (TYPE_FIELD_TYPE (fn_type
, 0)) == TYPE_CODE_PTR
)
1193 args
[0] = value_addr (args
[0]);
1195 function
= address_of_variable (sym
.symbol
, block
);
1197 for (i
= 0; i
< num_args
; ++i
)
1198 args
[i
+ 1] = evaluate_subexp (NULL_TYPE
, exp
, pos
, noside
);
1200 if (noside
== EVAL_AVOID_SIDE_EFFECTS
)
1201 result
= value_zero (TYPE_TARGET_TYPE (fn_type
), not_lval
);
1203 result
= call_function_by_hand (function
, NULL
, args
);
1207 /* A helper for rust_evaluate_subexp that handles OP_RANGE. */
1209 static struct value
*
1210 rust_range (struct expression
*exp
, int *pos
, enum noside noside
)
1212 enum range_type kind
;
1213 struct value
*low
= NULL
, *high
= NULL
;
1214 struct value
*addrval
, *result
;
1216 struct type
*range_type
;
1217 struct type
*index_type
;
1218 struct type
*temp_type
;
1221 kind
= (enum range_type
) longest_to_int (exp
->elts
[*pos
+ 1].longconst
);
1224 if (kind
== HIGH_BOUND_DEFAULT
|| kind
== NONE_BOUND_DEFAULT
1225 || kind
== NONE_BOUND_DEFAULT_EXCLUSIVE
)
1226 low
= evaluate_subexp (NULL_TYPE
, exp
, pos
, noside
);
1227 if (kind
== LOW_BOUND_DEFAULT
|| kind
== LOW_BOUND_DEFAULT_EXCLUSIVE
1228 || kind
== NONE_BOUND_DEFAULT
|| kind
== NONE_BOUND_DEFAULT_EXCLUSIVE
)
1229 high
= evaluate_subexp (NULL_TYPE
, exp
, pos
, noside
);
1230 bool inclusive
= (kind
== NONE_BOUND_DEFAULT
|| kind
== LOW_BOUND_DEFAULT
);
1232 if (noside
== EVAL_SKIP
)
1233 return value_from_longest (builtin_type (exp
->gdbarch
)->builtin_int
, 1);
1240 name
= "std::ops::RangeFull";
1244 index_type
= value_type (high
);
1246 ? "std::ops::RangeToInclusive" : "std::ops::RangeTo");
1253 index_type
= value_type (low
);
1254 name
= "std::ops::RangeFrom";
1258 if (!types_equal (value_type (low
), value_type (high
)))
1259 error (_("Range expression with different types"));
1260 index_type
= value_type (low
);
1261 name
= inclusive
? "std::ops::RangeInclusive" : "std::ops::Range";
1265 /* If we don't have an index type, just allocate this on the
1266 arch. Here any type will do. */
1267 temp_type
= (index_type
== NULL
1268 ? language_bool_type (exp
->language_defn
, exp
->gdbarch
)
1270 /* It would be nicer to cache the range type. */
1271 range_type
= rust_composite_type (temp_type
, name
,
1272 low
== NULL
? NULL
: "start", index_type
,
1273 high
== NULL
? NULL
: "end", index_type
);
1275 if (noside
== EVAL_AVOID_SIDE_EFFECTS
)
1276 return value_zero (range_type
, lval_memory
);
1278 addrval
= value_allocate_space_in_inferior (TYPE_LENGTH (range_type
));
1279 addr
= value_as_long (addrval
);
1280 result
= value_at_lazy (range_type
, addr
);
1284 struct value
*start
= value_struct_elt (&result
, NULL
, "start", NULL
,
1287 value_assign (start
, low
);
1292 struct value
*end
= value_struct_elt (&result
, NULL
, "end", NULL
,
1295 value_assign (end
, high
);
1298 result
= value_at_lazy (range_type
, addr
);
1302 /* A helper function to compute the range and kind given a range
1303 value. TYPE is the type of the range value. RANGE is the range
1304 value. LOW, HIGH, and KIND are out parameters. The LOW and HIGH
1305 parameters might be filled in, or might not be, depending on the
1306 kind of range this is. KIND will always be set to the appropriate
1307 value describing the kind of range, and this can be used to
1308 determine whether LOW or HIGH are valid. */
1311 rust_compute_range (struct type
*type
, struct value
*range
,
1312 LONGEST
*low
, LONGEST
*high
,
1313 enum range_type
*kind
)
1319 *kind
= BOTH_BOUND_DEFAULT
;
1321 if (TYPE_NFIELDS (type
) == 0)
1325 if (strcmp (TYPE_FIELD_NAME (type
, 0), "start") == 0)
1327 *kind
= HIGH_BOUND_DEFAULT
;
1328 *low
= value_as_long (value_field (range
, 0));
1331 if (TYPE_NFIELDS (type
) > i
1332 && strcmp (TYPE_FIELD_NAME (type
, i
), "end") == 0)
1334 *kind
= (*kind
== BOTH_BOUND_DEFAULT
1335 ? LOW_BOUND_DEFAULT
: NONE_BOUND_DEFAULT
);
1336 *high
= value_as_long (value_field (range
, i
));
1338 if (rust_inclusive_range_type_p (type
))
1343 /* A helper for rust_evaluate_subexp that handles BINOP_SUBSCRIPT. */
1345 static struct value
*
1346 rust_subscript (struct expression
*exp
, int *pos
, enum noside noside
,
1349 struct value
*lhs
, *rhs
, *result
;
1350 struct type
*rhstype
;
1351 LONGEST low
, high_bound
;
1352 /* Initialized to appease the compiler. */
1353 enum range_type kind
= BOTH_BOUND_DEFAULT
;
1358 lhs
= evaluate_subexp (NULL_TYPE
, exp
, pos
, noside
);
1359 rhs
= evaluate_subexp (NULL_TYPE
, exp
, pos
, noside
);
1361 if (noside
== EVAL_SKIP
)
1364 rhstype
= check_typedef (value_type (rhs
));
1365 if (rust_range_type_p (rhstype
))
1368 error (_("Can't take slice of array without '&'"));
1369 rust_compute_range (rhstype
, rhs
, &low
, &high
, &kind
);
1373 low
= value_as_long (rhs
);
1375 struct type
*type
= check_typedef (value_type (lhs
));
1376 if (noside
== EVAL_AVOID_SIDE_EFFECTS
)
1378 struct type
*base_type
= nullptr;
1379 if (TYPE_CODE (type
) == TYPE_CODE_ARRAY
)
1380 base_type
= TYPE_TARGET_TYPE (type
);
1381 else if (rust_slice_type_p (type
))
1383 for (int i
= 0; i
< TYPE_NFIELDS (type
); ++i
)
1385 if (strcmp (TYPE_FIELD_NAME (type
, i
), "data_ptr") == 0)
1387 base_type
= TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (type
, i
));
1391 if (base_type
== nullptr)
1392 error (_("Could not find 'data_ptr' in slice type"));
1394 else if (TYPE_CODE (type
) == TYPE_CODE_PTR
)
1395 base_type
= TYPE_TARGET_TYPE (type
);
1397 error (_("Cannot subscript non-array type"));
1399 struct type
*new_type
;
1402 if (rust_slice_type_p (type
))
1407 = language_lookup_primitive_type (exp
->language_defn
,
1410 new_type
= rust_slice_type ("&[*gdb*]", base_type
, usize
);
1414 new_type
= base_type
;
1416 return value_zero (new_type
, VALUE_LVAL (lhs
));
1423 if (TYPE_CODE (type
) == TYPE_CODE_ARRAY
)
1426 if (!get_array_bounds (type
, &low_bound
, &high_bound
))
1427 error (_("Can't compute array bounds"));
1429 error (_("Found array with non-zero lower bound"));
1432 else if (rust_slice_type_p (type
))
1436 base
= value_struct_elt (&lhs
, NULL
, "data_ptr", NULL
, "slice");
1437 len
= value_struct_elt (&lhs
, NULL
, "length", NULL
, "slice");
1439 high_bound
= value_as_long (len
);
1441 else if (TYPE_CODE (type
) == TYPE_CODE_PTR
)
1445 high_bound
= LONGEST_MAX
;
1448 error (_("Cannot subscript non-array type"));
1451 && (kind
== BOTH_BOUND_DEFAULT
|| kind
== LOW_BOUND_DEFAULT
))
1454 error (_("Index less than zero"));
1455 if (low
> high_bound
)
1456 error (_("Index greater than length"));
1458 result
= value_subscript (base
, low
);
1465 struct type
*usize
, *slice
;
1467 struct value
*addrval
, *tem
;
1469 if (kind
== BOTH_BOUND_DEFAULT
|| kind
== HIGH_BOUND_DEFAULT
)
1472 error (_("High index less than zero"));
1474 error (_("Low index greater than high index"));
1475 if (high
> high_bound
)
1476 error (_("High index greater than length"));
1478 usize
= language_lookup_primitive_type (exp
->language_defn
,
1481 const char *new_name
= ((type
!= nullptr
1482 && rust_slice_type_p (type
))
1483 ? TYPE_NAME (type
) : "&[*gdb*]");
1485 slice
= rust_slice_type (new_name
, value_type (result
), usize
);
1487 addrval
= value_allocate_space_in_inferior (TYPE_LENGTH (slice
));
1488 addr
= value_as_long (addrval
);
1489 tem
= value_at_lazy (slice
, addr
);
1491 value_assign (value_field (tem
, 0), value_addr (result
));
1492 value_assign (value_field (tem
, 1),
1493 value_from_longest (usize
, high
- low
));
1495 result
= value_at_lazy (slice
, addr
);
1498 result
= value_addr (result
);
1504 /* evaluate_exp implementation for Rust. */
1506 static struct value
*
1507 rust_evaluate_subexp (struct type
*expect_type
, struct expression
*exp
,
1508 int *pos
, enum noside noside
)
1510 struct value
*result
;
1512 switch (exp
->elts
[*pos
].opcode
)
1516 if (noside
!= EVAL_NORMAL
)
1517 result
= evaluate_subexp_standard (expect_type
, exp
, pos
, noside
);
1521 struct value
*value
= evaluate_subexp (expect_type
, exp
, pos
,
1524 struct value
*trait_ptr
= rust_get_trait_object_pointer (value
);
1525 if (trait_ptr
!= NULL
)
1528 result
= value_ind (value
);
1533 case UNOP_COMPLEMENT
:
1535 struct value
*value
;
1538 value
= evaluate_subexp (NULL_TYPE
, exp
, pos
, noside
);
1539 if (noside
== EVAL_SKIP
)
1541 /* Preserving the type is enough. */
1544 if (TYPE_CODE (value_type (value
)) == TYPE_CODE_BOOL
)
1545 result
= value_from_longest (value_type (value
),
1546 value_logical_not (value
));
1548 result
= value_complement (value
);
1552 case BINOP_SUBSCRIPT
:
1553 result
= rust_subscript (exp
, pos
, noside
, 0);
1557 result
= rust_evaluate_funcall (exp
, pos
, noside
);
1563 struct type
*type
= exp
->elts
[pc
+ 1].type
;
1564 int arglen
= longest_to_int (exp
->elts
[pc
+ 2].longconst
);
1567 struct value
*addrval
= NULL
;
1571 if (noside
== EVAL_NORMAL
)
1573 addrval
= value_allocate_space_in_inferior (TYPE_LENGTH (type
));
1574 addr
= value_as_long (addrval
);
1575 result
= value_at_lazy (type
, addr
);
1578 if (arglen
> 0 && exp
->elts
[*pos
].opcode
== OP_OTHERS
)
1583 init
= rust_evaluate_subexp (NULL
, exp
, pos
, noside
);
1584 if (noside
== EVAL_NORMAL
)
1586 /* This isn't quite right but will do for the time
1587 being, seeing that we can't implement the Copy
1589 value_assign (result
, init
);
1595 gdb_assert (arglen
% 2 == 0);
1596 for (i
= 0; i
< arglen
; i
+= 2)
1599 const char *fieldname
;
1600 struct value
*value
, *field
;
1602 gdb_assert (exp
->elts
[*pos
].opcode
== OP_NAME
);
1604 len
= longest_to_int (exp
->elts
[*pos
].longconst
);
1606 fieldname
= &exp
->elts
[*pos
].string
;
1607 *pos
+= 2 + BYTES_TO_EXP_ELEM (len
+ 1);
1609 value
= rust_evaluate_subexp (NULL
, exp
, pos
, noside
);
1610 if (noside
== EVAL_NORMAL
)
1612 field
= value_struct_elt (&result
, NULL
, fieldname
, NULL
,
1614 value_assign (field
, value
);
1618 if (noside
== EVAL_SKIP
)
1619 return value_from_longest (builtin_type (exp
->gdbarch
)->builtin_int
,
1621 else if (noside
== EVAL_AVOID_SIDE_EFFECTS
)
1622 result
= allocate_value (type
);
1624 result
= value_at_lazy (type
, addr
);
1633 struct value
*ncopies
;
1635 elt
= rust_evaluate_subexp (NULL
, exp
, pos
, noside
);
1636 ncopies
= rust_evaluate_subexp (NULL
, exp
, pos
, noside
);
1637 copies
= value_as_long (ncopies
);
1639 error (_("Array with negative number of elements"));
1641 if (noside
== EVAL_NORMAL
)
1644 std::vector
<struct value
*> eltvec (copies
);
1646 for (i
= 0; i
< copies
; ++i
)
1648 result
= value_array (0, copies
- 1, eltvec
.data ());
1652 struct type
*arraytype
1653 = lookup_array_range_type (value_type (elt
), 0, copies
- 1);
1654 result
= allocate_value (arraytype
);
1659 case STRUCTOP_ANONYMOUS
:
1661 /* Anonymous field access, i.e. foo.1. */
1663 int pc
, field_number
, nfields
;
1667 field_number
= longest_to_int (exp
->elts
[pc
+ 1].longconst
);
1669 lhs
= evaluate_subexp (NULL_TYPE
, exp
, pos
, noside
);
1671 type
= value_type (lhs
);
1673 if (TYPE_CODE (type
) == TYPE_CODE_STRUCT
)
1675 struct type
*outer_type
= NULL
;
1677 if (rust_enum_p (type
))
1679 if (rust_empty_enum_p (type
))
1680 error (_("Cannot access field %d of empty enum %s"),
1681 field_number
, TYPE_NAME (type
));
1683 const gdb_byte
*valaddr
= value_contents (lhs
);
1684 struct field
*variant_field
= rust_enum_variant (type
, valaddr
);
1686 struct value
*union_value
= value_primitive_field (lhs
, 0, 0,
1689 int fieldno
= (variant_field
1690 - &TYPE_FIELD (value_type (union_value
), 0));
1691 lhs
= value_primitive_field (union_value
, 0, fieldno
,
1692 value_type (union_value
));
1694 type
= value_type (lhs
);
1697 /* Tuples and tuple structs */
1698 nfields
= TYPE_NFIELDS (type
);
1700 if (field_number
>= nfields
|| field_number
< 0)
1702 if (outer_type
!= NULL
)
1703 error(_("Cannot access field %d of variant %s::%s, "
1704 "there are only %d fields"),
1705 field_number
, TYPE_NAME (outer_type
),
1706 rust_last_path_segment (TYPE_NAME (type
)),
1709 error(_("Cannot access field %d of %s, "
1710 "there are only %d fields"),
1711 field_number
, TYPE_NAME (type
), nfields
);
1714 /* Tuples are tuple structs too. */
1715 if (!rust_tuple_struct_type_p (type
))
1717 if (outer_type
!= NULL
)
1718 error(_("Variant %s::%s is not a tuple variant"),
1719 TYPE_NAME (outer_type
),
1720 rust_last_path_segment (TYPE_NAME (type
)));
1722 error(_("Attempting to access anonymous field %d "
1723 "of %s, which is not a tuple, tuple struct, or "
1724 "tuple-like variant"),
1725 field_number
, TYPE_NAME (type
));
1728 result
= value_primitive_field (lhs
, 0, field_number
, type
);
1731 error(_("Anonymous field access is only allowed on tuples, \
1732 tuple structs, and tuple-like enum variants"));
1736 case STRUCTOP_STRUCT
:
1743 tem
= longest_to_int (exp
->elts
[pc
+ 1].longconst
);
1744 (*pos
) += 3 + BYTES_TO_EXP_ELEM (tem
+ 1);
1745 lhs
= evaluate_subexp (NULL_TYPE
, exp
, pos
, noside
);
1747 const char *field_name
= &exp
->elts
[pc
+ 2].string
;
1748 type
= value_type (lhs
);
1749 if (TYPE_CODE (type
) == TYPE_CODE_STRUCT
&& rust_enum_p (type
))
1751 if (rust_empty_enum_p (type
))
1752 error (_("Cannot access field %s of empty enum %s"),
1753 field_name
, TYPE_NAME (type
));
1755 const gdb_byte
*valaddr
= value_contents (lhs
);
1756 struct field
*variant_field
= rust_enum_variant (type
, valaddr
);
1758 struct value
*union_value
= value_primitive_field (lhs
, 0, 0,
1761 int fieldno
= (variant_field
1762 - &TYPE_FIELD (value_type (union_value
), 0));
1763 lhs
= value_primitive_field (union_value
, 0, fieldno
,
1764 value_type (union_value
));
1766 struct type
*outer_type
= type
;
1767 type
= value_type (lhs
);
1768 if (rust_tuple_type_p (type
) || rust_tuple_struct_type_p (type
))
1769 error (_("Attempting to access named field %s of tuple "
1770 "variant %s::%s, which has only anonymous fields"),
1771 field_name
, TYPE_NAME (outer_type
),
1772 rust_last_path_segment (TYPE_NAME (type
)));
1776 result
= value_struct_elt (&lhs
, NULL
, field_name
,
1779 catch (const gdb_exception_error
&except
)
1781 error (_("Could not find field %s of struct variant %s::%s"),
1782 field_name
, TYPE_NAME (outer_type
),
1783 rust_last_path_segment (TYPE_NAME (type
)));
1787 result
= value_struct_elt (&lhs
, NULL
, field_name
, NULL
, "structure");
1788 if (noside
== EVAL_AVOID_SIDE_EFFECTS
)
1789 result
= value_zero (value_type (result
), VALUE_LVAL (result
));
1794 result
= rust_range (exp
, pos
, noside
);
1798 /* We might have &array[range], in which case we need to make a
1800 if (exp
->elts
[*pos
+ 1].opcode
== BINOP_SUBSCRIPT
)
1803 result
= rust_subscript (exp
, pos
, noside
, 1);
1808 result
= evaluate_subexp_standard (expect_type
, exp
, pos
, noside
);
1815 /* operator_length implementation for Rust. */
1818 rust_operator_length (const struct expression
*exp
, int pc
, int *oplenp
,
1824 switch (exp
->elts
[pc
- 1].opcode
)
1827 /* We handle aggregate as a type and argument count. The first
1828 argument might be OP_OTHERS. After that the arguments
1829 alternate: first an OP_NAME, then an expression. */
1831 args
= longest_to_int (exp
->elts
[pc
- 2].longconst
);
1839 case STRUCTOP_ANONYMOUS
:
1850 operator_length_standard (exp
, pc
, oplenp
, argsp
);
1858 /* op_name implementation for Rust. */
1861 rust_op_name (enum exp_opcode opcode
)
1866 return "OP_AGGREGATE";
1870 return op_name_standard (opcode
);
1874 /* dump_subexp_body implementation for Rust. */
1877 rust_dump_subexp_body (struct expression
*exp
, struct ui_file
*stream
,
1880 switch (exp
->elts
[elt
].opcode
)
1884 int length
= longest_to_int (exp
->elts
[elt
+ 2].longconst
);
1887 fprintf_filtered (stream
, "Type @");
1888 gdb_print_host_address (exp
->elts
[elt
+ 1].type
, stream
);
1889 fprintf_filtered (stream
, " (");
1890 type_print (exp
->elts
[elt
+ 1].type
, NULL
, stream
, 0);
1891 fprintf_filtered (stream
, "), length %d", length
);
1894 for (i
= 0; i
< length
; ++i
)
1895 elt
= dump_subexp (exp
, stream
, elt
);
1902 LONGEST len
= exp
->elts
[elt
+ 1].longconst
;
1904 fprintf_filtered (stream
, "%s: %s",
1905 (exp
->elts
[elt
].opcode
== OP_STRING
1906 ? "string" : "name"),
1907 &exp
->elts
[elt
+ 2].string
);
1908 elt
+= 4 + BYTES_TO_EXP_ELEM (len
+ 1);
1913 elt
= dump_subexp (exp
, stream
, elt
+ 1);
1916 case STRUCTOP_ANONYMOUS
:
1920 field_number
= longest_to_int (exp
->elts
[elt
+ 1].longconst
);
1922 fprintf_filtered (stream
, "Field number: %d", field_number
);
1923 elt
= dump_subexp (exp
, stream
, elt
+ 3);
1932 elt
= dump_subexp_body_standard (exp
, stream
, elt
);
1939 /* print_subexp implementation for Rust. */
1942 rust_print_subexp (struct expression
*exp
, int *pos
, struct ui_file
*stream
,
1943 enum precedence prec
)
1945 switch (exp
->elts
[*pos
].opcode
)
1949 int length
= longest_to_int (exp
->elts
[*pos
+ 2].longconst
);
1952 type_print (exp
->elts
[*pos
+ 1].type
, "", stream
, 0);
1953 fputs_filtered (" { ", stream
);
1956 for (i
= 0; i
< length
; ++i
)
1958 rust_print_subexp (exp
, pos
, stream
, prec
);
1959 fputs_filtered (", ", stream
);
1961 fputs_filtered (" }", stream
);
1967 LONGEST len
= exp
->elts
[*pos
+ 1].longconst
;
1969 fputs_filtered (&exp
->elts
[*pos
+ 2].string
, stream
);
1970 *pos
+= 4 + BYTES_TO_EXP_ELEM (len
+ 1);
1976 fputs_filtered ("<<others>> (", stream
);
1978 rust_print_subexp (exp
, pos
, stream
, prec
);
1979 fputs_filtered (")", stream
);
1983 case STRUCTOP_ANONYMOUS
:
1985 int tem
= longest_to_int (exp
->elts
[*pos
+ 1].longconst
);
1988 print_subexp (exp
, pos
, stream
, PREC_SUFFIX
);
1989 fprintf_filtered (stream
, ".%d", tem
);
1995 fprintf_filtered (stream
, "[");
1996 rust_print_subexp (exp
, pos
, stream
, prec
);
1997 fprintf_filtered (stream
, "; ");
1998 rust_print_subexp (exp
, pos
, stream
, prec
);
1999 fprintf_filtered (stream
, "]");
2003 print_subexp_standard (exp
, pos
, stream
, prec
);
2008 /* operator_check implementation for Rust. */
2011 rust_operator_check (struct expression
*exp
, int pos
,
2012 int (*objfile_func
) (struct objfile
*objfile
,
2016 switch (exp
->elts
[pos
].opcode
)
2020 struct type
*type
= exp
->elts
[pos
+ 1].type
;
2021 struct objfile
*objfile
= TYPE_OBJFILE (type
);
2023 if (objfile
!= NULL
&& (*objfile_func
) (objfile
, data
))
2034 return operator_check_standard (exp
, pos
, objfile_func
, data
);
2042 /* Implementation of la_lookup_symbol_nonlocal for Rust. */
2044 static struct block_symbol
2045 rust_lookup_symbol_nonlocal (const struct language_defn
*langdef
,
2047 const struct block
*block
,
2048 const domain_enum domain
)
2050 struct block_symbol result
= {};
2052 if (symbol_lookup_debug
)
2054 fprintf_unfiltered (gdb_stdlog
,
2055 "rust_lookup_symbol_non_local"
2056 " (%s, %s (scope %s), %s)\n",
2057 name
, host_address_to_string (block
),
2058 block_scope (block
), domain_name (domain
));
2061 /* Look up bare names in the block's scope. */
2062 std::string scopedname
;
2063 if (name
[cp_find_first_component (name
)] == '\0')
2065 const char *scope
= block_scope (block
);
2067 if (scope
[0] != '\0')
2069 scopedname
= std::string (scope
) + "::" + name
;
2070 name
= scopedname
.c_str ();
2078 result
= lookup_symbol_in_static_block (name
, block
, domain
);
2079 if (result
.symbol
== NULL
)
2080 result
= lookup_global_symbol (name
, block
, domain
);
2087 /* la_sniff_from_mangled_name for Rust. */
2090 rust_sniff_from_mangled_name (const char *mangled
, char **demangled
)
2092 *demangled
= gdb_demangle (mangled
, DMGL_PARAMS
| DMGL_ANSI
);
2093 return *demangled
!= NULL
;
2098 /* la_watch_location_expression for Rust. */
2100 static gdb::unique_xmalloc_ptr
<char>
2101 rust_watch_location_expression (struct type
*type
, CORE_ADDR addr
)
2103 type
= check_typedef (TYPE_TARGET_TYPE (check_typedef (type
)));
2104 std::string name
= type_to_string (type
);
2105 return gdb::unique_xmalloc_ptr
<char>
2106 (xstrprintf ("*(%s as *mut %s)", core_addr_to_string (addr
),
2112 static const struct exp_descriptor exp_descriptor_rust
=
2115 rust_operator_length
,
2116 rust_operator_check
,
2118 rust_dump_subexp_body
,
2119 rust_evaluate_subexp
2122 static const char *rust_extensions
[] =
2127 extern const struct language_defn rust_language_defn
=
2137 &exp_descriptor_rust
,
2140 rust_printchar
, /* Print a character constant */
2141 rust_printstr
, /* Function to print string constant */
2142 rust_emitchar
, /* Print a single char */
2143 rust_print_type
, /* Print a type using appropriate syntax */
2144 rust_print_typedef
, /* Print a typedef using appropriate syntax */
2145 rust_val_print
, /* Print a value using appropriate syntax */
2146 c_value_print
, /* Print a top-level value */
2147 default_read_var_value
, /* la_read_var_value */
2148 NULL
, /* Language specific skip_trampoline */
2149 NULL
, /* name_of_this */
2150 false, /* la_store_sym_names_in_linkage_form_p */
2151 rust_lookup_symbol_nonlocal
, /* lookup_symbol_nonlocal */
2152 basic_lookup_transparent_type
,/* lookup_transparent_type */
2153 gdb_demangle
, /* Language specific symbol demangler */
2154 rust_sniff_from_mangled_name
,
2155 NULL
, /* Language specific
2156 class_name_from_physname */
2157 c_op_print_tab
, /* expression operators for printing */
2158 1, /* c-style arrays */
2159 0, /* String lower bound */
2160 default_word_break_characters
,
2161 default_collect_symbol_completion_matches
,
2162 rust_language_arch_info
,
2163 default_print_array_index
,
2164 default_pass_by_reference
,
2166 rust_watch_location_expression
,
2167 NULL
, /* la_get_symbol_name_matcher */
2168 iterate_over_symbols
,
2169 default_search_name_hash
,
2170 &default_varobj_ops
,
2173 rust_is_string_type_p
,
2174 "{...}" /* la_struct_too_deep_ellipsis */