mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-26 02:06:07 +00:00

Jump tables may contain a function start address. One real-world example is when a target basic block contains a recursive tail call that is later optimized/folded into a jump table target. While analyzing a jump table, we treat start address similar to an address past the end of the containing function (a result of __builtin_unreachable), i.e. we require another "regular" entry for the heuristic to proceed. Reviewed By: Amir Differential Revision: https://reviews.llvm.org/D156206
73 lines
1.3 KiB
ArmAsm
73 lines
1.3 KiB
ArmAsm
# REQUIRES: system-linux
|
|
|
|
## Check that BOLT correctly processes jump table that contains function start
|
|
## as one of its entries.
|
|
|
|
# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-unknown %s -o %t.o
|
|
# RUN: %clang %cflags %t.o -o %t.exe -no-pie -Wl,-q
|
|
|
|
# RUN: llvm-bolt %t.exe --print-normalized --print-only=foo -o %t.out \
|
|
# RUN: |& FileCheck %s
|
|
|
|
|
|
|
|
.text
|
|
.globl _start
|
|
.type _start, %function
|
|
_start:
|
|
.cfi_startproc
|
|
call foo
|
|
ret
|
|
.cfi_endproc
|
|
.size _start, .-_start
|
|
|
|
.globl foo
|
|
.type foo, %function
|
|
foo:
|
|
.cfi_startproc
|
|
.LBB00:
|
|
movq 0x8(%rdi), %rdi
|
|
movzbl 0x1(%rdi), %eax
|
|
.LBB00_br:
|
|
jmpq *"JUMP_TABLE/foo.0"(,%rax,8)
|
|
# CHECK: jmpq {{.*}} # JUMPTABLE
|
|
# CHECK-NEXT: Successors: {{.*}}, {{.*}}, {{.*}}, {{.*}}, {{.*}}
|
|
|
|
.Ltmp87085:
|
|
xorl %eax, %eax
|
|
retq
|
|
|
|
.Ltmp87086:
|
|
cmpb $0x0, 0x8(%rdi)
|
|
setne %al
|
|
retq
|
|
|
|
.Ltmp87088:
|
|
movb $0x1, %al
|
|
retq
|
|
|
|
.Ltmp87087:
|
|
movzbl 0x14(%rdi), %eax
|
|
andb $0x2, %al
|
|
shrb %al
|
|
retq
|
|
|
|
.cfi_endproc
|
|
.size foo, .-foo
|
|
|
|
# Jump tables
|
|
.section .rodata
|
|
"JUMP_TABLE/foo.0":
|
|
.quad .Ltmp87085
|
|
.quad .Ltmp87086
|
|
.quad .Ltmp87087
|
|
.quad .LBB00
|
|
.quad .Ltmp87088
|
|
|
|
# CHECK: Jump table {{.*}} for function foo
|
|
# CHECK-NEXT: 0x{{.*}} :
|
|
# CHECK-NEXT: 0x{{.*}} :
|
|
# CHECK-NEXT: 0x{{.*}} :
|
|
# CHECK-NEXT: 0x{{.*}} :
|
|
# CHECK-NEXT: 0x{{.*}} :
|