Re: [RFA/sparc64] internal-error printing return value (Ada array)

Mark Kettenis
2006-11-12T20:49:39Z

> > To decide what is the right fix, we need to investigate this a bit
> > further.
> > I suspect that Ada arrays arereally treated as structures where all
> > members
> > have the same type.
>
> In Ada, arrays can take many forms, and as a result, you have
> 3 types of arrays:
>
> . statically known arrays (where the array bounds are known at
> compile time), are implemented using a memory buffer. This is
> our case here.
>
> . Then we have fat pointers: This is a structure that contains
> two pointers, one to a structure containing the array bounds,
> and one pointer to the memory buffer itself. We use that for
> arrays whose bounds are not known at compile time.
>
> . Lastly, we have thin pointers: This is a pointer to the second
> field of a structure that resembles the fat pointer.
>
> > So the first question I have is whether these indeed
> > have "fields".
>
> Is this question still relevant after the description above?
> I am not sure I understand it.

Hmm, I gueass I should have asked how a gdb `struct type' looks for
these Ada arrays? In particular, if main_type->nfields is set and
whether main_type->fields is set to something useful.

> > You should also check how small arrays are passed as arguments to a
> > function.
>
> This is described by the Ada Reference Manual: Arrays are always
> passed by reference. So a function taking a parameter of our static
> array type will have the array passed by reference. As a result,
> the the array parameter will be a REF to a TYPE_CODE_ARRAY.

So there is no way to pass a TYPE_CODE_ARRAY directly?

> > Here the magic length will be 16 bytes instead of 32 bytes.
>
> I don't understand this part. Why 16 bytes instead of 32?
> If the total size of the array is 32 bytes, shouldn't the compiler
> return it through %o0 - %o7?

The 16-byte limit is for passing structures as an argument to a function.
I presume this is because function arguments occupy 16-byte slots in the
ABI.

Mark