# This test ensures that "unclaimed" jump table entries are accounted later # in postProcessIndirectBranches and the function is marked as non-simple. # The test is compiled from the following source using GCC 12.2 -O3: # https://godbolt.org/z/YcPG131s6 # int func(long long Input) { # switch(Input) { # case 3: return 1; # case 4: return 2; # case 6: return 3; # case 8: return 4; # case 13: return 5; # default: __builtin_unreachable(); # } # } # REQUIRES: system-linux # RUN: llvm-mc -filetype=obj -triple x86_64-unknown-unknown %s -o %t.o # RUN: %clang %cflags %S/Inputs/unclaimed-jt-entries.c -no-pie %t.o -o %t.exe -Wl,-q # RUN: llvm-bolt %t.exe -o %t.out 2>&1 | FileCheck %s # CHECK: BOLT-WARNING: 11 unclaimed data relocations remain against function func # Run the optimized binary # RUN: %t.out 3 | FileCheck %s --check-prefix=CHECK3 # CHECK3: 1 # RUN: %t.out 4 | FileCheck %s --check-prefix=CHECK4 # CHECK4: 2 # RUN: %t.out 6 | FileCheck %s --check-prefix=CHECK6 # CHECK6: 3 # RUN: %t.out 8 | FileCheck %s --check-prefix=CHECK8 # CHECK8: 4 # RUN: %t.out 13 | FileCheck %s --check-prefix=CHECK13 # CHECK13: 5 .text .globl func .type func, %function .size func, .Lend-func func: jmp *L4-24(,%rdi,8) .L5: movl $4, %eax ret .L9: movl $2, %eax ret .L8: movl $1, %eax ret .L3: movl $5, %eax ret .L6: movl $3, %eax ret .Lend: .section .rodata .globl L4 L4: .quad .L8 .quad .L9 .quad .L3 .quad .L6 .quad .L3 .quad .L5 .quad .L3 .quad .L3 .quad .L3 .quad .L3 .quad .L3