# REQUIRES: riscv
# RUN: rm -rf %t && split-file %s %t && cd %t
# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+c,+relax a.s -o a.o

# RUN: ld.lld -T lds a.o -o a
# RUN: llvm-objdump -d --no-show-raw-insn -M no-aliases a | FileCheck %s

## Unsure whether this needs a diagnostic. GNU ld allows this.
# RUN: ld.lld -T lds -pie a.o -o a.pie
# RUN: llvm-objdump -d --no-show-raw-insn -M no-aliases a.pie | FileCheck %s

# RUN: ld.lld -T lds -pie -z notext -z ifunc-noplt a.o -o a.ifunc-noplt
# RUN: llvm-objdump -d --no-show-raw-insn -M no-aliases a.ifunc-noplt | FileCheck %s --check-prefix=CHECK2

# CHECK-LABEL:  <_start>:
# CHECK-NEXT:             jal    zero, 0x8 <abs>
# CHECK-NEXT:             jal    zero, 0x8 <abs>
# CHECK-NEXT:             jal    ra, 0x8 <abs>
# CHECK-NEXT:             auipc  t1, 0xfff00
# CHECK-NEXT:             jalr   zero, -0x4(t1)
# CHECK-EMPTY:

# CHECK-LABEL:  <.mid>:
# CHECK-NEXT:             jal    zero, 0x101000
# CHECK-NEXT:             c.j    0x101000
# CHECK-EMPTY:

# CHECK2-LABEL: <.mid>:
# CHECK2-NEXT:            auipc  t1, 0x0
# CHECK2-NEXT:            jalr   zero, 0x0(t1)
# CHECK2-NEXT:            auipc  t1, 0x0
# CHECK2-NEXT:            jalr   zero, 0x0(t1)
# CHECK2-EMPTY:

#--- a.s
.global _start, ifunc
_start:
  jump abs, t2
  jump abs, t3
  call abs
  tail abs       # not relaxed

.section .mid,"ax",@progbits
.balign 16
  tail ifunc@plt # not relaxed
  tail ifunc@plt

.type ifunc, @gnu_indirect_function
ifunc:
  ret

#--- lds
SECTIONS {
  .text 0x100000 : { *(.text) }
  .mid 0x100800 : { *(.mid) }
  .iplt 0x101000 : { *(.iplt) }
}
abs = 8;
