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