# This reproduces a bug where BOLT would read __hot_end as
# the name of a function even when -hot-text is used, which
# means BOLT will emit another __hot_end label, eventually
# asserting due to a symbol redefinition in MCStreamer.
# REQUIRES: system-linux
# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-unknown \
# RUN: %s -o %t.o
# RUN: link_fdata %s %t.o %t.fdata
# RUN: llvm-strip --strip-unneeded %t.o
# RUN: %clang %cflags -no-pie %t.o -o %t.exe -Wl,-q
# RUN: llvm-bolt %t.exe --relocs=1 --hot-text --reorder-functions=hfsort \
# RUN: --split-functions --split-strategy=all \
# RUN: --data %t.fdata -o %t.out | FileCheck %s
# RUN: %t.out 1
# CHECK: BOLT-INFO: setting __hot_end to
# RUN: llvm-nm -n %t.exe | FileCheck %s --check-prefix=CHECK-INPUT
# RUN: llvm-nm -n %t.out | FileCheck %s --check-prefix=CHECK-OUTPUT
# CHECK-INPUT: __hot_start
# CHECK-INPUT-NEXT: main
# CHECK-INPUT-NEXT: foo
# CHECK-INPUT-NEXT: __hot_end
# Our fdata only logs activity in main, so hot markers will change
# CHECK-OUTPUT: __hot_start
# CHECK-OUTPUT-NEXT: main
# CHECK-OUTPUT-NEXT: __hot_end
# CHECK-OUTPUT-NOT: __hot_start.cold
.text
.globl main
.type main, %function
.globl __hot_start
.p2align 4
main:
__hot_start:
# FDATA: 0 [unknown] 0 1 main 0 0 510
pushq %rbp
movq %rsp, %rbp
cmpl $0x2, %edi
jb .BBend
.BB2:
callq bar
leaq mystring, %rdi
callq puts
.BBend:
xorq %rax, %rax
leaveq
retq
.size main, .-main
.globl foo
.type foo, %function
.p2align 4
foo:
retq
.size foo, .-foo
.globl __hot_end
.type __hot_end, %object
.p2align 2
__hot_end:
int3
.size __hot_end, 0
.globl bar
.type bar, %function
.p2align 4
bar:
retq
.size bar, .-bar
.data
mystring: .asciz "test\n"