Automatic Copyright Year update after running gdb/copyright.py
[deliverable/binutils-gdb.git] / gdb / rust-lang.c
CommitLineData
c44af4eb
TT
1/* Rust language support routines for GDB, the GNU debugger.
2
88b9d363 3 Copyright (C) 2016-2022 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"
6fab4359 42#include "rust-exp.h"
c44af4eb 43
c9317f21 44/* See rust-lang.h. */
c44af4eb 45
c9317f21
TT
46const char *
47rust_last_path_segment (const char *path)
c44af4eb
TT
48{
49 const char *result = strrchr (path, ':');
50
51 if (result == NULL)
c9317f21 52 return path;
c44af4eb
TT
53 return result + 1;
54}
55
03c85b11 56/* See rust-lang.h. */
c44af4eb 57
03c85b11 58std::string
c44af4eb
TT
59rust_crate_for_block (const struct block *block)
60{
61 const char *scope = block_scope (block);
62
63 if (scope[0] == '\0')
03c85b11 64 return std::string ();
c44af4eb 65
03c85b11 66 return std::string (scope, cp_find_first_component (scope));
c44af4eb
TT
67}
68
c9317f21
TT
69/* Return true if TYPE, which must be a struct type, represents a Rust
70 enum. */
c44af4eb 71
b96645f1 72static bool
9c6a1327 73rust_enum_p (struct type *type)
b96645f1 74{
9c6a1327
TT
75 /* is_dynamic_type will return true if any field has a dynamic
76 attribute -- but we only want to check the top level. */
77 return TYPE_HAS_VARIANT_PARTS (type);
b96645f1
MG
78}
79
9c6a1327
TT
80/* Return true if TYPE, which must be an already-resolved enum type,
81 has no variants. */
098b2108
TT
82
83static bool
84rust_empty_enum_p (const struct type *type)
85{
1f704f76 86 return type->num_fields () == 0;
098b2108
TT
87}
88
9c6a1327
TT
89/* Given an already-resolved enum type and contents, find which
90 variant is active. */
c44af4eb 91
9c6a1327
TT
92static int
93rust_enum_variant (struct type *type)
c44af4eb 94{
9c6a1327 95 /* The active variant is simply the first non-artificial field. */
1f704f76 96 for (int i = 0; i < type->num_fields (); ++i)
9c6a1327
TT
97 if (!TYPE_FIELD_ARTIFICIAL (type, i))
98 return i;
c44af4eb 99
9c6a1327
TT
100 /* Perhaps we could get here by trying to print an Ada variant
101 record in Rust mode. Unlikely, but an error is safer than an
102 assert. */
103 error (_("Could not find active enum variant"));
c44af4eb
TT
104}
105
106/* See rust-lang.h. */
107
65c40c95 108bool
c44af4eb
TT
109rust_tuple_type_p (struct type *type)
110{
111 /* The current implementation is a bit of a hack, but there's
112 nothing else in the debuginfo to distinguish a tuple from a
113 struct. */
78134374 114 return (type->code () == TYPE_CODE_STRUCT
7d93a1e0
SM
115 && type->name () != NULL
116 && type->name ()[0] == '(');
c44af4eb
TT
117}
118
c44af4eb 119/* Return true if all non-static fields of a structlike type are in a
c9317f21 120 sequence like __0, __1, __2. */
c44af4eb 121
65c40c95 122static bool
c9317f21 123rust_underscore_fields (struct type *type)
c44af4eb
TT
124{
125 int i, field_number;
126
127 field_number = 0;
128
78134374 129 if (type->code () != TYPE_CODE_STRUCT)
65c40c95 130 return false;
1f704f76 131 for (i = 0; i < type->num_fields (); ++i)
c44af4eb 132 {
ceacbf6e 133 if (!field_is_static (&type->field (i)))
c44af4eb 134 {
c9317f21 135 char buf[20];
c44af4eb 136
c9317f21
TT
137 xsnprintf (buf, sizeof (buf), "__%d", field_number);
138 if (strcmp (buf, TYPE_FIELD_NAME (type, i)) != 0)
139 return false;
140 field_number++;
c44af4eb
TT
141 }
142 }
65c40c95 143 return true;
c44af4eb
TT
144}
145
146/* See rust-lang.h. */
147
65c40c95 148bool
c44af4eb
TT
149rust_tuple_struct_type_p (struct type *type)
150{
12df5c00
TT
151 /* This is just an approximation until DWARF can represent Rust more
152 precisely. We exclude zero-length structs because they may not
153 be tuple structs, and there's no way to tell. */
1f704f76 154 return type->num_fields () > 0 && rust_underscore_fields (type);
c44af4eb
TT
155}
156
157/* Return true if TYPE is a slice type, otherwise false. */
158
65c40c95 159static bool
c44af4eb
TT
160rust_slice_type_p (struct type *type)
161{
78134374 162 return (type->code () == TYPE_CODE_STRUCT
7d93a1e0
SM
163 && type->name () != NULL
164 && (strncmp (type->name (), "&[", 2) == 0
165 || strcmp (type->name (), "&str") == 0));
c44af4eb
TT
166}
167
168/* Return true if TYPE is a range type, otherwise false. */
169
65c40c95 170static bool
c44af4eb
TT
171rust_range_type_p (struct type *type)
172{
173 int i;
174
78134374 175 if (type->code () != TYPE_CODE_STRUCT
1f704f76 176 || type->num_fields () > 2
7d93a1e0
SM
177 || type->name () == NULL
178 || strstr (type->name (), "::Range") == NULL)
65c40c95 179 return false;
c44af4eb 180
1f704f76 181 if (type->num_fields () == 0)
65c40c95 182 return true;
c44af4eb
TT
183
184 i = 0;
185 if (strcmp (TYPE_FIELD_NAME (type, 0), "start") == 0)
186 {
1f704f76 187 if (type->num_fields () == 1)
65c40c95 188 return true;
c44af4eb
TT
189 i = 1;
190 }
1f704f76 191 else if (type->num_fields () == 2)
c44af4eb
TT
192 {
193 /* First field had to be "start". */
65c40c95 194 return false;
c44af4eb
TT
195 }
196
197 return strcmp (TYPE_FIELD_NAME (type, i), "end") == 0;
198}
199
6873858b
TT
200/* Return true if TYPE is an inclusive range type, otherwise false.
201 This is only valid for types which are already known to be range
202 types. */
203
204static bool
205rust_inclusive_range_type_p (struct type *type)
206{
7d93a1e0
SM
207 return (strstr (type->name (), "::RangeInclusive") != NULL
208 || strstr (type->name (), "::RangeToInclusive") != NULL);
6873858b
TT
209}
210
c44af4eb
TT
211/* Return true if TYPE seems to be the type "u8", otherwise false. */
212
65c40c95 213static bool
c44af4eb
TT
214rust_u8_type_p (struct type *type)
215{
78134374 216 return (type->code () == TYPE_CODE_INT
c6d940a9 217 && type->is_unsigned ()
c44af4eb
TT
218 && TYPE_LENGTH (type) == 1);
219}
220
221/* Return true if TYPE is a Rust character type. */
222
65c40c95 223static bool
c44af4eb
TT
224rust_chartype_p (struct type *type)
225{
78134374 226 return (type->code () == TYPE_CODE_CHAR
c44af4eb 227 && TYPE_LENGTH (type) == 4
c6d940a9 228 && type->is_unsigned ());
c44af4eb
TT
229}
230
71a3c369
TT
231/* If VALUE represents a trait object pointer, return the underlying
232 pointer with the correct (i.e., runtime) type. Otherwise, return
233 NULL. */
234
235static struct value *
236rust_get_trait_object_pointer (struct value *value)
237{
238 struct type *type = check_typedef (value_type (value));
239
1f704f76 240 if (type->code () != TYPE_CODE_STRUCT || type->num_fields () != 2)
71a3c369
TT
241 return NULL;
242
243 /* Try to be a bit resilient if the ABI changes. */
244 int vtable_field = 0;
245 for (int i = 0; i < 2; ++i)
246 {
247 if (strcmp (TYPE_FIELD_NAME (type, i), "vtable") == 0)
248 vtable_field = i;
249 else if (strcmp (TYPE_FIELD_NAME (type, i), "pointer") != 0)
250 return NULL;
251 }
252
253 CORE_ADDR vtable = value_as_address (value_field (value, vtable_field));
254 struct symbol *symbol = find_symbol_at_address (vtable);
cf724bc9 255 if (symbol == NULL || symbol->subclass != SYMBOL_RUST_VTABLE)
71a3c369
TT
256 return NULL;
257
258 struct rust_vtable_symbol *vtable_sym
259 = static_cast<struct rust_vtable_symbol *> (symbol);
260 struct type *pointer_type = lookup_pointer_type (vtable_sym->concrete_type);
261 return value_cast (pointer_type, value_field (value, 1 - vtable_field));
262}
263
c44af4eb
TT
264\f
265
1c485265 266/* See language.h. */
c44af4eb 267
1c485265
AB
268void
269rust_language::printstr (struct ui_file *stream, struct type *type,
270 const gdb_byte *string, unsigned int length,
271 const char *user_encoding, int force_ellipses,
272 const struct value_print_options *options) const
c44af4eb
TT
273{
274 /* Rust always uses UTF-8, but let the caller override this if need
275 be. */
276 const char *encoding = user_encoding;
277 if (user_encoding == NULL || !*user_encoding)
278 {
279 /* In Rust strings, characters are "u8". */
280 if (rust_u8_type_p (type))
281 encoding = "UTF-8";
282 else
283 {
284 /* This is probably some C string, so let's let C deal with
285 it. */
286 c_printstr (stream, type, string, length, user_encoding,
287 force_ellipses, options);
288 return;
289 }
290 }
291
292 /* This is not ideal as it doesn't use our character printer. */
293 generic_printstr (stream, type, string, length, encoding, force_ellipses,
294 '"', 0, options);
295}
296
297\f
298
45320ffa
TT
299/* Helper function to print a string slice. */
300
301static void
302rust_val_print_str (struct ui_file *stream, struct value *val,
303 const struct value_print_options *options)
304{
158cc4fe 305 struct value *base = value_struct_elt (&val, {}, "data_ptr", NULL,
45320ffa 306 "slice");
158cc4fe 307 struct value *len = value_struct_elt (&val, {}, "length", NULL, "slice");
45320ffa
TT
308
309 val_print_string (TYPE_TARGET_TYPE (value_type (base)), "UTF-8",
310 value_as_address (base), value_as_long (len), stream,
311 options);
312}
313
1c485265 314/* See rust-lang.h. */
b96645f1 315
1c485265
AB
316void
317rust_language::val_print_struct
318 (struct value *val, struct ui_file *stream, int recurse,
319 const struct value_print_options *options) const
b96645f1
MG
320{
321 int i;
322 int first_field;
5f56f7cb 323 struct type *type = check_typedef (value_type (val));
45320ffa 324
7d93a1e0 325 if (rust_slice_type_p (type) && strcmp (type->name (), "&str") == 0)
45320ffa 326 {
80062eb9
AB
327 /* If what we are printing here is actually a string within a
328 structure then VAL will be the original parent value, while TYPE
329 will be the type of the structure representing the string we want
330 to print.
331 However, RUST_VAL_PRINT_STR looks up the fields of the string
332 inside VAL, assuming that VAL is the string.
333 So, recreate VAL as a value representing just the string. */
5f56f7cb 334 val = value_at_lazy (type, value_address (val));
45320ffa
TT
335 rust_val_print_str (stream, val, options);
336 return;
337 }
338
65c40c95
TT
339 bool is_tuple = rust_tuple_type_p (type);
340 bool is_tuple_struct = !is_tuple && rust_tuple_struct_type_p (type);
b96645f1
MG
341 struct value_print_options opts;
342
343 if (!is_tuple)
344 {
7d93a1e0 345 if (type->name () != NULL)
dda83cd7 346 fprintf_filtered (stream, "%s", type->name ());
b96645f1 347
1f704f76 348 if (type->num_fields () == 0)
dda83cd7 349 return;
b96645f1 350
7d93a1e0 351 if (type->name () != NULL)
dda83cd7 352 fputs_filtered (" ", stream);
b96645f1
MG
353 }
354
355 if (is_tuple || is_tuple_struct)
356 fputs_filtered ("(", stream);
357 else
358 fputs_filtered ("{", stream);
359
360 opts = *options;
361 opts.deref_ref = 0;
362
363 first_field = 1;
1f704f76 364 for (i = 0; i < type->num_fields (); ++i)
b96645f1 365 {
ceacbf6e 366 if (field_is_static (&type->field (i)))
dda83cd7 367 continue;
b96645f1
MG
368
369 if (!first_field)
dda83cd7 370 fputs_filtered (",", stream);
b96645f1
MG
371
372 if (options->prettyformat)
dda83cd7 373 {
b50f188d
TT
374 fputs_filtered ("\n", stream);
375 print_spaces_filtered (2 + 2 * recurse, stream);
dda83cd7 376 }
b96645f1 377 else if (!first_field)
dda83cd7 378 fputs_filtered (" ", stream);
b96645f1
MG
379
380 first_field = 0;
381
382 if (!is_tuple && !is_tuple_struct)
dda83cd7 383 {
3f0cbb04
TT
384 fputs_styled (TYPE_FIELD_NAME (type, i),
385 variable_name_style.style (), stream);
b50f188d 386 fputs_filtered (": ", stream);
dda83cd7 387 }
b96645f1 388
887e7158
TT
389 common_val_print (value_field (val, i), stream, recurse + 1, &opts,
390 this);
b96645f1
MG
391 }
392
393 if (options->prettyformat)
394 {
395 fputs_filtered ("\n", stream);
396 print_spaces_filtered (2 * recurse, stream);
397 }
398
399 if (is_tuple || is_tuple_struct)
400 fputs_filtered (")", stream);
401 else
402 fputs_filtered ("}", stream);
403}
404
1c485265 405/* See rust-lang.h. */
c9317f21 406
1c485265
AB
407void
408rust_language::print_enum (struct value *val, struct ui_file *stream,
409 int recurse,
410 const struct value_print_options *options) const
c9317f21
TT
411{
412 struct value_print_options opts = *options;
5f56f7cb 413 struct type *type = check_typedef (value_type (val));
c9317f21
TT
414
415 opts.deref_ref = 0;
416
9c6a1327
TT
417 gdb_assert (rust_enum_p (type));
418 gdb::array_view<const gdb_byte> view (value_contents_for_printing (val),
419 TYPE_LENGTH (value_type (val)));
420 type = resolve_dynamic_type (type, view, value_address (val));
421
098b2108
TT
422 if (rust_empty_enum_p (type))
423 {
424 /* Print the enum type name here to be more clear. */
7f6aba03 425 fprintf_filtered (stream, _("%s {%p[<No data fields>%p]}"),
7d93a1e0 426 type->name (),
7f6aba03 427 metadata_style.style ().ptr (), nullptr);
098b2108
TT
428 return;
429 }
430
9c6a1327
TT
431 int variant_fieldno = rust_enum_variant (type);
432 val = value_field (val, variant_fieldno);
940da03e 433 struct type *variant_type = type->field (variant_fieldno).type ();
c9317f21 434
1f704f76 435 int nfields = variant_type->num_fields ();
c9317f21
TT
436
437 bool is_tuple = rust_tuple_struct_type_p (variant_type);
438
7d93a1e0 439 fprintf_filtered (stream, "%s", variant_type->name ());
c9317f21
TT
440 if (nfields == 0)
441 {
442 /* In case of a nullary variant like 'None', just output
443 the name. */
444 return;
445 }
446
447 /* In case of a non-nullary variant, we output 'Foo(x,y,z)'. */
448 if (is_tuple)
449 fprintf_filtered (stream, "(");
450 else
451 {
452 /* struct variant. */
453 fprintf_filtered (stream, "{");
454 }
455
456 bool first_field = true;
1f704f76 457 for (int j = 0; j < variant_type->num_fields (); j++)
c9317f21
TT
458 {
459 if (!first_field)
460 fputs_filtered (", ", stream);
461 first_field = false;
462
463 if (!is_tuple)
3f0cbb04
TT
464 fprintf_filtered (stream, "%ps: ",
465 styled_string (variable_name_style.style (),
466 TYPE_FIELD_NAME (variant_type, j)));
c9317f21 467
887e7158
TT
468 common_val_print (value_field (val, j), stream, recurse + 1, &opts,
469 this);
c9317f21
TT
470 }
471
472 if (is_tuple)
473 fputs_filtered (")", stream);
474 else
475 fputs_filtered ("}", stream);
476}
477
c44af4eb
TT
478static const struct generic_val_print_decorations rust_decorations =
479{
480 /* Complex isn't used in Rust, but we provide C-ish values just in
481 case. */
482 "",
483 " + ",
484 " * I",
485 "true",
486 "false",
921d8f54 487 "()",
c44af4eb
TT
488 "[",
489 "]"
490};
491
1c485265
AB
492/* See language.h. */
493
494void
495rust_language::value_print_inner
496 (struct value *val, struct ui_file *stream, int recurse,
497 const struct value_print_options *options) const
5f56f7cb
TT
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);
8ee511af 522 struct gdbarch *arch = type->arch ();
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);
1c485265
AB
560 printstr (stream, TYPE_TARGET_TYPE (type),
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))
1c485265 589 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
01739a3b 968/* A helper for rust_evaluate_subexp that handles OP_RANGE. */
c44af4eb 969
9db6b6dd 970struct value *
d148f803
TT
971rust_range (struct type *expect_type, struct expression *exp,
972 enum noside noside, enum range_flag kind,
973 struct value *low, struct value *high)
c44af4eb 974{
c44af4eb
TT
975 struct value *addrval, *result;
976 CORE_ADDR addr;
977 struct type *range_type;
978 struct type *index_type;
979 struct type *temp_type;
980 const char *name;
981
2f1b18db 982 bool inclusive = !(kind & RANGE_HIGH_BOUND_EXCLUSIVE);
c44af4eb 983
c44af4eb
TT
984 if (low == NULL)
985 {
986 if (high == NULL)
987 {
988 index_type = NULL;
989 name = "std::ops::RangeFull";
990 }
991 else
992 {
993 index_type = value_type (high);
6873858b
TT
994 name = (inclusive
995 ? "std::ops::RangeToInclusive" : "std::ops::RangeTo");
c44af4eb
TT
996 }
997 }
998 else
999 {
1000 if (high == NULL)
1001 {
1002 index_type = value_type (low);
1003 name = "std::ops::RangeFrom";
1004 }
1005 else
1006 {
1007 if (!types_equal (value_type (low), value_type (high)))
1008 error (_("Range expression with different types"));
1009 index_type = value_type (low);
6873858b 1010 name = inclusive ? "std::ops::RangeInclusive" : "std::ops::Range";
c44af4eb
TT
1011 }
1012 }
1013
1014 /* If we don't have an index type, just allocate this on the
1015 arch. Here any type will do. */
1016 temp_type = (index_type == NULL
1017 ? language_bool_type (exp->language_defn, exp->gdbarch)
1018 : index_type);
1019 /* It would be nicer to cache the range type. */
1020 range_type = rust_composite_type (temp_type, name,
1021 low == NULL ? NULL : "start", index_type,
1022 high == NULL ? NULL : "end", index_type);
1023
1024 if (noside == EVAL_AVOID_SIDE_EFFECTS)
1025 return value_zero (range_type, lval_memory);
1026
1027 addrval = value_allocate_space_in_inferior (TYPE_LENGTH (range_type));
1028 addr = value_as_long (addrval);
1029 result = value_at_lazy (range_type, addr);
1030
1031 if (low != NULL)
1032 {
158cc4fe 1033 struct value *start = value_struct_elt (&result, {}, "start", NULL,
c44af4eb
TT
1034 "range");
1035
1036 value_assign (start, low);
1037 }
1038
1039 if (high != NULL)
1040 {
158cc4fe 1041 struct value *end = value_struct_elt (&result, {}, "end", NULL,
c44af4eb
TT
1042 "range");
1043
1044 value_assign (end, high);
1045 }
1046
1047 result = value_at_lazy (range_type, addr);
1048 return result;
1049}
1050
1051/* A helper function to compute the range and kind given a range
1052 value. TYPE is the type of the range value. RANGE is the range
1053 value. LOW, HIGH, and KIND are out parameters. The LOW and HIGH
1054 parameters might be filled in, or might not be, depending on the
1055 kind of range this is. KIND will always be set to the appropriate
1056 value describing the kind of range, and this can be used to
1057 determine whether LOW or HIGH are valid. */
1058
1059static void
1060rust_compute_range (struct type *type, struct value *range,
1061 LONGEST *low, LONGEST *high,
f2d8e4c5 1062 range_flags *kind)
c44af4eb
TT
1063{
1064 int i;
1065
1066 *low = 0;
1067 *high = 0;
2f1b18db 1068 *kind = RANGE_LOW_BOUND_DEFAULT | RANGE_HIGH_BOUND_DEFAULT;
c44af4eb 1069
1f704f76 1070 if (type->num_fields () == 0)
c44af4eb
TT
1071 return;
1072
1073 i = 0;
1074 if (strcmp (TYPE_FIELD_NAME (type, 0), "start") == 0)
1075 {
2f1b18db 1076 *kind = RANGE_HIGH_BOUND_DEFAULT;
c44af4eb
TT
1077 *low = value_as_long (value_field (range, 0));
1078 ++i;
1079 }
1f704f76 1080 if (type->num_fields () > i
c44af4eb
TT
1081 && strcmp (TYPE_FIELD_NAME (type, i), "end") == 0)
1082 {
2f1b18db
AB
1083 *kind = (*kind == (RANGE_LOW_BOUND_DEFAULT | RANGE_HIGH_BOUND_DEFAULT)
1084 ? RANGE_LOW_BOUND_DEFAULT : RANGE_STANDARD);
c44af4eb 1085 *high = value_as_long (value_field (range, i));
6873858b
TT
1086
1087 if (rust_inclusive_range_type_p (type))
1088 ++*high;
c44af4eb
TT
1089 }
1090}
1091
1092/* A helper for rust_evaluate_subexp that handles BINOP_SUBSCRIPT. */
1093
6ce1ad67 1094struct value *
984af2cb
TT
1095rust_subscript (struct type *expect_type, struct expression *exp,
1096 enum noside noside, bool for_addr,
1097 struct value *lhs, struct value *rhs)
c44af4eb 1098{
984af2cb 1099 struct value *result;
c44af4eb 1100 struct type *rhstype;
45f4ed92 1101 LONGEST low, high_bound;
c44af4eb 1102 /* Initialized to appease the compiler. */
f2d8e4c5 1103 range_flags kind = RANGE_LOW_BOUND_DEFAULT | RANGE_HIGH_BOUND_DEFAULT;
45f4ed92 1104 LONGEST high = 0;
c44af4eb
TT
1105 int want_slice = 0;
1106
c44af4eb
TT
1107 rhstype = check_typedef (value_type (rhs));
1108 if (rust_range_type_p (rhstype))
1109 {
1110 if (!for_addr)
1111 error (_("Can't take slice of array without '&'"));
1112 rust_compute_range (rhstype, rhs, &low, &high, &kind);
1113 want_slice = 1;
1114 }
1115 else
1116 low = value_as_long (rhs);
1117
b3e3859b 1118 struct type *type = check_typedef (value_type (lhs));
c44af4eb
TT
1119 if (noside == EVAL_AVOID_SIDE_EFFECTS)
1120 {
b3e3859b 1121 struct type *base_type = nullptr;
78134374 1122 if (type->code () == TYPE_CODE_ARRAY)
b3e3859b
TT
1123 base_type = TYPE_TARGET_TYPE (type);
1124 else if (rust_slice_type_p (type))
1125 {
1f704f76 1126 for (int i = 0; i < type->num_fields (); ++i)
b3e3859b
TT
1127 {
1128 if (strcmp (TYPE_FIELD_NAME (type, i), "data_ptr") == 0)
1129 {
940da03e 1130 base_type = TYPE_TARGET_TYPE (type->field (i).type ());
b3e3859b
TT
1131 break;
1132 }
1133 }
1134 if (base_type == nullptr)
1135 error (_("Could not find 'data_ptr' in slice type"));
1136 }
78134374 1137 else if (type->code () == TYPE_CODE_PTR)
b3e3859b
TT
1138 base_type = TYPE_TARGET_TYPE (type);
1139 else
1140 error (_("Cannot subscript non-array type"));
1141
1142 struct type *new_type;
1143 if (want_slice)
1144 {
1145 if (rust_slice_type_p (type))
1146 new_type = type;
1147 else
1148 {
1149 struct type *usize
1150 = language_lookup_primitive_type (exp->language_defn,
1151 exp->gdbarch,
1152 "usize");
1153 new_type = rust_slice_type ("&[*gdb*]", base_type, usize);
1154 }
1155 }
1156 else
1157 new_type = base_type;
c44af4eb 1158
b3e3859b 1159 return value_zero (new_type, VALUE_LVAL (lhs));
c44af4eb
TT
1160 }
1161 else
1162 {
1163 LONGEST low_bound;
1164 struct value *base;
c44af4eb 1165
78134374 1166 if (type->code () == TYPE_CODE_ARRAY)
c44af4eb
TT
1167 {
1168 base = lhs;
1169 if (!get_array_bounds (type, &low_bound, &high_bound))
1170 error (_("Can't compute array bounds"));
1171 if (low_bound != 0)
1172 error (_("Found array with non-zero lower bound"));
1173 ++high_bound;
1174 }
1175 else if (rust_slice_type_p (type))
1176 {
1177 struct value *len;
1178
158cc4fe
AB
1179 base = value_struct_elt (&lhs, {}, "data_ptr", NULL, "slice");
1180 len = value_struct_elt (&lhs, {}, "length", NULL, "slice");
c44af4eb
TT
1181 low_bound = 0;
1182 high_bound = value_as_long (len);
1183 }
78134374 1184 else if (type->code () == TYPE_CODE_PTR)
42d94011
MG
1185 {
1186 base = lhs;
1187 low_bound = 0;
1188 high_bound = LONGEST_MAX;
1189 }
c44af4eb
TT
1190 else
1191 error (_("Cannot subscript non-array type"));
1192
2f1b18db 1193 if (want_slice && (kind & RANGE_LOW_BOUND_DEFAULT))
c44af4eb
TT
1194 low = low_bound;
1195 if (low < 0)
1196 error (_("Index less than zero"));
1197 if (low > high_bound)
1198 error (_("Index greater than length"));
1199
1200 result = value_subscript (base, low);
1201 }
1202
1203 if (for_addr)
1204 {
1205 if (want_slice)
1206 {
1207 struct type *usize, *slice;
1208 CORE_ADDR addr;
1209 struct value *addrval, *tem;
1210
2f1b18db 1211 if (kind & RANGE_HIGH_BOUND_DEFAULT)
c44af4eb
TT
1212 high = high_bound;
1213 if (high < 0)
1214 error (_("High index less than zero"));
1215 if (low > high)
1216 error (_("Low index greater than high index"));
1217 if (high > high_bound)
1218 error (_("High index greater than length"));
1219
1220 usize = language_lookup_primitive_type (exp->language_defn,
1221 exp->gdbarch,
1222 "usize");
45320ffa
TT
1223 const char *new_name = ((type != nullptr
1224 && rust_slice_type_p (type))
7d93a1e0 1225 ? type->name () : "&[*gdb*]");
45320ffa
TT
1226
1227 slice = rust_slice_type (new_name, value_type (result), usize);
c44af4eb
TT
1228
1229 addrval = value_allocate_space_in_inferior (TYPE_LENGTH (slice));
1230 addr = value_as_long (addrval);
1231 tem = value_at_lazy (slice, addr);
1232
1233 value_assign (value_field (tem, 0), value_addr (result));
1234 value_assign (value_field (tem, 1),
1235 value_from_longest (usize, high - low));
1236
1237 result = value_at_lazy (slice, addr);
1238 }
1239 else
1240 result = value_addr (result);
1241 }
1242
1243 return result;
1244}
1245
d123f9e4
TT
1246/* A helper function for UNOP_IND. */
1247
11dd3dce 1248struct value *
d123f9e4
TT
1249eval_op_rust_ind (struct type *expect_type, struct expression *exp,
1250 enum noside noside,
11dd3dce 1251 enum exp_opcode opcode,
d123f9e4
TT
1252 struct value *value)
1253{
1254 gdb_assert (noside == EVAL_NORMAL);
1255 struct value *trait_ptr = rust_get_trait_object_pointer (value);
1256 if (trait_ptr != NULL)
1257 value = trait_ptr;
1258
1259 return value_ind (value);
1260}
1261
6fa9831f
TT
1262/* A helper function for UNOP_COMPLEMENT. */
1263
6fab4359 1264struct value *
6fa9831f
TT
1265eval_op_rust_complement (struct type *expect_type, struct expression *exp,
1266 enum noside noside,
6fab4359 1267 enum exp_opcode opcode,
6fa9831f
TT
1268 struct value *value)
1269{
6fa9831f
TT
1270 if (value_type (value)->code () == TYPE_CODE_BOOL)
1271 return value_from_longest (value_type (value), value_logical_not (value));
1272 return value_complement (value);
1273}
1274
05104233
TT
1275/* A helper function for OP_ARRAY. */
1276
6fab4359 1277struct value *
05104233
TT
1278eval_op_rust_array (struct type *expect_type, struct expression *exp,
1279 enum noside noside,
6fab4359 1280 enum exp_opcode opcode,
05104233
TT
1281 struct value *elt, struct value *ncopies)
1282{
1283 int copies = value_as_long (ncopies);
1284 if (copies < 0)
1285 error (_("Array with negative number of elements"));
1286
1287 if (noside == EVAL_NORMAL)
1288 {
1289 int i;
1290 std::vector<struct value *> eltvec (copies);
1291
1292 for (i = 0; i < copies; ++i)
1293 eltvec[i] = elt;
1294 return value_array (0, copies - 1, eltvec.data ());
1295 }
1296 else
1297 {
1298 struct type *arraytype
1299 = lookup_array_range_type (value_type (elt), 0, copies - 1);
1300 return allocate_value (arraytype);
1301 }
1302}
1303
575cae23
TT
1304/* A helper function for STRUCTOP_ANONYMOUS. */
1305
e4407a20 1306struct value *
575cae23
TT
1307eval_op_rust_struct_anon (struct type *expect_type, struct expression *exp,
1308 enum noside noside,
1309 int field_number, struct value *lhs)
1310{
1311 struct type *type = value_type (lhs);
1312
1313 if (type->code () == TYPE_CODE_STRUCT)
1314 {
1315 struct type *outer_type = NULL;
1316
1317 if (rust_enum_p (type))
1318 {
1319 gdb::array_view<const gdb_byte> view (value_contents (lhs),
1320 TYPE_LENGTH (type));
1321 type = resolve_dynamic_type (type, view, value_address (lhs));
1322
1323 if (rust_empty_enum_p (type))
1324 error (_("Cannot access field %d of empty enum %s"),
1325 field_number, type->name ());
1326
1327 int fieldno = rust_enum_variant (type);
1328 lhs = value_primitive_field (lhs, 0, fieldno, type);
1329 outer_type = type;
1330 type = value_type (lhs);
1331 }
1332
1333 /* Tuples and tuple structs */
1334 int nfields = type->num_fields ();
1335
1336 if (field_number >= nfields || field_number < 0)
1337 {
1338 if (outer_type != NULL)
1339 error(_("Cannot access field %d of variant %s::%s, "
1340 "there are only %d fields"),
1341 field_number, outer_type->name (),
1342 rust_last_path_segment (type->name ()),
1343 nfields);
1344 else
1345 error(_("Cannot access field %d of %s, "
1346 "there are only %d fields"),
1347 field_number, type->name (), nfields);
1348 }
1349
1350 /* Tuples are tuple structs too. */
1351 if (!rust_tuple_struct_type_p (type))
1352 {
1353 if (outer_type != NULL)
1354 error(_("Variant %s::%s is not a tuple variant"),
1355 outer_type->name (),
1356 rust_last_path_segment (type->name ()));
1357 else
1358 error(_("Attempting to access anonymous field %d "
1359 "of %s, which is not a tuple, tuple struct, or "
1360 "tuple-like variant"),
1361 field_number, type->name ());
1362 }
1363
1364 return value_primitive_field (lhs, 0, field_number, type);
1365 }
1366 else
1367 error(_("Anonymous field access is only allowed on tuples, \
1368tuple structs, and tuple-like enum variants"));
1369}
1370
1fa41fc7
TT
1371/* A helper function for STRUCTOP_STRUCT. */
1372
e4407a20 1373struct value *
1fa41fc7
TT
1374eval_op_rust_structop (struct type *expect_type, struct expression *exp,
1375 enum noside noside,
1376 struct value *lhs, const char *field_name)
1377{
1378 struct value *result;
1379 struct type *type = value_type (lhs);
1380 if (type->code () == TYPE_CODE_STRUCT && rust_enum_p (type))
1381 {
1382 gdb::array_view<const gdb_byte> view (value_contents (lhs),
1383 TYPE_LENGTH (type));
1384 type = resolve_dynamic_type (type, view, value_address (lhs));
1385
1386 if (rust_empty_enum_p (type))
1387 error (_("Cannot access field %s of empty enum %s"),
1388 field_name, type->name ());
1389
1390 int fieldno = rust_enum_variant (type);
1391 lhs = value_primitive_field (lhs, 0, fieldno, type);
1392
1393 struct type *outer_type = type;
1394 type = value_type (lhs);
1395 if (rust_tuple_type_p (type) || rust_tuple_struct_type_p (type))
1396 error (_("Attempting to access named field %s of tuple "
1397 "variant %s::%s, which has only anonymous fields"),
1398 field_name, outer_type->name (),
1399 rust_last_path_segment (type->name ()));
1400
1401 try
1402 {
158cc4fe 1403 result = value_struct_elt (&lhs, {}, field_name,
1fa41fc7
TT
1404 NULL, "structure");
1405 }
1406 catch (const gdb_exception_error &except)
1407 {
1408 error (_("Could not find field %s of struct variant %s::%s"),
1409 field_name, outer_type->name (),
1410 rust_last_path_segment (type->name ()));
1411 }
1412 }
1413 else
158cc4fe 1414 result = value_struct_elt (&lhs, {}, field_name, NULL, "structure");
1fa41fc7
TT
1415 if (noside == EVAL_AVOID_SIDE_EFFECTS)
1416 result = value_zero (value_type (result), VALUE_LVAL (result));
1417 return result;
1418}
1419
5947d337
TT
1420namespace expr
1421{
1422
1423value *
1424rust_aggregate_operation::evaluate (struct type *expect_type,
1425 struct expression *exp,
1426 enum noside noside)
1427{
1428 struct type *type = std::get<0> (m_storage);
1429 CORE_ADDR addr = 0;
1430 struct value *addrval = NULL;
1431 value *result;
1432
1433 if (noside == EVAL_NORMAL)
1434 {
1435 addrval = value_allocate_space_in_inferior (TYPE_LENGTH (type));
1436 addr = value_as_long (addrval);
1437 result = value_at_lazy (type, addr);
1438 }
1439
1440 if (std::get<1> (m_storage) != nullptr)
1441 {
1442 struct value *init = std::get<1> (m_storage)->evaluate (nullptr, exp,
1443 noside);
1444
1445 if (noside == EVAL_NORMAL)
1446 {
1447 /* This isn't quite right but will do for the time
1448 being, seeing that we can't implement the Copy
1449 trait anyway. */
1450 value_assign (result, init);
1451 }
1452 }
1453
1454 for (const auto &item : std::get<2> (m_storage))
1455 {
1456 value *val = item.second->evaluate (nullptr, exp, noside);
1457 if (noside == EVAL_NORMAL)
1458 {
1459 const char *fieldname = item.first.c_str ();
158cc4fe 1460 value *field = value_struct_elt (&result, {}, fieldname,
5947d337
TT
1461 nullptr, "structure");
1462 value_assign (field, val);
1463 }
1464 }
1465
aa1da9ed 1466 if (noside == EVAL_AVOID_SIDE_EFFECTS)
5947d337
TT
1467 result = allocate_value (type);
1468 else
1469 result = value_at_lazy (type, addr);
1470
1471 return result;
1472}
1473
638fd74a
TT
1474value *
1475rust_structop::evaluate_funcall (struct type *expect_type,
1476 struct expression *exp,
1477 enum noside noside,
1478 const std::vector<operation_up> &ops)
1479{
1480 std::vector<struct value *> args (ops.size () + 1);
1481
1482 /* Evaluate the argument to STRUCTOP_STRUCT, then find its
1483 type in order to look up the method. */
1484 args[0] = std::get<0> (m_storage)->evaluate (nullptr, exp, noside);
1485 /* We don't yet implement real Deref semantics. */
1486 while (value_type (args[0])->code () == TYPE_CODE_PTR)
1487 args[0] = value_ind (args[0]);
1488
1489 struct type *type = value_type (args[0]);
1490 if ((type->code () != TYPE_CODE_STRUCT
1491 && type->code () != TYPE_CODE_UNION
1492 && type->code () != TYPE_CODE_ENUM)
1493 || rust_tuple_type_p (type))
1494 error (_("Method calls only supported on struct or enum types"));
1495 if (type->name () == NULL)
1496 error (_("Method call on nameless type"));
1497
1498 std::string name = (std::string (type->name ()) + "::"
1499 + std::get<1> (m_storage));
1500
1501 const struct block *block = get_selected_block (0);
1502 struct block_symbol sym = lookup_symbol (name.c_str (), block,
1503 VAR_DOMAIN, NULL);
1504 if (sym.symbol == NULL)
1505 error (_("Could not find function named '%s'"), name.c_str ());
1506
1507 struct type *fn_type = SYMBOL_TYPE (sym.symbol);
1508 if (fn_type->num_fields () == 0)
1509 error (_("Function '%s' takes no arguments"), name.c_str ());
1510
1511 if (fn_type->field (0).type ()->code () == TYPE_CODE_PTR)
1512 args[0] = value_addr (args[0]);
1513
1514 value *function = address_of_variable (sym.symbol, block);
1515
1516 for (int i = 0; i < ops.size (); ++i)
1517 args[i + 1] = ops[i]->evaluate (nullptr, exp, noside);
1518
1519 if (noside == EVAL_AVOID_SIDE_EFFECTS)
1520 return value_zero (TYPE_TARGET_TYPE (fn_type), not_lval);
1521 return call_function_by_hand (function, NULL, args);
1522}
1523
5947d337
TT
1524}
1525
c44af4eb
TT
1526\f
1527
1c485265 1528/* See language.h. */
0874fd07 1529
1c485265
AB
1530void
1531rust_language::language_arch_info (struct gdbarch *gdbarch,
1532 struct language_arch_info *lai) const
0874fd07 1533{
1c485265 1534 const struct builtin_type *builtin = builtin_type (gdbarch);
87afa652 1535
1c485265
AB
1536 /* Helper function to allow shorter lines below. */
1537 auto add = [&] (struct type * t) -> struct type *
87afa652 1538 {
1c485265
AB
1539 lai->add_primitive_type (t);
1540 return t;
1541 };
1542
1543 struct type *bool_type
1544 = add (arch_boolean_type (gdbarch, 8, 1, "bool"));
1545 add (arch_character_type (gdbarch, 32, 1, "char"));
1546 add (arch_integer_type (gdbarch, 8, 0, "i8"));
1547 struct type *u8_type
1548 = add (arch_integer_type (gdbarch, 8, 1, "u8"));
1549 add (arch_integer_type (gdbarch, 16, 0, "i16"));
1550 add (arch_integer_type (gdbarch, 16, 1, "u16"));
1551 add (arch_integer_type (gdbarch, 32, 0, "i32"));
1552 add (arch_integer_type (gdbarch, 32, 1, "u32"));
1553 add (arch_integer_type (gdbarch, 64, 0, "i64"));
1554 add (arch_integer_type (gdbarch, 64, 1, "u64"));
1555
1556 unsigned int length = 8 * TYPE_LENGTH (builtin->builtin_data_ptr);
1557 add (arch_integer_type (gdbarch, length, 0, "isize"));
1558 struct type *usize_type
1559 = add (arch_integer_type (gdbarch, length, 1, "usize"));
1560
1561 add (arch_float_type (gdbarch, 32, "f32", floatformats_ieee_single));
1562 add (arch_float_type (gdbarch, 64, "f64", floatformats_ieee_double));
1563 add (arch_integer_type (gdbarch, 0, 1, "()"));
1564
1565 struct type *tem = make_cv_type (1, 0, u8_type, NULL);
1566 add (rust_slice_type ("&str", tem, usize_type));
1567
1568 lai->set_bool_type (bool_type);
1569 lai->set_string_char_type (u8_type);
1570}
39e7ecca 1571
1c485265 1572/* See language.h. */
efdf6a73 1573
1c485265
AB
1574void
1575rust_language::print_type (struct type *type, const char *varstring,
1576 struct ui_file *stream, int show, int level,
1577 const struct type_print_options *flags) const
1578{
fbb46296 1579 print_offset_data podata (flags);
1c485265
AB
1580 rust_internal_print_type (type, varstring, stream, show, level,
1581 flags, false, &podata);
1582}
efdf6a73 1583
1c485265 1584/* See language.h. */
5aba6ebe 1585
1c485265
AB
1586void
1587rust_language::emitchar (int ch, struct type *chtype,
1588 struct ui_file *stream, int quoter) const
1589{
1590 if (!rust_chartype_p (chtype))
1591 generic_emit_char (ch, chtype, stream, quoter,
8ee511af 1592 target_charset (chtype->arch ()));
1c485265
AB
1593 else if (ch == '\\' || ch == quoter)
1594 fprintf_filtered (stream, "\\%c", ch);
1595 else if (ch == '\n')
1596 fputs_filtered ("\\n", stream);
1597 else if (ch == '\r')
1598 fputs_filtered ("\\r", stream);
1599 else if (ch == '\t')
1600 fputs_filtered ("\\t", stream);
1601 else if (ch == '\0')
1602 fputs_filtered ("\\0", stream);
1603 else if (ch >= 32 && ch <= 127 && isprint (ch))
1604 fputc_filtered (ch, stream);
1605 else if (ch <= 255)
1606 fprintf_filtered (stream, "\\x%02x", ch);
1607 else
1608 fprintf_filtered (stream, "\\u{%06x}", ch);
1609}
5aba6ebe 1610
1c485265 1611/* See language.h. */
b7c6e27d 1612
1c485265
AB
1613bool
1614rust_language::is_string_type_p (struct type *type) const
1615{
1616 LONGEST low_bound, high_bound;
b7c6e27d 1617
1c485265
AB
1618 type = check_typedef (type);
1619 return ((type->code () == TYPE_CODE_STRING)
1620 || (type->code () == TYPE_CODE_PTR
1621 && (TYPE_TARGET_TYPE (type)->code () == TYPE_CODE_ARRAY
1622 && rust_u8_type_p (TYPE_TARGET_TYPE (TYPE_TARGET_TYPE (type)))
1623 && get_array_bounds (TYPE_TARGET_TYPE (type), &low_bound,
1624 &high_bound)))
1625 || (type->code () == TYPE_CODE_STRUCT
1626 && !rust_enum_p (type)
1627 && rust_slice_type_p (type)
1628 && strcmp (type->name (), "&str") == 0));
1629}
0874fd07
AB
1630
1631/* Single instance of the Rust language class. */
1632
1633static rust_language rust_language_defn;
This page took 0.76136 seconds and 4 git commands to generate.