aboutsummaryrefslogtreecommitdiff
path: root/llvm/test/MC/RISCV/align.s
blob: 1dab1c6f75458c68dd82f186f6a56462556ff124 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
# The file testing Nop insertion with R_RISCV_ALIGN for relaxation.

# Relaxation enabled:
# RUN: llvm-mc -filetype=obj -triple riscv32 -mattr=+relax < %s \
# RUN:     | llvm-objdump -d -M no-aliases - \
# RUN:     | FileCheck -check-prefix=RELAX-INST %s
# RUN: llvm-mc -filetype=obj -triple riscv32 -mattr=+relax < %s \
# RUN:     | llvm-readobj -r - | FileCheck -check-prefix=RELAX-RELOC %s

# Relaxation disabled:
# RUN: llvm-mc -filetype=obj -triple riscv32 -mattr=-relax < %s \
# RUN:     | llvm-objdump -d -M no-aliases - \
# RUN:     | FileCheck -check-prefix=NORELAX-INST %s
# RUN: llvm-mc -filetype=obj -triple riscv32 -mattr=-relax < %s \
# RUN:     | llvm-readobj -r - | FileCheck -check-prefix=NORELAX-RELOC %s

# Relaxation enabled with C extension:
# RUN: llvm-mc -filetype=obj -triple riscv32 -mattr=+c,+relax < %s \
# RUN:     | llvm-objdump -d -M no-aliases - \
# RUN:     | FileCheck -check-prefix=C-OR-ZCA-EXT-RELAX-INST %s
# RUN: llvm-mc -filetype=obj -triple riscv32 -mattr=+c,+relax < %s \
# RUN:     | llvm-readobj -r - | FileCheck -check-prefix=C-OR-ZCA-EXT-RELAX-RELOC %s

# Relaxation enabled with Zca extension:
# RUN: llvm-mc -filetype=obj -triple riscv32 -mattr=+zca,+relax < %s \
# RUN:     | llvm-objdump --mattr=+zca -d -M no-aliases - \
# RUN:     | FileCheck -check-prefix=C-OR-ZCA-EXT-RELAX-INST %s
# RUN: llvm-mc -filetype=obj -triple riscv32 -mattr=+zca,+relax < %s \
# RUN:     | llvm-readobj -r - | FileCheck -check-prefix=C-OR-ZCA-EXT-RELAX-RELOC %s

# Relaxation disabled with C extension:
# RUN: llvm-mc -filetype=obj -triple riscv32 -mattr=+c,-relax < %s \
# RUN:     | llvm-objdump -d -M no-aliases - \
# RUN:     | FileCheck -check-prefix=C-OR-ZCA-EXT-NORELAX-INST %s
# RUN: llvm-mc -filetype=obj -triple riscv32 -mattr=+c,-relax < %s \
# RUN:     | llvm-readobj -r - | FileCheck -check-prefix=C-OR-ZCA-EXT-NORELAX-RELOC %s

# Relaxation disabled with ZCA extension:
# RUN: llvm-mc -filetype=obj -triple riscv32 -mattr=+zca,-relax < %s \
# RUN:     | llvm-objdump --mattr=+zca -d -M no-aliases - \
# RUN:     | FileCheck -check-prefix=C-OR-ZCA-EXT-NORELAX-INST %s
# RUN: llvm-mc -filetype=obj -triple riscv32 -mattr=+zca,-relax < %s \
# RUN:     | llvm-readobj -r - | FileCheck -check-prefix=C-OR-ZCA-EXT-NORELAX-RELOC %s

# We need to insert N-MinNopSize bytes NOPs and R_RISCV_ALIGN relocation
# type for .align N directive when linker relaxation enabled.
# Linker could satisfy alignment by removing NOPs after linker relaxation.

# The first R_RISCV_ALIGN come from
# MCELFStreamer::InitSections() emitCodeAlignment(getTextSectionAligntment()).
# C-OR-ZCA-EXT-RELAX-RELOC: R_RISCV_ALIGN - 0x2
# C-OR-ZCA-EXT-RELAX-INST:  c.nop
test:
	.p2align 2
# If the +c extension is enabled, the text section will be 2-byte aligned, so
# one c.nop instruction is sufficient.
# C-OR-ZCA-EXT-RELAX-RELOC-NOT: R_RISCV_ALIGN - 0x2
# C-OR-ZCA-EXT-RELAX-INST-NOT:  c.nop
	bne     zero, a0, .LBB0_2
	mv	a0, zero
	.p2align 3
# RELAX-RELOC: R_RISCV_ALIGN - 0x4
# RELAX-INST:  addi    zero, zero, 0
# C-OR-ZCA-EXT-RELAX-RELOC: R_RISCV_ALIGN - 0x6
# C-OR-ZCA-EXT-RELAX-INST:  c.nop
# C-OR-ZCA-EXT-RELAX-INST:  addi    zero, zero, 0
# C-OR-ZCA-EXT-NORELAX-INST: addi    zero, zero, 0
	add	a0, a0, a1
	.align 4
