]> git.ipfire.org Git - thirdparty/gcc.git/commit
RISC-V: Stack-clash protection implemention
authorRaphael Moreira Zinsly <rzinsly@ventanamicro.com>
Mon, 22 Jul 2024 14:23:20 +0000 (11:23 -0300)
committerRaphael Moreira Zinsly <rzinsly@ventanamicro.com>
Fri, 9 Aug 2024 13:59:10 +0000 (10:59 -0300)
commitb82d173dac33d9e2f7d31bf84eb0d9f0c21d0240
tree7d6148fa683a8f81fba483967a3346308e0ad6d1
parent5694fcf75b65bea5d3eb42e5d28d7f3e5ee7cfd7
RISC-V: Stack-clash protection implemention

This implements stack-clash protection for riscv, with
riscv_allocate_and_probe_stack_space being based of
aarch64_allocate_and_probe_stack_space from aarch64's implementation.
We enforce the probing interval and the guard size to always be equal, their
default value is 4Kb which is riscv page size.

We also probe up by 1024 bytes in the general case when a probe is required.

gcc/ChangeLog:
* config/riscv/riscv.cc
(riscv_option_override): Enforce that interval is the same size as
guard size.
(riscv_allocate_and_probe_stack_space): New function.
(riscv_expand_prologue): Call riscv_allocate_and_probe_stack_space
to the final allocation of the stack and add stack-clash dump
information.
* config/riscv/riscv.h: Define STACK_CLASH_CALLER_GUARD and
STACK_CLASH_MAX_UNROLL_PAGES.

gcc/testsuite/ChangeLog:
* gcc.dg/params/blocksort-part.c: Skip riscv for
stack-clash protection intervals.
* gcc.dg/pr82788.c: Skip riscv.
* gcc.dg/stack-check-6.c: Skip residual check for riscv.
* gcc.dg/stack-check-6a.c: Skip riscv.
* gcc.target/riscv/stack-check-12.c: New test.
* gcc.target/riscv/stack-check-13.c: New test.
* gcc.target/riscv/stack-check-cfa-1.c: New test.
* gcc.target/riscv/stack-check-cfa-2.c: New test.
* gcc.target/riscv/stack-check-prologue-1.c: New test.
* gcc.target/riscv/stack-check-prologue-10.c: New test.
* gcc.target/riscv/stack-check-prologue-11.c: New test.
* gcc.target/riscv/stack-check-prologue-12.c: New test.
* gcc.target/riscv/stack-check-prologue-13.c: New test.
* gcc.target/riscv/stack-check-prologue-14.c: New test.
* gcc.target/riscv/stack-check-prologue-15.c: New test.
* gcc.target/riscv/stack-check-prologue-2.c: New test.
* gcc.target/riscv/stack-check-prologue-3.c: New test.
* gcc.target/riscv/stack-check-prologue-4.c: New test.
* gcc.target/riscv/stack-check-prologue-5.c: New test.
* gcc.target/riscv/stack-check-prologue-6.c: New test.
* gcc.target/riscv/stack-check-prologue-7.c: New test.
* gcc.target/riscv/stack-check-prologue-8.c: New test.
* gcc.target/riscv/stack-check-prologue-9.c: New test.
* gcc.target/riscv/stack-check-prologue.h: New file.
* lib/target-supports.exp
(check_effective_target_supports_stack_clash_protection):
Add riscv.
(check_effective_target_caller_implicit_probes): Likewise.
27 files changed:
gcc/config/riscv/riscv.cc
gcc/config/riscv/riscv.h
gcc/testsuite/gcc.dg/params/blocksort-part.c
gcc/testsuite/gcc.dg/pr82788.c
gcc/testsuite/gcc.dg/stack-check-6.c
gcc/testsuite/gcc.dg/stack-check-6a.c
gcc/testsuite/gcc.target/riscv/stack-check-12.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/stack-check-13.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/stack-check-cfa-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/stack-check-cfa-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/stack-check-prologue-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/stack-check-prologue-10.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/stack-check-prologue-11.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/stack-check-prologue-12.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/stack-check-prologue-13.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/stack-check-prologue-14.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/stack-check-prologue-15.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/stack-check-prologue-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/stack-check-prologue-3.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/stack-check-prologue-4.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/stack-check-prologue-5.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/stack-check-prologue-6.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/stack-check-prologue-7.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/stack-check-prologue-8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/stack-check-prologue-9.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/stack-check-prologue.h [new file with mode: 0644]
gcc/testsuite/lib/target-supports.exp