xref: /llvm-project/bolt/test/runtime/X86/retpoline-synthetic.test (revision 52e4f9e386ac1bf0e515a50a871231b89d3e28fc)
18331f75eSAmir Ayupov# Check that llvm-bolt retpoline all indirect branches and the resulting binary
28331f75eSAmir Ayupov# correctly runs.
38331f75eSAmir Ayupov
48331f75eSAmir AyupovREQUIRES: x86_64-linux
58331f75eSAmir Ayupov
68331f75eSAmir AyupovRUN: %clangxx %S/Inputs/retpoline_synthetic.cpp -fno-jump-tables -Wl,-q,-znow \
78331f75eSAmir AyupovRUN:   -O2 -o %t.exe
8d648aa1bSMaksim PanchenkoRUN: llvm-bolt %t.exe -o %t --insert-retpolines --trap-old-code
98331f75eSAmir Ayupov
10e9ee2ca1SAmir Ayupov# Check indirect calls in the original binary
11e9ee2ca1SAmir AyupovRUN: llvm-objdump -d %t.exe | FileCheck %s -check-prefix=CHECK-CALL-ORIG
12e9ee2ca1SAmir AyupovCHECK-CALL-ORIG: callq  *
13e9ee2ca1SAmir Ayupov# No indirect jumps
14e9ee2ca1SAmir AyupovRUN: llvm-objdump -d -j ".text" %t | FileCheck %s -check-prefix=CHECK-JUMP-ORIG
15e9ee2ca1SAmir AyupovCHECK-JUMP-ORIG-NOT: jmpq   *
16e9ee2ca1SAmir Ayupov
17e9ee2ca1SAmir Ayupov# Check that there are no indirect calls or jumps in the resulting binary
18e9ee2ca1SAmir AyupovRUN: llvm-objdump -d %t | FileCheck %s -check-prefix=CHECK-CALL
19e9ee2ca1SAmir AyupovCHECK-CALL-NOT: callq  *
20e9ee2ca1SAmir AyupovRUN: llvm-objdump -d -j ".text" %t | FileCheck %s -check-prefix=CHECK-JUMP
21e9ee2ca1SAmir AyupovCHECK-JUMP-NOT: jmpq   *
22e9ee2ca1SAmir Ayupov
23*19941b04SAmir Ayupov# Check generated retpoline stub names
24*19941b04SAmir AyupovRUN: llvm-strings %t | FileCheck %s -check-prefix=CHECK-STRINGS
25*19941b04SAmir AyupovCHECK-STRINGS-DAG: __retpoline_%rax_
26*19941b04SAmir AyupovCHECK-STRINGS-DAG: __retpoline_mem_%rip+DATAat0x[[#]]
27*19941b04SAmir AyupovCHECK-STRINGS-DAG: __retpoline_mem_%rax+0
28*19941b04SAmir Ayupov
29e9ee2ca1SAmir AyupovRUN: %t 1000 3 | FileCheck %s
30e9ee2ca1SAmir AyupovCHECK: 30000000
31