// 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 near_f // CHECK-NEXT: auipc ra, far_f // CHECK-NEXT: jalr 0xc(ra) // CHECK-NEXT: j near_f // CHECK: Binary Function "_start" after fix-riscv-calls { // CHECK: call near_f // CHECK-NEXT: nop // CHECK-NEXT: call far_f // CHECK-NEXT: tail near_f // OBJDUMP: 0000000000600000 <_start>: // OBJDUMP-NEXT: jal 0x600040 // OBJDUMP-NEXT: nop // OBJDUMP-NEXT: auipc ra, 0x200 // OBJDUMP-NEXT: jalr 0x78(ra) // OBJDUMP-NEXT: j 0x600040 // OBJDUMP: 0000000000600040 : // OBJDUMP: 0000000000800080 : .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