Whenever LPStartEncoding was different from DW_EH_PE_omit, we used to miscalculate LPStart. As a result, landing pads were assigned wrong addresses. Fix that.
92 lines
2.7 KiB
ArmAsm
92 lines
2.7 KiB
ArmAsm
# RUN: %clangxx %cflags -no-pie %s -o %t.exe -Wl,-q
|
|
# RUN: llvm-bolt %t.exe -o %t.exe.bolt
|
|
# RUN: %t.exe.bolt
|
|
|
|
# REQUIRES: system-linux
|
|
|
|
## Test that BOLT properly handles LPStart when LPStartEncoding is different
|
|
## from DW_EH_PE_omit.
|
|
|
|
# The test case compiled with -O1 from:
|
|
#
|
|
# int main() {
|
|
# try {
|
|
# throw 42;
|
|
# } catch (...) {
|
|
# return 0;
|
|
# }
|
|
# return 1;
|
|
# }
|
|
#
|
|
# The exception table was modified with udata4 LPStartEncoding and sdata4
|
|
# CallSiteEncoding.
|
|
|
|
.text
|
|
.globl main # -- Begin function main
|
|
.p2align 4, 0x90
|
|
.type main,@function
|
|
main: # @main
|
|
.Lfunc_begin0:
|
|
.cfi_startproc
|
|
.cfi_personality 3, __gxx_personality_v0
|
|
.cfi_lsda 3, .Lexception0
|
|
# %bb.0:
|
|
pushq %rax
|
|
.cfi_def_cfa_offset 16
|
|
movl $4, %edi
|
|
callq __cxa_allocate_exception
|
|
movl $42, (%rax)
|
|
.Ltmp0:
|
|
movl $_ZTIi, %esi
|
|
movq %rax, %rdi
|
|
xorl %edx, %edx
|
|
callq __cxa_throw
|
|
.Ltmp1:
|
|
# %bb.1:
|
|
.LBB0_2:
|
|
.Ltmp2:
|
|
movq %rax, %rdi
|
|
callq __cxa_begin_catch
|
|
callq __cxa_end_catch
|
|
xorl %eax, %eax
|
|
popq %rcx
|
|
.cfi_def_cfa_offset 8
|
|
retq
|
|
.Lfunc_end0:
|
|
.size main, .Lfunc_end0-main
|
|
.cfi_endproc
|
|
.section .gcc_except_table,"a",@progbits
|
|
.p2align 2
|
|
GCC_except_table0:
|
|
.Lexception0:
|
|
.byte 3 # @LPStart Encoding = udata4
|
|
.long 0
|
|
.byte 3 # @TType Encoding = udata4
|
|
.uleb128 .Lttbase0-.Lttbaseref0
|
|
.Lttbaseref0:
|
|
.byte 11 # Call site Encoding = sdata4
|
|
.uleb128 .Lcst_end0-.Lcst_begin0
|
|
.Lcst_begin0:
|
|
.long .Lfunc_begin0-.Lfunc_begin0 # >> Call Site 1 <<
|
|
.long .Ltmp0-.Lfunc_begin0 # Call between .Lfunc_begin0 and .Ltmp0
|
|
.long 0 # has no landing pad
|
|
.byte 0 # On action: cleanup
|
|
.long .Ltmp0-.Lfunc_begin0 # >> Call Site 2 <<
|
|
.long .Ltmp1-.Ltmp0 # Call between .Ltmp0 and .Ltmp1
|
|
.long .Ltmp2 # jumps to .Ltmp2
|
|
.byte 1 # On action: 1
|
|
.long .Ltmp1-.Lfunc_begin0 # >> Call Site 3 <<
|
|
.long .Lfunc_end0-.Ltmp1 # Call between .Ltmp1 and .Lfunc_end0
|
|
.long 0 # has no landing pad
|
|
.byte 0 # On action: cleanup
|
|
.Lcst_end0:
|
|
.byte 1 # >> Action Record 1 <<
|
|
# Catch TypeInfo 1
|
|
.byte 0 # No further actions
|
|
.p2align 2
|
|
# >> Catch TypeInfos <<
|
|
.long 0 # TypeInfo 1
|
|
.Lttbase0:
|
|
.p2align 2
|
|
# -- End function
|