Szabolcs Nagy <szabolcs.n...@arm.com> writes: > gcc/testsuite/ChangeLog: > > * gcc.target/aarch64/eh_return-2.c: New test. > * gcc.target/aarch64/eh_return-3.c: New test. > > --- > v2: check-function-bodies in eh_return-3.c > (this is not very robust, but easier to read) > --- > .../gcc.target/aarch64/eh_return-2.c | 9 ++++++ > .../gcc.target/aarch64/eh_return-3.c | 30 +++++++++++++++++++ > 2 files changed, 39 insertions(+) > create mode 100644 gcc/testsuite/gcc.target/aarch64/eh_return-2.c > create mode 100644 gcc/testsuite/gcc.target/aarch64/eh_return-3.c > > diff --git a/gcc/testsuite/gcc.target/aarch64/eh_return-2.c > b/gcc/testsuite/gcc.target/aarch64/eh_return-2.c > new file mode 100644 > index 00000000000..4a9d124e891 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/aarch64/eh_return-2.c > @@ -0,0 +1,9 @@ > +/* { dg-do compile } */ > +/* { dg-final { scan-assembler "add\tsp, sp, x5" } } */ > +/* { dg-final { scan-assembler "br\tx6" } } */ > + > +void > +foo (unsigned long off, void *handler) > +{ > + __builtin_eh_return (off, handler); > +} > diff --git a/gcc/testsuite/gcc.target/aarch64/eh_return-3.c > b/gcc/testsuite/gcc.target/aarch64/eh_return-3.c > new file mode 100644 > index 00000000000..bfbe92af427 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/aarch64/eh_return-3.c > @@ -0,0 +1,30 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -mbranch-protection=pac-ret+leaf" } */
Probably best to add -fno-schedule-insns -fno-schedule-insns2, so that the instructions in the check-function-bodies are in a more predictable order. > +/* { dg-final { check-function-bodies "**" "" "" } } */ > + > +/* > +**foo: > +** hint 25 // paciasp > +** stp x0, x1, .* > +** stp x2, x3, .* > +** cbz w2, .* > +** mov x4, 0 > +** ldp x2, x3, .* > +** ldp x0, x1, .* > +** cbz x4, .* > +** add sp, sp, x5 > +** br x6 > +** hint 29 // autiasp > +** ret > +** mov x5, x0 > +** mov x6, x1 > +** mov x4, 1 > +** b .* > +*/ What's the significance of x3 here? It looks from the function definition like it should be undefined. And what are the stps and ldps doing? If those aren't an important part of the test, it might be better to stub them out with "...", e.g.: /* **foo: ** hint 25 // paciasp ** ... ** cbz w2, .* ** mov x4, 0 ** ... ** cbz x4, .* ** add sp, sp, x5 ** br x6 ** hint 29 // autiasp ** ret ** mov x5, x0 ** mov x6, x1 ** mov x4, 1 ** b .* */ LGTM otherwise. Thanks, Richard > +void > +foo (unsigned long off, void *handler, int c) > +{ > + if (c) > + return; > + __builtin_eh_return (off, handler); > +}