// Test to demonstrate that functions compiled with synchronous unwind tables // are ignored by the PointerAuthCFIAnalyzer. // Exception handling is needed to have _any_ unwind tables, otherwise the // PointerAuthCFIAnalyzer does not run on these functions, so it does not ignore // any function. // // REQUIRES: system-linux,bolt-runtime // // RUN: %clangxx --target=aarch64-unknown-linux-gnu \ // RUN: -mbranch-protection=pac-ret \ // RUN: -fno-asynchronous-unwind-tables \ // RUN: %s -o %t.exe -Wl,-q // RUN: llvm-bolt %t.exe -o %t.bolt | FileCheck %s --check-prefix=CHECK // Number of functions with .cfi-negate-ra-state in the binary is // platform-dependent. // CHECK: BOLT-INFO: PointerAuthCFIAnalyzer ran on {{[0-9]+}} functions. // CHECK-SAME: Ignored {{[0-9]}} functions ({{[0-9.]+}}%) because of CFI // CHECK-SAME: inconsistencies // CHECK-NEXT: BOLT-WARNING: PointerAuthCFIAnalyzer only supports // CHECK-SAME: asynchronous unwind tables. For C compilers, see // CHECK-SAME: -fasynchronous-unwind-tables. #include #include void foo() { throw std::runtime_error("Exception from foo()."); } int main() { try { foo(); } catch (const std::exception &e) { printf("Exception caught: %s\n", e.what()); } return 0; }