Skip to content

Commit 697a162

Browse files
committed
[AVR] Fix inaccurate offsets in PC relative branch instructions
In avr-gcc, the destination of "rjmp label + offset" is address 'label + offset', while destination of "rjmp . + offset" is 'address_of_rjmp + offset + 2'. Clang is in accordance with avr-gcc for "rjmp label + offset", but emits incorrect destination of "rjmp . + offset" to 'address_of_rjmp + offset', in which the expected offset 2 is missing. This patch fixes the above issue. Fixes #60019 Reviewed By: jacquesguan, aykevl Differential Revision: https://reviews.llvm.org/D143901
1 parent 1e69211 commit 697a162

File tree

6 files changed

+73
-67
lines changed

6 files changed

+73
-67
lines changed

llvm/lib/Target/AVR/MCTargetDesc/AVRAsmBackend.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -514,6 +514,12 @@ bool AVRAsmBackend::shouldForceRelocation(const MCAssembler &Asm,
514514
// Fixups which should always be recorded as relocations.
515515
case AVR::fixup_7_pcrel:
516516
case AVR::fixup_13_pcrel:
517+
// Do not force relocation for PC relative branch like 'rjmp .',
518+
// 'rcall . - off' and 'breq . + off'.
519+
if (const auto *SymA = Target.getSymA())
520+
if (SymA->getSymbol().getName().size() == 0)
521+
return false;
522+
[[fallthrough]];
517523
case AVR::fixup_call:
518524
return true;
519525
}

llvm/test/MC/AVR/inst-brbc.s

+6-6
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ foo:
1616
; CHECK: brcc .Ltmp1-16 ; encoding: [0bAAAAA000,0b111101AA]
1717
; CHECK: ; fixup A - offset: 0, value: .Ltmp1-16, kind: fixup_7_pcrel
1818

19-
; INST: brvc .+0
20-
; INST: brsh .+0
21-
; INST: brne .-42
22-
; INST: brpl .-44
23-
; INST: brge .-46
24-
; INST: brid .+48
19+
; INST: 23 f4 brvc .+8
20+
; INST: c0 f7 brsh .-16
21+
; INST: 59 f7 brne .-42
22+
; INST: 52 f7 brpl .-44
23+
; INST: 4c f7 brge .-46
24+
; INST: c7 f4 brid .+48

llvm/test/MC/AVR/inst-brbs.s

+6-6
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ foo:
1616
; CHECK: brcs .Ltmp1-12 ; encoding: [0bAAAAA000,0b111100AA]
1717
; CHECK: ; fixup A - offset: 0, value: .Ltmp1-12, kind: fixup_7_pcrel
1818

19-
; INST: brvs .+0
20-
; INST: brlo .+0
21-
; INST: breq .-42
22-
; INST brmi .-44
23-
; INST brlt .-46
24-
; InST: brie .+28
19+
; INST: 23 f0 brvs .+8
20+
; INST: d0 f3 brlo .-12
21+
; INST: 59 f3 breq .-42
22+
; INST: 52 f3 brmi .-44
23+
; INST: 4c f3 brlt .-46
24+
; INST: 77 f0 brie .+28

llvm/test/MC/AVR/inst-family-cond-branch.s

+40-40
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@ foo:
2020
; CHECK: ; fixup A - offset: 0, value: baz, kind: fixup_7_pcrel
2121

2222
; INST-LABEL: <foo>:
23-
; INST: breq .+0
24-
; INST: breq .+0
25-
; INST: breq .+0
23+
; INST: breq .-18
24+
; INST: breq .-12
25+
; INST: breq .-18
2626
; INST: breq .+0
2727

2828
; BRNE
@@ -40,9 +40,9 @@ foo:
4040
; CHECK: brbc 1, bar ; encoding: [0bAAAAA001,0b111101AA]
4141
; CHECK: ; fixup A - offset: 0, value: bar, kind: fixup_7_pcrel
4242

43-
; INST: brne .+0
44-
; INST: brne .+0
45-
; INST: brne .+0
43+
; INST: brne .+10
44+
; INST: brne .+2
45+
; INST: brne .+10
4646
; INST: brne .+0
4747

4848
bar:
@@ -62,9 +62,9 @@ bar:
6262
; CHECK: ; fixup A - offset: 0, value: end, kind: fixup_7_pcrel
6363

