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