.LBB0_2:
# RELAX-RELOC: R_RISCV_ALIGN - 0xC
# RELAX-INST:  addi    zero, zero, 0
# RELAX-INST:  addi    zero, zero, 0
# RELAX-INST:  addi    zero, zero, 0
# NORELAX-INST: addi    zero, zero, 0
# C-OR-ZCA-EXT-RELAX-RELOC: R_RISCV_ALIGN - 0xE
# C-OR-ZCA-EXT-RELAX-INST:  addi    zero, zero, 0
# C-OR-ZCA-EXT-RELAX-INST:  addi    zero, zero, 0
# C-OR-ZCA-EXT-RELAX-INST:  addi    zero, zero, 0
# C-OR-ZCA-EXT-RELAX-INST:  c.nop
# C-EXT-INST: addi    zero, zero, 0
# C-EXT-INST: c.nop
	add	a0, a0, a1
	.p2align 3
.constant_pool:
.long	3126770193
# RELAX-RELOC: R_RISCV_ALIGN - 0x4
# RELAX-INST:  addi    zero, zero, 0
# NORELAX-INST: addi    zero, zero, 0
# C-OR-ZCA-EXT-RELAX-RELOC: R_RISCV_ALIGN - 0x6
# C-OR-ZCA-EXT-RELAX-INST:  addi    zero, zero, 0
# C-OR-ZCA-EXT-RELAX-INST-NOT:  c.nop
# C-EXT-INST: addi    zero, zero, 0
# C-EXT-INST: c.nop
	add	a0, a0, a1
# Alignment directive with specific padding value 0x01.
# We will not emit R_RISCV_ALIGN in this case.
# The behavior is the same as GNU assembler.
	.p2align 4, 1
# RELAX-RELOC-NOT: R_RISCV_ALIGN - 0xC
# RELAX-INST:  0101
# RELAX-INST:  0101
# C-OR-ZCA-EXT-RELAX-RELOC-NOT: R_RISCV_ALIGN - 0xE
# C-OR-ZCA-EXT-RELAX-INST:  0101
# C-EXT-INST:  0101
	ret
# NORELAX-RELOC-NOT: R_RISCV
# C-OR-ZCA-EXT-NORELAX-RELOC-NOT: R_RISCV
# Code alignment of a byte size less than the size of a nop must be treated
# as no alignment. This used to trigger a fatal error with relaxation enabled
# as the calculation to emit the worst-case sequence of nops would overflow.
	.p2align        1
	add	a0, a0, a1
	.p2align        0
	add	a0, a0, a1
# We only need to insert R_RISCV_ALIGN for code section
# when the linker relaxation enabled.
        .data
	.p2align        3
# RELAX-RELOC-NOT: R_RISCV_ALIGN
# C-OR-ZCA-EXT-RELAX-RELOC-NOT: R_RISCV_ALIGN
data1:
	.word 7
	.p2align        4
# RELAX-RELOC-NOT: R_RISCV_ALIGN
# C-OR-ZCA-EXT-RELAX-RELOC-NOT: R_RISCV_ALIGN
data2:
	.word 9
# Check that the initial alignment is properly handled when using .option to
# disable the C extension. This used to crash.
# C-OR-ZCA-EXT-RELAX-INST:      <.text2>:
# C-OR-ZCA-EXT-RELAX-INST-NEXT: add a0, a0, a1
	.section .text2, "x"
	.option norvc
	.balign 4
	add	a0, a0, a1

## Branches crossing the linker-relaxable R_RISCV_ALIGN need relocations.
# RELAX-RELOC:      .rela.text3 {
# RELAX-RELOC-NEXT:    0x4 R_RISCV_BRANCH .Ltmp[[#]] 0x0
# RELAX-RELOC-NEXT:    0x8 R_RISCV_ALIGN - 0x4
# RELAX-RELOC-NEXT:    0xC R_RISCV_BRANCH .Ltmp[[#]] 0x0
# RELAX-RELOC-NEXT: }
# C-OR-ZCA-EXT-RELAX-RELOC:      .rela.text3 {
# C-OR-ZCA-EXT-RELAX-RELOC-NEXT:    0x4 R_RISCV_BRANCH .Ltmp[[#]] 0x0
# C-OR-ZCA-EXT-RELAX-RELOC-NEXT:    0x8 R_RISCV_ALIGN - 0x4
# C-OR-ZCA-EXT-RELAX-RELOC-NEXT:    0xC R_RISCV_BRANCH .Ltmp[[#]] 0x0
# C-OR-ZCA-EXT-RELAX-RELOC-NEXT: }
	.section .text3, "ax"
	bnez t1, 1f
	bnez t2, 2f
1:
	.p2align 3
2:
	bnez t1, 1b
	bnez t1, 2b