# This test checks that PointerAuthCFIAnalyzer pass ignores functions with # malformed .cfi_negate_ra_state sequences in the input binary. # The cases checked are: # - extra .cfi_negate_ra_state in Signed state: checked in foo, # - extra .cfi_negate_ra_state in Unsigned state: checked in bar, # - missing .cfi_negate_ra_state from PSign or PAuth instructions: checked in baz. # RUN: llvm-mc -filetype=obj -triple aarch64-unknown-unknown %s -o %t.o # RUN: %clang %cflags %t.o -o %t.exe -Wl,-q # RUN: llvm-bolt %t.exe -o %t.exe.bolt -v=1 --no-threads | FileCheck %s --check-prefix=CHECK-BOLT # CHECK-BOLT: BOLT-INFO: inconsistent RAStates in function foo: ptr authenticating inst encountered in Unsigned RA state # CHECK-BOLT: BOLT-INFO: inconsistent RAStates in function bar: ptr signing inst encountered in Signed RA state # CHECK-BOLT: BOLT-INFO: inconsistent RAStates in function baz: ptr sign/auth inst without .cfi_negate_ra_state # Check that the incorrect functions got ignored, so they are not in the new .text section # RUN: llvm-objdump %t.exe.bolt -d -j .text | FileCheck %s --check-prefix=CHECK-OBJDUMP # CHECK-OBJDUMP-NOT: : # CHECK-OBJDUMP-NOT: : # CHECK-OBJDUMP-NOT: : .text .globl foo .p2align 2 .type foo,@function foo: .cfi_startproc hint #25 .cfi_negate_ra_state mov x1, #0 .cfi_negate_ra_state // Incorrect CFI in signed state hint #29 .cfi_negate_ra_state ret .cfi_endproc .size foo, .-foo .text .globl bar .p2align 2 .type bar,@function bar: .cfi_startproc mov x1, #0 .cfi_negate_ra_state // Incorrect CFI in unsigned state hint #25 .cfi_negate_ra_state mov x1, #0 hint #29 .cfi_negate_ra_state ret .cfi_endproc .size bar, .-bar .text .globl baz .p2align 2 .type baz,@function baz: .cfi_startproc mov x1, #0 hint #25 .cfi_negate_ra_state mov x1, #0 hint #29 // Missing .cfi_negate_ra_state ret .cfi_endproc .size baz, .-baz .global _start .type _start, %function _start: b foo b bar b baz