llvm/bolt/test/AArch64/veneer.s

// This test checks that the veneer are properly handled by BOLT.
// Strip .rela.mytext section to simulate inserted by a linker veneers
// that does not contain relocations.

# RUN: llvm-mc -filetype=obj -triple aarch64-unknown-unknown \
# RUN:   %s -o %t.o
# RUN: %clang %cflags -fPIC -pie %t.o -o %t.exe -nostdlib \
# RUN:    -fuse-ld=lld -Wl,--no-relax -Wl,-q
# RUN: llvm-objdump -d --disassemble-symbols='myveneer' %t.exe | \
# RUN:   FileCheck --check-prefix=CHECKVENEER %s
# RUN: llvm-objcopy --remove-section .rela.mytext %t.exe
# RUN: llvm-bolt %t.exe -o %t.bolt --elim-link-veneers=true --lite=0
# RUN: llvm-objdump -d -j .text --disassemble-symbols='myveneer' %t.bolt | \
# RUN:   FileCheck --check-prefix=CHECKOUTVENEER %s
# RUN: llvm-objdump -d --disassemble-symbols='_start' %t.bolt | FileCheck %s

.text
.balign 4
.global foo
.type foo, %function
foo:
  adrp x1, foo
  ret
.size foo, .-foo

.section ".mytext", "ax"
.balign 4
# CHECKOUTVENEER-NOT: {{.*}} <myveneer>:
.global myveneer
.type myveneer, %function
myveneer:
# CHECKVENEER: adrp
# CHECKVENEER-NEXT: add
  adrp x16, foo
  add x16, x16, #:lo12:foo
  br x16
  nop
.size myveneer, .-myveneer

.global _start
.type _start, %function
_start:
# CHECK: {{.*}} bl {{.*}} <foo>
  bl myveneer
  ret
.size _start, .-_start