Summary: The majority of tests in LLVM projects are using - instead of _ in the name, i.e. `check-something.test` is preferred over `check_something.test`. It makes sense for us to adopt the same naming scheme for our future tests and to rename existing ones. (cherry picked from FBD32185879)
60 lines
1.4 KiB
ArmAsm
60 lines
1.4 KiB
ArmAsm
# This reproduces a bug with jump table identification where jump table has
|
|
# entries pointing to code in function and its cold fragment.
|
|
# The fragment is only reachable through jump table.
|
|
|
|
# REQUIRES: system-linux
|
|
|
|
# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-unknown %s -o %t.o
|
|
# RUN: llvm-strip --strip-unneeded %t.o
|
|
# RUN: %clang %cflags %t.o -o %t.exe -Wl,-q
|
|
# RUN: llvm-bolt %t.exe -o %t.out -lite=0 -v=1 2>&1 | FileCheck %s
|
|
|
|
# CHECK-NOT: unclaimed PC-relative relocations left in data
|
|
# CHECK: BOLT-INFO: marking main.cold as a fragment of main
|
|
.text
|
|
.globl main.cold
|
|
.type main.cold, %function
|
|
.p2align 2
|
|
main.cold:
|
|
LBB0:
|
|
andl $0xf, %ecx
|
|
cmpb $0x4, %cl
|
|
# exit through ret
|
|
ja LBB3
|
|
|
|
# jump table dispatch, jumping to label indexed by val in %ecx
|
|
LBB1:
|
|
leaq JUMP_TABLE(%rip), %r8
|
|
movzbl %cl, %ecx
|
|
movslq (%r8,%rcx,4), %rax
|
|
addq %rax, %r8
|
|
jmpq *%r8
|
|
|
|
LBB2:
|
|
xorq %rax, %rax
|
|
LBB3:
|
|
addq $0x8, %rsp
|
|
ret
|
|
.size main.cold, .-main.cold
|
|
|
|
# main function, referenced from jump table in cold fragment
|
|
.globl main
|
|
.type main, %function
|
|
.p2align 2
|
|
main:
|
|
# load bearing nop: pad LBB4 so that it can't be treated
|
|
# as __builtin_unreachable by analyzeJumpTable
|
|
nop
|
|
LBB4:
|
|
callq abort
|
|
.size main, .-main
|
|
|
|
.rodata
|
|
# jmp table, entries must be R_X86_64_PC32 relocs
|
|
.globl JUMP_TABLE
|
|
JUMP_TABLE:
|
|
.long LBB2-JUMP_TABLE
|
|
.long LBB3-JUMP_TABLE
|
|
.long LBB4-JUMP_TABLE
|
|
.long LBB3-JUMP_TABLE
|