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

Manman Ren mren at apple.com
Mon Oct 15 17:26:03 PDT 2012


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?

> 
> +  if (Ty->getAs<VectorType>() && ((Size == 8 && TyAlign < 8) ||
> +           (Size >= 16 && TyAlign < 16))) {
> +    // We can't directly cast ap.cur to pointer to a vector type, since ap.cur
> +    // may not be correctly aligned for the vector type. We create an aligned
> +    // temporary space and copy the content over from ap.cur to the temporary
> +    // space. This is necessary if TyAlign < 8 for Size == 8, or
> +    // TyAlign < 16 for Size >= 16.
> 
> The general rule here is something like "TyAlign <
> CGF.getContext().getTypeAlign(Ty) / 8" (i.e. the natural alignment of
> the type is greater than the argument-passing alignment).
Agree, will update the patch.

Thanks,
Manman
> 
> -Eli




More information about the cfe-commits mailing list