summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2016-02-07 09:30:58 -0800
committerH.J. Lu <hjl.tools@gmail.com>2016-03-02 09:31:33 -0800
commit6544171ed150d78a9d0bb952c28338b68269f17c (patch)
tree3e7aa6024bef21aeb2f1d27e9c5fcd205cefc351
parentb0c400c037208cbe240af6135f09c33461c7e5ad (diff)
downloadgcc-hjl/pr60336/psabi.tar.gz
Add a call target hook: function_skip_empty_type_phjl/pr60336/psabi
A function call target hook, function_skip_empty_type_p, is added, which defaults to return false. This ABI change is enabled only if the ABI level is at least 10, which is updated in GCC 6, and the target hook TARGET_FUNCTION_SKIP_EMPTY_TYPE_P returns true, which is used by target whose psABI specifies that no memory slot nor register should be used to pass or return an object of empty type whose address isn't needed. gcc/ PR c++/60336 PR middle-end/67239 PR target/68355 * target.def (calls): Add function_skip_empty_type_p. * tree.c (type_is_empty_type_p): Return false if targetm.calls.function_skip_empty_type_p return false. * config/i386/i386.c (TARGET_FUNCTION_SKIP_EMPTY_TYPE_P): New hook to return true. * doc/tm.texi.in (TARGET_FUNCTION_SKIP_EMPTY_TYPE_P): New hook. * doc/tm.texi: Regenerated. gcc/testsuite/ PR c++/60336 PR middle-end/67239 PR target/68355 * g++.dg/abi/empty12.C: Enabled only for x86 targets. * g++.dg/abi/empty12.h: Likewise. * g++.dg/abi/empty12a.c: Likewise. * g++.dg/abi/empty13.C: Likewise. * g++.dg/abi/empty13.h: Likewise. * g++.dg/abi/empty13a.c: Likewise. * g++.dg/abi/empty14.C: Likewise. * g++.dg/abi/empty14.h: Likewise. * g++.dg/abi/empty14a.c: Likewise. * g++.dg/abi/empty15.C: Likewise. * g++.dg/abi/empty15.h: Likewise. * g++.dg/abi/empty15a.c: Likewise. * g++.dg/abi/empty16.C: Likewise. * g++.dg/abi/empty16.h: Likewise. * g++.dg/abi/empty16a.c: Likewise. * g++.dg/abi/empty17.C: Likewise. * g++.dg/abi/empty17.h: Likewise. * g++.dg/abi/empty17a.c: Likewise. * g++.dg/pr60336-1.C: Likewise. * g++.dg/pr60336-2.C: Likewise. * g++.dg/pr60336-3.C: Likewise. * g++.dg/pr60336-4.C: Likewise. * g++.dg/pr60336-5.C: Likewise. * g++.dg/pr60336-6.C: Likewise. * g++.dg/pr60336-7.C: Likewise. * g++.dg/pr60336-8.C: Likewise. * g++.dg/pr60336-9.C: Likewise. * g++.dg/pr60336-10.C: Likewise. * g++.dg/pr60336-11.C: Likewise. * g++.dg/pr60336-12.C: Likewise. * g++.dg/pr68355.C: Likewise.
-rw-r--r--gcc/config/i386/i386.c3
-rw-r--r--gcc/doc/tm.texi6
-rw-r--r--gcc/doc/tm.texi.in2
-rw-r--r--gcc/target.def10
-rw-r--r--gcc/testsuite/g++.dg/abi/empty12.C2
-rw-r--r--gcc/testsuite/g++.dg/abi/empty13.C2
-rw-r--r--gcc/testsuite/g++.dg/abi/empty14.C2
-rw-r--r--gcc/testsuite/g++.dg/abi/empty15.C2
-rw-r--r--gcc/testsuite/g++.dg/abi/empty16.C2
-rw-r--r--gcc/testsuite/g++.dg/abi/empty17.C2
-rw-r--r--gcc/testsuite/g++.dg/pr60336-1.C2
-rw-r--r--gcc/testsuite/g++.dg/pr60336-10.C2
-rw-r--r--gcc/testsuite/g++.dg/pr60336-11.C2
-rw-r--r--gcc/testsuite/g++.dg/pr60336-12.C2
-rw-r--r--gcc/testsuite/g++.dg/pr60336-2.C2
-rw-r--r--gcc/testsuite/g++.dg/pr60336-3.C2
-rw-r--r--gcc/testsuite/g++.dg/pr60336-5.C2
-rw-r--r--gcc/testsuite/g++.dg/pr60336-6.C2
-rw-r--r--gcc/testsuite/g++.dg/pr60336-7.C2
-rw-r--r--gcc/testsuite/g++.dg/pr60336-8.C2
-rw-r--r--gcc/testsuite/g++.dg/pr60336-9.C2
-rw-r--r--gcc/testsuite/g++.dg/pr68355.C2
-rw-r--r--gcc/tree.c3
23 files changed, 42 insertions, 18 deletions
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 0cf6fb2d858..754ca021b56 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -54561,6 +54561,9 @@ ix86_addr_space_zero_address_valid (addr_space_t as)
#undef TARGET_PROMOTE_FUNCTION_MODE
#define TARGET_PROMOTE_FUNCTION_MODE ix86_promote_function_mode
+#undef TARGET_FUNCTION_SKIP_EMPTY_TYPE_P
+#define TARGET_FUNCTION_SKIP_EMPTY_TYPE_P hook_bool_void_true
+
#undef TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE
#define TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE ix86_override_options_after_change
diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi
index 8b3bccda967..9cd04515f46 100644
--- a/gcc/doc/tm.texi
+++ b/gcc/doc/tm.texi
@@ -969,6 +969,12 @@ also define the hook to @code{default_promote_function_mode_always_promote}
if you would like to apply the same rules given by @code{PROMOTE_MODE}.
@end deftypefn
+@deftypefn {Target Hook} bool TARGET_FUNCTION_SKIP_EMPTY_TYPE_P (void)
+This hook should return true if no memory slot nor register should be
+used to pass or return an object of empty type. The default is to
+return @code{false}.
+@end deftypefn
+
@defmac PARM_BOUNDARY
Normal alignment required for function parameters on the stack, in
bits. All stack parameters receive at least this much alignment
diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in
index f31c763991c..3b978e6e313 100644
--- a/gcc/doc/tm.texi.in
+++ b/gcc/doc/tm.texi.in
@@ -923,6 +923,8 @@ Do not define this macro if it would never modify @var{m}.
@hook TARGET_PROMOTE_FUNCTION_MODE
+@hook TARGET_FUNCTION_SKIP_EMPTY_TYPE_P
+
@defmac PARM_BOUNDARY
Normal alignment required for function parameters on the stack, in
bits. All stack parameters receive at least this much alignment
diff --git a/gcc/target.def b/gcc/target.def
index 5c8e4e16cc1..b6d28cf179e 100644
--- a/gcc/target.def
+++ b/gcc/target.def
@@ -4035,6 +4035,16 @@ supported by the target.",
/* Members of struct call have no special macro prefix. */
HOOK_VECTOR (TARGET_CALLS, calls)
+/* Returns true if no memory slot nor register should be used to pass
+ or return an object of empty type. */
+DEFHOOK
+(function_skip_empty_type_p,
+ "This hook should return true if no memory slot nor register should be\n\
+used to pass or return an object of empty type. The default is to\n\
+return @code{false}.",
+ bool, (void),
+ hook_bool_void_false)
+
DEFHOOK
(promote_function_mode,
"Like @code{PROMOTE_MODE}, but it is applied to outgoing function arguments or\n\
diff --git a/gcc/testsuite/g++.dg/abi/empty12.C b/gcc/testsuite/g++.dg/abi/empty12.C
index ff2909c84dc..3e97af6a7d6 100644
--- a/gcc/testsuite/g++.dg/abi/empty12.C
+++ b/gcc/testsuite/g++.dg/abi/empty12.C
@@ -1,5 +1,5 @@
// PR c++/60336
-// { dg-do run }
+// { dg-do run { target i?86-*-* x86_64-*-* } }
// { dg-options "-x c" }
// { dg-additional-sources "empty12a.c" }
// { dg-prune-output "command line option" }
diff --git a/gcc/testsuite/g++.dg/abi/empty13.C b/gcc/testsuite/g++.dg/abi/empty13.C
index d1e094685de..d2e297edbb2 100644
--- a/gcc/testsuite/g++.dg/abi/empty13.C
+++ b/gcc/testsuite/g++.dg/abi/empty13.C
@@ -1,5 +1,5 @@
// PR c++/60336
-// { dg-do run }
+// { dg-do run { target i?86-*-* x86_64-*-* } }
// { dg-options "-x c -fabi-version=9" }
// { dg-additional-sources "empty13a.c" }
// { dg-prune-output "command line option" }
diff --git a/gcc/testsuite/g++.dg/abi/empty14.C b/gcc/testsuite/g++.dg/abi/empty14.C
index 712d4e8a3fc..208518812eb 100644
--- a/gcc/testsuite/g++.dg/abi/empty14.C
+++ b/gcc/testsuite/g++.dg/abi/empty14.C
@@ -1,5 +1,5 @@
// PR c++/60336
-// { dg-do run }
+// { dg-do run { target i?86-*-* x86_64-*-* } }
// { dg-options "-x c" }
// { dg-additional-sources "empty14a.c" }
// { dg-prune-output "command line option" }
diff --git a/gcc/testsuite/g++.dg/abi/empty15.C b/gcc/testsuite/g++.dg/abi/empty15.C
index 24bf047bd79..34f78aee6df 100644
--- a/gcc/testsuite/g++.dg/abi/empty15.C
+++ b/gcc/testsuite/g++.dg/abi/empty15.C
@@ -1,5 +1,5 @@
// PR c++/60336
-// { dg-do run }
+// { dg-do run { target i?86-*-* x86_64-*-* } }
// { dg-options "-x c" }
// { dg-additional-sources "empty15a.c" }
// { dg-prune-output "command line option" }
diff --git a/gcc/testsuite/g++.dg/abi/empty16.C b/gcc/testsuite/g++.dg/abi/empty16.C
index f058720e7ba..200d2abc62c 100644
--- a/gcc/testsuite/g++.dg/abi/empty16.C
+++ b/gcc/testsuite/g++.dg/abi/empty16.C
@@ -1,5 +1,5 @@
// PR c++/60336
-// { dg-do run }
+// { dg-do run { target i?86-*-* x86_64-*-* } }
// { dg-options "-x c" }
// { dg-additional-sources "empty16a.c" }
// { dg-prune-output "command line option" }
diff --git a/gcc/testsuite/g++.dg/abi/empty17.C b/gcc/testsuite/g++.dg/abi/empty17.C
index f6f88c85556..72211018286 100644
--- a/gcc/testsuite/g++.dg/abi/empty17.C
+++ b/gcc/testsuite/g++.dg/abi/empty17.C
@@ -1,5 +1,5 @@
// PR c++/60336
-// { dg-do run }
+// { dg-do run { target i?86-*-* x86_64-*-* } }
// { dg-options "-x c" }
// { dg-additional-sources "empty17a.c" }
// { dg-prune-output "command line option" }
diff --git a/gcc/testsuite/g++.dg/pr60336-1.C b/gcc/testsuite/g++.dg/pr60336-1.C
index af0863887a0..946f8accda2 100644
--- a/gcc/testsuite/g++.dg/pr60336-1.C
+++ b/gcc/testsuite/g++.dg/pr60336-1.C
@@ -1,4 +1,4 @@
-// { dg-do compile }
+// { dg-do compile { target i?86-*-* x86_64-*-* } }
// { dg-options "-O2 -std=c++11 -fno-pic" }
// { dg-require-effective-target fpic }
diff --git a/gcc/testsuite/g++.dg/pr60336-10.C b/gcc/testsuite/g++.dg/pr60336-10.C
index 6c9c990dad6..57707fca749 100644
--- a/gcc/testsuite/g++.dg/pr60336-10.C
+++ b/gcc/testsuite/g++.dg/pr60336-10.C
@@ -1,4 +1,4 @@
-// { dg-do run }
+// { dg-do run { target i?86-*-* x86_64-*-* } }
// { dg-options "-O2" }
#include <stdarg.h>
diff --git a/gcc/testsuite/g++.dg/pr60336-11.C b/gcc/testsuite/g++.dg/pr60336-11.C
index c92f3d43a5b..32000b2ebe5 100644
--- a/gcc/testsuite/g++.dg/pr60336-11.C
+++ b/gcc/testsuite/g++.dg/pr60336-11.C
@@ -1,4 +1,4 @@
-// { dg-do run }
+// { dg-do run { target i?86-*-* x86_64-*-* } }
// { dg-options "-O2" }
#include <stdarg.h>
diff --git a/gcc/testsuite/g++.dg/pr60336-12.C b/gcc/testsuite/g++.dg/pr60336-12.C
index 83a7bb0cfa0..febcc6fcf2e 100644
--- a/gcc/testsuite/g++.dg/pr60336-12.C
+++ b/gcc/testsuite/g++.dg/pr60336-12.C
@@ -1,4 +1,4 @@
-// { dg-do run }
+// { dg-do run { target i?86-*-* x86_64-*-* } }
// { dg-options "-O2" }
#include <stdarg.h>
diff --git a/gcc/testsuite/g++.dg/pr60336-2.C b/gcc/testsuite/g++.dg/pr60336-2.C
index ad63ceedfc1..dcde99c836e 100644
--- a/gcc/testsuite/g++.dg/pr60336-2.C
+++ b/gcc/testsuite/g++.dg/pr60336-2.C
@@ -1,4 +1,4 @@
-// { dg-do run }
+// { dg-do run { target i?86-*-* x86_64-*-* } }
// { dg-options "-O2" }
#include <stdarg.h>
diff --git a/gcc/testsuite/g++.dg/pr60336-3.C b/gcc/testsuite/g++.dg/pr60336-3.C
index 9ec4914c7ac..d126cb58705 100644
--- a/gcc/testsuite/g++.dg/pr60336-3.C
+++ b/gcc/testsuite/g++.dg/pr60336-3.C
@@ -1,4 +1,4 @@
-// { dg-do compile }
+// { dg-do compile { target i?86-*-* x86_64-*-* } }
// { dg-options "-O2" }
struct dummy { struct{}__attribute__((aligned (4))) a[7]; };
diff --git a/gcc/testsuite/g++.dg/pr60336-5.C b/gcc/testsuite/g++.dg/pr60336-5.C
index b0c76ad5aa2..a051f6e6105 100644
--- a/gcc/testsuite/g++.dg/pr60336-5.C
+++ b/gcc/testsuite/g++.dg/pr60336-5.C
@@ -1,4 +1,4 @@
-// { dg-do compile }
+// { dg-do compile { target i?86-*-* x86_64-*-* } }
// { dg-options "-O2 -std=c++11 -fno-pic" }
// { dg-require-effective-target fpic }
diff --git a/gcc/testsuite/g++.dg/pr60336-6.C b/gcc/testsuite/g++.dg/pr60336-6.C
index 58796519334..22728d364fd 100644
--- a/gcc/testsuite/g++.dg/pr60336-6.C
+++ b/gcc/testsuite/g++.dg/pr60336-6.C
@@ -1,4 +1,4 @@
-// { dg-do compile }
+// { dg-do compile { target i?86-*-* x86_64-*-* } }
// { dg-options "-O2 -std=c++11 -fno-pic" }
// { dg-require-effective-target fpic }
diff --git a/gcc/testsuite/g++.dg/pr60336-7.C b/gcc/testsuite/g++.dg/pr60336-7.C
index 0e5d2ef2f11..5fc8320c7de 100644
--- a/gcc/testsuite/g++.dg/pr60336-7.C
+++ b/gcc/testsuite/g++.dg/pr60336-7.C
@@ -1,4 +1,4 @@
-// { dg-do compile }
+// { dg-do compile { target i?86-*-* x86_64-*-* } }
// { dg-options "-O2 -std=c++11 -fno-pic" }
// { dg-require-effective-target fpic }
diff --git a/gcc/testsuite/g++.dg/pr60336-8.C b/gcc/testsuite/g++.dg/pr60336-8.C
index 2c22f78787c..e88dbb44aed 100644
--- a/gcc/testsuite/g++.dg/pr60336-8.C
+++ b/gcc/testsuite/g++.dg/pr60336-8.C
@@ -1,4 +1,4 @@
-// { dg-do compile }
+// { dg-do compile { target i?86-*-* x86_64-*-* } }
// { dg-options "-O2" }
struct dummy { struct{} a[7][3]; };
diff --git a/gcc/testsuite/g++.dg/pr60336-9.C b/gcc/testsuite/g++.dg/pr60336-9.C
index 4ad333f6b9c..3d768c06f14 100644
--- a/gcc/testsuite/g++.dg/pr60336-9.C
+++ b/gcc/testsuite/g++.dg/pr60336-9.C
@@ -1,4 +1,4 @@
-// { dg-do compile }
+// { dg-do compile { target i?86-*-* x86_64-*-* } }
// { dg-options "-O2 -std=c++11 -fno-pic" }
// { dg-require-effective-target fpic }
diff --git a/gcc/testsuite/g++.dg/pr68355.C b/gcc/testsuite/g++.dg/pr68355.C
index 1354fc497b5..5c2f0da3fd3 100644
--- a/gcc/testsuite/g++.dg/pr68355.C
+++ b/gcc/testsuite/g++.dg/pr68355.C
@@ -1,4 +1,4 @@
-// { dg-do compile }
+// { dg-do compile { target i?86-*-* x86_64-*-* } }
// { dg-options "-O2 -std=c++11 -fno-pic" }
// { dg-require-effective-target fpic }
diff --git a/gcc/tree.c b/gcc/tree.c
index 900a4fa1b89..8891cb95273 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -14078,6 +14078,9 @@ is_empty_type (tree type)
bool
type_is_empty_type_p (const_tree type)
{
+ if (!targetm.calls.function_skip_empty_type_p ())
+ return false;
+
if (!abi_version_at_least (10))
return false;