6464
; INST-LABEL: <bar>:
65-
; INST: brlo .+0
66-
; INST: brlo .+0
67-
; INST: brlo .+0
65+
; INST: brlo .+8
66+
; INST: brlo .+4
67+
; INST: brlo .+8
6868
; INST: brlo .+0
6969

7070
; BRCC
@@ -82,9 +82,9 @@ bar:
8282
; CHECK: brcc baz ; encoding: [0bAAAAA000,0b111101AA]
8383
; CHECK: ; fixup A - offset: 0, value: baz, kind: fixup_7_pcrel
8484

85-
; INST: brsh .+0
86-
; INST: brsh .+0
87-
; INST: brsh .+0
85+
; INST: brsh .+66
86+
; INST: brsh .-22
87+
; INST: brsh .+66
8888
; INST: brsh .+0
8989

9090
; BRSH
@@ -99,8 +99,8 @@ bar:
9999
; CHECK: brsh car ; encoding: [0bAAAAA000,0b111101AA]
100100
; CHECK: ; fixup A - offset: 0, value: car, kind: fixup_7_pcrel
101101

102-
; INST: brsh .+0
103-
; INST: brsh .+0
102+
; INST: brsh .+32
103+
; INST: brsh .+70
104104
; INST: brsh .+0
105105

106106
baz:
@@ -118,8 +118,8 @@ baz:
118118
; CHECK: ; fixup A - offset: 0, value: car, kind: fixup_7_pcrel
119119

120120
; INST-LABEL: <baz>:
121-
; INST: brlo .+0
122-
; INST: brlo .+0
121+
; INST: brlo .+12
122+
; INST: brlo .+28
123123
; INST: brlo .+0
124124

125125
; BRMI
@@ -134,8 +134,8 @@ baz:
134134
; CHECK: brmi car ; encoding: [0bAAAAA010,0b111100AA]
135135
; CHECK: ; fixup A - offset: 0, value: car, kind: fixup_7_pcrel
136136

137-
; INST: brmi .+0
138-
; INST: brmi .+0
137+
; INST: brmi .+66
138+
; INST: brmi .+58
139139
; INST: brmi .+0
140140

141141
; BRPL
@@ -150,8 +150,8 @@ baz:
150150
; CHECK: brpl car ; encoding: [0bAAAAA010,0b111101AA]
151151
; CHECK: ; fixup A - offset: 0, value: car, kind: fixup_7_pcrel
152152

153-
; INST: brpl .+0
154-
; INST: brpl .+0
153+
; INST: brpl .-12
154+
; INST: brpl .+18
155155
; INST: brpl .+0
156156

157157
; BRGE
@@ -166,8 +166,8 @@ baz:
166166
; CHECK: brge car ; encoding: [0bAAAAA100,0b111101AA]
167167
; CHECK: ; fixup A - offset: 0, value: car, kind: fixup_7_pcrel
168168

169-
; INST: brge .+0
170-
; INST: brge .+0
169+
; INST: brge .+50
170+
; INST: brge .+42
171171
; INST: brge .+0
172172

173173
car:
@@ -184,8 +184,8 @@ car:
184184
; CHECK: ; fixup A - offset: 0, value: end, kind: fixup_7_pcrel
185185

186186
; INST-LABEL: <car>:
187-
; INST: brlt .+0
188-
; INST: brlt .+0
187+
; INST: brlt .+16
188+
; INST: brlt .+2
189189
; INST: brlt .+0
190190

191191
; BRHS
@@ -200,8 +200,8 @@ car:
200200
; CHECK: brhs just_another_label ; encoding: [0bAAAAA101,0b111100AA]
201201
; CHECK: ; fixup A - offset: 0, value: just_another_label, kind: fixup_7_pcrel
202202

203-
; INST: brhs .+0
204-
; INST: brhs .+0
203+
; INST: brhs .-66
204+
; INST: brhs .+14
205205
; INST: brhs .+0
206206

207207
; BRHC
@@ -216,8 +216,8 @@ car:
216216
; CHECK: brhc just_another_label ; encoding: [0bAAAAA101,0b111101AA]
217217
; CHECK: ; fixup A - offset: 0, value: just_another_label, kind: fixup_7_pcrel
218218

219-
; INST: brhc .+0
220-
; INST: brhc .+0
219+
; INST: brhc .+12
220+
; INST: brhc .+14
221221
; INST: brhc .+0
222222

223223
; BRTS
@@ -232,8 +232,8 @@ car:
232232
; CHECK: brts just_another_label ; encoding: [0bAAAAA110,0b111100AA]
233233
; CHECK: ; fixup A - offset: 0, value: just_another_label, kind: fixup_7_pcrel
234234

