| ## Test that BOLT handles large code model LSDA encoding correctly: |
| ## 1. Auto-detection via .ltext sections |
| ## 2. Disabling auto-detection with --large-code-model=0 |
| ## 3. Forcing large code model with --large-code-model flag |
| |
| # REQUIRES: system-linux |
| |
| ## Build two variants: one with .ltext section, one without. |
| # RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux \ |
| # RUN: --defsym LTEXT=1 %s -o %t.ltext.o |
| # RUN: ld.lld --no-pie %t.ltext.o -o %t.ltext.exe -q -e _start |
| # RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux \ |
| # RUN: --defsym LTEXT=0 %s -o %t.text.o |
| # RUN: ld.lld --no-pie %t.text.o -o %t.text.exe -q -e _start |
| |
| ## Test 1: Auto-detection via .ltext section. |
| # RUN: llvm-bolt %t.ltext.exe -o %t.ltext.bolt --reorder-blocks=none 2>&1 \ |
| # RUN: | FileCheck %s --check-prefix=CHECK-BOLT |
| # CHECK-BOLT: enabling large code model |
| |
| # RUN: llvm-dwarfdump --eh-frame %t.ltext.bolt \ |
| # RUN: | FileCheck %s --check-prefix=CHECK-EH |
| |
| ## Test 2: Disable large code model with --large-code-model=0, overriding |
| ## auto-detection even though .ltext is present. |
| # RUN: llvm-bolt %t.ltext.exe -o %t.ltext.bolt2 --reorder-blocks=none \ |
| # RUN: --large-code-model=0 2>&1 \ |
| # RUN: | FileCheck %s --check-prefix=CHECK-DISABLED |
| # CHECK-DISABLED-NOT: enabling large code model |
| |
| # RUN: llvm-dwarfdump --eh-frame %t.ltext.bolt2 \ |
| # RUN: | FileCheck %s --check-prefix=CHECK-EH |
| |
| ## Test 3: --large-code-model flag forces large code model on a binary |
| ## without .ltext sections. No auto-detection message is printed since the |
| ## flag is explicit, but the LSDA encoding should still be updated. |
| # RUN: llvm-bolt %t.text.exe -o %t.text.bolt --reorder-blocks=none \ |
| # RUN: --large-code-model 2>&1 \ |
| # RUN: | FileCheck %s --check-prefix=CHECK-FORCED |
| # CHECK-FORCED-NOT: enabling large code model |
| |
| # RUN: llvm-dwarfdump --eh-frame %t.text.bolt \ |
| # RUN: | FileCheck %s --check-prefix=CHECK-EH |
| |
| ## Verify the BOLT-emitted CIE uses 8-byte LSDA encoding (DW_EH_PE_absptr |
| ## = 0x00) instead of the default 4-byte encoding (DW_EH_PE_sdata4 = 0x1B). |
| ## In the "zLR" augmentation data: [L-enc] [R-enc]. |
| # CHECK-EH: Augmentation: "zLR" |
| # CHECK-EH: Augmentation data: 00 1B |
| |
| .text |
| .globl 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. |
| .LLP0: |
| ret |
| .LLP1: |
| ret |
| |
| .cfi_endproc |
| .Lfunc_end0: |
| .size _start, .Lfunc_end0-_start |
| |
| ## Exception table. |
| .section .gcc_except_table,"a",@progbits |
| .p2align 2 |
| .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 |
| .uleb128 .LLP0-.Lfunc_begin0 # landing pad |
| .byte 0 # action: cleanup |
| .uleb128 .Ltmp0-.Lfunc_begin0 # Call Site 2 |
| .uleb128 .Ltmp1-.Ltmp0 |
| .uleb128 .LLP1-.Lfunc_begin0 # landing pad |
| .byte 0 # action: cleanup |
| .Lcst_end0: |
| |
| ## When LTEXT=1, emit large_func in .ltext to trigger auto-detection. |
| .if LTEXT |
| .section .ltext,"axl",@progbits |
| .globl large_func |
| .type large_func, @function |
| large_func: |
| .cfi_startproc |
| movl $42, %eax |
| retq |
| .cfi_endproc |
| .size large_func, .-large_func |
| .endif |