]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame_incremental - gdb/rust-lang.c
Automatic date update in version.in
[thirdparty/binutils-gdb.git] / gdb / rust-lang.c
... / ...
CommitLineData
1/* Rust language support routines for GDB, the GNU debugger.
2
3 Copyright (C) 2016-2025 Free Software Foundation, Inc.
4
5 This file is part of GDB.
6
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.
11
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.
16
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/>. */
19
20
21#include <ctype.h>
22
23#include "block.h"
24#include "c-lang.h"
25#include "charset.h"
26#include "cp-support.h"
27#include "demangle.h"
28#include "event-top.h"
29#include "gdbarch.h"
30#include "infcall.h"
31#include "objfiles.h"
32#include "rust-lang.h"
33#include "typeprint.h"
34#include "valprint.h"
35#include "varobj.h"
36#include <algorithm>
37#include <string>
38#include <vector>
39#include "cli/cli-style.h"
40#include "parser-defs.h"
41#include "rust-exp.h"
42
43/* See rust-lang.h. */
44
45const char *
46rust_last_path_segment (const char *path)
47{
48 const char *result = strrchr (path, ':');
49
50 if (result == NULL)
51 return path;
52 return result + 1;
53}
54
55/* See rust-lang.h. */
56
57std::string
58rust_crate_for_block (const struct block *block)
59{
60 const char *scope = block->scope ();
61
62 if (scope[0] == '\0')
63 return std::string ();
64
65 return std::string (scope, cp_find_first_component (scope));
66}
67
68/* Return true if TYPE, which must be a struct type, represents a Rust
69 enum. */
70
71static bool
72rust_enum_p (struct type *type)
73{
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);
77}
78
79/* Return true if TYPE, which must be an already-resolved enum type,
80 has no variants. */
81
82static bool
83rust_empty_enum_p (const struct type *type)
84{
85 return type->num_fields () == 0;
86}
87
88/* Given an already-resolved enum type and contents, find which
89 variant is active. */
90
91static int
92rust_enum_variant (struct type *type)
93{
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 ())
97 return i;
98
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
101 assert. */
102 error (_("Could not find active enum variant"));
103}
104
105/* See rust-lang.h. */
106
107bool
108rust_tuple_type_p (struct type *type)
109{
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
112 struct. */
113 return (type->code () == TYPE_CODE_STRUCT
114 && type->name () != NULL
115 && type->name ()[0] == '(');
116}
117
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". */
121
122static bool
123rust_underscore_fields (struct type *type)
124{
125 int field_number = 0;
126
127 if (type->code () != TYPE_CODE_STRUCT)
128 return false;
129 for (int i = 0; i < type->num_fields (); ++i)
130 {
131 if (!type->field (i).is_static ())
132 {
133 char buf[20];
134
135 xsnprintf (buf, sizeof (buf), "%d", field_number);
136
137 const char *field_name = type->field (i).name ();
138 if (startswith (field_name, "__"))
139 field_name += 2;
140 if (strcmp (buf, field_name) != 0)
141 return false;
142 field_number++;
143 }
144 }
145 return true;
146}
147
148/* See rust-lang.h. */
149
150bool
151rust_tuple_struct_type_p (struct type *type)
152{
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);
157}
158
159/* Return true if TYPE is "slice-like"; false otherwise. */
160
161static bool
162rust_slice_type_p (const struct type *type)
163{
164 if (type->code () == TYPE_CODE_STRUCT
165 && type->name () != NULL
166 && type->num_fields () == 2)
167 {
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")));
175 }
176 return false;
177}
178
179/* Return true if TYPE is a range type, otherwise false. */
180
181static bool
182rust_range_type_p (struct type *type)
183{
184 if (type->code () != TYPE_CODE_STRUCT
185 || type->num_fields () > 2
186 || type->name () == NULL
187 || strstr (type->name (), "::Range") == NULL)
188 return false;
189
190 if (type->num_fields () == 0)
191 return true;
192
193 int field_num = 0;
194 if (strcmp (type->field (0).name (), "start") == 0)
195 {
196 if (type->num_fields () == 1)
197 return true;
198 field_num = 1;
199 }
200 else if (type->num_fields () == 2)
201 {
202 /* First field had to be "start". */
203 return false;
204 }
205
206 return strcmp (type->field (field_num).name (), "end") == 0;
207}
208
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
211 types. */
212
213static bool
214rust_inclusive_range_type_p (struct type *type)
215{
216 return (strstr (type->name (), "::RangeInclusive") != NULL
217 || strstr (type->name (), "::RangeToInclusive") != NULL);
218}
219
220/* Return true if TYPE seems to be the type "u8", otherwise false. */
221
222static bool
223rust_u8_type_p (struct type *type)
224{
225 return (type->code () == TYPE_CODE_INT
226 && type->is_unsigned ()
227 && type->length () == 1);
228}
229
230/* Return true if TYPE is a Rust character type. */
231
232static bool
233rust_chartype_p (struct type *type)
234{
235 return (type->code () == TYPE_CODE_CHAR
236 && type->length () == 4
237 && type->is_unsigned ());
238}
239
240/* If VALUE represents a trait object pointer, return the underlying
241 pointer with the correct (i.e., runtime) type. Otherwise, return
242 NULL. */
243
244static struct value *
245rust_get_trait_object_pointer (struct value *value)
246{
247 struct type *type = check_typedef (value->type ());
248
249 if (type->code () != TYPE_CODE_STRUCT || type->num_fields () != 2)
250 return NULL;
251
252 /* Try to be a bit resilient if the ABI changes. */
253 int vtable_field = 0;
254 for (int i = 0; i < 2; ++i)
255 {
256 if (strcmp (type->field (i).name (), "vtable") == 0)
257 vtable_field = i;
258 else if (strcmp (type->field (i).name (), "pointer") != 0)
259 return NULL;
260 }
261
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)
265 return NULL;
266
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));
271}
272
273/* Find and possibly rewrite the unsized part of a slice-like type.
274
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.
277
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.
281
282 See convert_slice to understand the different kinds of unsized type
283 and how they are represented.
284*/
285static bool
286rewrite_slice_type (struct type *in_type, struct type **new_type,
287 LONGEST bound, ULONGEST *additional_length)
288{
289 if (in_type->code () != TYPE_CODE_STRUCT)
290 return false;
291
292 unsigned nfields = in_type->num_fields ();
293 if (nfields == 0)
294 return false;
295
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 ())
301 {
302 if (additional_length == nullptr)
303 return true;
304 rewritten = lookup_array_range_type (field_type, 0, bound);
305 *additional_length = rewritten->length ();
306 }
307 else
308 {
309 if (!rewrite_slice_type (field_type, &rewritten, bound,
310 additional_length))
311 return false;
312 if (additional_length == nullptr)
313 return true;
314 }
315
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);
320
321 *new_type = result;
322 return true;
323}
324
325/* Convert a Rust slice to its "true" representation.
326
327 The Rust compiler emits slices as "fat" pointers like:
328
329 struct { payload *data_ptr; usize length }
330
331 Any sort of unsized type is emitted this way.
332
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
338 type's size.
339
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.
343*/
344static struct value *
345convert_slice (struct value *val)
346{
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));
350
351 struct value *len = value_struct_elt (&val, {}, "length", nullptr,
352 "slice");
353 LONGEST llen = value_as_long (len);
354
355 struct value *ptr = value_struct_elt (&val, {}, "data_ptr", nullptr,
356 "slice");
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);
363
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 ();
368
369 return result;
370}
371
372/* If TYPE is an array-like slice, return the element type; otherwise
373 return NULL. */
374static struct type *
375rust_array_like_element_type (struct type *type)
376{
377 /* Caller must check this. */
378 gdb_assert (rust_slice_type_p (type));
379 for (int i = 0; i < type->num_fields (); ++i)
380 {
381 if (strcmp (type->field (i).name (), "data_ptr") == 0)
382 {
383 struct type *base_type = type->field (i).type ()->target_type ();
384 if (rewrite_slice_type (base_type, nullptr, 0, nullptr))
385 return nullptr;
386 return base_type;
387 }
388 }
389 return nullptr;
390}
391
392\f
393
394/* See language.h. */
395
396void
397rust_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
401{
402 /* Rust always uses UTF-8, but let the caller override this if need
403 be. */
404 const char *encoding = user_encoding;
405 if (user_encoding == NULL || !*user_encoding)
406 {
407 /* In Rust strings, characters are "u8". */
408 if (rust_u8_type_p (type))
409 encoding = "UTF-8";
410 else
411 {
412 /* This is probably some C string, so let's let C deal with
413 it. */
414 language_defn::printstr (stream, type, string, length,
415 user_encoding, force_ellipses,
416 options);
417 return;
418 }
419 }
420
421 /* This is not ideal as it doesn't use our character printer. */
422 generic_printstr (stream, type, string, length, encoding, force_ellipses,
423 '"', 0, options);
424}
425
426\f
427
428static const struct generic_val_print_decorations rust_decorations =
429{
430 /* Complex isn't used in Rust, but we provide C-ish values just in
431 case. */
432 "",
433 " + ",
434 " * I",
435 "true",
436 "false",
437 "()",
438 "[",
439 "]"
440};
441
442/* See rust-lang.h. */
443
444struct value *
445rust_slice_to_array (struct value *val)
446{
447 val = convert_slice (val);
448 if (val->type ()->code () != TYPE_CODE_ARRAY)
449 return nullptr;
450 return val;
451}
452
453/* Helper function to print a slice. */
454
455void
456rust_language::val_print_slice
457 (struct value *val, struct ui_file *stream, int recurse,
458 const struct value_print_options *options) const
459{
460 struct type *orig_type = check_typedef (val->type ());
461
462 val = convert_slice (val);
463 struct type *type = check_typedef (val->type ());
464
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)
469 {
470 LONGEST low_bound, high_bound;
471 if (get_array_bounds (type, &low_bound, &high_bound))
472 {
473 val_print_string (type->target_type (), "UTF-8",
474 val->address (), high_bound - low_bound + 1,
475 stream, options);
476 return;
477 }
478 }
479
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)
486 {
487 type_print (orig_type, "", stream, -1);
488 gdb_printf (stream, " ");
489 }
490
491 value_print_inner (val, stream, recurse, options);
492}
493
494/* See rust-lang.h. */
495
496void
497rust_language::val_print_struct
498 (struct value *val, struct ui_file *stream, int recurse,
499 const struct value_print_options *options) const
500{
501 int first_field;
502 struct type *type = check_typedef (val->type ());
503
504 if (rust_slice_type_p (type))
505 {
506 val_print_slice (val, stream, recurse, options);
507 return;
508 }
509
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;
513
514 if (!is_tuple)
515 {
516 if (type->name () != NULL)
517 gdb_printf (stream, "%s", type->name ());
518
519 if (type->num_fields () == 0)
520 return;
521
522 if (type->name () != NULL)
523 gdb_puts (" ", stream);
524 }
525
526 if (is_tuple || is_tuple_struct)
527 gdb_puts ("(", stream);
528 else
529 gdb_puts ("{", stream);
530
531 opts = *options;
532 opts.deref_ref = false;
533
534 first_field = 1;
535 for (int i = 0; i < type->num_fields (); ++i)
536 {
537 if (type->field (i).is_static ())
538 continue;
539
540 if (!first_field)
541 gdb_puts (",", stream);
542
543 if (options->prettyformat)
544 {
545 gdb_puts ("\n", stream);
546 print_spaces (2 + 2 * recurse, stream);
547 }
548 else if (!first_field)
549 gdb_puts (" ", stream);
550
551 first_field = 0;
552
553 if (!is_tuple && !is_tuple_struct)
554 {
555 fputs_styled (type->field (i).name (),
556 variable_name_style.style (), stream);
557 gdb_puts (": ", stream);
558 }
559
560 common_val_print (value_field (val, i), stream, recurse + 1, &opts,
561 this);
562 }
563
564 if (options->prettyformat)
565 {
566 gdb_puts ("\n", stream);
567 print_spaces (2 * recurse, stream);
568 }
569
570 if (is_tuple || is_tuple_struct)
571 gdb_puts (")", stream);
572 else
573 gdb_puts ("}", stream);
574}
575
576/* See rust-lang.h. */
577
578void
579rust_language::print_enum (struct value *val, struct ui_file *stream,
580 int recurse,
581 const struct value_print_options *options) const
582{
583 struct value_print_options opts = *options;
584 struct type *type = check_typedef (val->type ());
585
586 opts.deref_ref = false;
587
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 ());
593
594 if (rust_empty_enum_p (type))
595 {
596 /* Print the enum type name here to be more clear. */
597 gdb_printf (stream, _("%s {%p[<No data fields>%p]}"),
598 type->name (),
599 metadata_style.style ().ptr (), nullptr);
600 return;
601 }
602
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 ();
606
607 int nfields = variant_type->num_fields ();
608
609 bool is_tuple = rust_tuple_struct_type_p (variant_type);
610
611 gdb_printf (stream, "%s", variant_type->name ());
612 if (nfields == 0)
613 {
614 /* In case of a nullary variant like 'None', just output
615 the name. */
616 return;
617 }
618
619 /* In case of a non-nullary variant, we output 'Foo(x,y,z)'. */
620 if (is_tuple)
621 gdb_printf (stream, "(");
622 else
623 {
624 /* struct variant. */
625 gdb_printf (stream, "{");
626 }
627
628 bool first_field = true;
629 for (int j = 0; j < nfields; j++)
630 {
631 if (!first_field)
632 gdb_puts (", ", stream);
633 first_field = false;
634
635 if (!is_tuple)
636 gdb_printf (stream, "%ps: ",
637 styled_string (variable_name_style.style (),
638 variant_type->field (j).name ()));
639
640 common_val_print (value_field (val, j), stream, recurse + 1, &opts,
641 this);
642 }
643
644 if (is_tuple)
645 gdb_puts (")", stream);
646 else
647 gdb_puts ("}", stream);
648}
649
650/* See language.h. */
651
652void
653rust_language::value_print_inner
654 (struct value *val, struct ui_file *stream, int recurse,
655 const struct value_print_options *options) const
656{
657 struct value_print_options opts = *options;
658 opts.deref_ref = true;
659
660 if (opts.prettyformat == Val_prettyformat_default)
661 opts.prettyformat = (opts.prettyformat_structs
662 ? Val_prettyformat : Val_no_prettyformat);
663
664 struct type *type = check_typedef (val->type ());
665 switch (type->code ())
666 {
667 case TYPE_CODE_PTR:
668 {
669 LONGEST low_bound, high_bound;
670
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,
674 &high_bound))
675 {
676 /* We have a pointer to a byte string, so just print
677 that. */
678 struct type *elttype = check_typedef (type->target_type ());
679 CORE_ADDR addr = value_as_address (val);
680 struct gdbarch *arch = type->arch ();
681
682 if (opts.addressprint)
683 {
684 gdb_puts (paddress (arch, addr), stream);
685 gdb_puts (" ", stream);
686 }
687
688 gdb_puts ("b", stream);
689 val_print_string (elttype->target_type (), "ASCII", addr,
690 high_bound - low_bound + 1, stream,
691 &opts);
692 break;
693 }
694 }
695 goto generic_print;
696
697 case TYPE_CODE_INT:
698 /* Recognize the unit type. */
699 if (type->is_unsigned () && type->length () == 0
700 && type->name () != NULL && strcmp (type->name (), "()") == 0)
701 {
702 gdb_puts ("()", stream);
703 break;
704 }
705 goto generic_print;
706
707 case TYPE_CODE_STRING:
708 {
709 LONGEST low_bound, high_bound;
710
711 if (!get_array_bounds (type, &low_bound, &high_bound))
712 error (_("Could not determine the array bounds"));
713
714 /* If we see a plain TYPE_CODE_STRING, then we're printing a
715 byte string, hence the choice of "ASCII" as the
716 encoding. */
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);
721 }
722 break;
723
724 case TYPE_CODE_ARRAY:
725 {
726 LONGEST low_bound, high_bound;
727
728 if (get_array_bounds (type, &low_bound, &high_bound)
729 && high_bound - low_bound + 1 == 0)
730 gdb_puts ("[]", stream);
731 else
732 goto generic_print;
733 }
734 break;
735
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
741 fields. */
742 val_print_struct (val, stream, recurse, &opts);
743 break;
744
745 case TYPE_CODE_STRUCT:
746 if (rust_enum_p (type))
747 print_enum (val, stream, recurse, &opts);
748 else
749 val_print_struct (val, stream, recurse, &opts);
750 break;
751
752 default:
753 generic_print:
754 /* Nothing special yet. */
755 generic_value_print (val, stream, recurse, &opts, &rust_decorations);
756 }
757}
758
759/* See language.h. */
760
761void
762rust_language::value_print
763 (struct value *val, struct ui_file *stream,
764 const struct value_print_options *options) const
765{
766 value_print_options opts = *options;
767 opts.deref_ref = true;
768
769 struct type *type = check_typedef (val->type ());
770 if (type->is_pointer_or_reference ())
771 {
772 gdb_printf (stream, "(");
773 type_print (val->type (), "", stream, -1);
774 gdb_printf (stream, ") ");
775 }
776
777 return common_val_print (val, stream, 0, &opts, this);
778}
779
780\f
781
782static void
783rust_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);
787
788/* Print a struct or union typedef. */
789static void
790rust_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)
794{
795 /* Print a tuple type simply. */
796 if (rust_tuple_type_p (type))
797 {
798 gdb_puts (type->name (), stream);
799 return;
800 }
801
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);
805
806 if (flags->print_offsets)
807 {
808 /* Temporarily bump the level so that the output lines up
809 correctly. */
810 level += 2;
811 }
812
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);
819
820 if (for_rust_enum)
821 {
822 /* Already printing an outer enum, so nothing to print here. */
823 }
824 else
825 {
826 /* This code path is also used by unions and enums. */
827 if (is_enum)
828 {
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 ();
833 }
834 else if (type->code () == TYPE_CODE_STRUCT)
835 gdb_puts ("struct ", stream);
836 else
837 gdb_puts ("union ", stream);
838
839 if (tagname != NULL)
840 gdb_puts (tagname, stream);
841 }
842
843 if (type->num_fields () == 0 && !is_tuple)
844 return;
845 if (for_rust_enum && !flags->print_offsets)
846 gdb_puts (is_tuple_struct ? "(" : "{", stream);
847 else
848 gdb_puts (is_tuple_struct ? " (\n" : " {\n", stream);
849
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)
856 {
857 if (type->field (i).is_static ())
858 continue;
859 if (is_enum && type->field (i).is_artificial ())
860 continue;
861 fields.push_back (i);
862 }
863 if (flags->print_offsets)
864 std::sort (fields.begin (), fields.end (),
865 [&] (int a, int b)
866 {
867 return (type->field (a).loc_bitpos ()
868 < type->field (b).loc_bitpos ());
869 });
870
871 for (int i : fields)
872 {
873 QUIT;
874
875 gdb_assert (!type->field (i).is_static ());
876 gdb_assert (! (is_enum && type->field (i).is_artificial ()));
877
878 if (flags->print_offsets)
879 podata->update (type, i, stream);
880
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. */
884
885 /* For a tuple struct we print the type but nothing
886 else. */
887 if (!for_rust_enum || flags->print_offsets)
888 print_spaces (level + 2, stream);
889 if (is_enum)
890 fputs_styled (type->field (i).name (), variable_name_style.style (),
891 stream);
892 else if (!is_tuple_struct)
893 gdb_printf (stream, "%ps: ",
894 styled_string (variable_name_style.style (),
895 type->field (i).name ()));
896
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);
907 }
908
909 if (flags->print_offsets)
910 {
911 /* Undo the temporary level increase we did above. */
912 level -= 2;
913 podata->finish (type, level, stream);
914 print_spaces (print_offset_data::indentation, stream);
915 if (level == 0)
916 print_spaces (2, stream);
917 }
918 if (!for_rust_enum || flags->print_offsets)
919 print_spaces (level, stream);
920 gdb_puts (is_tuple_struct ? ")" : "}", stream);
921}
922
923/* la_print_type implementation for Rust. */
924
925static void
926rust_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)
930{
931 QUIT;
932 if (show <= 0
933 && type->name () != NULL)
934 {
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);
939 else
940 gdb_puts (type->name (), stream);
941 return;
942 }
943
944 type = check_typedef (type);
945 switch (type->code ())
946 {
947 case TYPE_CODE_VOID:
948 /* If we have an enum, we've already printed the type's
949 unqualified name, and there is nothing else to print
950 here. */
951 if (!for_rust_enum)
952 gdb_puts ("()", stream);
953 break;
954
955 case TYPE_CODE_FUNC:
956 /* Delegate varargs to the C printer. */
957 if (type->has_varargs ())
958 goto c_printer;
959
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)
965 {
966 QUIT;
967 if (i > 0)
968 gdb_puts (", ", stream);
969 rust_internal_print_type (type->field (i).type (), "", stream,
970 -1, 0, flags, false, podata);
971 }
972 gdb_puts (")", stream);
973 /* If it returns unit, we can omit the return type. */
974 if (type->target_type ()->code () != TYPE_CODE_VOID)
975 {
976 gdb_puts (" -> ", stream);
977 rust_internal_print_type (type->target_type (), "", stream,
978 -1, 0, flags, false, podata);
979 }
980 break;
981
982 case TYPE_CODE_ARRAY:
983 {
984 LONGEST low_bound, high_bound;
985
986 gdb_puts ("[", stream);
987 rust_internal_print_type (type->target_type (), NULL,
988 stream, show - 1, level, flags, false,
989 podata);
990
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);
998 }
999 break;
1000
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);
1005 break;
1006
1007 case TYPE_CODE_ENUM:
1008 {
1009 int len = 0;
1010
1011 gdb_puts ("enum ", stream);
1012 if (type->name () != NULL)
1013 {
1014 gdb_puts (type->name (), stream);
1015 gdb_puts (" ", stream);
1016 len = strlen (type->name ());
1017 }
1018 gdb_puts ("{\n", stream);
1019
1020 for (int i = 0; i < type->num_fields (); ++i)
1021 {
1022 const char *name = type->field (i).name ();
1023
1024 QUIT;
1025
1026 if (len > 0
1027 && strncmp (name, type->name (), len) == 0
1028 && name[len] == ':'
1029 && name[len + 1] == ':')
1030 name += len + 2;
1031 gdb_printf (stream, "%*s%ps,\n",
1032 level + 2, "",
1033 styled_string (variable_name_style.style (),
1034 name));
1035 }
1036
1037 gdb_puts ("}", stream);
1038 }
1039 break;
1040
1041 case TYPE_CODE_PTR:
1042 {
1043 if (type->name () != nullptr)
1044 gdb_puts (type->name (), stream);
1045 else
1046 {
1047 /* We currently can't distinguish between pointers and
1048 references. */
1049 gdb_puts ("*mut ", stream);
1050 type_print (type->target_type (), "", stream, 0);
1051 }
1052 }
1053 break;
1054
1055 default:
1056 c_printer:
1057 c_print_type (type, varstring, stream, show, level, language_rust,
1058 flags);
1059 }
1060}
1061
1062\f
1063
1064/* Like arch_composite_type, but uses TYPE to decide how to allocate
1065 -- either on an obstack or on a gdbarch. */
1066
1067static struct type *
1068rust_composite_type (struct type *original,
1069 const char *name,
1070 const char *field1, struct type *type1,
1071 const char *field2, struct type *type2)
1072{
1073 struct type *result = type_allocator (original).new_type ();
1074 int i, nfields, bitpos;
1075
1076 nfields = 0;
1077 if (field1 != NULL)
1078 ++nfields;
1079 if (field2 != NULL)
1080 ++nfields;
1081
1082 result->set_code (TYPE_CODE_STRUCT);
1083 result->set_name (name);
1084
1085 result->alloc_fields (nfields);
1086
1087 i = 0;
1088 bitpos = 0;
1089 if (field1 != NULL)
1090 {
1091 struct field *field = &result->field (i);
1092
1093 field->set_loc_bitpos (bitpos);
1094 bitpos += type1->length () * TARGET_CHAR_BIT;
1095
1096 field->set_name (field1);
1097 field->set_type (type1);
1098 ++i;
1099 }
1100 if (field2 != NULL)
1101 {
1102 struct field *field = &result->field (i);
1103 unsigned align = type_align (type2);
1104
1105 if (align != 0)
1106 {
1107 int delta;
1108
1109 align *= TARGET_CHAR_BIT;
1110 delta = bitpos % align;
1111 if (delta != 0)
1112 bitpos += align - delta;
1113 }
1114 field->set_loc_bitpos (bitpos);
1115
1116 field->set_name (field2);
1117 field->set_type (type2);
1118 ++i;
1119 }
1120
1121 if (i > 0)
1122 result->set_length (result->field (i - 1).loc_bitpos () / TARGET_CHAR_BIT
1123 + result->field (i - 1).type ()->length ());
1124 return result;
1125}
1126
1127/* See rust-lang.h. */
1128
1129struct type *
1130rust_slice_type (const char *name, struct type *elt_type,
1131 struct type *usize_type)
1132{
1133 struct type *type;
1134
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);
1139
1140 return type;
1141}
1142
1143\f
1144
1145namespace expr
1146{
1147
1148struct value *
1149rust_range_operation::evaluate (struct type *expect_type,
1150 struct expression *exp,
1151 enum noside noside)
1152{
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);
1160
1161 struct value *addrval, *result;
1162 CORE_ADDR addr;
1163 struct type *range_type;
1164 struct type *index_type;
1165 struct type *temp_type;
1166 const char *name;
1167
1168 bool inclusive = !(kind & RANGE_HIGH_BOUND_EXCLUSIVE);
1169
1170 if (low == NULL)
1171 {
1172 if (high == NULL)
1173 {
1174 index_type = NULL;
1175 name = "std::ops::RangeFull";
1176 }
1177 else
1178 {
1179 index_type = high->type ();
1180 name = (inclusive
1181 ? "std::ops::RangeToInclusive" : "std::ops::RangeTo");
1182 }
1183 }
1184 else
1185 {
1186 if (high == NULL)
1187 {
1188 index_type = low->type ();
1189 name = "std::ops::RangeFrom";
1190 }
1191 else
1192 {
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";
1197 }
1198 }
1199
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)
1204 : index_type);
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);
1209
1210 if (noside == EVAL_AVOID_SIDE_EFFECTS)
1211 return value::zero (range_type, lval_memory);
1212
1213 addrval = value_allocate_space_in_inferior (range_type->length ());
1214 addr = value_as_long (addrval);
1215 result = value_at_lazy (range_type, addr);
1216
1217 if (low != NULL)
1218 {
1219 struct value *start = value_struct_elt (&result, {}, "start", NULL,
1220 "range");
1221
1222 value_assign (start, low);
1223 }
1224
1225 if (high != NULL)
1226 {
1227 struct value *end = value_struct_elt (&result, {}, "end", NULL,
1228 "range");
1229
1230 value_assign (end, high);
1231 }
1232
1233 result = value_at_lazy (range_type, addr);
1234 return result;
1235}
1236
1237} /* namespace expr */
1238
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. */
1246
1247static void
1248rust_compute_range (struct type *type, struct value *range,
1249 LONGEST *low, LONGEST *high,
1250 range_flags *kind)
1251{
1252 int i;
1253
1254 *low = 0;
1255 *high = 0;
1256 *kind = RANGE_LOW_BOUND_DEFAULT | RANGE_HIGH_BOUND_DEFAULT;
1257
1258 if (type->num_fields () == 0)
1259 return;
1260
1261 i = 0;
1262 if (strcmp (type->field (0).name (), "start") == 0)
1263 {
1264 *kind = RANGE_HIGH_BOUND_DEFAULT;
1265 *low = value_as_long (value_field (range, 0));
1266 ++i;
1267 }
1268 if (type->num_fields () > i
1269 && strcmp (type->field (i).name (), "end") == 0)
1270 {
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));
1274
1275 if (rust_inclusive_range_type_p (type))
1276 ++*high;
1277 }
1278}
1279
1280namespace expr
1281{
1282
1283struct value *
1284rust_subscript_operation::subscript (struct expression *exp,
1285 enum noside noside, bool for_addr)
1286{
1287 value *lhs = std::get<0> (m_storage)->evaluate (nullptr, exp, noside);
1288 value *rhs = std::get<1> (m_storage)->evaluate (nullptr, exp, noside);
1289
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;
1295 LONGEST high = 0;
1296 bool want_slice = false;
1297
1298 rhstype = check_typedef (rhs->type ());
1299 if (rust_range_type_p (rhstype))
1300 {
1301 if (!for_addr)
1302 error (_("Can't take slice of array without '&'"));
1303 rust_compute_range (rhstype, rhs, &low, &high, &kind);
1304 want_slice = true;
1305 }
1306 else
1307 low = value_as_long (rhs);
1308
1309 struct type *type = check_typedef (lhs->type ());
1310 struct type *orig_type = type;
1311 if (noside == EVAL_AVOID_SIDE_EFFECTS)
1312 {
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))
1317 {
1318 base_type = rust_array_like_element_type (type);
1319 if (base_type == nullptr)
1320 error (_("Cannot subscript non-array-like slice"));
1321 }
1322 else if (type->code () == TYPE_CODE_PTR)
1323 base_type = type->target_type ();
1324 else
1325 error (_("Cannot subscript non-array type"));
1326
1327 struct type *new_type;
1328 if (want_slice)
1329 {
1330 if (rust_slice_type_p (type))
1331 new_type = type;
1332 else
1333 {
1334 struct type *usize
1335 = language_lookup_primitive_type (exp->language_defn,
1336 exp->gdbarch,
1337 "usize");
1338 new_type = rust_slice_type ("&[*gdb*]", base_type, usize);
1339 }
1340 }
1341 else
1342 new_type = base_type;
1343
1344 return value::zero (new_type, lhs->lval ());
1345 }
1346 else
1347 {
1348 LONGEST low_bound;
1349 struct value *base;
1350
1351 if (rust_slice_type_p (type))
1352 {
1353 lhs = convert_slice (lhs);
1354 type = check_typedef (lhs->type ());
1355 }
1356
1357 if (type->code () == TYPE_CODE_ARRAY)
1358 {
1359 base = lhs;
1360 if (!get_array_bounds (type, &low_bound, &high_bound))
1361 error (_("Can't compute array bounds"));
1362 if (low_bound != 0)
1363 error (_("Found array with non-zero lower bound"));
1364 ++high_bound;
1365 }
1366 else if (type->code () == TYPE_CODE_PTR)
1367 {
1368 base = lhs;
1369 low_bound = 0;
1370 high_bound = LONGEST_MAX;
1371 }
1372 else
1373 error (_("Cannot subscript non-array type"));
1374
1375 if (want_slice && (kind & RANGE_LOW_BOUND_DEFAULT))
1376 low = low_bound;
1377 if (low < 0)
1378 error (_("Index less than zero"));
1379 if (low > high_bound)
1380 error (_("Index greater than length"));
1381
1382 result = value_subscript (base, low);
1383 }
1384
1385 if (for_addr)
1386 {
1387 if (want_slice)
1388 {
1389 struct type *usize, *slice;
1390 CORE_ADDR addr;
1391 struct value *addrval, *tem;
1392
1393 if (kind & RANGE_HIGH_BOUND_DEFAULT)
1394 high = high_bound;
1395 if (high < 0)
1396 error (_("High index less than zero"));
1397 if (low > high)
1398 error (_("Low index greater than high index"));
1399 if (high > high_bound)
1400 error (_("High index greater than length"));
1401
1402 usize = language_lookup_primitive_type (exp->language_defn,
1403 exp->gdbarch,
1404 "usize");
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*]");
1410
1411 slice = rust_slice_type (new_name, result->type (), usize);
1412
1413 addrval = value_allocate_space_in_inferior (slice->length ());
1414 addr = value_as_long (addrval);
1415 tem = value_at_lazy (slice, addr);
1416
1417 value_assign (value_field (tem, 0), value_addr (result));
1418 value_assign (value_field (tem, 1),
1419 value_from_longest (usize, high - low));
1420
1421 result = value_at_lazy (slice, addr);
1422 }
1423 else
1424 result = value_addr (result);
1425 }
1426
1427 return result;
1428}
1429
1430struct value *
1431rust_unop_ind_operation::evaluate (struct type *expect_type,
1432 struct expression *exp,
1433 enum noside noside)
1434{
1435 if (noside != EVAL_NORMAL)
1436 return unop_ind_operation::evaluate (expect_type, exp, noside);
1437
1438 struct value *value = std::get<0> (m_storage)->evaluate (nullptr, exp,
1439 noside);
1440 struct value *trait_ptr = rust_get_trait_object_pointer (value);
1441 if (trait_ptr != NULL)
1442 value = trait_ptr;
1443
1444 return value_ind (value);
1445}
1446
1447} /* namespace expr */
1448
1449/* A helper function for UNOP_COMPLEMENT. */
1450
1451struct value *
1452eval_op_rust_complement (struct type *expect_type, struct expression *exp,
1453 enum noside noside,
1454 enum exp_opcode opcode,
1455 struct value *value)
1456{
1457 if (value->type ()->code () == TYPE_CODE_BOOL)
1458 return value_from_longest (value->type (), value_logical_not (value));
1459 return value_complement (value);
1460}
1461
1462/* A helper function for OP_ARRAY. */
1463
1464struct value *
1465eval_op_rust_array (struct type *expect_type, struct expression *exp,
1466 enum noside noside,
1467 enum exp_opcode opcode,
1468 struct value *elt, struct value *ncopies)
1469{
1470 int copies = value_as_long (ncopies);
1471 if (copies < 0)
1472 error (_("Array with negative number of elements"));
1473
1474 if (noside == EVAL_NORMAL && copies > 0)
1475 return value_array (0, std::vector<value *> (copies, elt));
1476 else
1477 {
1478 struct type *arraytype
1479 = lookup_array_range_type (elt->type (), 0, copies - 1);
1480 return value::allocate (arraytype);
1481 }
1482}
1483
1484namespace expr
1485{
1486
1487struct value *
1488rust_struct_anon::evaluate (struct type *expect_type,
1489 struct expression *exp,
1490 enum noside noside)
1491{
1492 value *lhs = std::get<1> (m_storage)->evaluate (nullptr, exp, noside);
1493 int field_number = std::get<0> (m_storage);
1494
1495 struct type *type = check_typedef (lhs->type ());
1496
1497 if (type->code () == TYPE_CODE_STRUCT)
1498 {
1499 struct type *outer_type = NULL;
1500
1501 if (rust_enum_p (type))
1502 {
1503 type = resolve_dynamic_type (type, lhs->contents (),
1504 lhs->address ());
1505
1506 if (rust_empty_enum_p (type))
1507 error (_("Cannot access field %d of empty enum %s"),
1508 field_number, type->name ());
1509
1510 int fieldno = rust_enum_variant (type);
1511 lhs = lhs->primitive_field (0, fieldno, type);
1512 outer_type = type;
1513 type = lhs->type ();
1514 }
1515
1516 /* Tuples and tuple structs */
1517 int nfields = type->num_fields ();
1518
1519 if (field_number >= nfields || field_number < 0)
1520 {
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 ()),
1526 nfields);
1527 else
1528 error(_("Cannot access field %d of %s, "
1529 "there are only %d fields"),
1530 field_number, type->name (), nfields);
1531 }
1532
1533 /* Tuples are tuple structs too. */
1534 if (!rust_tuple_struct_type_p (type))
1535 {
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 ()));
1540 else
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 ());
1545 }
1546
1547 return lhs->primitive_field (0, field_number, type);
1548 }
1549 else
1550 error(_("Anonymous field access is only allowed on tuples, \
1551tuple structs, and tuple-like enum variants"));
1552}
1553
1554struct value *
1555rust_structop::evaluate (struct type *expect_type,
1556 struct expression *exp,
1557 enum noside noside)
1558{
1559 value *lhs = std::get<0> (m_storage)->evaluate (nullptr, exp, noside);
1560 const char *field_name = std::get<1> (m_storage).c_str ();
1561
1562 struct value *result;
1563 struct type *type = lhs->type ();
1564 if (type->code () == TYPE_CODE_STRUCT && rust_enum_p (type))
1565 {
1566 type = resolve_dynamic_type (type, lhs->contents (),
1567 lhs->address ());
1568
1569 if (rust_empty_enum_p (type))
1570 error (_("Cannot access field %s of empty enum %s"),
1571 field_name, type->name ());
1572
1573 int fieldno = rust_enum_variant (type);
1574 lhs = lhs->primitive_field (0, fieldno, type);
1575
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 ()));
1583
1584 try
1585 {
1586 result = value_struct_elt (&lhs, {}, field_name,
1587 NULL, "structure");
1588 }
1589 catch (const gdb_exception_error &except)
1590 {
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 ()));
1594 }
1595 }
1596 else
1597 {
1598 if (rust_slice_type_p (type))
1599 lhs = convert_slice (lhs);
1600 result = value_struct_elt (&lhs, {}, field_name, NULL, "structure");
1601 }
1602 if (noside == EVAL_AVOID_SIDE_EFFECTS)
1603 result = value::zero (result->type (), result->lval ());
1604 return result;
1605}
1606
1607value *
1608rust_aggregate_operation::evaluate (struct type *expect_type,
1609 struct expression *exp,
1610 enum noside noside)
1611{
1612 struct type *type = std::get<0> (m_storage);
1613 CORE_ADDR addr = 0;
1614 struct value *addrval = NULL;
1615 value *result;
1616
1617 if (noside == EVAL_NORMAL)
1618 {
1619 addrval = value_allocate_space_in_inferior (type->length ());
1620 addr = value_as_long (addrval);
1621 result = value_at_lazy (type, addr);
1622 }
1623
1624 if (std::get<1> (m_storage) != nullptr)
1625 {
1626 struct value *init = std::get<1> (m_storage)->evaluate (nullptr, exp,
1627 noside);
1628
1629 if (noside == EVAL_NORMAL)
1630 {
1631 /* This isn't quite right but will do for the time
1632 being, seeing that we can't implement the Copy
1633 trait anyway. */
1634 value_assign (result, init);
1635 }
1636 }
1637
1638 for (const auto &item : std::get<2> (m_storage))
1639 {
1640 value *val = item.second->evaluate (nullptr, exp, noside);
1641 if (noside == EVAL_NORMAL)
1642 {
1643 const char *fieldname = item.first.c_str ();
1644 value *field = value_struct_elt (&result, {}, fieldname,
1645 nullptr, "structure");
1646 value_assign (field, val);
1647 }
1648 }
1649
1650 if (noside == EVAL_AVOID_SIDE_EFFECTS)
1651 result = value::allocate (type);
1652 else
1653 result = value_at_lazy (type, addr);
1654
1655 return result;
1656}
1657
1658value *
1659rust_structop::evaluate_funcall (struct type *expect_type,
1660 struct expression *exp,
1661 enum noside noside,
1662 const std::vector<operation_up> &ops)
1663{
1664 std::vector<struct value *> args (ops.size () + 1);
1665
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]);
1672
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"));
1681
1682 std::string name = (std::string (type->name ()) + "::"
1683 + std::get<1> (m_storage));
1684
1685 const struct block *block = get_selected_block (0);
1686 struct block_symbol sym = lookup_symbol (name.c_str (), block,
1687 SEARCH_FUNCTION_DOMAIN,
1688 nullptr);
1689 if (sym.symbol == NULL)
1690 error (_("Could not find function named '%s'"), name.c_str ());
1691
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 ());
1695
1696 if (fn_type->field (0).type ()->code () == TYPE_CODE_PTR)
1697 args[0] = value_addr (args[0]);
1698
1699 value *function = address_of_variable (sym.symbol, block);
1700
1701 for (int i = 0; i < ops.size (); ++i)
1702 args[i + 1] = ops[i]->evaluate (nullptr, exp, noside);
1703
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);
1707}
1708
1709}
1710
1711\f
1712
1713/* See language.h. */
1714
1715void
1716rust_language::language_arch_info (struct gdbarch *gdbarch,
1717 struct language_arch_info *lai) const
1718{
1719 const struct builtin_type *builtin = builtin_type (gdbarch);
1720
1721 /* Helper function to allow shorter lines below. */
1722 auto add = [&] (struct type * t) -> struct type *
1723 {
1724 lai->add_primitive_type (t);
1725 return t;
1726 };
1727
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"));
1743
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"));
1748
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, "()"));
1752
1753 struct type *tem = make_cv_type (1, 0, u8_type, NULL);
1754 add (rust_slice_type ("&str", tem, usize_type));
1755
1756 lai->set_bool_type (bool_type);
1757 lai->set_string_char_type (u8_type);
1758}
1759
1760/* See language.h. */
1761
1762void
1763rust_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
1766{
1767 print_offset_data podata (flags);
1768 rust_internal_print_type (type, varstring, stream, show, level,
1769 flags, false, &podata);
1770}
1771
1772/* See language.h. */
1773
1774void
1775rust_language::emitchar (int ch, struct type *chtype,
1776 struct ui_file *stream, int quoter) const
1777{
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);
1793 else if (ch <= 255)
1794 gdb_printf (stream, "\\x%02x", ch);
1795 else
1796 gdb_printf (stream, "\\u{%06x}", ch);
1797}
1798
1799/* See language.h. */
1800
1801bool
1802rust_language::is_array_like (struct type *type) const
1803{
1804 if (!rust_slice_type_p (type))
1805 return false;
1806 return rust_array_like_element_type (type) != nullptr;
1807}
1808
1809/* See language.h. */
1810
1811bool
1812rust_language::is_string_type_p (struct type *type) const
1813{
1814 LONGEST low_bound, high_bound;
1815
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,
1822 &high_bound)))
1823 || (type->code () == TYPE_CODE_STRUCT
1824 && !rust_enum_p (type)
1825 && rust_slice_type_p (type)
1826 && strcmp (type->name (), "&str") == 0));
1827}
1828
1829/* See language.h. */
1830
1831struct block_symbol
1832rust_language::lookup_symbol_nonlocal
1833 (const char *name, const struct block *block,
1834 const domain_search_flags domain) const
1835{
1836 struct block_symbol result = {};
1837
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 ());
1843
1844 /* Look up bare names in the block's scope. */
1845 std::string scopedname;
1846 if (name[cp_find_first_component (name)] == '\0')
1847 {
1848 if (scope[0] != '\0')
1849 {
1850 scopedname = std::string (scope) + "::" + name;
1851 name = scopedname.c_str ();
1852 }
1853 else
1854 name = NULL;
1855 }
1856
1857 if (name != NULL)
1858 {
1859 result = lookup_symbol_in_static_block (name, block, domain);
1860 if (result.symbol == NULL)
1861 result = lookup_global_symbol (name, block, domain);
1862 }
1863 return result;
1864}
1865
1866/* Single instance of the Rust language class. */
1867
1868static rust_language rust_language_defn;