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