Go to file
Matthew Malcomson e73a32d6d4 [AArch64] (PR94383) Avoid C++17 empty base field checking for HVA/HFA
In C++17, an empty class deriving from an empty base is not an
aggregate, while in C++14 it is.  In order to implement this, GCC adds
an artificial field to such classes.

This artificial field has no mapping to Fundamental Data Types in the
AArch64 PCS ABI and hence should not count towards determining whether an
object can be passed using the vector registers as per section
"6.4.2 Parameter Passing Rules" in the AArch64 PCS.
https://github.com/ARM-software/abi-aa/blob/master/aapcs64/aapcs64.rst#the-base-procedure-call-standard

This patch avoids counting this artificial field in
aapcs_vfp_sub_candidate, and hence calculates whether such objects
should be passed in vector registers in the same manner as C++14 (where
the artificial field does not exist).

Before this change, the test below would pass the arguments to `f` in
general registers.  After this change, the test passes the arguments to
`f` using the vector registers.

The new behaviour matches the behaviour of `armclang`, and also matches
the behaviour when run with `-std=gnu++14`.

> gcc -std=gnu++17 test.cpp

``` test.cpp
struct base {};

struct pair : base
{
  float first;
  float second;
  pair (float f, float s) : first(f), second(s) {}
};

void f (pair);
int main()
{
  f({3.14, 666});
  return 1;
}
```

We add a `-Wpsabi` warning to catch cases where this fix has changed the ABI for
some functions.  Unfortunately this warning is not emitted twice for multiple
calls to the same function, but I feel this is not much of a problem and can be
fixed later if needs be.

(i.e. if `main` called `f` twice in a row we only emit a diagnostic for the
first).

Testing:
    Bootstrap and regression test on aarch64-linux.
    All struct-layout-1 tests now pass.

gcc/ChangeLog:

2020-04-23  Matthew Malcomson  <matthew.malcomson@arm.com>
	    Jakub Jelinek  <jakub@redhat.com>

	PR target/94383
	* config/aarch64/aarch64.c (aapcs_vfp_sub_candidate): Account for C++17
	empty base class artificial fields.
	(aarch64_vfp_is_call_or_return_candidate): Warn when ABI PCS decision is
	different after this fix.
2020-04-23 15:33:55 +01:00
config libgfortran: Provide some further math library fallbacks [PR94694] 2020-04-22 21:34:19 +02:00
contrib Do not modify tab options in vimrc for .py files. 2020-04-17 08:55:55 +02:00
fixincludes
gcc [AArch64] (PR94383) Avoid C++17 empty base field checking for HVA/HFA 2020-04-23 15:33:55 +01:00
gnattools
gotools
include Do not use HAVE_DOS_BASED_FILE_SYSTEM for Cygwin. 2020-04-17 09:22:51 +02:00
INSTALL
intl intl: Unbreak intl build with bison 3 when no regeneration is needed [PR92008] 2020-04-16 11:55:00 +02:00
libada
libatomic i386: Remove unneeded assignments when triggering SSE exceptions 2020-04-19 14:27:12 +02:00
libbacktrace
libcc1
libcpp
libdecnumber
libffi
libgcc aarch64, libgcc: Fix unwinding from pac-ret to normal frames [PR94514] 2020-04-21 17:49:01 +01:00
libgfortran Protect the trigd functions in libgfortran from unavailable math functions. 2020-04-23 10:11:01 -04:00
libgo gccgo: fix runtime compilation on NetBSD 2020-04-20 21:20:53 -07:00
libgomp amdgcn: Check HSA return codes [PR94629] 2020-04-23 15:05:23 +01:00
libhsail-rt
libiberty
libitm
libobjc
liboffloadmic
libphobos libphobos: Remove GDCFLAGSX variable from configure scripts. 2020-04-21 23:03:23 +02:00
libquadmath
libsanitizer
libssp
libstdc++-v3 libstdc++: Define __cpp_lib_execution feature test macro 2020-04-22 22:54:35 +01:00
libvtv
lto-plugin
maintainer-scripts
zlib
.dir-locals.el
.gitattributes
.gitignore
ABOUT-NLS
ar-lib
ChangeLog Since the pdp11-aout target does not support gdb, gdbserver or gprof these should be excluded in configure. 2020-04-21 10:44:32 +01:00
ChangeLog.jit
ChangeLog.tree-ssa
compile
config-ml.in
config.guess
config.rpath
config.sub
configure Since the pdp11-aout target does not support gdb, gdbserver or gprof these should be excluded in configure. 2020-04-21 10:44:32 +01:00
configure.ac Since the pdp11-aout target does not support gdb, gdbserver or gprof these should be excluded in configure. 2020-04-21 10:44:32 +01:00
COPYING
COPYING3
COPYING3.LIB
COPYING.LIB
COPYING.RUNTIME
depcomp
install-sh
libtool-ldflags
libtool.m4
lt~obsolete.m4
ltgcc.m4
ltmain.sh Do not use HAVE_DOS_BASED_FILE_SYSTEM for Cygwin. 2020-04-17 09:22:51 +02:00
ltoptions.m4
ltsugar.m4
ltversion.m4
MAINTAINERS MAINTAINERS: add myself for write after approval 2020-04-22 09:39:44 +02:00
Makefile.def Merge top-level configury changes from gdb 2020-04-09 06:52:55 -06:00
Makefile.in Merge top-level configury changes from gdb 2020-04-09 06:52:55 -06:00
Makefile.tpl
missing
mkdep
mkinstalldirs
move-if-change
multilib.am
README
symlink-tree
test-driver
ylwrap

This directory contains the GNU Compiler Collection (GCC).

The GNU Compiler Collection is free software.  See the files whose
names start with COPYING for copying permission.  The manuals, and
some of the runtime libraries, are under different terms; see the
individual source files for details.

The directory INSTALL contains copies of the installation information
as HTML and plain text.  The source of this information is
gcc/doc/install.texi.  The installation information includes details
of what is included in the GCC sources and what files GCC installs.

See the file gcc/doc/gcc.texi (together with other files that it
includes) for usage and porting information.  An online readable
version of the manual is in the files gcc/doc/gcc.info*.

See http://gcc.gnu.org/bugs/ for how to report bugs usefully.

Copyright years on GCC source files may be listed using range
notation, e.g., 1987-2012, indicating that every year in the range,
inclusive, is a copyrightable year that could otherwise be listed
individually.