aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAlexandre Oliva <oliva@adacore.com>2020-06-10 17:56:36 -0300
committerGiuliano Belinassi <giuliano.belinassi@usp.br>2020-08-17 13:11:51 -0300
commit261a4d68c99c1f447223a063962531ec2f496c22 (patch)
tree329db8007330b844cb4d8935d3c62edde26a4244 /gcc
parentce6914411cd7d4133f829aae6dcea01069c69fc5 (diff)
downloadgcc-261a4d68c99c1f447223a063962531ec2f496c22.zip
gcc-261a4d68c99c1f447223a063962531ec2f496c22.tar.gz
gcc-261a4d68c99c1f447223a063962531ec2f496c22.tar.bz2
[PR51447] restore the global reg var before returning from main
A runtime system might legitimately hold in rbx a value expected to be preserved across the call to main, but its use as a global register variable stops main from preserving it. for gcc/testsuite/ChangeLog PR rtl-optimization/51447 * gcc.c-torture/execute/pr51447.c (main): Preserve call-saved register.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/pr51447.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr51447.c b/gcc/testsuite/gcc.c-torture/execute/pr51447.c
index 887ddb7..1d00953 100644
--- a/gcc/testsuite/gcc.c-torture/execute/pr51447.c
+++ b/gcc/testsuite/gcc.c-torture/execute/pr51447.c
@@ -14,6 +14,9 @@ int
main (void)
{
__label__ nonlocal_lab;
+#ifdef __x86_64__
+ void *save = ptr;
+#endif
__attribute__((noinline, noclone)) void
bar (void *func)
{
@@ -25,5 +28,8 @@ main (void)
nonlocal_lab:
if (ptr != &&nonlocal_lab)
abort ();
+#ifdef __x86_64__
+ ptr = save; /* Restore the call-saved register. */
+#endif
return 0;
}