# This reproduces a bug with instrumentation when trying to instrument
# a function with only tail calls. Such functions can clobber red zone,
# see https://github.com/llvm/llvm-project/issues/61114.
# REQUIRES: system-linux,bolt-runtime
# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-unknown %s -o %t.o
# RUN: %clang %cflags -no-pie %t.o -o %t.exe -Wl,-q
# RUN: llvm-bolt %t.exe --instrument --instrumentation-file=%t.fdata \
# RUN: -o %t.instrumented
# RUN: %t.instrumented arg1 arg2
# RUN: llvm-objdump %t.instrumented --disassemble-symbols=main | FileCheck %s
# CHECK: leaq 0x80(%rsp), %rsp
# RUN: FileCheck %s --input-file %t.fdata --check-prefix=CHECK-FDATA
# CHECK-FDATA: 1 main {{.*}} 1 targetFunc 0 0 1
.text
.globl main
.type main, %function
.p2align 4
main:
pushq %rbp
movq %rsp, %rbp
mov %rax,-0x10(%rsp)
leaq targetFunc, %rax
pushq %rax # We save the target function address in the stack
subq $0x18, %rsp # Set up a dummy stack frame
cmpl $0x2, %edi
jb .LBBerror # Add control flow so we don't have a trivial case
.LBB2:
addq $0x20, %rsp
movq %rbp, %rsp
pop %rbp
mov -0x10(%rsp),%rax
test %rsp, %rsp
jne targetFunc
.LBBerror:
addq $0x20, %rsp
movq %rbp, %rsp
pop %rbp
movq $1, %rax # Finish with an error if we go this path
retq
.size main, .-main
.globl targetFunc
.type targetFunc, %function
.p2align 4
targetFunc:
xorq %rax, %rax
retq
.size targetFunc, .-targetFunc