Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / libcxxabi / test / native / AArch64 / ra_sign_state.pass.cpp
blob35c05fc40efd4b786dc61c5913cf468556e1b553
1 // -*- C++ -*-
2 //===----------------------------------------------------------------------===//
3 //
4 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5 // See https://llvm.org/LICENSE.txt for license information.
6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //
8 //===----------------------------------------------------------------------===//
10 // REQUIRES: linux && target={{aarch64-.+}}
11 // XFAIL: no-exceptions
13 // This test ensures the .cfi_negate_ra_state the RA_SIGN_STATE pseudo register
14 // could be set directly set by a DWARF expression and the unwinder handles it
15 // correctly. The two directives can't be mixed in one CIE/FDE sqeuence.
17 #include <stdlib.h>
19 __attribute__((noinline, target("branch-protection=pac-ret+leaf")))
20 void bar() {
21 // ".cfi_negate_ra_state" is emitted by the compiler.
22 throw 1;
25 __attribute__((noinline, target("branch-protection=none")))
26 void foo() {
27 // Here a DWARF expression sets RA_SIGN_STATE.
28 // The LR is signed manually and stored on the stack.
29 asm volatile(
30 ".cfi_escape 0x16," // DW_CFA_val_expression
31 "34," // REG_34(RA_SIGN_STATE)
32 "1," // expression_length(1)
33 "0x31\n" // DW_OP_lit1
34 "add sp, sp, 16\n" // Restore SP's value before the stack frame is
35 // created.
36 "paciasp\n" // Sign the LR.
37 "str lr, [sp, -0x8]\n" // Overwrite LR on the stack.
38 "sub sp, sp, 16\n" // Restore SP's value.
40 bar();
41 _Exit(-1);
44 __attribute__((noinline, target("branch-protection=pac-ret")))
45 void bazz() {
46 // ".cfi_negate_ra_state" is emitted by the compiler.
47 try {
48 foo();
49 } catch (int i) {
50 if (i == 1)
51 throw i;
52 throw 2;
56 int main() {
57 try {
58 bazz();
59 } catch (int i) {
60 if (i == 1)
61 _Exit(0);
63 return -1;