blob: 0f5e9a38da2ba3000af7208745d086ff56110b2a [file] [edit]
// 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 <cstdio>
#include <stdexcept>
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;
}