## Check that llvm-bolt successfully relaxes branches for compact (<128MB) code ## model. # REQUIRES: system-linux # RUN: llvm-mc -filetype=obj -triple aarch64-unknown-unknown %s -o %t.o # RUN: link_fdata %s %t.o %t.fdata # RUN: llvm-strip --strip-unneeded %t.o # RUN: %clang %cflags %t.o -o %t.exe -Wl,-q -static # RUN: llvm-bolt %t.exe -o %t.bolt --data %t.fdata --split-functions \ # RUN: --keep-nops --compact-code-model # RUN: llvm-objdump -d \ # RUN: --disassemble-symbols=_start,_start.cold.0,foo,foo.cold.0 %t.bolt \ # RUN: | FileCheck %s # RUN: llvm-nm -nS %t.bolt | FileCheck %s --check-prefix=CHECK-NM ## Fragments of _start and foo will be separated by large_function which is over ## 1MB in size - larger than all conditional branches can cover requiring branch ## relaxation. # CHECK-NM: _start # CHECK-NM: foo # CHECK-NM: 0000000000124f84 T large_function # CHECK-NM: _start.cold.0 # CHECK-NM: foo.cold.0 .text .globl _start .type _start, %function _start: # CHECK: <_start>: # FDATA: 0 [unknown] 0 1 _start 0 0 100 .cfi_startproc cmp x0, 1 b.eq .L0 # CHECK: b.eq # CHECK-NEXT: b # CHECK-NEXT: b bl large_function .L0: ret x30 .cfi_endproc .size _start, .-_start ## Check that long branch in foo() is reused during relaxation. I.e. we should ## see just one branch to the cold fragment. .globl foo .type foo, %function foo: # CHECK: : # FDATA: 0 [unknown] 0 1 foo 0 0 100 .cfi_startproc cmp x0, 0 .T0: b.eq .ERROR # CHECK: b {{.*}} # CHECK-NOT: b {{.*}} # FDATA: 1 foo #.T0# 1 foo #.T1# 0 100 .T1: bl large_function cmp x0, 1 .T2: b.eq .ERROR # FDATA: 1 foo #.T2# 1 foo #.T3# 0 100 .T3: mov x1, x0 mov x0, 0 ret x30 # CHECK: : # CHECK-NEXT: mov x0, #0x1 # CHECK-NEXT: ret .ERROR: mov x0, 1 ret x30 .cfi_endproc .size foo, .-foo .globl large_function .type large_function, %function large_function: # FDATA: 0 [unknown] 0 1 large_function 0 0 100 .cfi_startproc .rept 300000 nop .endr ret x30 .cfi_endproc .size large_function, .-large_function ## Force relocation mode. .reloc 0, R_AARCH64_NONE