blob: 3ad69467fe54ffed12b09d74396d8fd2f5b6ca83 [file] [log] [blame] [edit]
# 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: *;
};