aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKewen Lin <linkw@linux.ibm.com>2024-01-09 23:05:13 -0600
committerKewen Lin <linkw@linux.ibm.com>2024-01-09 23:05:13 -0600
commitcb62101787555b7b32607b431fdfe6fcc8f3830f (patch)
treed7fcceff501debd853347c808661394ada0efb03
parent1d1faf326474a20c8622007af1bdc9730397a427 (diff)
downloadgcc-cb62101787555b7b32607b431fdfe6fcc8f3830f.zip
gcc-cb62101787555b7b32607b431fdfe6fcc8f3830f.tar.gz
gcc-cb62101787555b7b32607b431fdfe6fcc8f3830f.tar.bz2
strub: Only unbias stack point for SPARC_STACK_BOUNDARY_HACK [PR113100]
As PR113100 shows, the unbiasing introduced by r14-6737 can cause the scrubbing to overrun and screw some critical data on stack like saved toc base consequently cause segfault. By checking PR112917, IMHO we should keep this unbiasing guarded under SPARC_STACK_BOUNDARY_HACK (TARGET_ARCH64 && TARGET_STACK_BIAS), similar to some existing code special treating SPARC stack bias. PR middle-end/113100 gcc/ChangeLog: * builtins.cc (expand_builtin_stack_address): Guard stack point adjustment with SPARC_STACK_BOUNDARY_HACK.
-rw-r--r--gcc/builtins.cc5
1 files changed, 4 insertions, 1 deletions
diff --git a/gcc/builtins.cc b/gcc/builtins.cc
index d176759..09f2354 100644
--- a/gcc/builtins.cc
+++ b/gcc/builtins.cc
@@ -5450,6 +5450,7 @@ expand_builtin_stack_address ()
rtx ret = convert_to_mode (ptr_mode, copy_to_reg (stack_pointer_rtx),
STACK_UNSIGNED);
+#ifdef SPARC_STACK_BOUNDARY_HACK
/* Unbias the stack pointer, bringing it to the boundary between the
stack area claimed by the active function calling this builtin,
and stack ranges that could get clobbered if it called another
@@ -5476,7 +5477,9 @@ expand_builtin_stack_address ()
(caller) function's active area as well, whereas those pushed or
allocated temporarily for a call are regarded as part of the
callee's stack range, rather than the caller's. */
- ret = plus_constant (ptr_mode, ret, STACK_POINTER_OFFSET);
+ if (SPARC_STACK_BOUNDARY_HACK)
+ ret = plus_constant (ptr_mode, ret, STACK_POINTER_OFFSET);
+#endif
return force_reg (ptr_mode, ret);
}