RE: [PATCH 2/2] handle VLA in a struct or union

Agovic, Sanimir
2014-05-09T08:05:36Z

> diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c
> index 95b861e..59f354a 100644
> --- a/gdb/gdbtypes.c
> +++ b/gdb/gdbtypes.c
> @@ -1636,6 +1636,20 @@ is_dynamic_type (struct type *type)
> return 1;
> return is_dynamic_type (TYPE_TARGET_TYPE (type));
> }
> +
> + case TYPE_CODE_STRUCT:
> + case TYPE_CODE_UNION:
> + {
> + int i;
> +
> + for (i = 0; i < TYPE_NFIELDS (type); ++i)
> + if (!field_is_static (&TYPE_FIELD (type, i))
> + /* This can happen with Ada for reasons unknown. */
> + && TYPE_FIELD_TYPE (type, i) != NULL
> + && is_dynamic_type (TYPE_FIELD_TYPE (type, i)))
> + return 1;
> + }
> + break;
> }
>
> return 0;
> @@ -1753,6 +1767,86 @@ resolve_dynamic_type (struct type *type, CORE_ADDR addr)
> case TYPE_CODE_RANGE:
> resolved_type = resolve_dynamic_range (type);
> break;
> +
> + case TYPE_CODE_UNION:
>
As Joel has moved the heavy work out of the cases into separate function
how about doing the same for arrays and unions (resolve_dynamic_compound)?

> + {
> + int i;
> + unsigned int max_len;
> +
> + resolved_type = copy_type (type);
> + TYPE_FIELDS (resolved_type)
> + = TYPE_ALLOC (resolved_type,
> + TYPE_NFIELDS (resolved_type) * sizeof (struct field));
> + memcpy (TYPE_FIELDS (resolved_type),
> + TYPE_FIELDS (type),
> + TYPE_NFIELDS (resolved_type) * sizeof (struct field));
> + for (i = 0; i < TYPE_NFIELDS (resolved_type); ++i)
> + {
> + struct type *t;
> +
> + if (field_is_static (&TYPE_FIELD (type, i)))
> + continue;
> +
> + t = resolve_dynamic_type (TYPE_FIELD_TYPE (resolved_type, i),
> + addr);
> +
> + TYPE_FIELD_TYPE (resolved_type, i) = t;
> + if (TYPE_LENGTH (t) > max_len)
> + max_len = TYPE_LENGTH (t);
> + }
> +
> + TYPE_LENGTH (resolved_type) = max_len;
> + }
> + break;
> +
> + case TYPE_CODE_STRUCT:
> + {
> + int i;
> + int vla_field = TYPE_NFIELDS (type) - 1;
> +
How about adding a gdb_assert to ensure NFIELDS is > 0. I know this cannot
happen in this particular case but in others it might and one may assume
that a struct has at least a member which is not the case.

> diff --git a/gdb/testsuite/gdb.base/vla-datatypes.c b/gdb/testsuite/gdb.base/vla-
> datatypes.c
> index 51e342e..8561a4e 100644
> --- a/gdb/testsuite/gdb.base/vla-datatypes.c
> +++ b/gdb/testsuite/gdb.base/vla-datatypes.c
> @@ -46,6 +46,18 @@ vla_factory (int n)
> BAR bar_vla[n];
> int i;
>
> + struct vla_struct
> + {
> + int something;
> + int vla_field[n];
> + } vla_struct_object;
> +
> + union vla_union
> + {
> + int vla_field[n];
> + } vla_union_object;
> +
As you have pointed out the limitation of vla within arrays, this might
as well serve as a test case that we deal with it.

-Sanimir

Intel GmbH
Dornacher Strasse 1
85622 Feldkirchen/Muenchen, Deutschland
Sitz der Gesellschaft: Feldkirchen bei Muenchen
Geschaeftsfuehrer: Christian Lamprechter, Hannes Schwaderer, Douglas Lusk
Registergericht: Muenchen HRB 47456
Ust.-IdNr./VAT Registration No.: DE129385895
Citibank Frankfurt a.M. (BLZ 502 109 00) 600119052