diff options
author | Christoph Muellner <christoph.muellner@theobroma-systems.com> | 2018-05-24 10:15:07 +0200 |
---|---|---|
committer | Christoph Muellner <christoph.muellner@theobroma-systems.com> | 2018-05-24 10:15:07 +0200 |
commit | 16d3dddc0913148d8f7b3dc5b0d560934f853031 (patch) | |
tree | 2a0ee1af792ed465b1a89e1e0affdbb7b753745a | |
parent | 050f1d28b1de094b3112c0d5331322f109561713 (diff) |
aarch64: Optimize retpoline (Spectre-V2 mitigation) for aarch64.
Merging the adrp/add instruction pair to a single adr instruction.
The actual retpoline instruction sequence, which prevents speculative
indirect branches looks like this now:
str x30, [sp, #-16]!
bl 101f
100: //speculation trap
wfe
b 100b
101: //do ROP
adr x30, 102f
ret
102: //non-spec code
ldr x30, [sp], #16
Signed-off-by: Christoph Muellner <christoph.muellner@theobroma-systems.com>
19 files changed, 19 insertions, 41 deletions
diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index 1cea7c7aaf51..3a2c838a3ff0 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -12724,7 +12724,6 @@ indirect_thunk_name (char name[32], int regno) push lr bl L2 L1: wfe - dsb sy b L1 L2: mov lr, &L3 ret @@ -12765,10 +12764,7 @@ output_indirect_thunk (bool save_lr) /* L2: lr=&L3; ret */ ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, indirectlabel2); - fputs ("\tadrp\tx30, ", asm_out_file); - assemble_name_raw (asm_out_file, indirectlabel3); - fputc ('\n', asm_out_file); - fputs ("\tadd\tx30, x30, :lo12:", asm_out_file); + fputs ("\tadr\tx30, ", asm_out_file); assemble_name_raw (asm_out_file, indirectlabel3); fputc ('\n', asm_out_file); fputs ("\tret\n", asm_out_file); diff --git a/gcc/testsuite/gcc.target/aarch64/indirect-thunk-1.c b/gcc/testsuite/gcc.target/aarch64/indirect-thunk-1.c index 256aee2e1a2a..c5bd82a56d90 100644 --- a/gcc/testsuite/gcc.target/aarch64/indirect-thunk-1.c +++ b/gcc/testsuite/gcc.target/aarch64/indirect-thunk-1.c @@ -19,8 +19,7 @@ male_indirect_jump (long offset) /* { dg-final { scan-assembler "bl\[ \t\]*\.LIND1" } } */ /* { dg-final { scan-assembler "wfe" } } */ /* { dg-final { scan-assembler "b\[ \t\]*\.LIND0" } } */ -/* { dg-final { scan-assembler "adrp\[ \t\]*x30, .LIND2" } } */ -/* { dg-final { scan-assembler "add\[ \t\]*x30, x30, :lo12:.LIND2" } } */ +/* { dg-final { scan-assembler "adr\[ \t\]*x30, .LIND2" } } */ /* { dg-final { scan-assembler "ret" } } */ /* { dg-final { scan-assembler "ldr\[ \t\]*x30, \\\[sp\\\], #16" } } */ /* { dg-final { scan-assembler "br\[ \t\]*x1" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/indirect-thunk-2.c b/gcc/testsuite/gcc.target/aarch64/indirect-thunk-2.c index 8e6dc31171ad..0107bbd9559d 100644 --- a/gcc/testsuite/gcc.target/aarch64/indirect-thunk-2.c +++ b/gcc/testsuite/gcc.target/aarch64/indirect-thunk-2.c @@ -20,8 +20,7 @@ male_indirect_jump (long offset) /* { dg-final { scan-assembler "bl\[ \t\]*\.LIND1" } } */ /* { dg-final { scan-assembler "wfe" } } */ /* { dg-final { scan-assembler "b\[ \t\]*\.LIND0" } } */ -/* { dg-final { scan-assembler "adrp\[ \t\]*x30, .LIND2" } } */ -/* { dg-final { scan-assembler "add\[ \t\]*x30, x30, :lo12:.LIND2" } } */ +/* { dg-final { scan-assembler "adr\[ \t\]*x30, .LIND2" } } */ /* { dg-final { scan-assembler "ret" } } */ /* { dg-final { scan-assembler "ldr\[ \t\]*x30, \\\[sp\\\], #16" } } */ /* { dg-final { scan-assembler "br\[ \t\]*x1" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/indirect-thunk-3.c b/gcc/testsuite/gcc.target/aarch64/indirect-thunk-3.c index 2c9938244b99..d9b5cfed19b2 100644 --- a/gcc/testsuite/gcc.target/aarch64/indirect-thunk-3.c +++ b/gcc/testsuite/gcc.target/aarch64/indirect-thunk-3.c @@ -20,8 +20,7 @@ male_indirect_jump (long offset) /* { dg-final { scan-assembler "bl\[ \t\]*\.LIND1" } } */ /* { dg-final { scan-assembler "wfe" } } */ /* { dg-final { scan-assembler "b\[ \t\]*\.LIND0" } } */ -/* { dg-final { scan-assembler "adrp\[ \t\]*x30, .LIND2" } } */ -/* { dg-final { scan-assembler "add\[ \t\]*x30, x30, :lo12:.LIND2" } } */ +/* { dg-final { scan-assembler "adr\[ \t\]*x30, .LIND2" } } */ /* { dg-final { scan-assembler "ret" } } */ /* { dg-final { scan-assembler "ldr\[ \t\]*x30, \\\[sp\\\], #16" } } */ /* { dg-final { scan-assembler "br\[ \t\]*x1" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/indirect-thunk-4.c b/gcc/testsuite/gcc.target/aarch64/indirect-thunk-4.c index d09c37d8045e..b89f333457c7 100644 --- a/gcc/testsuite/gcc.target/aarch64/indirect-thunk-4.c +++ b/gcc/testsuite/gcc.target/aarch64/indirect-thunk-4.c @@ -21,8 +21,7 @@ male_indirect_jump (long offset) /* { dg-final { scan-assembler "bl\[ \t\]*\.LIND1" } } */ /* { dg-final { scan-assembler "wfe" } } */ /* { dg-final { scan-assembler "b\[ \t\]*\.LIND0" } } */ -/* { dg-final { scan-assembler "adrp\[ \t\]*x30, .LIND2" } } */ -/* { dg-final { scan-assembler "add\[ \t\]*x30, x30, :lo12:.LIND2" } } */ +/* { dg-final { scan-assembler "adr\[ \t\]*x30, .LIND2" } } */ /* { dg-final { scan-assembler "ret" } } */ /* { dg-final { scan-assembler "ldr\[ \t\]*x30, \\\[sp\\\], #16" } } */ /* { dg-final { scan-assembler "br\[ \t\]*x1" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/indirect-thunk-5.c b/gcc/testsuite/gcc.target/aarch64/indirect-thunk-5.c index d93217554ec1..eb7ccda2ae66 100644 --- a/gcc/testsuite/gcc.target/aarch64/indirect-thunk-5.c +++ b/gcc/testsuite/gcc.target/aarch64/indirect-thunk-5.c @@ -17,8 +17,7 @@ foo (void) /* { dg-final { scan-assembler "bl\[ \t\]*\.LIND1" } } */ /* { dg-final { scan-assembler "wfe" } } */ /* { dg-final { scan-assembler "b\[ \t\]*\.LIND0" } } */ -/* { dg-final { scan-assembler "adrp\[ \t\]*x30, .LIND2" } } */ -/* { dg-final { scan-assembler "add\[ \t\]*x30, x30, :lo12:.LIND2" } } */ +/* { dg-final { scan-assembler "adr\[ \t\]*x30, .LIND2" } } */ /* { dg-final { scan-assembler "ret" } } */ /* { dg-final { scan-assembler "ldr\[ \t\]*x30, \\\[sp\\\], #16" } } */ /* { dg-final { scan-assembler "br\[ \t\]*x0" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/indirect-thunk-6.c b/gcc/testsuite/gcc.target/aarch64/indirect-thunk-6.c index e54fc0d272a3..4c21735dc3c8 100644 --- a/gcc/testsuite/gcc.target/aarch64/indirect-thunk-6.c +++ b/gcc/testsuite/gcc.target/aarch64/indirect-thunk-6.c @@ -18,8 +18,7 @@ foo (void) /* { dg-final { scan-assembler "bl\[ \t\]*\.LIND1" } } */ /* { dg-final { scan-assembler "wfe" } } */ /* { dg-final { scan-assembler "b\[ \t\]*\.LIND0" } } */ -/* { dg-final { scan-assembler "adrp\[ \t\]*x30, .LIND2" } } */ -/* { dg-final { scan-assembler "add\[ \t\]*x30, x30, :lo12:.LIND2" } } */ +/* { dg-final { scan-assembler "adr\[ \t\]*x30, .LIND2" } } */ /* { dg-final { scan-assembler "ret" } } */ /* { dg-final { scan-assembler "ldr\[ \t\]*x30, \\\[sp\\\], #16" } } */ /* { dg-final { scan-assembler "br\[ \t\]*x0" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/indirect-thunk-attr-1.c b/gcc/testsuite/gcc.target/aarch64/indirect-thunk-attr-1.c index a2ae84af6c23..2485e9248910 100644 --- a/gcc/testsuite/gcc.target/aarch64/indirect-thunk-attr-1.c +++ b/gcc/testsuite/gcc.target/aarch64/indirect-thunk-attr-1.c @@ -22,8 +22,7 @@ male_indirect_jump (long offset) /* { dg-final { scan-assembler "bl\[ \t\]*\.LIND1" } } */ /* { dg-final { scan-assembler "wfe" } } */ /* { dg-final { scan-assembler "b\[ \t\]*\.LIND0" } } */ -/* { dg-final { scan-assembler "adrp\[ \t\]*x30, .LIND2" } } */ -/* { dg-final { scan-assembler "add\[ \t\]*x30, x30, :lo12:.LIND2" } } */ +/* { dg-final { scan-assembler "adr\[ \t\]*x30, .LIND2" } } */ /* { dg-final { scan-assembler "ret" } } */ /* { dg-final { scan-assembler "ldr\[ \t\]*x30, \\\[sp\\\], #16" } } */ /* { dg-final { scan-assembler "br\[ \t\]*x1" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/indirect-thunk-attr-2.c b/gcc/testsuite/gcc.target/aarch64/indirect-thunk-attr-2.c index 0f3b4d55afc7..8e9425294b6e 100644 --- a/gcc/testsuite/gcc.target/aarch64/indirect-thunk-attr-2.c +++ b/gcc/testsuite/gcc.target/aarch64/indirect-thunk-attr-2.c @@ -21,8 +21,7 @@ male_indirect_jump (long offset) /* { dg-final { scan-assembler "bl\[ \t\]*\.LIND1" } } */ /* { dg-final { scan-assembler "wfe" } } */ /* { dg-final { scan-assembler "b\[ \t\]*\.LIND0" } } */ -/* { dg-final { scan-assembler "adrp\[ \t\]*x30, .LIND2" } } */ -/* { dg-final { scan-assembler "add\[ \t\]*x30, x30, :lo12:.LIND2" } } */ +/* { dg-final { scan-assembler "adr\[ \t\]*x30, .LIND2" } } */ /* { dg-final { scan-assembler "ret" } } */ /* { dg-final { scan-assembler "ldr\[ \t\]*x30, \\\[sp\\\], #16" } } */ /* { dg-final { scan-assembler "br\[ \t\]*x1" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/indirect-thunk-attr-3.c b/gcc/testsuite/gcc.target/aarch64/indirect-thunk-attr-3.c index 7ff66e8d0fc0..47005c96d098 100644 --- a/gcc/testsuite/gcc.target/aarch64/indirect-thunk-attr-3.c +++ b/gcc/testsuite/gcc.target/aarch64/indirect-thunk-attr-3.c @@ -20,8 +20,7 @@ male_indirect_jump (long offset) /* { dg-final { scan-assembler "bl\[ \t\]*\.LIND1" } } */ /* { dg-final { scan-assembler "wfe" } } */ /* { dg-final { scan-assembler "b\[ \t\]*\.LIND0" } } */ -/* { dg-final { scan-assembler "adrp\[ \t\]*x30, .LIND2" } } */ -/* { dg-final { scan-assembler "add\[ \t\]*x30, x30, :lo12:.LIND2" } } */ +/* { dg-final { scan-assembler "adr\[ \t\]*x30, .LIND2" } } */ /* { dg-final { scan-assembler "ret" } } */ /* { dg-final { scan-assembler "ldr\[ \t\]*x30, \\\[sp\\\], #16" } } */ /* { dg-final { scan-assembler "blr\[ \t\]*x1" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/indirect-thunk-attr-4.c b/gcc/testsuite/gcc.target/aarch64/indirect-thunk-attr-4.c index 0734295ae89b..4ad462f7efa2 100644 --- a/gcc/testsuite/gcc.target/aarch64/indirect-thunk-attr-4.c +++ b/gcc/testsuite/gcc.target/aarch64/indirect-thunk-attr-4.c @@ -20,8 +20,7 @@ male_indirect_jump (long offset) /* { dg-final { scan-assembler "bl\[ \t\]*\.LIND1" } } */ /* { dg-final { scan-assembler "wfe" } } */ /* { dg-final { scan-assembler "b\[ \t\]*\.LIND0" } } */ -/* { dg-final { scan-assembler "adrp\[ \t\]*x30, .LIND2" } } */ -/* { dg-final { scan-assembler "add\[ \t\]*x30, x30, :lo12:.LIND2" } } */ +/* { dg-final { scan-assembler "adr\[ \t\]*x30, .LIND2" } } */ /* { dg-final { scan-assembler "ret" } } */ /* { dg-final { scan-assembler "ldr\[ \t\]*x30, \\\[sp\\\], #16" } } */ /* { dg-final { scan-assembler "blr\[ \t\]*x1" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/indirect-thunk-attr-5.c b/gcc/testsuite/gcc.target/aarch64/indirect-thunk-attr-5.c index 916288421cfc..178ce26ff25f 100644 --- a/gcc/testsuite/gcc.target/aarch64/indirect-thunk-attr-5.c +++ b/gcc/testsuite/gcc.target/aarch64/indirect-thunk-attr-5.c @@ -21,5 +21,4 @@ male_indirect_jump (long offset) /* { dg-final { scan-assembler-not "bl\[ \t\]*\.LIND1" } } */ /* { dg-final { scan-assembler-not "wfe" } } */ /* { dg-final { scan-assembler-not "b\[ \t\]*\.LIND0" } } */ -/* { dg-final { scan-assembler-not "adrp\[ \t\]*x30, .LIND2" } } */ -/* { dg-final { scan-assembler-not "add\[ \t\]*x30, x30, :lo12:.LIND2" } } */ +/* { dg-final { scan-assembler-not "adr\[ \t\]*x30, .LIND2" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/indirect-thunk-attr-6.c b/gcc/testsuite/gcc.target/aarch64/indirect-thunk-attr-6.c index 34649e213705..75964a058391 100644 --- a/gcc/testsuite/gcc.target/aarch64/indirect-thunk-attr-6.c +++ b/gcc/testsuite/gcc.target/aarch64/indirect-thunk-attr-6.c @@ -21,5 +21,4 @@ male_indirect_jump (long offset) /* { dg-final { scan-assembler-not "bl\[ \t\]*\.LIND1" } } */ /* { dg-final { scan-assembler-not "wfe" } } */ /* { dg-final { scan-assembler-not "b\[ \t\]*\.LIND0" } } */ -/* { dg-final { scan-assembler-not "adrp\[ \t\]*x30, .LIND2" } } */ -/* { dg-final { scan-assembler-not "add\[ \t\]*x30, x30, :lo12:.LIND2" } } */ +/* { dg-final { scan-assembler-not "adr\[ \t\]*x30, .LIND2" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/indirect-thunk-inline-1.c b/gcc/testsuite/gcc.target/aarch64/indirect-thunk-inline-1.c index b70f07131202..4c94efc8121f 100644 --- a/gcc/testsuite/gcc.target/aarch64/indirect-thunk-inline-1.c +++ b/gcc/testsuite/gcc.target/aarch64/indirect-thunk-inline-1.c @@ -17,8 +17,7 @@ male_indirect_jump (long offset) /* { dg-final { scan-assembler "bl\[ \t\]*\.LIND1" } } */ /* { dg-final { scan-assembler "wfe" } } */ /* { dg-final { scan-assembler "b\[ \t\]*\.LIND0" } } */ -/* { dg-final { scan-assembler "adrp\[ \t\]*x30, .LIND2" } } */ -/* { dg-final { scan-assembler "add\[ \t\]*x30, x30, :lo12:.LIND2" } } */ +/* { dg-final { scan-assembler "adr\[ \t\]*x30, .LIND2" } } */ /* { dg-final { scan-assembler "ret" } } */ /* { dg-final { scan-assembler "ldr\[ \t\]*x30, \\\[sp\\\], #16" } } */ /* { dg-final { scan-assembler "br\[ \t\]*x1" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/indirect-thunk-inline-2.c b/gcc/testsuite/gcc.target/aarch64/indirect-thunk-inline-2.c index e58e4ad32c73..3c5c263b5e6f 100644 --- a/gcc/testsuite/gcc.target/aarch64/indirect-thunk-inline-2.c +++ b/gcc/testsuite/gcc.target/aarch64/indirect-thunk-inline-2.c @@ -18,8 +18,7 @@ male_indirect_jump (long offset) /* { dg-final { scan-assembler "bl\[ \t\]*\.LIND1" } } */ /* { dg-final { scan-assembler "wfe" } } */ /* { dg-final { scan-assembler "b\[ \t\]*\.LIND0" } } */ -/* { dg-final { scan-assembler "adrp\[ \t\]*x30, .LIND2" } } */ -/* { dg-final { scan-assembler "add\[ \t\]*x30, x30, :lo12:.LIND2" } } */ +/* { dg-final { scan-assembler "adr\[ \t\]*x30, .LIND2" } } */ /* { dg-final { scan-assembler "ret" } } */ /* { dg-final { scan-assembler "ldr\[ \t\]*x30, \\\[sp\\\], #16" } } */ /* { dg-final { scan-assembler "br\[ \t\]*x1" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/indirect-thunk-inline-3.c b/gcc/testsuite/gcc.target/aarch64/indirect-thunk-inline-3.c index a253fa20acea..cd09d78b082b 100644 --- a/gcc/testsuite/gcc.target/aarch64/indirect-thunk-inline-3.c +++ b/gcc/testsuite/gcc.target/aarch64/indirect-thunk-inline-3.c @@ -18,8 +18,7 @@ male_indirect_jump (long offset) /* { dg-final { scan-assembler "bl\[ \t\]*\.LIND1" } } */ /* { dg-final { scan-assembler "wfe" } } */ /* { dg-final { scan-assembler "b\[ \t\]*\.LIND0" } } */ -/* { dg-final { scan-assembler "adrp\[ \t\]*x30, .LIND2" } } */ -/* { dg-final { scan-assembler "add\[ \t\]*x30, x30, :lo12:.LIND2" } } */ +/* { dg-final { scan-assembler "adr\[ \t\]*x30, .LIND2" } } */ /* { dg-final { scan-assembler "ret" } } */ /* { dg-final { scan-assembler "ldr\[ \t\]*x30, \\\[sp\\\], #16" } } */ /* { dg-final { scan-assembler "blr\[ \t\]*x1" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/indirect-thunk-inline-4.c b/gcc/testsuite/gcc.target/aarch64/indirect-thunk-inline-4.c index 7061da768a82..45b33ac9c02c 100644 --- a/gcc/testsuite/gcc.target/aarch64/indirect-thunk-inline-4.c +++ b/gcc/testsuite/gcc.target/aarch64/indirect-thunk-inline-4.c @@ -19,8 +19,7 @@ male_indirect_jump (long offset) /* { dg-final { scan-assembler "bl\[ \t\]*\.LIND1" } } */ /* { dg-final { scan-assembler "wfe" } } */ /* { dg-final { scan-assembler "b\[ \t\]*\.LIND0" } } */ -/* { dg-final { scan-assembler "adrp\[ \t\]*x30, .LIND2" } } */ -/* { dg-final { scan-assembler "add\[ \t\]*x30, x30, :lo12:.LIND2" } } */ +/* { dg-final { scan-assembler "adr\[ \t\]*x30, .LIND2" } } */ /* { dg-final { scan-assembler "ret" } } */ /* { dg-final { scan-assembler "ldr\[ \t\]*x30, \\\[sp\\\], #16" } } */ /* { dg-final { scan-assembler "blr\[ \t\]*x1" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/indirect-thunk-inline-5.c b/gcc/testsuite/gcc.target/aarch64/indirect-thunk-inline-5.c index 7945fd184802..28b4c87b80af 100644 --- a/gcc/testsuite/gcc.target/aarch64/indirect-thunk-inline-5.c +++ b/gcc/testsuite/gcc.target/aarch64/indirect-thunk-inline-5.c @@ -15,8 +15,7 @@ foo (void) /* { dg-final { scan-assembler "bl\[ \t\]*\.LIND1" } } */ /* { dg-final { scan-assembler "wfe" } } */ /* { dg-final { scan-assembler "b\[ \t\]*\.LIND0" } } */ -/* { dg-final { scan-assembler "adrp\[ \t\]*x30, .LIND2" } } */ -/* { dg-final { scan-assembler "add\[ \t\]*x30, x30, :lo12:.LIND2" } } */ +/* { dg-final { scan-assembler "adr\[ \t\]*x30, .LIND2" } } */ /* { dg-final { scan-assembler "ret" } } */ /* { dg-final { scan-assembler "ldr\[ \t\]*x30, \\\[sp\\\], #16" } } */ /* { dg-final { scan-assembler "br\[ \t\]*x0" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/indirect-thunk-inline-6.c b/gcc/testsuite/gcc.target/aarch64/indirect-thunk-inline-6.c index 556aa58be559..9cedefadd8d6 100644 --- a/gcc/testsuite/gcc.target/aarch64/indirect-thunk-inline-6.c +++ b/gcc/testsuite/gcc.target/aarch64/indirect-thunk-inline-6.c @@ -16,8 +16,7 @@ foo (void) /* { dg-final { scan-assembler "bl\[ \t\]*\.LIND1" } } */ /* { dg-final { scan-assembler "wfe" } } */ /* { dg-final { scan-assembler "b\[ \t\]*\.LIND0" } } */ -/* { dg-final { scan-assembler "adrp\[ \t\]*x30, .LIND2" } } */ -/* { dg-final { scan-assembler "add\[ \t\]*x30, x30, :lo12:.LIND2" } } */ +/* { dg-final { scan-assembler "adr\[ \t\]*x30, .LIND2" } } */ /* { dg-final { scan-assembler "ret" } } */ /* { dg-final { scan-assembler "ldr\[ \t\]*x30, \\\[sp\\\], #16" } } */ /* { dg-final { scan-assembler "blr\[ \t\]*x0" } } */ |