diff options
author | Tom Tromey <tromey@adacore.com> | 2020-03-30 11:50:35 -0600 |
---|---|---|
committer | Tom Tromey <tromey@adacore.com> | 2020-03-30 11:54:50 -0600 |
commit | d8af906814bd69dad694e475288401b1dee6ac3a (patch) | |
tree | 0e95af57f2a2ff0ca8fb515d6b12ff62c2d7498d /gdb/ada-lang.c | |
parent | 00386881a3d0f7ac89fcc5cc912da8cd69c04324 (diff) | |
download | gdb-d8af906814bd69dad694e475288401b1dee6ac3a.zip gdb-d8af906814bd69dad694e475288401b1dee6ac3a.tar.gz gdb-d8af906814bd69dad694e475288401b1dee6ac3a.tar.bz2 |
Change ada_which_variant_applies to value API
While debugging an Ada regression, I noticed that all the callers of
ada_which_variant_applies desconstruct a value, only to have it be
reconstructed by this function.
This patch removes this inefficiency in favor of simply passing in the
value directly.
Tested on x86-64 Fedora 30.
gdb/ChangeLog
2020-03-30 Tom Tromey <tromey@adacore.com>
* ada-valprint.c (print_variant_part): Update.
* ada-lang.h (ada_which_variant_applies): Update.
* ada-lang.c (ada_which_variant_applies): Remove outer_type and
outer_valaddr parameters; replace with "outer" value parameter.
(to_fixed_variant_branch_type): Update.
Diffstat (limited to 'gdb/ada-lang.c')
-rw-r--r-- | gdb/ada-lang.c | 13 |
1 files changed, 3 insertions, 10 deletions
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index 2822d40..565299a 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -7661,26 +7661,21 @@ is_unchecked_variant (struct type *var_type, struct type *outer_type) /* Assuming that VAR_TYPE is the type of a variant part of a record (a union), - within a value of type OUTER_TYPE that is stored in GDB at - OUTER_VALADDR, determine which variant clause (field number in VAR_TYPE, + within OUTER, determine which variant clause (field number in VAR_TYPE, numbering from 0) is applicable. Returns -1 if none are. */ int -ada_which_variant_applies (struct type *var_type, struct type *outer_type, - const gdb_byte *outer_valaddr) +ada_which_variant_applies (struct type *var_type, struct value *outer) { int others_clause; int i; const char *discrim_name = ada_variant_discrim_name (var_type); - struct value *outer; struct value *discrim; LONGEST discrim_val; /* Using plain value_from_contents_and_address here causes problems because we will end up trying to resolve a type that is currently being constructed. */ - outer = value_from_contents_and_address_unresolved (outer_type, - outer_valaddr, 0); discrim = ada_value_struct_elt (outer, discrim_name, 1); if (discrim == NULL) return -1; @@ -8555,9 +8550,7 @@ to_fixed_variant_branch_type (struct type *var_type0, const gdb_byte *valaddr, if (is_unchecked_variant (var_type, value_type (dval))) return var_type0; - which = - ada_which_variant_applies (var_type, - value_type (dval), value_contents (dval)); + which = ada_which_variant_applies (var_type, dval); if (which < 0) return empty_record (var_type); |