| ## Check that BOLT successfully splits C++ exception-handling code for | |
| ## PIEs or shared objects. | |
| REQUIRES: system-linux,bolt-runtime | |
| RUN: %clangxx %cxxflags -pie -fPIC %p/Inputs/exceptions_split.cpp -Wl,-q -o %t | |
| RUN: llvm-bolt %t -o %t.instr --instrument --instrumentation-file=%t.fdata | |
| ## Record profile with invocation that does not throw exceptions. | |
| RUN: %t.instr | |
| RUN: llvm-bolt %t -o %t.bolt --data %t.fdata --reorder-blocks=ext-tsp \ | |
| RUN: --split-functions --split-eh --print-after-lowering \ | |
| RUN: --print-only=main 2>&1 | FileCheck %s | |
| ## All calls to printf() should be from exception handling code that was | |
| ## recorded as cold during the profile collection run. Check that the calls | |
| ## are placed after the split point. | |
| CHECK-NOT: printf | |
| CHECK: HOT-COLD SPLIT POINT | |
| CHECK: printf | |
| ## Verify the output still executes correctly when the exception path is being | |
| ## taken. | |
| RUN: %t.bolt arg1 arg2 arg3 2>&1 | FileCheck --check-prefix=CHECK-BOLTED %s | |
| CHECK-BOLTED: catch 2 | |
| CHECK-BOLTED-NEXT: catch 1 |