]> git.lizzy.rs Git - rust.git/commit
powerpc64: improve extern struct ABI
authorJosh Stone <jistone@redhat.com>
Wed, 23 Aug 2017 21:38:45 +0000 (17:38 -0400)
committerJosh Stone <jistone@redhat.com>
Sat, 2 Sep 2017 01:21:29 +0000 (18:21 -0700)
commita9bb599fb14fab9a9acee13c590b11a47c392cf6
treeef67f8dcbfb516516472802cabc7d81aed5b0c28
parentf861b6ee46465097eec266c160ac53e230df7cf0
powerpc64: improve extern struct ABI

These fixes all have to do with the 64-bit PowerPC ELF ABI for big-endian
targets.  The ELF v2 ABI for powerpc64le already worked well.

- Return after marking return aggregates indirect. Fixes #42757.
- Pass one-member float aggregates as direct argument values.
- Aggregate arguments less than 64-bit must be written in the least-
  significant bits of the parameter space.
- Larger aggregates are instead padded at the tail.
  (i.e. filling MSBs, padding the remaining LSBs.)

New tests were also added for the single-float aggregate, and a 3-byte
aggregate to check that it's filled into LSBs.  Overall, at least these
formerly-failing tests now pass on powerpc64:

- run-make/extern-fn-struct-passing-abi
- run-make/extern-fn-with-packed-struct
- run-pass/extern-pass-TwoU16s.rs
- run-pass/extern-pass-TwoU8s.rs
- run-pass/struct-return.rs
src/librustc_trans/cabi_powerpc64.rs
src/test/run-make/extern-fn-struct-passing-abi/test.c
src/test/run-make/extern-fn-struct-passing-abi/test.rs
src/test/run-make/extern-fn-with-packed-struct/test.c
src/test/run-make/extern-fn-with-packed-struct/test.rs