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