235-
; INST: brts .+0
236-
; INST: brts .+0
235+
; INST: brts .+18
236+
; INST: brts .+22
237237
; INST: brts .+0
238238

239239
just_another_label:
@@ -250,8 +250,8 @@ just_another_label:
250250
; CHECK: ; fixup A - offset: 0, value: end, kind: fixup_7_pcrel
251251

252252
; INST-LABEL: <just_another_label>:
253-
; INST: brtc .+0
254-
; INST: brtc .+0
253+
; INST: brtc .+52
254+
; INST: brtc .+50
255255
; INST: brtc .+0
256256

257257
; BRVS
@@ -266,8 +266,8 @@ just_another_label:
266266
; CHECK: brvs end ; encoding: [0bAAAAA011,0b111100AA]
267267
; CHECK: ; fixup A - offset: 0, value: end, kind: fixup_7_pcrel
268268

269-
; INST: brvs .+0
270-
; INST: brvs .+0
269+
; INST: brvs .+18
270+
; INST: brvs .+32
271271
; INST: brvs .+0
272272

273273
; BRVC
@@ -282,8 +282,8 @@ just_another_label:
282282
; CHECK: brvc end ; encoding: [0bAAAAA011,0b111101AA]
283283
; CHECK: ; fixup A - offset: 0, value: end, kind: fixup_7_pcrel
284284

285-
; INST: brvc .+0
286-
; INST: brvc .+0
285+
; INST: brvc .-28
286+
; INST: brvc .-62
287287
; INST: brvc .+0
288288

289289
; BRIE
@@ -298,8 +298,8 @@ just_another_label:
298298
; CHECK: brie end ; encoding: [0bAAAAA111,0b111100AA]
299299
; CHECK: ; fixup A - offset: 0, value: end, kind: fixup_7_pcrel
300300

301-
; INST: brie .+0
302-
; INST: brie .+0
301+
; INST: brie .+20
302+
; INST: brie .+40
303303
; INST: brie .+0
304304

305305
; BRID
@@ -314,8 +314,8 @@ just_another_label:
314314
; CHECK: brid end ; encoding: [0bAAAAA111,0b111101AA]
315315
; CHECK: ; fixup A - offset: 0, value: end, kind: fixup_7_pcrel
316316

317-
; INST: brid .+0
318-
; INST: brid .+0
317+
; INST: brid .+42
318+
; INST: brid .+62
319319
; INST: brid .+0
320320

321321
end:

llvm/test/MC/AVR/inst-rcall.s

+5-5
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ foo:
2020
; CHECK: rcall .Ltmp3+46 ; encoding: [A,0b1101AAAA]
2121
; CHECK: ; fixup A - offset: 0, value: .Ltmp3+46, kind: fixup_13_pcrel
2222

23-
; INST: rcall .+0
24-
; INST: rcall .+0
25-
; INST: rcall .+0
26-
; INST: rcall .+0
27-
; INST: rcall .-44
23+
; INST: 00 d0 rcall .+0
24+
; INST: fc df rcall .-8
25+
; INST: 06 d0 rcall .+12
26+
; INST: 17 d0 rcall .+46
27+
; INST: ea df rcall .-44

llvm/test/MC/AVR/inst-rjmp.s

+10-10
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,13 @@ x:
3737
; CHECK: rjmp x ; encoding: [A,0b1100AAAA]
3838
; CHECK: ; fixup A - offset: 0, value: x, kind: fixup_13_pcrel
3939

40-
; INST: rjmp .+0
41-
; INST: rjmp .+0
42-
; INST: rjmp .+0
43-
; INST: rjmp .+0
44-
; INST: rjmp .+0
45-
; INST: rjmp .+0
46-
; INST: rjmp .+0
47-
; INST: rjmp .+0
48-
; INST: rjmp .+0
49-
; INST: rjmp .+30
40+
; INST: 01 c0 rjmp .+2
41+
; INST: ff cf rjmp .-2
42+
; INST: 00 c0 rjmp .+0
43+
; INST: 04 c0 rjmp .+8
44+
; INST: 00 c0 rjmp .+0
45+
; INST: 00 c0 rjmp .+0
46+
; INST: fe cf rjmp .-4
47+
; INST: fd cf rjmp .-6
48+
; INST: 00 c0 rjmp .+0
49+
; INST: 0f c0 rjmp .+30

0 commit comments

Comments
 (0)