# This test is to verify that BOLT won't take a label pointing to constant # island as a secondary entry point. This could happen when function doesn't # have ELF size set if it is from assembly code, or a constant island is # referenced by another function discovered during relocation processing. # RUN: split-file %s %t # RUN: %clang %cflags -pie %t/tt.asm -o %t.so \ # RUN: -Wl,-q -Wl,--init=_foo -Wl,--fini=_foo # RUN: llvm-bolt %t.so -o %t.bolt.so --print-cfg 2>&1 | FileCheck %s # CHECK-NOT: BOLT-WARNING: reference in the middle of instruction detected \ # CHECK-NOT: function _start at offset 0x{{[0-9a-f]+}} # CHECK: Binary Function "_start" after building cfg # RUN: %clang %cflags -ffunction-sections -shared %t/tt.c %t/ss.c -o %tt.so \ # RUN: -Wl,-q -Wl,--init=_start -Wl,--fini=_start \ # RUN: -Wl,--version-script=%t/linker_script # RUN: llvm-bolt %tt.so -o %tt.bolted.so ;--- tt.asm .text .global _foo .type _foo, %function _foo: ret .global _start .type _start, %function _start: b _foo .balign 16 _random_consts: .long 0x12345678 .long 0x90abcdef .global _bar .type _bar, %function _bar: ret # Dummy relocation to force relocation mode .reloc 0, R_AARCH64_NONE ;--- tt.c void _start() {} __attribute__((naked)) void foo() { __asm( "ldr x16, .L_fnptr\n" "blr x16\n" "ret\n" "_rodatx:" ".global _rodatx;" ".quad 0;" ".L_fnptr:" ".quad 0;"); } ;--- ss.c __attribute__((visibility("hidden"))) extern void* _rodatx; void* bar() { return &_rodatx; } ;--- linker_script { global: _start; foo; bar; local: *; };