This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


> 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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]