]> Git Repo - binutils.git/blob - gdb/rust-lang.c
[gdb] Fix heap-buffer-overflow in completion_tracker::build_completion_result
[binutils.git] / gdb / rust-lang.c
1 /* Rust language support routines for GDB, the GNU debugger.
2
3    Copyright (C) 2016-2020 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 #include "defs.h"
21
22 #include <ctype.h>
23
24 #include "block.h"
25 #include "c-lang.h"
26 #include "charset.h"
27 #include "cp-support.h"
28 #include "demangle.h"
29 #include "gdbarch.h"
30 #include "infcall.h"
31 #include "objfiles.h"
32 #include "psymtab.h"
33 #include "rust-lang.h"
34 #include "typeprint.h"
35 #include "valprint.h"
36 #include "varobj.h"
37 #include <algorithm>
38 #include <string>
39 #include <vector>
40 #include "cli/cli-style.h"
41 #include "parser-defs.h"
42
43 /* See rust-lang.h.  */
44
45 const char *
46 rust_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
57 std::string
58 rust_crate_for_block (const struct block *block)
59 {
60   const char *scope = block_scope (block);
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
71 static bool
72 rust_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
82 static bool
83 rust_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
91 static int
92 rust_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_ARTIFICIAL (type, i))
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
107 bool
108 rust_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.  */
120
121 static bool
122 rust_underscore_fields (struct type *type)
123 {
124   int i, field_number;
125
126   field_number = 0;
127
128   if (type->code () != TYPE_CODE_STRUCT)
129     return false;
130   for (i = 0; i < type->num_fields (); ++i)
131     {
132       if (!field_is_static (&type->field (i)))
133         {
134           char buf[20];
135
136           xsnprintf (buf, sizeof (buf), "__%d", field_number);
137           if (strcmp (buf, TYPE_FIELD_NAME (type, i)) != 0)
138             return false;
139           field_number++;
140         }
141     }
142   return true;
143 }
144
145 /* See rust-lang.h.  */
146
147 bool
148 rust_tuple_struct_type_p (struct type *type)
149 {
150   /* This is just an approximation until DWARF can represent Rust more
151      precisely.  We exclude zero-length structs because they may not
152      be tuple structs, and there's no way to tell.  */
153   return type->num_fields () > 0 && rust_underscore_fields (type);
154 }
155
156 /* Return true if TYPE is a slice type, otherwise false.  */
157
158 static bool
159 rust_slice_type_p (struct type *type)
160 {
161   return (type->code () == TYPE_CODE_STRUCT
162           && type->name () != NULL
163           && (strncmp (type->name (), "&[", 2) == 0
164               || strcmp (type->name (), "&str") == 0));
165 }
166
167 /* Return true if TYPE is a range type, otherwise false.  */
168
169 static bool
170 rust_range_type_p (struct type *type)
171 {
172   int i;
173
174   if (type->code () != TYPE_CODE_STRUCT
175       || type->num_fields () > 2
176       || type->name () == NULL
177       || strstr (type->name (), "::Range") == NULL)
178     return false;
179
180   if (type->num_fields () == 0)
181     return true;
182
183   i = 0;
184   if (strcmp (TYPE_FIELD_NAME (type, 0), "start") == 0)
185     {
186       if (type->num_fields () == 1)
187         return true;
188       i = 1;
189     }
190   else if (type->num_fields () == 2)
191     {
192       /* First field had to be "start".  */
193       return false;
194     }
195
196   return strcmp (TYPE_FIELD_NAME (type, i), "end") == 0;
197 }
198
199 /* Return true if TYPE is an inclusive range type, otherwise false.
200    This is only valid for types which are already known to be range
201    types.  */
202
203 static bool
204 rust_inclusive_range_type_p (struct type *type)
205 {
206   return (strstr (type->name (), "::RangeInclusive") != NULL
207           || strstr (type->name (), "::RangeToInclusive") != NULL);
208 }
209
210 /* Return true if TYPE seems to be the type "u8", otherwise false.  */
211
212 static bool
213 rust_u8_type_p (struct type *type)
214 {
215   return (type->code () == TYPE_CODE_INT
216           && type->is_unsigned ()
217           && TYPE_LENGTH (type) == 1);
218 }
219
220 /* Return true if TYPE is a Rust character type.  */
221
222 static bool
223 rust_chartype_p (struct type *type)
224 {
225   return (type->code () == TYPE_CODE_CHAR
226           && TYPE_LENGTH (type) == 4
227           && type->is_unsigned ());
228 }
229
230 /* If VALUE represents a trait object pointer, return the underlying
231    pointer with the correct (i.e., runtime) type.  Otherwise, return
232    NULL.  */
233
234 static struct value *
235 rust_get_trait_object_pointer (struct value *value)
236 {
237   struct type *type = check_typedef (value_type (value));
238
239   if (type->code () != TYPE_CODE_STRUCT || type->num_fields () != 2)
240     return NULL;
241
242   /* Try to be a bit resilient if the ABI changes.  */
243   int vtable_field = 0;
244   for (int i = 0; i < 2; ++i)
245     {
246       if (strcmp (TYPE_FIELD_NAME (type, i), "vtable") == 0)
247         vtable_field = i;
248       else if (strcmp (TYPE_FIELD_NAME (type, i), "pointer") != 0)
249         return NULL;
250     }
251
252   CORE_ADDR vtable = value_as_address (value_field (value, vtable_field));
253   struct symbol *symbol = find_symbol_at_address (vtable);
254   if (symbol == NULL || symbol->subclass != SYMBOL_RUST_VTABLE)
255     return NULL;
256
257   struct rust_vtable_symbol *vtable_sym
258     = static_cast<struct rust_vtable_symbol *> (symbol);
259   struct type *pointer_type = lookup_pointer_type (vtable_sym->concrete_type);
260   return value_cast (pointer_type, value_field (value, 1 - vtable_field));
261 }
262
263 \f
264
265 /* language_defn::printstr implementation for Rust.  */
266
267 static void
268 rust_printstr (struct ui_file *stream, struct type *type,
269                const gdb_byte *string, unsigned int length,
270                const char *user_encoding, int force_ellipses,
271                const struct value_print_options *options)
272 {
273   /* Rust always uses UTF-8, but let the caller override this if need
274      be.  */
275   const char *encoding = user_encoding;
276   if (user_encoding == NULL || !*user_encoding)
277     {
278       /* In Rust strings, characters are "u8".  */
279       if (rust_u8_type_p (type))
280         encoding = "UTF-8";
281       else
282         {
283           /* This is probably some C string, so let's let C deal with
284              it.  */
285           c_printstr (stream, type, string, length, user_encoding,
286                       force_ellipses, options);
287           return;
288         }
289     }
290
291   /* This is not ideal as it doesn't use our character printer.  */
292   generic_printstr (stream, type, string, length, encoding, force_ellipses,
293                     '"', 0, options);
294 }
295
296 \f
297
298 static void rust_value_print_inner (struct value *val, struct ui_file *stream,
299                                     int recurse,
300                                     const struct value_print_options *options);
301
302 /* Helper function to print a string slice.  */
303
304 static void
305 rust_val_print_str (struct ui_file *stream, struct value *val,
306                     const struct value_print_options *options)
307 {
308   struct value *base = value_struct_elt (&val, NULL, "data_ptr", NULL,
309                                          "slice");
310   struct value *len = value_struct_elt (&val, NULL, "length", NULL, "slice");
311
312   val_print_string (TYPE_TARGET_TYPE (value_type (base)), "UTF-8",
313                     value_as_address (base), value_as_long (len), stream,
314                     options);
315 }
316
317 /* rust_val_print helper for structs and untagged unions.  */
318
319 static void
320 val_print_struct (struct value *val, struct ui_file *stream, int recurse,
321                   const struct value_print_options *options)
322 {
323   int i;
324   int first_field;
325   struct type *type = check_typedef (value_type (val));
326
327   if (rust_slice_type_p (type) && strcmp (type->name (), "&str") == 0)
328     {
329       /* If what we are printing here is actually a string within a
330          structure then VAL will be the original parent value, while TYPE
331          will be the type of the structure representing the string we want
332          to print.
333          However, RUST_VAL_PRINT_STR looks up the fields of the string
334          inside VAL, assuming that VAL is the string.
335          So, recreate VAL as a value representing just the string.  */
336       val = value_at_lazy (type, value_address (val));
337       rust_val_print_str (stream, val, options);
338       return;
339     }
340
341   bool is_tuple = rust_tuple_type_p (type);
342   bool is_tuple_struct = !is_tuple && rust_tuple_struct_type_p (type);
343   struct value_print_options opts;
344
345   if (!is_tuple)
346     {
347       if (type->name () != NULL)
348         fprintf_filtered (stream, "%s", type->name ());
349
350       if (type->num_fields () == 0)
351         return;
352
353       if (type->name () != NULL)
354         fputs_filtered (" ", stream);
355     }
356
357   if (is_tuple || is_tuple_struct)
358     fputs_filtered ("(", stream);
359   else
360     fputs_filtered ("{", stream);
361
362   opts = *options;
363   opts.deref_ref = 0;
364
365   first_field = 1;
366   for (i = 0; i < type->num_fields (); ++i)
367     {
368       if (field_is_static (&type->field (i)))
369         continue;
370
371       if (!first_field)
372         fputs_filtered (",", stream);
373
374       if (options->prettyformat)
375         {
376           fputs_filtered ("\n", stream);
377           print_spaces_filtered (2 + 2 * recurse, stream);
378         }
379       else if (!first_field)
380         fputs_filtered (" ", stream);
381
382       first_field = 0;
383
384       if (!is_tuple && !is_tuple_struct)
385         {
386           fputs_styled (TYPE_FIELD_NAME (type, i),
387                         variable_name_style.style (), stream);
388           fputs_filtered (": ", stream);
389         }
390
391       rust_value_print_inner (value_field (val, i), stream, recurse + 1,
392                               &opts);
393     }
394
395   if (options->prettyformat)
396     {
397       fputs_filtered ("\n", stream);
398       print_spaces_filtered (2 * recurse, stream);
399     }
400
401   if (is_tuple || is_tuple_struct)
402     fputs_filtered (")", stream);
403   else
404     fputs_filtered ("}", stream);
405 }
406
407 /* rust_val_print helper for discriminated unions (Rust enums).  */
408
409 static void
410 rust_print_enum (struct value *val, struct ui_file *stream, int recurse,
411                  const struct value_print_options *options)
412 {
413   struct value_print_options opts = *options;
414   struct type *type = check_typedef (value_type (val));
415
416   opts.deref_ref = 0;
417
418   gdb_assert (rust_enum_p (type));
419   gdb::array_view<const gdb_byte> view (value_contents_for_printing (val),
420                                         TYPE_LENGTH (value_type (val)));
421   type = resolve_dynamic_type (type, view, value_address (val));
422
423   if (rust_empty_enum_p (type))
424     {
425       /* Print the enum type name here to be more clear.  */
426       fprintf_filtered (stream, _("%s {%p[<No data fields>%p]}"),
427                         type->name (),
428                         metadata_style.style ().ptr (), nullptr);
429       return;
430     }
431
432   int variant_fieldno = rust_enum_variant (type);
433   val = value_field (val, variant_fieldno);
434   struct type *variant_type = type->field (variant_fieldno).type ();
435
436   int nfields = variant_type->num_fields ();
437
438   bool is_tuple = rust_tuple_struct_type_p (variant_type);
439
440   fprintf_filtered (stream, "%s", variant_type->name ());
441   if (nfields == 0)
442     {
443       /* In case of a nullary variant like 'None', just output
444          the name. */
445       return;
446     }
447
448   /* In case of a non-nullary variant, we output 'Foo(x,y,z)'. */
449   if (is_tuple)
450     fprintf_filtered (stream, "(");
451   else
452     {
453       /* struct variant.  */
454       fprintf_filtered (stream, "{");
455     }
456
457   bool first_field = true;
458   for (int j = 0; j < variant_type->num_fields (); j++)
459     {
460       if (!first_field)
461         fputs_filtered (", ", stream);
462       first_field = false;
463
464       if (!is_tuple)
465         fprintf_filtered (stream, "%ps: ",
466                           styled_string (variable_name_style.style (),
467                                          TYPE_FIELD_NAME (variant_type, j)));
468
469       rust_value_print_inner (value_field (val, j), stream, recurse + 1,
470                               &opts);
471     }
472
473   if (is_tuple)
474     fputs_filtered (")", stream);
475   else
476     fputs_filtered ("}", stream);
477 }
478
479 static const struct generic_val_print_decorations rust_decorations =
480 {
481   /* Complex isn't used in Rust, but we provide C-ish values just in
482      case.  */
483   "",
484   " + ",
485   " * I",
486   "true",
487   "false",
488   "()",
489   "[",
490   "]"
491 };
492
493 /* la_value_print_inner implementation for Rust.  */
494 static void
495 rust_value_print_inner (struct value *val, struct ui_file *stream,
496                         int recurse,
497                         const struct value_print_options *options)
498 {
499   struct value_print_options opts = *options;
500   opts.deref_ref = 1;
501
502   if (opts.prettyformat == Val_prettyformat_default)
503     opts.prettyformat = (opts.prettyformat_structs
504                          ? Val_prettyformat : Val_no_prettyformat);
505
506   struct type *type = check_typedef (value_type (val));
507   switch (type->code ())
508     {
509     case TYPE_CODE_PTR:
510       {
511         LONGEST low_bound, high_bound;
512         
513         if (TYPE_TARGET_TYPE (type)->code () == TYPE_CODE_ARRAY
514             && rust_u8_type_p (TYPE_TARGET_TYPE (TYPE_TARGET_TYPE (type)))
515             && get_array_bounds (TYPE_TARGET_TYPE (type), &low_bound,
516                                  &high_bound))
517           {
518             /* We have a pointer to a byte string, so just print
519                that.  */
520             struct type *elttype = check_typedef (TYPE_TARGET_TYPE (type));
521             CORE_ADDR addr = value_as_address (val);
522             struct gdbarch *arch = get_type_arch (type);
523
524             if (opts.addressprint)
525               {
526                 fputs_filtered (paddress (arch, addr), stream);
527                 fputs_filtered (" ", stream);
528               }
529
530             fputs_filtered ("b", stream);
531             val_print_string (TYPE_TARGET_TYPE (elttype), "ASCII", addr,
532                               high_bound - low_bound + 1, stream,
533                               &opts);
534             break;
535           }
536       }
537       goto generic_print;
538
539     case TYPE_CODE_INT:
540       /* Recognize the unit type.  */
541       if (type->is_unsigned () && TYPE_LENGTH (type) == 0
542           && type->name () != NULL && strcmp (type->name (), "()") == 0)
543         {
544           fputs_filtered ("()", stream);
545           break;
546         }
547       goto generic_print;
548
549     case TYPE_CODE_STRING:
550       {
551         LONGEST low_bound, high_bound;
552
553         if (!get_array_bounds (type, &low_bound, &high_bound))
554           error (_("Could not determine the array bounds"));
555
556         /* If we see a plain TYPE_CODE_STRING, then we're printing a
557            byte string, hence the choice of "ASCII" as the
558            encoding.  */
559         fputs_filtered ("b", stream);
560         rust_printstr (stream, TYPE_TARGET_TYPE (type),
561                        value_contents_for_printing (val),
562                        high_bound - low_bound + 1, "ASCII", 0, &opts);
563       }
564       break;
565
566     case TYPE_CODE_ARRAY:
567       {
568         LONGEST low_bound, high_bound;
569
570         if (get_array_bounds (type, &low_bound, &high_bound)
571             && high_bound - low_bound + 1 == 0)
572           fputs_filtered ("[]", stream);
573         else
574           goto generic_print;
575       }
576       break;
577
578     case TYPE_CODE_UNION:
579       /* Untagged unions are printed as if they are structs.  Since
580          the field bit positions overlap in the debuginfo, the code
581          for printing a union is same as that for a struct, the only
582          difference is that the input type will have overlapping
583          fields.  */
584       val_print_struct (val, stream, recurse, &opts);
585       break;
586
587     case TYPE_CODE_STRUCT:
588       if (rust_enum_p (type))
589         rust_print_enum (val, stream, recurse, &opts);
590       else
591         val_print_struct (val, stream, recurse, &opts);
592       break;
593
594     default:
595     generic_print:
596       /* Nothing special yet.  */
597       generic_value_print (val, stream, recurse, &opts, &rust_decorations);
598     }
599 }
600
601 \f
602
603 static void
604 rust_internal_print_type (struct type *type, const char *varstring,
605                           struct ui_file *stream, int show, int level,
606                           const struct type_print_options *flags,
607                           bool for_rust_enum, print_offset_data *podata);
608
609 /* Print a struct or union typedef.  */
610 static void
611 rust_print_struct_def (struct type *type, const char *varstring,
612                        struct ui_file *stream, int show, int level,
613                        const struct type_print_options *flags,
614                        bool for_rust_enum, print_offset_data *podata)
615 {
616   /* Print a tuple type simply.  */
617   if (rust_tuple_type_p (type))
618     {
619       fputs_filtered (type->name (), stream);
620       return;
621     }
622
623   /* If we see a base class, delegate to C.  */
624   if (TYPE_N_BASECLASSES (type) > 0)
625     c_print_type (type, varstring, stream, show, level, flags);
626
627   if (flags->print_offsets)
628     {
629       /* Temporarily bump the level so that the output lines up
630          correctly.  */
631       level += 2;
632     }
633
634   /* Compute properties of TYPE here because, in the enum case, the
635      rest of the code ends up looking only at the variant part.  */
636   const char *tagname = type->name ();
637   bool is_tuple_struct = rust_tuple_struct_type_p (type);
638   bool is_tuple = rust_tuple_type_p (type);
639   bool is_enum = rust_enum_p (type);
640
641   if (for_rust_enum)
642     {
643       /* Already printing an outer enum, so nothing to print here.  */
644     }
645   else
646     {
647       /* This code path is also used by unions and enums.  */
648       if (is_enum)
649         {
650           fputs_filtered ("enum ", stream);
651           dynamic_prop *prop = type->dyn_prop (DYN_PROP_VARIANT_PARTS);
652           if (prop != nullptr && prop->kind () == PROP_TYPE)
653             type = prop->original_type ();
654         }
655       else if (type->code () == TYPE_CODE_STRUCT)
656         fputs_filtered ("struct ", stream);
657       else
658         fputs_filtered ("union ", stream);
659
660       if (tagname != NULL)
661         fputs_filtered (tagname, stream);
662     }
663
664   if (type->num_fields () == 0 && !is_tuple)
665     return;
666   if (for_rust_enum && !flags->print_offsets)
667     fputs_filtered (is_tuple_struct ? "(" : "{", stream);
668   else
669     fputs_filtered (is_tuple_struct ? " (\n" : " {\n", stream);
670
671   /* When printing offsets, we rearrange the fields into storage
672      order.  This lets us show holes more clearly.  We work using
673      field indices here because it simplifies calls to
674      print_offset_data::update below.  */
675   std::vector<int> fields;
676   for (int i = 0; i < type->num_fields (); ++i)
677     {
678       if (field_is_static (&type->field (i)))
679         continue;
680       if (is_enum && TYPE_FIELD_ARTIFICIAL (type, i))
681         continue;
682       fields.push_back (i);
683     }
684   if (flags->print_offsets)
685     std::sort (fields.begin (), fields.end (),
686                [&] (int a, int b)
687                {
688                  return (TYPE_FIELD_BITPOS (type, a)
689                          < TYPE_FIELD_BITPOS (type, b));
690                });
691
692   for (int i : fields)
693     {
694       QUIT;
695
696       gdb_assert (!field_is_static (&type->field (i)));
697       gdb_assert (! (is_enum && TYPE_FIELD_ARTIFICIAL (type, i)));
698
699       if (flags->print_offsets)
700         podata->update (type, i, stream);
701
702       /* We'd like to print "pub" here as needed, but rustc
703          doesn't emit the debuginfo, and our types don't have
704          cplus_struct_type attached.  */
705
706       /* For a tuple struct we print the type but nothing
707          else.  */
708       if (!for_rust_enum || flags->print_offsets)
709         print_spaces_filtered (level + 2, stream);
710       if (is_enum)
711         fputs_styled (TYPE_FIELD_NAME (type, i), variable_name_style.style (),
712                       stream);
713       else if (!is_tuple_struct)
714         fprintf_filtered (stream, "%ps: ",
715                           styled_string (variable_name_style.style (),
716                                          TYPE_FIELD_NAME (type, i)));
717
718       rust_internal_print_type (type->field (i).type (), NULL,
719                                 stream, (is_enum ? show : show - 1),
720                                 level + 2, flags, is_enum, podata);
721       if (!for_rust_enum || flags->print_offsets)
722         fputs_filtered (",\n", stream);
723       /* Note that this check of "I" is ok because we only sorted the
724          fields by offset when print_offsets was set, so we won't take
725          this branch in that case.  */
726       else if (i + 1 < type->num_fields ())
727         fputs_filtered (", ", stream);
728     }
729
730   if (flags->print_offsets)
731     {
732       /* Undo the temporary level increase we did above.  */
733       level -= 2;
734       podata->finish (type, level, stream);
735       print_spaces_filtered (print_offset_data::indentation, stream);
736       if (level == 0)
737         print_spaces_filtered (2, stream);
738     }
739   if (!for_rust_enum || flags->print_offsets)
740     print_spaces_filtered (level, stream);
741   fputs_filtered (is_tuple_struct ? ")" : "}", stream);
742 }
743
744 /* la_print_type implementation for Rust.  */
745
746 static void
747 rust_internal_print_type (struct type *type, const char *varstring,
748                           struct ui_file *stream, int show, int level,
749                           const struct type_print_options *flags,
750                           bool for_rust_enum, print_offset_data *podata)
751 {
752   QUIT;
753   if (show <= 0
754       && type->name () != NULL)
755     {
756       /* Rust calls the unit type "void" in its debuginfo,
757          but we don't want to print it as that.  */
758       if (type->code () == TYPE_CODE_VOID)
759         fputs_filtered ("()", stream);
760       else
761         fputs_filtered (type->name (), stream);
762       return;
763     }
764
765   type = check_typedef (type);
766   switch (type->code ())
767     {
768     case TYPE_CODE_VOID:
769       /* If we have an enum, we've already printed the type's
770          unqualified name, and there is nothing else to print
771          here.  */
772       if (!for_rust_enum)
773         fputs_filtered ("()", stream);
774       break;
775
776     case TYPE_CODE_FUNC:
777       /* Delegate varargs to the C printer.  */
778       if (type->has_varargs ())
779         goto c_printer;
780
781       fputs_filtered ("fn ", stream);
782       if (varstring != NULL)
783         fputs_filtered (varstring, stream);
784       fputs_filtered ("(", stream);
785       for (int i = 0; i < type->num_fields (); ++i)
786         {
787           QUIT;
788           if (i > 0)
789             fputs_filtered (", ", stream);
790           rust_internal_print_type (type->field (i).type (), "", stream,
791                                     -1, 0, flags, false, podata);
792         }
793       fputs_filtered (")", stream);
794       /* If it returns unit, we can omit the return type.  */
795       if (TYPE_TARGET_TYPE (type)->code () != TYPE_CODE_VOID)
796         {
797           fputs_filtered (" -> ", stream);
798           rust_internal_print_type (TYPE_TARGET_TYPE (type), "", stream,
799                                     -1, 0, flags, false, podata);
800         }
801       break;
802
803     case TYPE_CODE_ARRAY:
804       {
805         LONGEST low_bound, high_bound;
806
807         fputs_filtered ("[", stream);
808         rust_internal_print_type (TYPE_TARGET_TYPE (type), NULL,
809                                   stream, show - 1, level, flags, false,
810                                   podata);
811
812         if (type->bounds ()->high.kind () == PROP_LOCEXPR
813             || type->bounds ()->high.kind () == PROP_LOCLIST)
814           fprintf_filtered (stream, "; variable length");
815         else if (get_array_bounds (type, &low_bound, &high_bound))
816           fprintf_filtered (stream, "; %s",
817                             plongest (high_bound - low_bound + 1));
818         fputs_filtered ("]", stream);
819       }
820       break;
821
822     case TYPE_CODE_UNION:
823     case TYPE_CODE_STRUCT:
824       rust_print_struct_def (type, varstring, stream, show, level, flags,
825                              for_rust_enum, podata);
826       break;
827
828     case TYPE_CODE_ENUM:
829       {
830         int len = 0;
831
832         fputs_filtered ("enum ", stream);
833         if (type->name () != NULL)
834           {
835             fputs_filtered (type->name (), stream);
836             fputs_filtered (" ", stream);
837             len = strlen (type->name ());
838           }
839         fputs_filtered ("{\n", stream);
840
841         for (int i = 0; i < type->num_fields (); ++i)
842           {
843             const char *name = TYPE_FIELD_NAME (type, i);
844
845             QUIT;
846
847             if (len > 0
848                 && strncmp (name, type->name (), len) == 0
849                 && name[len] == ':'
850                 && name[len + 1] == ':')
851               name += len + 2;
852             fprintfi_filtered (level + 2, stream, "%ps,\n",
853                                styled_string (variable_name_style.style (),
854                                               name));
855           }
856
857         fputs_filtered ("}", stream);
858       }
859       break;
860
861     case TYPE_CODE_PTR:
862       {
863         if (type->name () != nullptr)
864           fputs_filtered (type->name (), stream);
865         else
866           {
867             /* We currently can't distinguish between pointers and
868                references.  */
869             fputs_filtered ("*mut ", stream);
870             type_print (TYPE_TARGET_TYPE (type), "", stream, 0);
871           }
872       }
873       break;
874
875     default:
876     c_printer:
877       c_print_type (type, varstring, stream, show, level, flags);
878     }
879 }
880
881 \f
882
883 /* Like arch_composite_type, but uses TYPE to decide how to allocate
884    -- either on an obstack or on a gdbarch.  */
885
886 static struct type *
887 rust_composite_type (struct type *original,
888                      const char *name,
889                      const char *field1, struct type *type1,
890                      const char *field2, struct type *type2)
891 {
892   struct type *result = alloc_type_copy (original);
893   int i, nfields, bitpos;
894
895   nfields = 0;
896   if (field1 != NULL)
897     ++nfields;
898   if (field2 != NULL)
899     ++nfields;
900
901   result->set_code (TYPE_CODE_STRUCT);
902   result->set_name (name);
903
904   result->set_num_fields (nfields);
905   result->set_fields
906     ((struct field *) TYPE_ZALLOC (result, nfields * sizeof (struct field)));
907
908   i = 0;
909   bitpos = 0;
910   if (field1 != NULL)
911     {
912       struct field *field = &result->field (i);
913
914       SET_FIELD_BITPOS (*field, bitpos);
915       bitpos += TYPE_LENGTH (type1) * TARGET_CHAR_BIT;
916
917       FIELD_NAME (*field) = field1;
918       field->set_type (type1);
919       ++i;
920     }
921   if (field2 != NULL)
922     {
923       struct field *field = &result->field (i);
924       unsigned align = type_align (type2);
925
926       if (align != 0)
927         {
928           int delta;
929
930           align *= TARGET_CHAR_BIT;
931           delta = bitpos % align;
932           if (delta != 0)
933             bitpos += align - delta;
934         }
935       SET_FIELD_BITPOS (*field, bitpos);
936
937       FIELD_NAME (*field) = field2;
938       field->set_type (type2);
939       ++i;
940     }
941
942   if (i > 0)
943     TYPE_LENGTH (result)
944       = (TYPE_FIELD_BITPOS (result, i - 1) / TARGET_CHAR_BIT +
945          TYPE_LENGTH (result->field (i - 1).type ()));
946   return result;
947 }
948
949 /* See rust-lang.h.  */
950
951 struct type *
952 rust_slice_type (const char *name, struct type *elt_type,
953                  struct type *usize_type)
954 {
955   struct type *type;
956
957   elt_type = lookup_pointer_type (elt_type);
958   type = rust_composite_type (elt_type, name,
959                               "data_ptr", elt_type,
960                               "length", usize_type);
961
962   return type;
963 }
964
965 \f
966
967 /* A helper for rust_evaluate_subexp that handles OP_FUNCALL.  */
968
969 static struct value *
970 rust_evaluate_funcall (struct expression *exp, int *pos, enum noside noside)
971 {
972   int i;
973   int num_args = exp->elts[*pos + 1].longconst;
974   const char *method;
975   struct value *function, *result, *arg0;
976   struct type *type, *fn_type;
977   const struct block *block;
978   struct block_symbol sym;
979
980   /* For an ordinary function call we can simply defer to the
981      generic implementation.  */
982   if (exp->elts[*pos + 3].opcode != STRUCTOP_STRUCT)
983     return evaluate_subexp_standard (NULL, exp, pos, noside);
984
985   /* Skip over the OP_FUNCALL and the STRUCTOP_STRUCT.  */
986   *pos += 4;
987   method = &exp->elts[*pos + 1].string;
988   *pos += 3 + BYTES_TO_EXP_ELEM (exp->elts[*pos].longconst + 1);
989
990   /* Evaluate the argument to STRUCTOP_STRUCT, then find its
991      type in order to look up the method.  */
992   arg0 = evaluate_subexp (nullptr, exp, pos, noside);
993
994   if (noside == EVAL_SKIP)
995     {
996       for (i = 0; i < num_args; ++i)
997         evaluate_subexp (nullptr, exp, pos, noside);
998       return arg0;
999     }
1000
1001   std::vector<struct value *> args (num_args + 1);
1002   args[0] = arg0;
1003
1004   /* We don't yet implement real Deref semantics.  */
1005   while (value_type (args[0])->code () == TYPE_CODE_PTR)
1006     args[0] = value_ind (args[0]);
1007
1008   type = value_type (args[0]);
1009   if ((type->code () != TYPE_CODE_STRUCT
1010        && type->code () != TYPE_CODE_UNION
1011        && type->code () != TYPE_CODE_ENUM)
1012       || rust_tuple_type_p (type))
1013     error (_("Method calls only supported on struct or enum types"));
1014   if (type->name () == NULL)
1015     error (_("Method call on nameless type"));
1016
1017   std::string name = std::string (type->name ()) + "::" + method;
1018
1019   block = get_selected_block (0);
1020   sym = lookup_symbol (name.c_str (), block, VAR_DOMAIN, NULL);
1021   if (sym.symbol == NULL)
1022     error (_("Could not find function named '%s'"), name.c_str ());
1023
1024   fn_type = SYMBOL_TYPE (sym.symbol);
1025   if (fn_type->num_fields () == 0)
1026     error (_("Function '%s' takes no arguments"), name.c_str ());
1027
1028   if (fn_type->field (0).type ()->code () == TYPE_CODE_PTR)
1029     args[0] = value_addr (args[0]);
1030
1031   function = address_of_variable (sym.symbol, block);
1032
1033   for (i = 0; i < num_args; ++i)
1034     args[i + 1] = evaluate_subexp (nullptr, exp, pos, noside);
1035
1036   if (noside == EVAL_AVOID_SIDE_EFFECTS)
1037     result = value_zero (TYPE_TARGET_TYPE (fn_type), not_lval);
1038   else
1039     result = call_function_by_hand (function, NULL, args);
1040   return result;
1041 }
1042
1043 /* A helper for rust_evaluate_subexp that handles OP_RANGE.  */
1044
1045 static struct value *
1046 rust_range (struct expression *exp, int *pos, enum noside noside)
1047 {
1048   struct value *low = NULL, *high = NULL;
1049   struct value *addrval, *result;
1050   CORE_ADDR addr;
1051   struct type *range_type;
1052   struct type *index_type;
1053   struct type *temp_type;
1054   const char *name;
1055
1056   auto kind
1057     = (enum range_flag) longest_to_int (exp->elts[*pos + 1].longconst);
1058   *pos += 3;
1059
1060   if (!(kind & RANGE_LOW_BOUND_DEFAULT))
1061     low = evaluate_subexp (nullptr, exp, pos, noside);
1062   if (!(kind & RANGE_HIGH_BOUND_DEFAULT))
1063     high = evaluate_subexp (nullptr, exp, pos, noside);
1064   bool inclusive = !(kind & RANGE_HIGH_BOUND_EXCLUSIVE);
1065
1066   if (noside == EVAL_SKIP)
1067     return value_from_longest (builtin_type (exp->gdbarch)->builtin_int, 1);
1068
1069   if (low == NULL)
1070     {
1071       if (high == NULL)
1072         {
1073           index_type = NULL;
1074           name = "std::ops::RangeFull";
1075         }
1076       else
1077         {
1078           index_type = value_type (high);
1079           name = (inclusive
1080                   ? "std::ops::RangeToInclusive" : "std::ops::RangeTo");
1081         }
1082     }
1083   else
1084     {
1085       if (high == NULL)
1086         {
1087           index_type = value_type (low);
1088           name = "std::ops::RangeFrom";
1089         }
1090       else
1091         {
1092           if (!types_equal (value_type (low), value_type (high)))
1093             error (_("Range expression with different types"));
1094           index_type = value_type (low);
1095           name = inclusive ? "std::ops::RangeInclusive" : "std::ops::Range";
1096         }
1097     }
1098
1099   /* If we don't have an index type, just allocate this on the
1100      arch.  Here any type will do.  */
1101   temp_type = (index_type == NULL
1102                ? language_bool_type (exp->language_defn, exp->gdbarch)
1103                : index_type);
1104   /* It would be nicer to cache the range type.  */
1105   range_type = rust_composite_type (temp_type, name,
1106                                     low == NULL ? NULL : "start", index_type,
1107                                     high == NULL ? NULL : "end", index_type);
1108
1109   if (noside == EVAL_AVOID_SIDE_EFFECTS)
1110     return value_zero (range_type, lval_memory);
1111
1112   addrval = value_allocate_space_in_inferior (TYPE_LENGTH (range_type));
1113   addr = value_as_long (addrval);
1114   result = value_at_lazy (range_type, addr);
1115
1116   if (low != NULL)
1117     {
1118       struct value *start = value_struct_elt (&result, NULL, "start", NULL,
1119                                               "range");
1120
1121       value_assign (start, low);
1122     }
1123
1124   if (high != NULL)
1125     {
1126       struct value *end = value_struct_elt (&result, NULL, "end", NULL,
1127                                             "range");
1128
1129       value_assign (end, high);
1130     }
1131
1132   result = value_at_lazy (range_type, addr);
1133   return result;
1134 }
1135
1136 /* A helper function to compute the range and kind given a range
1137    value.  TYPE is the type of the range value.  RANGE is the range
1138    value.  LOW, HIGH, and KIND are out parameters.  The LOW and HIGH
1139    parameters might be filled in, or might not be, depending on the
1140    kind of range this is.  KIND will always be set to the appropriate
1141    value describing the kind of range, and this can be used to
1142    determine whether LOW or HIGH are valid.  */
1143
1144 static void
1145 rust_compute_range (struct type *type, struct value *range,
1146                     LONGEST *low, LONGEST *high,
1147                     range_flags *kind)
1148 {
1149   int i;
1150
1151   *low = 0;
1152   *high = 0;
1153   *kind = RANGE_LOW_BOUND_DEFAULT | RANGE_HIGH_BOUND_DEFAULT;
1154
1155   if (type->num_fields () == 0)
1156     return;
1157
1158   i = 0;
1159   if (strcmp (TYPE_FIELD_NAME (type, 0), "start") == 0)
1160     {
1161       *kind = RANGE_HIGH_BOUND_DEFAULT;
1162       *low = value_as_long (value_field (range, 0));
1163       ++i;
1164     }
1165   if (type->num_fields () > i
1166       && strcmp (TYPE_FIELD_NAME (type, i), "end") == 0)
1167     {
1168       *kind = (*kind == (RANGE_LOW_BOUND_DEFAULT | RANGE_HIGH_BOUND_DEFAULT)
1169                ? RANGE_LOW_BOUND_DEFAULT : RANGE_STANDARD);
1170       *high = value_as_long (value_field (range, i));
1171
1172       if (rust_inclusive_range_type_p (type))
1173         ++*high;
1174     }
1175 }
1176
1177 /* A helper for rust_evaluate_subexp that handles BINOP_SUBSCRIPT.  */
1178
1179 static struct value *
1180 rust_subscript (struct expression *exp, int *pos, enum noside noside,
1181                 int for_addr)
1182 {
1183   struct value *lhs, *rhs, *result;
1184   struct type *rhstype;
1185   LONGEST low, high_bound;
1186   /* Initialized to appease the compiler.  */
1187   range_flags kind = RANGE_LOW_BOUND_DEFAULT | RANGE_HIGH_BOUND_DEFAULT;
1188   LONGEST high = 0;
1189   int want_slice = 0;
1190
1191   ++*pos;
1192   lhs = evaluate_subexp (nullptr, exp, pos, noside);
1193   rhs = evaluate_subexp (nullptr, exp, pos, noside);
1194
1195   if (noside == EVAL_SKIP)
1196     return lhs;
1197
1198   rhstype = check_typedef (value_type (rhs));
1199   if (rust_range_type_p (rhstype))
1200     {
1201       if (!for_addr)
1202         error (_("Can't take slice of array without '&'"));
1203       rust_compute_range (rhstype, rhs, &low, &high, &kind);
1204       want_slice = 1;
1205     }
1206   else
1207     low = value_as_long (rhs);
1208
1209   struct type *type = check_typedef (value_type (lhs));
1210   if (noside == EVAL_AVOID_SIDE_EFFECTS)
1211     {
1212       struct type *base_type = nullptr;
1213       if (type->code () == TYPE_CODE_ARRAY)
1214         base_type = TYPE_TARGET_TYPE (type);
1215       else if (rust_slice_type_p (type))
1216         {
1217           for (int i = 0; i < type->num_fields (); ++i)
1218             {
1219               if (strcmp (TYPE_FIELD_NAME (type, i), "data_ptr") == 0)
1220                 {
1221                   base_type = TYPE_TARGET_TYPE (type->field (i).type ());
1222                   break;
1223                 }
1224             }
1225           if (base_type == nullptr)
1226             error (_("Could not find 'data_ptr' in slice type"));
1227         }
1228       else if (type->code () == TYPE_CODE_PTR)
1229         base_type = TYPE_TARGET_TYPE (type);
1230       else
1231         error (_("Cannot subscript non-array type"));
1232
1233       struct type *new_type;
1234       if (want_slice)
1235         {
1236           if (rust_slice_type_p (type))
1237             new_type = type;
1238           else
1239             {
1240               struct type *usize
1241                 = language_lookup_primitive_type (exp->language_defn,
1242                                                   exp->gdbarch,
1243                                                   "usize");
1244               new_type = rust_slice_type ("&[*gdb*]", base_type, usize);
1245             }
1246         }
1247       else
1248         new_type = base_type;
1249
1250       return value_zero (new_type, VALUE_LVAL (lhs));
1251     }
1252   else
1253     {
1254       LONGEST low_bound;
1255       struct value *base;
1256
1257       if (type->code () == TYPE_CODE_ARRAY)
1258         {
1259           base = lhs;
1260           if (!get_array_bounds (type, &low_bound, &high_bound))
1261             error (_("Can't compute array bounds"));
1262           if (low_bound != 0)
1263             error (_("Found array with non-zero lower bound"));
1264           ++high_bound;
1265         }
1266       else if (rust_slice_type_p (type))
1267         {
1268           struct value *len;
1269
1270           base = value_struct_elt (&lhs, NULL, "data_ptr", NULL, "slice");
1271           len = value_struct_elt (&lhs, NULL, "length", NULL, "slice");
1272           low_bound = 0;
1273           high_bound = value_as_long (len);
1274         }
1275       else if (type->code () == TYPE_CODE_PTR)
1276         {
1277           base = lhs;
1278           low_bound = 0;
1279           high_bound = LONGEST_MAX;
1280         }
1281       else
1282         error (_("Cannot subscript non-array type"));
1283
1284       if (want_slice && (kind & RANGE_LOW_BOUND_DEFAULT))
1285         low = low_bound;
1286       if (low < 0)
1287         error (_("Index less than zero"));
1288       if (low > high_bound)
1289         error (_("Index greater than length"));
1290
1291       result = value_subscript (base, low);
1292     }
1293
1294   if (for_addr)
1295     {
1296       if (want_slice)
1297         {
1298           struct type *usize, *slice;
1299           CORE_ADDR addr;
1300           struct value *addrval, *tem;
1301
1302           if (kind & RANGE_HIGH_BOUND_DEFAULT)
1303             high = high_bound;
1304           if (high < 0)
1305             error (_("High index less than zero"));
1306           if (low > high)
1307             error (_("Low index greater than high index"));
1308           if (high > high_bound)
1309             error (_("High index greater than length"));
1310
1311           usize = language_lookup_primitive_type (exp->language_defn,
1312                                                   exp->gdbarch,
1313                                                   "usize");
1314           const char *new_name = ((type != nullptr
1315                                    && rust_slice_type_p (type))
1316                                   ? type->name () : "&[*gdb*]");
1317
1318           slice = rust_slice_type (new_name, value_type (result), usize);
1319
1320           addrval = value_allocate_space_in_inferior (TYPE_LENGTH (slice));
1321           addr = value_as_long (addrval);
1322           tem = value_at_lazy (slice, addr);
1323
1324           value_assign (value_field (tem, 0), value_addr (result));
1325           value_assign (value_field (tem, 1),
1326                         value_from_longest (usize, high - low));
1327
1328           result = value_at_lazy (slice, addr);
1329         }
1330       else
1331         result = value_addr (result);
1332     }
1333
1334   return result;
1335 }
1336
1337 /* evaluate_exp implementation for Rust.  */
1338
1339 static struct value *
1340 rust_evaluate_subexp (struct type *expect_type, struct expression *exp,
1341                       int *pos, enum noside noside)
1342 {
1343   struct value *result;
1344
1345   switch (exp->elts[*pos].opcode)
1346     {
1347     case UNOP_IND:
1348       {
1349         if (noside != EVAL_NORMAL)
1350           result = evaluate_subexp_standard (expect_type, exp, pos, noside);
1351         else
1352           {
1353             ++*pos;
1354             struct value *value = evaluate_subexp (expect_type, exp, pos,
1355                                                    noside);
1356
1357             struct value *trait_ptr = rust_get_trait_object_pointer (value);
1358             if (trait_ptr != NULL)
1359               value = trait_ptr;
1360
1361             result = value_ind (value);
1362           }
1363       }
1364       break;
1365
1366     case UNOP_COMPLEMENT:
1367       {
1368         struct value *value;
1369
1370         ++*pos;
1371         value = evaluate_subexp (nullptr, exp, pos, noside);
1372         if (noside == EVAL_SKIP)
1373           {
1374             /* Preserving the type is enough.  */
1375             return value;
1376           }
1377         if (value_type (value)->code () == TYPE_CODE_BOOL)
1378           result = value_from_longest (value_type (value),
1379                                        value_logical_not (value));
1380         else
1381           result = value_complement (value);
1382       }
1383       break;
1384
1385     case BINOP_SUBSCRIPT:
1386       result = rust_subscript (exp, pos, noside, 0);
1387       break;
1388
1389     case OP_FUNCALL:
1390       result = rust_evaluate_funcall (exp, pos, noside);
1391       break;
1392
1393     case OP_AGGREGATE:
1394       {
1395         int pc = (*pos)++;
1396         struct type *type = exp->elts[pc + 1].type;
1397         int arglen = longest_to_int (exp->elts[pc + 2].longconst);
1398         int i;
1399         CORE_ADDR addr = 0;
1400         struct value *addrval = NULL;
1401
1402         *pos += 3;
1403
1404         if (noside == EVAL_NORMAL)
1405           {
1406             addrval = value_allocate_space_in_inferior (TYPE_LENGTH (type));
1407             addr = value_as_long (addrval);
1408             result = value_at_lazy (type, addr);
1409           }
1410
1411         if (arglen > 0 && exp->elts[*pos].opcode == OP_OTHERS)
1412           {
1413             struct value *init;
1414
1415             ++*pos;
1416             init = rust_evaluate_subexp (NULL, exp, pos, noside);
1417             if (noside == EVAL_NORMAL)
1418               {
1419                 /* This isn't quite right but will do for the time
1420                    being, seeing that we can't implement the Copy
1421                    trait anyway.  */
1422                 value_assign (result, init);
1423               }
1424
1425             --arglen;
1426           }
1427
1428         gdb_assert (arglen % 2 == 0);
1429         for (i = 0; i < arglen; i += 2)
1430           {
1431             int len;
1432             const char *fieldname;
1433             struct value *value, *field;
1434
1435             gdb_assert (exp->elts[*pos].opcode == OP_NAME);
1436             ++*pos;
1437             len = longest_to_int (exp->elts[*pos].longconst);
1438             ++*pos;
1439             fieldname = &exp->elts[*pos].string;
1440             *pos += 2 + BYTES_TO_EXP_ELEM (len + 1);
1441
1442             value = rust_evaluate_subexp (NULL, exp, pos, noside);
1443             if (noside == EVAL_NORMAL)
1444               {
1445                 field = value_struct_elt (&result, NULL, fieldname, NULL,
1446                                           "structure");
1447                 value_assign (field, value);
1448               }
1449           }
1450
1451         if (noside == EVAL_SKIP)
1452           return value_from_longest (builtin_type (exp->gdbarch)->builtin_int,
1453                                      1);
1454         else if (noside == EVAL_AVOID_SIDE_EFFECTS)
1455           result = allocate_value (type);
1456         else
1457           result = value_at_lazy (type, addr);
1458       }
1459       break;
1460
1461     case OP_RUST_ARRAY:
1462       {
1463         (*pos)++;
1464         int copies;
1465         struct value *elt;
1466         struct value *ncopies;
1467
1468         elt = rust_evaluate_subexp (NULL, exp, pos, noside);
1469         ncopies = rust_evaluate_subexp (NULL, exp, pos, noside);
1470         copies = value_as_long (ncopies);
1471         if (copies < 0)
1472           error (_("Array with negative number of elements"));
1473
1474         if (noside == EVAL_NORMAL)
1475           {
1476             int i;
1477             std::vector<struct value *> eltvec (copies);
1478
1479             for (i = 0; i < copies; ++i)
1480               eltvec[i] = elt;
1481             result = value_array (0, copies - 1, eltvec.data ());
1482           }
1483         else
1484           {
1485             struct type *arraytype
1486               = lookup_array_range_type (value_type (elt), 0, copies - 1);
1487             result = allocate_value (arraytype);
1488           }
1489       }
1490       break;
1491
1492     case STRUCTOP_ANONYMOUS:
1493       {
1494         /* Anonymous field access, i.e. foo.1.  */
1495         struct value *lhs;
1496         int pc, field_number, nfields;
1497         struct type *type;
1498
1499         pc = (*pos)++;
1500         field_number = longest_to_int (exp->elts[pc + 1].longconst);
1501         (*pos) += 2;
1502         lhs = evaluate_subexp (nullptr, exp, pos, noside);
1503
1504         type = value_type (lhs);
1505
1506         if (type->code () == TYPE_CODE_STRUCT)
1507           {
1508             struct type *outer_type = NULL;
1509
1510             if (rust_enum_p (type))
1511               {
1512                 gdb::array_view<const gdb_byte> view (value_contents (lhs),
1513                                                       TYPE_LENGTH (type));
1514                 type = resolve_dynamic_type (type, view, value_address (lhs));
1515
1516                 if (rust_empty_enum_p (type))
1517                   error (_("Cannot access field %d of empty enum %s"),
1518                          field_number, type->name ());
1519
1520                 int fieldno = rust_enum_variant (type);
1521                 lhs = value_primitive_field (lhs, 0, fieldno, type);
1522                 outer_type = type;
1523                 type = value_type (lhs);
1524               }
1525
1526             /* Tuples and tuple structs */
1527             nfields = type->num_fields ();
1528
1529             if (field_number >= nfields || field_number < 0)
1530               {
1531                 if (outer_type != NULL)
1532                   error(_("Cannot access field %d of variant %s::%s, "
1533                           "there are only %d fields"),
1534                         field_number, outer_type->name (),
1535                         rust_last_path_segment (type->name ()),
1536                         nfields);
1537                 else
1538                   error(_("Cannot access field %d of %s, "
1539                           "there are only %d fields"),
1540                         field_number, type->name (), nfields);
1541               }
1542
1543             /* Tuples are tuple structs too.  */
1544             if (!rust_tuple_struct_type_p (type))
1545               {
1546                 if (outer_type != NULL)
1547                   error(_("Variant %s::%s is not a tuple variant"),
1548                         outer_type->name (),
1549                         rust_last_path_segment (type->name ()));
1550                 else
1551                   error(_("Attempting to access anonymous field %d "
1552                           "of %s, which is not a tuple, tuple struct, or "
1553                           "tuple-like variant"),
1554                       field_number, type->name ());
1555               }
1556
1557             result = value_primitive_field (lhs, 0, field_number, type);
1558           }
1559         else
1560           error(_("Anonymous field access is only allowed on tuples, \
1561 tuple structs, and tuple-like enum variants"));
1562       }
1563       break;
1564
1565     case STRUCTOP_STRUCT:
1566       {
1567         struct value *lhs;
1568         struct type *type;
1569         int tem, pc;
1570
1571         pc = (*pos)++;
1572         tem = longest_to_int (exp->elts[pc + 1].longconst);
1573         (*pos) += 3 + BYTES_TO_EXP_ELEM (tem + 1);
1574         lhs = evaluate_subexp (nullptr, exp, pos, noside);
1575
1576         const char *field_name = &exp->elts[pc + 2].string;
1577         type = value_type (lhs);
1578         if (type->code () == TYPE_CODE_STRUCT && rust_enum_p (type))
1579           {
1580             gdb::array_view<const gdb_byte> view (value_contents (lhs),
1581                                                   TYPE_LENGTH (type));
1582             type = resolve_dynamic_type (type, view, value_address (lhs));
1583
1584             if (rust_empty_enum_p (type))
1585               error (_("Cannot access field %s of empty enum %s"),
1586                      field_name, type->name ());
1587
1588             int fieldno = rust_enum_variant (type);
1589             lhs = value_primitive_field (lhs, 0, fieldno, type);
1590
1591             struct type *outer_type = type;
1592             type = value_type (lhs);
1593             if (rust_tuple_type_p (type) || rust_tuple_struct_type_p (type))
1594                 error (_("Attempting to access named field %s of tuple "
1595                          "variant %s::%s, which has only anonymous fields"),
1596                        field_name, outer_type->name (),
1597                        rust_last_path_segment (type->name ()));
1598
1599             try
1600               {
1601                 result = value_struct_elt (&lhs, NULL, field_name,
1602                                            NULL, "structure");
1603               }
1604             catch (const gdb_exception_error &except)
1605               {
1606                 error (_("Could not find field %s of struct variant %s::%s"),
1607                        field_name, outer_type->name (),
1608                        rust_last_path_segment (type->name ()));
1609               }
1610           }
1611         else
1612           result = value_struct_elt (&lhs, NULL, field_name, NULL, "structure");
1613         if (noside == EVAL_AVOID_SIDE_EFFECTS)
1614           result = value_zero (value_type (result), VALUE_LVAL (result));
1615       }
1616       break;
1617
1618     case OP_RANGE:
1619       result = rust_range (exp, pos, noside);
1620       break;
1621
1622     case UNOP_ADDR:
1623       /* We might have &array[range], in which case we need to make a
1624          slice.  */
1625       if (exp->elts[*pos + 1].opcode == BINOP_SUBSCRIPT)
1626         {
1627           ++*pos;
1628           result = rust_subscript (exp, pos, noside, 1);
1629           break;
1630         }
1631       /* Fall through.  */
1632     default:
1633       result = evaluate_subexp_standard (expect_type, exp, pos, noside);
1634       break;
1635     }
1636
1637   return result;
1638 }
1639
1640 /* operator_length implementation for Rust.  */
1641
1642 static void
1643 rust_operator_length (const struct expression *exp, int pc, int *oplenp,
1644                       int *argsp)
1645 {
1646   int oplen = 1;
1647   int args = 0;
1648
1649   switch (exp->elts[pc - 1].opcode)
1650     {
1651     case OP_AGGREGATE:
1652       /* We handle aggregate as a type and argument count.  The first
1653          argument might be OP_OTHERS.  After that the arguments
1654          alternate: first an OP_NAME, then an expression.  */
1655       oplen = 4;
1656       args = longest_to_int (exp->elts[pc - 2].longconst);
1657       break;
1658
1659     case OP_OTHERS:
1660       oplen = 1;
1661       args = 1;
1662       break;
1663
1664     case STRUCTOP_ANONYMOUS:
1665       oplen = 3;
1666       args = 1;
1667       break;
1668
1669     case OP_RUST_ARRAY:
1670       oplen = 1;
1671       args = 2;
1672       break;
1673
1674     default:
1675       operator_length_standard (exp, pc, oplenp, argsp);
1676       return;
1677     }
1678
1679   *oplenp = oplen;
1680   *argsp = args;
1681 }
1682
1683 /* dump_subexp_body implementation for Rust.  */
1684
1685 static int
1686 rust_dump_subexp_body (struct expression *exp, struct ui_file *stream,
1687                        int elt)
1688 {
1689   switch (exp->elts[elt].opcode)
1690     {
1691     case OP_AGGREGATE:
1692       {
1693         int length = longest_to_int (exp->elts[elt + 2].longconst);
1694         int i;
1695
1696         fprintf_filtered (stream, "Type @");
1697         gdb_print_host_address (exp->elts[elt + 1].type, stream);
1698         fprintf_filtered (stream, " (");
1699         type_print (exp->elts[elt + 1].type, NULL, stream, 0);
1700         fprintf_filtered (stream, "), length %d", length);
1701
1702         elt += 4;
1703         for (i = 0; i < length; ++i)
1704           elt = dump_subexp (exp, stream, elt);
1705       }
1706       break;
1707
1708     case OP_STRING:
1709     case OP_NAME:
1710       {
1711         LONGEST len = exp->elts[elt + 1].longconst;
1712
1713         fprintf_filtered (stream, "%s: %s",
1714                           (exp->elts[elt].opcode == OP_STRING
1715                            ? "string" : "name"),
1716                           &exp->elts[elt + 2].string);
1717         elt += 4 + BYTES_TO_EXP_ELEM (len + 1);
1718       }
1719       break;
1720
1721     case OP_OTHERS:
1722       elt = dump_subexp (exp, stream, elt + 1);
1723       break;
1724
1725     case STRUCTOP_ANONYMOUS:
1726       {
1727         int field_number;
1728
1729         field_number = longest_to_int (exp->elts[elt + 1].longconst);
1730
1731         fprintf_filtered (stream, "Field number: %d", field_number);
1732         elt = dump_subexp (exp, stream, elt + 3);
1733       }
1734       break;
1735
1736     case OP_RUST_ARRAY:
1737       ++elt;
1738       break;
1739
1740     default:
1741       elt = dump_subexp_body_standard (exp, stream, elt);
1742       break;
1743     }
1744
1745   return elt;
1746 }
1747
1748 /* print_subexp implementation for Rust.  */
1749
1750 static void
1751 rust_print_subexp (struct expression *exp, int *pos, struct ui_file *stream,
1752                    enum precedence prec)
1753 {
1754   switch (exp->elts[*pos].opcode)
1755     {
1756     case OP_AGGREGATE:
1757       {
1758         int length = longest_to_int (exp->elts[*pos + 2].longconst);
1759         int i;
1760
1761         type_print (exp->elts[*pos + 1].type, "", stream, 0);
1762         fputs_filtered (" { ", stream);
1763
1764         *pos += 4;
1765         for (i = 0; i < length; ++i)
1766           {
1767             rust_print_subexp (exp, pos, stream, prec);
1768             fputs_filtered (", ", stream);
1769           }
1770         fputs_filtered (" }", stream);
1771       }
1772       break;
1773
1774     case OP_NAME:
1775       {
1776         LONGEST len = exp->elts[*pos + 1].longconst;
1777
1778         fputs_filtered (&exp->elts[*pos + 2].string, stream);
1779         *pos += 4 + BYTES_TO_EXP_ELEM (len + 1);
1780       }
1781       break;
1782
1783     case OP_OTHERS:
1784       {
1785         fputs_filtered ("<<others>> (", stream);
1786         ++*pos;
1787         rust_print_subexp (exp, pos, stream, prec);
1788         fputs_filtered (")", stream);
1789       }
1790       break;
1791
1792     case STRUCTOP_ANONYMOUS:
1793       {
1794         int tem = longest_to_int (exp->elts[*pos + 1].longconst);
1795
1796         (*pos) += 3;
1797         print_subexp (exp, pos, stream, PREC_SUFFIX);
1798         fprintf_filtered (stream, ".%d", tem);
1799       }
1800       break;
1801
1802     case OP_RUST_ARRAY:
1803       ++*pos;
1804       fprintf_filtered (stream, "[");
1805       rust_print_subexp (exp, pos, stream, prec);
1806       fprintf_filtered (stream, "; ");
1807       rust_print_subexp (exp, pos, stream, prec);
1808       fprintf_filtered (stream, "]");
1809       break;
1810
1811     default:
1812       print_subexp_standard (exp, pos, stream, prec);
1813       break;
1814     }
1815 }
1816
1817 /* operator_check implementation for Rust.  */
1818
1819 static int
1820 rust_operator_check (struct expression *exp, int pos,
1821                      int (*objfile_func) (struct objfile *objfile,
1822                                           void *data),
1823                      void *data)
1824 {
1825   switch (exp->elts[pos].opcode)
1826     {
1827     case OP_AGGREGATE:
1828       {
1829         struct type *type = exp->elts[pos + 1].type;
1830         struct objfile *objfile = TYPE_OBJFILE (type);
1831
1832         if (objfile != NULL && (*objfile_func) (objfile, data))
1833           return 1;
1834       }
1835       break;
1836
1837     case OP_OTHERS:
1838     case OP_NAME:
1839     case OP_RUST_ARRAY:
1840       break;
1841
1842     default:
1843       return operator_check_standard (exp, pos, objfile_func, data);
1844     }
1845
1846   return 0;
1847 }
1848
1849 \f
1850
1851 static const struct exp_descriptor exp_descriptor_rust = 
1852 {
1853   rust_print_subexp,
1854   rust_operator_length,
1855   rust_operator_check,
1856   rust_dump_subexp_body,
1857   rust_evaluate_subexp
1858 };
1859
1860 /* Class representing the Rust language.  */
1861
1862 class rust_language : public language_defn
1863 {
1864 public:
1865   rust_language ()
1866     : language_defn (language_rust)
1867   { /* Nothing.  */ }
1868
1869   /* See language.h.  */
1870
1871   const char *name () const override
1872   { return "rust"; }
1873
1874   /* See language.h.  */
1875
1876   const char *natural_name () const override
1877   { return "Rust"; }
1878
1879   /* See language.h.  */
1880
1881   const std::vector<const char *> &filename_extensions () const override
1882   {
1883     static const std::vector<const char *> extensions = { ".rs" };
1884     return extensions;
1885   }
1886
1887   /* See language.h.  */
1888   void language_arch_info (struct gdbarch *gdbarch,
1889                            struct language_arch_info *lai) const override
1890   {
1891     const struct builtin_type *builtin = builtin_type (gdbarch);
1892
1893     /* Helper function to allow shorter lines below.  */
1894     auto add  = [&] (struct type * t) -> struct type *
1895     {
1896       lai->add_primitive_type (t);
1897       return t;
1898     };
1899
1900     struct type *bool_type
1901       = add (arch_boolean_type (gdbarch, 8, 1, "bool"));
1902     add (arch_character_type (gdbarch, 32, 1, "char"));
1903     add (arch_integer_type (gdbarch, 8, 0, "i8"));
1904     struct type *u8_type
1905       = add (arch_integer_type (gdbarch, 8, 1, "u8"));
1906     add (arch_integer_type (gdbarch, 16, 0, "i16"));
1907     add (arch_integer_type (gdbarch, 16, 1, "u16"));
1908     add (arch_integer_type (gdbarch, 32, 0, "i32"));
1909     add (arch_integer_type (gdbarch, 32, 1, "u32"));
1910     add (arch_integer_type (gdbarch, 64, 0, "i64"));
1911     add (arch_integer_type (gdbarch, 64, 1, "u64"));
1912
1913     unsigned int length = 8 * TYPE_LENGTH (builtin->builtin_data_ptr);
1914     add (arch_integer_type (gdbarch, length, 0, "isize"));
1915     struct type *usize_type
1916       = add (arch_integer_type (gdbarch, length, 1, "usize"));
1917
1918     add (arch_float_type (gdbarch, 32, "f32", floatformats_ieee_single));
1919     add (arch_float_type (gdbarch, 64, "f64", floatformats_ieee_double));
1920     add (arch_integer_type (gdbarch, 0, 1, "()"));
1921
1922     struct type *tem = make_cv_type (1, 0, u8_type, NULL);
1923     add (rust_slice_type ("&str", tem, usize_type));
1924
1925     lai->set_bool_type (bool_type);
1926     lai->set_string_char_type (u8_type);
1927   }
1928
1929   /* See language.h.  */
1930   bool sniff_from_mangled_name (const char *mangled,
1931                                 char **demangled) const override
1932   {
1933     *demangled = gdb_demangle (mangled, DMGL_PARAMS | DMGL_ANSI);
1934     return *demangled != NULL;
1935   }
1936
1937   /* See language.h.  */
1938
1939   char *demangle_symbol (const char *mangled, int options) const override
1940   {
1941     return gdb_demangle (mangled, options);
1942   }
1943
1944   /* See language.h.  */
1945
1946   void print_type (struct type *type, const char *varstring,
1947                    struct ui_file *stream, int show, int level,
1948                    const struct type_print_options *flags) const override
1949   {
1950     print_offset_data podata;
1951     rust_internal_print_type (type, varstring, stream, show, level,
1952                               flags, false, &podata);
1953   }
1954
1955   /* See language.h.  */
1956
1957   gdb::unique_xmalloc_ptr<char> watch_location_expression
1958         (struct type *type, CORE_ADDR addr) const override
1959   {
1960     type = check_typedef (TYPE_TARGET_TYPE (check_typedef (type)));
1961     std::string name = type_to_string (type);
1962     return gdb::unique_xmalloc_ptr<char>
1963       (xstrprintf ("*(%s as *mut %s)", core_addr_to_string (addr),
1964                    name.c_str ()));
1965   }
1966
1967   /* See language.h.  */
1968
1969   void value_print_inner
1970         (struct value *val, struct ui_file *stream, int recurse,
1971          const struct value_print_options *options) const override
1972   {
1973     return rust_value_print_inner (val, stream, recurse, options);
1974   }
1975
1976   /* See language.h.  */
1977
1978   struct block_symbol lookup_symbol_nonlocal
1979         (const char *name, const struct block *block,
1980          const domain_enum domain) const override
1981   {
1982     struct block_symbol result = {};
1983
1984     if (symbol_lookup_debug)
1985       {
1986         fprintf_unfiltered (gdb_stdlog,
1987                             "rust_lookup_symbol_non_local"
1988                             " (%s, %s (scope %s), %s)\n",
1989                             name, host_address_to_string (block),
1990                             block_scope (block), domain_name (domain));
1991       }
1992
1993     /* Look up bare names in the block's scope.  */
1994     std::string scopedname;
1995     if (name[cp_find_first_component (name)] == '\0')
1996       {
1997         const char *scope = block_scope (block);
1998
1999         if (scope[0] != '\0')
2000           {
2001             scopedname = std::string (scope) + "::" + name;
2002             name = scopedname.c_str ();
2003           }
2004         else
2005           name = NULL;
2006       }
2007
2008     if (name != NULL)
2009       {
2010         result = lookup_symbol_in_static_block (name, block, domain);
2011         if (result.symbol == NULL)
2012           result = lookup_global_symbol (name, block, domain);
2013       }
2014     return result;
2015   }
2016
2017   /* See language.h.  */
2018
2019   int parser (struct parser_state *ps) const override
2020   {
2021     return rust_parse (ps);
2022   }
2023
2024   /* See language.h.  */
2025
2026   void emitchar (int ch, struct type *chtype,
2027                  struct ui_file *stream, int quoter) const override
2028   {
2029     if (!rust_chartype_p (chtype))
2030       generic_emit_char (ch, chtype, stream, quoter,
2031                          target_charset (get_type_arch (chtype)));
2032     else if (ch == '\\' || ch == quoter)
2033       fprintf_filtered (stream, "\\%c", ch);
2034     else if (ch == '\n')
2035       fputs_filtered ("\\n", stream);
2036     else if (ch == '\r')
2037       fputs_filtered ("\\r", stream);
2038     else if (ch == '\t')
2039       fputs_filtered ("\\t", stream);
2040     else if (ch == '\0')
2041       fputs_filtered ("\\0", stream);
2042     else if (ch >= 32 && ch <= 127 && isprint (ch))
2043       fputc_filtered (ch, stream);
2044     else if (ch <= 255)
2045       fprintf_filtered (stream, "\\x%02x", ch);
2046     else
2047       fprintf_filtered (stream, "\\u{%06x}", ch);
2048   }
2049
2050   /* See language.h.  */
2051
2052   void printchar (int ch, struct type *chtype,
2053                   struct ui_file *stream) const override
2054   {
2055     fputs_filtered ("'", stream);
2056     LA_EMIT_CHAR (ch, chtype, stream, '\'');
2057     fputs_filtered ("'", stream);
2058   }
2059
2060   /* See language.h.  */
2061
2062   void printstr (struct ui_file *stream, struct type *elttype,
2063                  const gdb_byte *string, unsigned int length,
2064                  const char *encoding, int force_ellipses,
2065                  const struct value_print_options *options) const override
2066   {
2067     rust_printstr (stream, elttype, string, length, encoding,
2068                    force_ellipses, options);
2069   }
2070
2071   /* See language.h.  */
2072
2073   void print_typedef (struct type *type, struct symbol *new_symbol,
2074                       struct ui_file *stream) const override
2075   {
2076     type = check_typedef (type);
2077     fprintf_filtered (stream, "type %s = ", new_symbol->print_name ());
2078     type_print (type, "", stream, 0);
2079     fprintf_filtered (stream, ";");
2080   }
2081
2082   /* See language.h.  */
2083
2084   bool is_string_type_p (struct type *type) const override
2085   {
2086     LONGEST low_bound, high_bound;
2087
2088     type = check_typedef (type);
2089     return ((type->code () == TYPE_CODE_STRING)
2090             || (type->code () == TYPE_CODE_PTR
2091                 && (TYPE_TARGET_TYPE (type)->code () == TYPE_CODE_ARRAY
2092                     && rust_u8_type_p (TYPE_TARGET_TYPE (TYPE_TARGET_TYPE (type)))
2093                     && get_array_bounds (TYPE_TARGET_TYPE (type), &low_bound,
2094                                          &high_bound)))
2095             || (type->code () == TYPE_CODE_STRUCT
2096                 && !rust_enum_p (type)
2097                 && rust_slice_type_p (type)
2098                 && strcmp (type->name (), "&str") == 0));
2099   }
2100
2101   /* See language.h.  */
2102
2103   bool range_checking_on_by_default () const override
2104   { return true; }
2105
2106   /* See language.h.  */
2107
2108   const struct exp_descriptor *expression_ops () const override
2109   { return &exp_descriptor_rust; }
2110
2111   /* See language.h.  */
2112
2113   const struct op_print *opcode_print_table () const override
2114   { return c_op_print_tab; }
2115 };
2116
2117 /* Single instance of the Rust language class.  */
2118
2119 static rust_language rust_language_defn;
This page took 0.142334 seconds and 4 git commands to generate.