| ## Check that llvm-bolt is able to overwrite LSDA in ULEB128 format in-place for |
| ## all types of binaries. |
| |
| # REQUIRES: system-linux |
| |
| # RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %s -o %t.o |
| # RUN: ld.lld --no-pie %t.o -o %t.exe -q |
| # RUN: ld.lld --pie %t.o -o %t.pie -q |
| # RUN: ld.lld --shared %t.o -o %t.so -q |
| # RUN: llvm-bolt %t.exe -o %t.bolt --strict \ |
| # RUN: | FileCheck --check-prefix=CHECK-BOLT %s |
| # RUN: llvm-bolt %t.pie -o %t.pie.bolt --strict \ |
| # RUN: | FileCheck --check-prefix=CHECK-BOLT %s |
| # RUN: llvm-bolt %t.so -o %t.so.bolt --strict \ |
| # RUN: | FileCheck --check-prefix=CHECK-BOLT %s |
| |
| # CHECK-BOLT: rewriting .gcc_except_table in-place |
| |
| # RUN: llvm-readelf -WS %t.bolt | FileCheck --check-prefix=CHECK-ELF %s |
| # RUN: llvm-readelf -WS %t.pie.bolt | FileCheck --check-prefix=CHECK-ELF %s |
| # RUN: llvm-readelf -WS %t.so.bolt | FileCheck --check-prefix=CHECK-ELF %s |
| |
| # CHECK-ELF-NOT: .bolt.org.gcc_except_table |
| |
| .text |
| .global foo |
| .type foo, %function |
| foo: |
| .cfi_startproc |
| ret |
| .cfi_endproc |
| .size foo, .-foo |
| |
| .globl _start |
| .type _start, %function |
| _start: |
| .Lfunc_begin0: |
| .cfi_startproc |
| .cfi_lsda 27, .Lexception0 |
| call foo |
| .Ltmp0: |
| call foo |
| .Ltmp1: |
| ret |
| |
| ## Landing pads. |
| .LLP1: |
| ret |
| .LLP0: |
| ret |
| |
| .cfi_endproc |
| .Lfunc_end0: |
| .size _start, .-_start |
| |
| ## EH table. |
| .section .gcc_except_table,"a",@progbits |
| .p2align 2 |
| GCC_except_table0: |
| .Lexception0: |
| .byte 255 # @LPStart Encoding = omit |
| .byte 255 # @TType Encoding = omit |
| .byte 1 # Call site Encoding = uleb128 |
| .uleb128 .Lcst_end0-.Lcst_begin0 |
| .Lcst_begin0: |
| .uleb128 .Lfunc_begin0-.Lfunc_begin0 # >> Call Site 1 << |
| .uleb128 .Ltmp0-.Lfunc_begin0 # Call between .Lfunc_begin0 and .Ltmp0 |
| .uleb128 .LLP0-.Lfunc_begin0 # jumps to .LLP0 |
| .byte 0 # On action: cleanup |
| .uleb128 .Ltmp0-.Lfunc_begin0 # >> Call Site 2 << |
| .uleb128 .Ltmp1-.Ltmp0 # Call between .Ltmp0 and .Ltmp1 |
| .uleb128 .LLP1-.Lfunc_begin0 # jumps to .LLP1 |
| .byte 0 # On action: cleanup |
| .Lcst_end0: |
| |