[cfe-commits] [llvm-commits] [PATCH] ARM ABI: handle varargs with vector types.

manman ren mren at apple.com
Tue Oct 16 11:10:40 PDT 2012


On Oct 15, 2012, at 5:59 PM, Eli Friedman <eli.friedman at gmail.com> wrote:

> On Mon, Oct 15, 2012 at 5:38 PM, Manman Ren <mren at apple.com> wrote:
>> 
>> On Oct 15, 2012, at 5:34 PM, Eli Friedman wrote:
>> 
>>> On Mon, Oct 15, 2012 at 5:26 PM, Manman Ren <mren at apple.com> wrote:
>>>> 
>>>> On Oct 15, 2012, at 5:11 PM, Eli Friedman wrote:
>>>> 
>>>>> On Mon, Oct 15, 2012 at 4:46 PM, manman ren <mren at apple.com> wrote:
>>>>>> 
>>>>>> The initial patch was updated and separated to two patches (attached).
>>>>>> 
>>>>>> The first patch will fix passing legal vector types as varargs:
>>>>>> We make sure the vector is correctly aligned before casting it to the vector type.
>>>>> 
>>>>> +  uint64_t Size = CGF.getContext().getTypeSize(Ty) / 8;
>>>>> +  uint64_t TyAlign = CGF.getContext().getTypeAlign(Ty) / 8;
>>>>> +
>>>>> +  // The ABI alignment for vectors is 8 for AAPCS and 4 for APCS.
>>>>> +  if (Ty->getAs<VectorType>() && Size >= 8) {
>>>>> +    if (getABIKind() == ARMABIInfo::AAPCS_VFP ||
>>>>> +        getABIKind() == ARMABIInfo::AAPCS)
>>>>> +      TyAlign = 8;
>>>>> +    else
>>>>> +      TyAlign = 4;
>>>>> +  }
>>>>> 
>>>>> We should be using the same rules here we do for argument passing.  In
>>>>> particular, for APCS, the argument-passing type alignment is
>>>>> unconditionally 4.  (This can have effects for structs marked with
>>>>> "__attribute__((aligned(16)))", etc.)
>>>> Is there an interface to query the argument-passing alignment?
>>> 
>>> Nothing cares about it other than the calling convention code, so
>>> there isn't a general API.  It's basically just "match whatever
>>> ARMABIInfo::classifyArgumentType does".
>> 
>> I don't see code in ARMABIInfo::classifyArgumentType that checks the argument-passing alignment.
>> The code in the patch is trying to match what the calling convention does in the backend:
> 
> Yes, it's a bit tricky because of the implicit contract between clang
> and the ARM backend... you basically have to combine the frontend and
> backend rules to figure out how the result is actually represented on
> the stack.  When you do that, it comes out to always 4 for APCS, and I
> think it comes out to min(max(naturalAlign, 4), 8) for AAPCS.

I think you are right, the patch is updated, please review again :]

Manman
-------------- next part --------------
A non-text attachment was scrubbed...
Name: arm-abi-vector-1st.patch
Type: application/octet-stream
Size: 4778 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20121016/e5dcb153/attachment.obj>
-------------- next part --------------

> 
> -Eli



More information about the cfe-commits mailing list