# REQUIRES: loongarch
# RUN: llvm-mc --filetype=obj --triple=loongarch32 --mattr=+relax %s -o %t.32.o
# RUN: llvm-mc --filetype=obj --triple=loongarch64 --mattr=+relax %s -o %t.64.o
# RUN: ld.lld --section-start=.text=0x10000 --section-start=.text2=0x20000 -e 0 %t.32.o -o %t.32
# RUN: ld.lld --section-start=.text=0x10000 --section-start=.text2=0x20000 -e 0 %t.64.o -o %t.64
# RUN: ld.lld --section-start=.text=0x10000 --section-start=.text2=0x20000 -e 0 %t.32.o --no-relax -o %t.32n
# RUN: ld.lld --section-start=.text=0x10000 --section-start=.text2=0x20000 -e 0 %t.64.o --no-relax -o %t.64n
# RUN: llvm-objdump -td --no-show-raw-insn %t.32 | FileCheck %s
# RUN: llvm-objdump -td --no-show-raw-insn %t.64 | FileCheck %s
# RUN: llvm-objdump -td --no-show-raw-insn %t.32n | FileCheck %s
# RUN: llvm-objdump -td --no-show-raw-insn %t.64n | FileCheck %s
## Test the R_LARCH_ALIGN without symbol index.
# RUN: llvm-mc --filetype=obj --triple=loongarch64 --mattr=+relax %s -o %t.o64.o --defsym=old=1
# RUN: ld.lld --section-start=.text=0x10000 --section-start=.text2=0x20000 -e 0 %t.o64.o -o %t.o64
# RUN: ld.lld --section-start=.text=0x10000 --section-start=.text2=0x20000 -e 0 %t.o64.o --no-relax -o %t.o64n
# RUN: llvm-objdump -td --no-show-raw-insn %t.o64 | FileCheck %s
# RUN: llvm-objdump -td --no-show-raw-insn %t.o64n | FileCheck %s
## -r keeps section contents unchanged.
# RUN: ld.lld -r %t.64.o -o %t.64.r
# RUN: llvm-objdump -dr --no-show-raw-insn %t.64.r | FileCheck %s --check-prefix=CHECKR
# CHECK-DAG: {{0*}}10000 l .text {{0*}}44 .Ltext_start
# CHECK-DAG: {{0*}}10038 l .text {{0*}}0c .L1
# CHECK-DAG: {{0*}}10040 l .text {{0*}}04 .L2
# CHECK-DAG: {{0*}}20000 l .text2 {{0*}}14 .Ltext2_start
# CHECK: <.Ltext_start>:
# CHECK-NEXT: break 1
# CHECK-NEXT: break 2
# CHECK-NEXT: nop
# CHECK-NEXT: nop
# CHECK-NEXT: break 3
# CHECK-NEXT: break 4
# CHECK-NEXT: nop
# CHECK-NEXT: nop
# CHECK-NEXT: pcalau12i $a0, 0
# CHECK-NEXT: addi.{{[dw]}} $a0, $a0, 0
# CHECK-NEXT: pcalau12i $a0, 0
# CHECK-NEXT: addi.{{[dw]}} $a0, $a0, 56
# CHECK-NEXT: pcalau12i $a0, 0
# CHECK-NEXT: addi.{{[dw]}} $a0, $a0, 64
# CHECK-EMPTY:
# CHECK-NEXT: <.L1>:
# CHECK-NEXT: nop
# CHECK-NEXT: nop
# CHECK-EMPTY:
# CHECK-NEXT: <.L2>:
# CHECK-NEXT: break 5
# CHECK: <.Ltext2_start>:
# CHECK-NEXT: pcalau12i $a0, 0
# CHECK-NEXT: addi.{{[dw]}} $a0, $a0, 0
# CHECK-NEXT: nop
# CHECK-NEXT: nop
# CHECK-NEXT: break 6
# CHECKR: <.Ltext2_start>:
# CHECKR-NEXT: pcalau12i $a0, 0
# CHECKR-NEXT: {{0*}}00: R_LARCH_PCALA_HI20 .Ltext2_start
# CHECKR-NEXT: {{0*}}00: R_LARCH_RELAX *ABS*
# CHECKR-NEXT: addi.d $a0, $a0, 0
# CHECKR-NEXT: {{0*}}04: R_LARCH_PCALA_LO12 .Ltext2_start
# CHECKR-NEXT: {{0*}}04: R_LARCH_RELAX *ABS*
# CHECKR-NEXT: nop
# CHECKR-NEXT: {{0*}}08: R_LARCH_ALIGN .Lalign_symbol+0x4
# CHECKR-NEXT: nop
# CHECKR-NEXT: nop
# CHECKR-NEXT: break 6
.macro .fake_p2align_4 max=0
.ifdef old
.if \max==0
.reloc ., R_LARCH_ALIGN, 0xc
nop; nop; nop
.endif
.else
.reloc ., R_LARCH_ALIGN, .Lalign_symbol + 0x4 + (\max << 8)
nop; nop; nop
.endif
.endm
.text
.Lalign_symbol:
.Ltext_start:
break 1
break 2
## +0x8: Emit 2 nops, delete 1 nop.
.fake_p2align_4
break 3
## +0x14: Emit 3 nops > 8 bytes, not emit.
.fake_p2align_4 8
break 4
.fake_p2align_4 8
## +0x18: Emit 2 nops <= 8 bytes.
## Compensate
.ifdef old
nop; nop
.endif
## +0x20: Test symbol value and symbol size can be handled.
la.pcrel $a0, .Ltext_start
la.pcrel $a0, .L1
la.pcrel $a0, .L2
## +0x38: Emit 2 nops, delete 1 nop.
.L1:
.fake_p2align_4
.L2:
break 5
.size .L1, . - .L1
.size .L2, . - .L2
.size .Ltext_start, . - .Ltext_start
## Test another text section.
.section .text2,"ax",@progbits
.Ltext2_start:
la.pcrel $a0, .Ltext2_start
.fake_p2align_4
break 6
.size .Ltext2_start, . - .Ltext2_start