# In this test case, the symbol that represents the end of a table # in .rodata is being colocated with the start of a jump table from # another function, and BOLT moves that jump table. This should not # cause the symbol representing the end of the table to be moved as # well. # Bug reported in https://github.com/llvm/llvm-project/issues/55004 # 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 -no-pie -nostartfiles -nostdlib -lc %t.o -o %t.exe -Wl,-q # RUN: llvm-bolt %t.exe -o %t.exe.bolt --relocs=1 --lite=0 \ # RUN: --reorder-blocks=reverse -jump-tables=move # RUN: %t.exe.bolt 1 2 3 .file "jt-symbol-disambiguation.s" .text # ---- # Func foo contains a jump table whose start is colocated with a # symbol marking the end of a data table # ---- .globl foo .type foo, @function foo: .cfi_startproc xor %rax,%rax and $0x3,%rdi leaq .JT1(%rip), %rax movslq (%rax, %rdi, 4), %rdi addq %rax, %rdi jmpq *%rdi .LBB1: movl $0x1,%eax jmp .LBB5 .LBB2: movl $0x2,%eax jmp .LBB5 .LBB3: movl $0x3,%eax jmp .LBB5 .LBB4: movl $0x4,%eax .LBB5: retq .cfi_endproc .size foo, .-foo # ---- # Func _start scans a table using begin/end pointers. End pointer is colocated # with the start of a jump table of function foo. When that jump # table moves, end pointer in _start should not be affected. # ---- .globl _start .type _start, @function _start: .cfi_startproc movq (%rsp), %rdi callq foo leaq .start_of_table(%rip), %rsi # iterator leaq .end_of_table(%rip), %rdi # iterator end .LBB6: cmpq %rsi, %rdi je .LBB7 movq (%rsi), %rbx leaq 8(%rsi), %rsi # ++iterator jmp .LBB6 .LBB7: xor %rdi, %rdi callq exit@PLT .cfi_endproc .size _start, .-_start # ---- # Data section # ---- .section .rodata,"a",@progbits .p2align 3 .start_of_table: .quad 123 .quad 456 .quad 789 .end_of_table: .JT1: .long .LBB1 - .JT1 .long .LBB2 - .JT1 .long .LBB3 - .JT1 .long .LBB4 - .JT1