// RUN: llvm-mc -triple riscv64 -mattr=+c,+relax -filetype obj -o %t.o %s
// RUN: ld.lld --emit-relocs -o %t %t.o
// RUN: llvm-bolt --print-cfg --print-fix-riscv-calls --print-only=_start \
// RUN:     -o %t.bolt %t | FileCheck %s
// RUN: llvm-objdump -d %t.bolt | FileCheck --check-prefix=OBJDUMP %s

// CHECK:      Binary Function "_start" after building cfg {
// CHECK:      jal ra, near_f
// CHECK-NEXT: auipc ra, far_f
// CHECK-NEXT: jalr ra, 0xc(ra)
// CHECK-NEXT: j near_f

// CHECK:      Binary Function "_start" after fix-riscv-calls {
// CHECK:      call near_f
// CHECK-NEXT: call far_f
// CHECK-NEXT: tail near_f

// OBJDUMP:      0000000000600000 <_start>:
// OBJDUMP-NEXT:     jal 0x600040 <near_f>
// OBJDUMP-NEXT:     auipc ra, 0x200
// OBJDUMP-NEXT:     jalr 0x7c(ra)
// OBJDUMP-NEXT:     j 0x600040 <near_f>
// OBJDUMP:      0000000000600040 <near_f>:
// OBJDUMP:      0000000000800080 <far_f>:

  .text
  .globl _start
  .p2align 1
_start:
  call near_f
  call far_f
  tail near_f
  .size _start, .-_start

  .global near_f
  .p2align 1
near_f:
  ret
  .size near_f, .-near_f

  .skip (1 << 21)

  .global far_f
  .p2align 1
far_f:
  ret
  .size far_f, .-far_f
