We used to emit EH trampolines for PIE/DSO whenever a function fragment contained a landing pad outside of it. However, it is common to have all landing pads in a cold fragment even when their throwers are in a hot one. To reduce the number of trampolines, analyze landing pads for any given function fragment, and if they all belong to the same (possibly different) fragment, designate that fragment as a landing pad fragment for the "thrower" fragment. Later, emit landing pad fragment symbol as an LPStart for the thrower LSDA.
28 lines
917 B
Plaintext
28 lines
917 B
Plaintext
REQUIRES: system-linux,bolt-runtime
|
|
|
|
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
|
|
|
|
## Check that a landing pad is split from its thrower and does not require a
|
|
## trampoline LP.
|
|
CHECK: Binary Function "_Z10throw_testiPPc"
|
|
CHECK: IsSplit :
|
|
CHECK-SAME: 1
|
|
CHECK: callq {{.*}} # handler: [[LPAD:.*]];
|
|
CHECK-NOT: Landing Pad{{$}}
|
|
CHECK: HOT-COLD SPLIT POINT
|
|
CHECK: {{^}}[[LPAD]]
|
|
CHECK-NEXT: Landing Pad
|
|
|
|
## Verify the output still executes correctly when the exception path is being
|
|
## taken.
|
|
RUN: %t.bolt arg1 arg2 arg3
|