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

manman ren mren at apple.com
Tue Oct 16 12:22:28 PDT 2012



On Oct 16, 2012, at 12:04 PM, manman ren <mren at apple.com> wrote:

> 
> Committed as r166040.
> Thanks Eli for reviewing.
> 
> Manman
> 
> On Oct 16, 2012, at 11:53 AM, Eli Friedman <eli.friedman at gmail.com> wrote:
> 
>> On Tue, Oct 16, 2012 at 11:42 AM, Manman Ren <mren at apple.com> wrote:
>>> 
>>> On Oct 16, 2012, at 11:32 AM, Eli Friedman wrote:
>>> 
>>>> On Tue, Oct 16, 2012 at 11:10 AM, manman ren <mren at apple.com> wrote:
>>>>> 
>>>>> 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 :]
>>>> 
>>>> +  if (Ty->getAs<VectorType>()) {
>>>> 
>>>> Why restrict the check to vector types?  (This check can have effects
>>>> for other types, e.g. structs containing vectors.)
>>> I want to make sure this patch only touches varargs with vector types.
>>> For other types, we can handle those in a separate patch with additional testing cases.

Committed the patch for illegal vector types in r166043.
I will try to remove the check for vector types and add a testing case.

Thanks,
Manman

>> 
>> Okay.
>> 
>> -Eli
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the cfe-commits mailing list