john.brawn added a comment.

In D62152#1508979 <https://reviews.llvm.org/D62152#1508979>, @efriedma wrote:

> Please verify my understanding of the following is correct:
>
> 1. getTypeUnadjustedAlign() is currently only used to compute calling 
> convention alignment for ARM and AArch64.


Yes, the only places it's called are AArch64ABIInfo::classifyArgumentType and 
ARMABIInfo::classifyArgumentType.

> 2. Without this patch, we use the unadjusted alignment to pass arguments, but 
> the adjusted alignment to compute the alignment for the corresponding va_arg 
> calls.

Yes.

> 3. Without this patch, the unadjusted alignment for non-struct types is 
> actually adjusted based on attributes on typedefs.

Only in va_arg. For example if you look at

  typedef int aligned_int __attribute__((aligned(8)));
  aligned_int called_fn(int a1, aligned_int a2) {
    return a2;
  }
  aligned_int calling_fn() {
    return called_fn(1,2);
  }

a2 is passed in r1 by calling_fn, and read from it in called_fn (both before 
and after this patch). However for

  typedef int aligned_int __attribute__((aligned(8)));
  aligned_int called_fn(int a1, ...) {
    va_list ap;
    va_start(ap, a1);
    aligned_int a2 = va_arg(ap, aligned_int);
    va_end(ap);
    return a2;
  }
  aligned_int calling_fn() {
    return called_fn(1,2);
  }

a2 is still passed in r1 by calling_fn, but the current clang behaviour in 
called_fn is that it pushes r1-r3 then loads the next 8-byte-aligned value, 
which will be the pushed r2 value.  This patch fixes this so that it doesn't 
8-byte align the load address, and so gets the pushed r1.

> I'm not confident about changing the calling convention again at this point 
> for non-struct types.  I guess it's obscure enough that changing it is 
> probably okay.  But would you mind splitting it into a separate followup, 
> with a better description of the impact?

This patch only changes the va_arg behaviour, and this whole thing with 
unadjusted alignment is from the published pcs 
(https://developer.arm.com/docs/ihi0042/latest/procedure-call-standard-for-the-arm-architecture-abi-2019q1-documentation
 and 
https://developer.arm.com/docs/ihi0055/latest/procedure-call-standard-for-the-arm-64-bit-architecture,
 though it's called "natural alignment" there).


Repository:
  rC Clang

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D62152/new/

https://reviews.llvm.org/D62152



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to