Hi all, When committing my b-key patch (r271735) I didn't svn add the new test files, this patch adds them and moves the exception tests to g++.target/aarch64.
Tested on aarch64-none-linux-gnu and aarch64-none-elf. OK for trunk? gcc/testsuite 2019-06-05 Sam Tebbs<sam.te...@arm.com> * gcc.target/aarch64/return_address_sign_b_1.c: New file. * gcc.target/aarch64/return_address_sign_b_2.c: New file. * gcc.target/aarch64/return_address_sign_b_3.c: New file. * gcc.target/aarch64/return_address_sign_builtin.c: New file. * g++.target/aarch64/return_address_sign_ab_exception.C: New file. * g++.target/aarch64/return_address_sign_b_exception.C: New file.
diff --git a/gcc/testsuite/g++.target/aarch64/return_address_sign_ab_exception.C b/gcc/testsuite/g++.target/aarch64/return_address_sign_ab_exception.C new file mode 100644 index 0000000000000000000000000000000000000000..520cd180beeba317a12d2404ce6e252eaeb6aa90 --- /dev/null +++ b/gcc/testsuite/g++.target/aarch64/return_address_sign_ab_exception.C @@ -0,0 +1,30 @@ +/* { dg-do run } */ +/* { dg-options "--save-temps" } */ + +__attribute__((target("branch-protection=pac-ret+leaf"))) +int foo_a () { + throw 22; +} + +__attribute__((target("branch-protection=pac-ret+leaf+b-key"))) +int foo_b () { + throw 22; +} + +int main (int argc, char** argv) { + try { + foo_a (); + } catch (...) { + try { + foo_b (); + } catch (...) { + return 0; + } + } + return 1; +} + +/* { dg-final { scan-assembler-times "paciasp" 1 } } */ +/* { dg-final { scan-assembler-times "pacibsp" 1 } } */ +/* { dg-final { scan-assembler-times ".cfi_b_key_frame" 1 } } */ + diff --git a/gcc/testsuite/g++.target/aarch64/return_address_sign_b_exception.C b/gcc/testsuite/g++.target/aarch64/return_address_sign_b_exception.C new file mode 100644 index 0000000000000000000000000000000000000000..eab2869e004b245944d2222b696e34dc4db90e6e --- /dev/null +++ b/gcc/testsuite/g++.target/aarch64/return_address_sign_b_exception.C @@ -0,0 +1,17 @@ +/* { dg-do run } */ +/* { dg-options "-mbranch-protection=pac-ret+leaf+b-key --save-temps" } */ + +int foo () { + throw 22; +} + +int main (int argc, char** argv) { + try { + foo(); + } catch (...) { + return 0; + } + return 1; +} + +/* { dg-final { scan-assembler-times ".cfi_b_key_frame" 2 } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/return_address_sign_b_1.c b/gcc/testsuite/gcc.target/aarch64/return_address_sign_b_1.c new file mode 100644 index 0000000000000000000000000000000000000000..32d788ddf3fb72545d7c4b9869d8e445bdaaab37 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/return_address_sign_b_1.c @@ -0,0 +1,52 @@ +/* Testing return address signing where no combined instructions used. */ +/* { dg-do compile } */ +/* { dg-options "-O2 -mbranch-protection=pac-ret+leaf+b-key" } */ +/* { dg-require-effective-target lp64 } */ + +int foo (int); + +/* sibcall only. */ +int __attribute__ ((target ("arch=armv8.3-a"))) +func1 (int a, int b) +{ + /* pacibsp */ + return foo (a + b); + /* autibsp */ +} + +/* non-leaf function with sibcall. */ +int __attribute__ ((target ("arch=armv8.3-a"))) +func2 (int a, int b) +{ + /* pacibsp */ + if (a < b) + return b; + + a = foo (b); + + return foo (a); + /* autibsp */ +} + +/* non-leaf function, legacy arch. */ +int __attribute__ ((target ("arch=armv8.2-a"))) +func3 (int a, int b, int c) +{ + /* pacibsp */ + return a + foo (b) + c; + /* autibsp */ +} + +/* eh_return. */ +void __attribute__ ((target ("arch=armv8.3-a"))) +func4 (long offset, void *handler, int *ptr, int imm1, int imm2) +{ + /* pacibsp */ + *ptr = imm1 + foo (imm1) + imm2; + __builtin_eh_return (offset, handler); + /* autibsp */ + return; +} + +/* { dg-final { scan-assembler-times "pacibsp" 4 } } */ +/* { dg-final { scan-assembler-times "autibsp" 4 } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/return_address_sign_b_2.c b/gcc/testsuite/gcc.target/aarch64/return_address_sign_b_2.c new file mode 100644 index 0000000000000000000000000000000000000000..9ed64ce05911475268e9ef95e88e873e21611085 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/return_address_sign_b_2.c @@ -0,0 +1,18 @@ +/* Testing return address signing where combined instructions used. */ +/* { dg-do compile } */ +/* { dg-options "-O2 -mbranch-protection=pac-ret+leaf+b-key" } */ +/* { dg-require-effective-target lp64 } */ + +int foo (int); +int bar (int, int); + +int __attribute__ ((target ("arch=armv8.3-a"))) +func1 (int a, int b, int c) +{ + /* pacibsp */ + return a + foo (b) + c; + /* retab */ +} + +/* { dg-final { scan-assembler-times "pacibsp" 1 } } */ +/* { dg-final { scan-assembler-times "retab" 1 } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/return_address_sign_b_3.c b/gcc/testsuite/gcc.target/aarch64/return_address_sign_b_3.c new file mode 100644 index 0000000000000000000000000000000000000000..7183cc2f2b1c1692d5eda9c96c237d2e308060fb --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/return_address_sign_b_3.c @@ -0,0 +1,22 @@ +/* Testing the disable of return address signing. */ +/* { dg-do compile } */ +/* { dg-options "-O2 -mbranch-protection=pac-ret+leaf+b-key" } */ +/* { dg-require-effective-target lp64 } */ + +int bar (int, int); + +int __attribute__ ((target ("arch=armv8.3-a,branch-protection=pac-ret+b-key"))) +func1_leaf (int a, int b, int c, int d) +{ + return a + b + c + d; +} + +int __attribute__ ((target ("arch=armv8.3-a,branch-protection=none"))) +func2_none (int a, int b, int c, int d) +{ + return c + bar (a, b) + d; +} + +/* { dg-final { scan-assembler-not "pacibsp" } } */ +/* { dg-final { scan-assembler-not "autibsp" } } */ +/* { dg-final { scan-assembler-not "retab" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/return_address_sign_builtin.c b/gcc/testsuite/gcc.target/aarch64/return_address_sign_builtin.c new file mode 100644 index 0000000000000000000000000000000000000000..0a01bfc9da45589740f9939d780805c27379c650 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/return_address_sign_builtin.c @@ -0,0 +1,16 @@ +/* { dg-do compile } */ +/* { dg-options "-mbranch-protection=pac-ret+leaf+b-key" } */ + +/* The correct pauth instruction should be generated no matter the return + address signing key/scope specified in the options. */ + +int foo() { + /* { dg-final { scan-assembler-times "pacia1716" 1 } } */ + __builtin_aarch64_pacia1716(0, 0); + /* { dg-final { scan-assembler-times "pacib1716" 1 } } */ + __builtin_aarch64_pacib1716(0, 0); + /* { dg-final { scan-assembler-times "autia1716" 1 } } */ + __builtin_aarch64_autia1716(0, 0); + /* { dg-final { scan-assembler-times "autib1716" 1 } } */ + __builtin_aarch64_autib1716(0, 0); +}