When SplitFunctions pass adds a trampoline code for exception landing pads (limited to shared objects), it may increase the size of the hot fragment making it larger than the whole function pre-split. When this happens, the pass reverts the splitting action by restoring the original block order and marking all blocks hot. However, if createEHTrampolines() added new blocks to the CFG and modified invoke instructions, simply restoring the original block layout will not suffice as the new CFG has more blocks. For proper backout of the split, modify the original layout by merging in trampoline blocks immediately before their matching targets. As a result, the number of blocks increases, but the number of instructions and the function size remains the same as pre-split. Add an assertion for the number of blocks when updating a function layout. Reviewed By: rafauler Differential Revision: https://reviews.llvm.org/D128696
37 lines
1.2 KiB
Plaintext
37 lines
1.2 KiB
Plaintext
REQUIRES: system-linux
|
|
|
|
RUN: %clangxx %cxxflags -pie -fPIC %p/Inputs/pie-exceptions-failed-split.s \
|
|
RUN: -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=_Z10throw_testiPPc 2>&1 | FileCheck %s
|
|
|
|
## Hot code in the test case gets larger after splitting because of jump
|
|
## instruction relaxation. Check that BOLT reverts the split correctly.
|
|
CHECK: Binary Function "_Z10throw_testiPPc"
|
|
CHECK: IsSplit :
|
|
CHECK-SAME: 0
|
|
|
|
## Check that the landing pad trampoline was created, but contains no
|
|
## instructions and falls to the real landing pad.
|
|
CHECK: {{^[^[:space:]]+}} (0 instructions
|
|
CHECK-NEXT: Landing Pad{{$}}
|
|
CHECK: Exec Count
|
|
CHECK-SAME: : 0
|
|
CHECK: Successors:
|
|
CHECK-SAME: [[LP:[^[:space:]]+]]
|
|
CHECK-EMPTY:
|
|
CHECK-NEXT: [[LP]]
|
|
CHECK-DAG: Exec Count
|
|
CHECK-NOT: Exec Count
|
|
CHECK-DAG: callq __cxa_begin_catch
|
|
|
|
## Verify the output still executes correctly when the exception path is being
|
|
## taken.
|
|
RUN: %t.bolt arg1 arg2 arg3
|