On Wed, Jul 9, 2014 at 11:25 AM, David Edelsohn <dje....@gmail.com> wrote:
> On Wed, Jul 9, 2014 at 12:04 PM, Ulrich Weigand <uweig...@de.ibm.com> wrote:
>> Hello,
>>
>> last year, Bill added a patch to address PR 57949 by aligning aggregates
>> requiring at least 128-bit alignment at a quadword boundary in the
>> parameter save area:
>> https://gcc.gnu.org/ml/gcc-patches/2013-08/msg00803.html
>>
>> Unfortunately, to implement this check, Bill's patch used a pre-existing
>> piece of code originally used only on Darwin, which uses a "mode == BLKmode"
>> check to test for aggregate types.
>>
>> However, GCC may sometimes choose non-BLKmode modes to represent aggregate
>> types.  One case the single-element float/vector aggregates; that's OK,
>> because those are handled separately by the ABI anyway.
>>
>> But there are more cases: many structures get some integer mode simply
>> because their size happen to be 1, 2, 4, 8, or 16 bytes.  The precise
>> rules *which* aggregates GCC uses such a mode for are intricate, and
>> even differ slightly between types created by the C vs. C++ front-ends.
>>
>> This normally doesn't matter since the mode used to back an aggregate
>> type only matters for internal code generation (basically, whether GCC
>> may use a register to hold a local variable of that type, or whether
>> they must all go to memory).
>>
>> Due to this check in rs6000_function_arg_boundary, however, those GCC
>> internal details have now leaked into the public ABI.  We have thought
>> of simply accepting that ABI as the de-facto ABI now and documenting
>> it, but that turned out to be too fragile; it is hard to precisely
>> describe the mode selection in a way that it can be reliably implemented
>> by another (non-GCC based) compiler.
>>
>> After various off-line discussions, we came to the conclusion that the
>> best way is to fix the GCC implementation to actually align *all* aggregate
>> types, not just those backed by BLKmode.  [ The exception remain single-
>> element (or ELFv2 homogeneous) float/vector aggregates, which are handled
>> as before: float is doubleword aligned, vector is quadword aligned. ]
>>
>> This change does break the ABI in certain cases.  However, we hope that
>> this is acceptable because:
>>
>> - The change only affects rare cases: passing a struct by value that is
>>    * not a float/vector special case, and
>>    * has a size of 1, 2, 4, 8, or 16 bytes, and
>>    * has an alignment requirement of 16 bytes or more
>>   [ Not *all* these cases will see change, but all cases that change
>>   will share these properties.  ]
>>
>> - This aspect of the ABI already changed recently with Bill's patch,
>>   and the current version hasn't seen very widespread use yet.
>>
>> Note that patch below only changes the ABI for the AIX/ELFv1 and ELFv2
>> cases; the Darwin ABI (which shared the same problem) is left as-is.
>> It's up to the Darwin maintainers whether they prefer to change as well
>> or rather keep everything as it has been on Darwin for a long time.
>>
>> Tested on powerpc64-linux and powerpc64le-linux.
>>
>> OK for mainline?
>> [ The patch should then also go into the 4.8 and 4.9 branches for
>> consistency. ]
>>
>> Bye,
>> Ulrich
>>
>>
>> ChangeLog:
>>
>>         * config/rs6000/rs6000.c (rs6000_function_arg_boundary): In the AIX
>>         and ELFv2 ABI, do not use the "mode == BLKmode" check to test for
>>         aggregate types.  Instead, *all* aggregate types, except for single-
>>         element or homogeneous float/vector aggregates, are quadword-aligned
>>         if required by their type alignment.
>
> Okay.
>
> I copied the Darwin maintainers and active testers so that they are
> explicitly aware of the ABI issue. They can decide if they want to fix
> the ABI alignment issue on Darwin.
>

Thanks David, In general I'd personally prefer to fix the ABI issues,
but PPC darwin is beyond EoL by the original company and I don't have
any hardware for it myself - in which case I'll leave it up to our
more active testers or someone with hardware. (Mike? Have old ppc
hardware sitting around?)

-eric

Reply via email to