| # Checking that we generate an OpNegateRAState CFI after the split point, |
| # when splitting a region with signed RA state. |
| # We split at the fallthrough label. |
| |
| # REQUIRES: system-linux |
| |
| # RUN: %clang %s %cflags -march=armv8.3-a -Wl,-q -o %t |
| # RUN: link_fdata --no-lbr %s %t %t.fdata |
| # RUN: llvm-bolt %t -o %t.bolt --data %t.fdata -split-functions \ |
| # RUN: --print-only foo --print-split --print-all 2>&1 | FileCheck %s |
| |
| # Checking that we don't see any OpNegateRAState CFIs before the insertion pass. |
| # CHECK-NOT: OpNegateRAState |
| # CHECK: Binary Function "foo" after pointer-auth-cfi-fixup |
| |
| # CHECK: paciasp |
| # CHECK-NEXT: OpNegateRAState |
| |
| # CHECK: ------- HOT-COLD SPLIT POINT ------- |
| |
| # CHECK: OpNegateRAState |
| # CHECK-NEXT: mov x0, #0x1 |
| # CHECK-NEXT: autiasp |
| # CHECK-NEXT: OpNegateRAState |
| # CHECK-NEXT: ret |
| |
| # End of the pointer-auth-cfi-fixup logs |
| # CHECK: Binary Function "foo" after finalize-functions |
| |
| .text |
| .globl foo |
| .type foo, %function |
| foo: |
| .cfi_startproc |
| .entry_bb: |
| # FDATA: 1 foo #.entry_bb# 10 |
| paciasp |
| .cfi_negate_ra_state // indicating that paciasp changed the RA state to signed |
| cmp x0, #0 |
| b.eq .Lcold_bb1 |
| .Lfallthrough: // split point |
| mov x0, #1 |
| autiasp |
| .cfi_negate_ra_state // indicating that autiasp changed the RA state to unsigned |
| ret |
| .Lcold_bb1: // Instructions below are not important, they are just here so the cold block is not empty. |
| .cfi_negate_ra_state // ret has unsigned RA state, but the next inst (autiasp) has signed RA state |
| mov x0, #2 |
| retaa |
| .cfi_endproc |
| .size foo, .-foo |
| |
| ## Force relocation mode. |
| .reloc 0, R_AARCH64_NONE |