Move out of line
[llvm-project.git] / lld / test / ELF / loongarch-relax-align.s
blobab61e15d5caca28ef83e42c2ff7efd444e8608fb
1 # REQUIRES: loongarch
3 # RUN: llvm-mc --filetype=obj --triple=loongarch32 --mattr=+relax %s -o %t.32.o
4 # RUN: llvm-mc --filetype=obj --triple=loongarch64 --mattr=+relax %s -o %t.64.o
5 # RUN: ld.lld --section-start=.text=0x10000 --section-start=.text2=0x20000 -e 0 %t.32.o -o %t.32
6 # RUN: ld.lld --section-start=.text=0x10000 --section-start=.text2=0x20000 -e 0 %t.64.o -o %t.64
7 # RUN: ld.lld --section-start=.text=0x10000 --section-start=.text2=0x20000 -e 0 %t.32.o --no-relax -o %t.32n
8 # RUN: ld.lld --section-start=.text=0x10000 --section-start=.text2=0x20000 -e 0 %t.64.o --no-relax -o %t.64n
9 # RUN: llvm-objdump -td --no-show-raw-insn %t.32 | FileCheck %s
10 # RUN: llvm-objdump -td --no-show-raw-insn %t.64 | FileCheck %s
11 # RUN: llvm-objdump -td --no-show-raw-insn %t.32n | FileCheck %s
12 # RUN: llvm-objdump -td --no-show-raw-insn %t.64n | FileCheck %s
14 ## Test the R_LARCH_ALIGN without symbol index.
15 # RUN: llvm-mc --filetype=obj --triple=loongarch64 --mattr=+relax %s -o %t.o64.o --defsym=old=1
16 # RUN: ld.lld --section-start=.text=0x10000 --section-start=.text2=0x20000 -e 0 %t.o64.o -o %t.o64
17 # RUN: ld.lld --section-start=.text=0x10000 --section-start=.text2=0x20000 -e 0 %t.o64.o --no-relax -o %t.o64n
18 # RUN: llvm-objdump -td --no-show-raw-insn %t.o64 | FileCheck %s
19 # RUN: llvm-objdump -td --no-show-raw-insn %t.o64n | FileCheck %s
21 ## -r keeps section contents unchanged.
22 # RUN: ld.lld -r %t.64.o -o %t.64.r
23 # RUN: llvm-objdump -dr --no-show-raw-insn %t.64.r | FileCheck %s --check-prefix=CHECKR
25 # CHECK-DAG: {{0*}}10000 l .text {{0*}}44 .Ltext_start
26 # CHECK-DAG: {{0*}}10038 l .text {{0*}}0c .L1
27 # CHECK-DAG: {{0*}}10040 l .text {{0*}}04 .L2
28 # CHECK-DAG: {{0*}}20000 l .text2 {{0*}}14 .Ltext2_start
30 # CHECK: <.Ltext_start>:
31 # CHECK-NEXT: break 1
32 # CHECK-NEXT: break 2
33 # CHECK-NEXT: nop
34 # CHECK-NEXT: nop
35 # CHECK-NEXT: break 3
36 # CHECK-NEXT: break 4
37 # CHECK-NEXT: nop
38 # CHECK-NEXT: nop
39 # CHECK-NEXT: pcalau12i $a0, 0
40 # CHECK-NEXT: addi.{{[dw]}} $a0, $a0, 0
41 # CHECK-NEXT: pcalau12i $a0, 0
42 # CHECK-NEXT: addi.{{[dw]}} $a0, $a0, 56
43 # CHECK-NEXT: pcalau12i $a0, 0
44 # CHECK-NEXT: addi.{{[dw]}} $a0, $a0, 64
45 # CHECK-EMPTY:
46 # CHECK-NEXT: <.L1>:
47 # CHECK-NEXT: nop
48 # CHECK-NEXT: nop
49 # CHECK-EMPTY:
50 # CHECK-NEXT: <.L2>:
51 # CHECK-NEXT: break 5
53 # CHECK: <.Ltext2_start>:
54 # CHECK-NEXT: pcalau12i $a0, 0
55 # CHECK-NEXT: addi.{{[dw]}} $a0, $a0, 0
56 # CHECK-NEXT: nop
57 # CHECK-NEXT: nop
58 # CHECK-NEXT: break 6
60 # CHECKR: <.Ltext2_start>:
61 # CHECKR-NEXT: pcalau12i $a0, 0
62 # CHECKR-NEXT: {{0*}}00: R_LARCH_PCALA_HI20 .Ltext2_start
63 # CHECKR-NEXT: {{0*}}00: R_LARCH_RELAX *ABS*
64 # CHECKR-NEXT: addi.d $a0, $a0, 0
65 # CHECKR-NEXT: {{0*}}04: R_LARCH_PCALA_LO12 .Ltext2_start
66 # CHECKR-NEXT: {{0*}}04: R_LARCH_RELAX *ABS*
67 # CHECKR-NEXT: nop
68 # CHECKR-NEXT: {{0*}}08: R_LARCH_ALIGN .Lalign_symbol+0x4
69 # CHECKR-NEXT: nop
70 # CHECKR-NEXT: nop
71 # CHECKR-NEXT: break 6
73 .macro .fake_p2align_4 max=0
74 .ifdef old
75 .if \max==0
76 .reloc ., R_LARCH_ALIGN, 0xc
77 nop; nop; nop
78 .endif
79 .else
80 .reloc ., R_LARCH_ALIGN, .Lalign_symbol + 0x4 + (\max << 8)
81 nop; nop; nop
82 .endif
83 .endm
85 .text
86 .Lalign_symbol:
87 .Ltext_start:
88 break 1
89 break 2
90 ## +0x8: Emit 2 nops, delete 1 nop.
91 .fake_p2align_4
93 break 3
94 ## +0x14: Emit 3 nops > 8 bytes, not emit.
95 .fake_p2align_4 8
97 break 4
98 .fake_p2align_4 8
99 ## +0x18: Emit 2 nops <= 8 bytes.
101 ## Compensate
102 .ifdef old
103 nop; nop
104 .endif
106 ## +0x20: Test symbol value and symbol size can be handled.
107 la.pcrel $a0, .Ltext_start
108 la.pcrel $a0, .L1
109 la.pcrel $a0, .L2
111 ## +0x38: Emit 2 nops, delete 1 nop.
112 .L1:
113 .fake_p2align_4
114 .L2:
115 break 5
116 .size .L1, . - .L1
117 .size .L2, . - .L2
118 .size .Ltext_start, . - .Ltext_start
120 ## Test another text section.
121 .section .text2,"ax",@progbits
122 .Ltext2_start:
123 la.pcrel $a0, .Ltext2_start
124 .fake_p2align_4
125 break 6
126 .size .Ltext2_start, . - .Ltext2_start