llvm/bolt/test/runtime/X86/hot-end-symbol.s

# 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"