Skip to content

Commit 8c3b94f

Browse files
authored
[AVR][MC] Fix incorrect range of relative jumps (llvm#109124)
'rjmp .+4094' is legal but rejected by llvm-mc since 86a60e7, and this patch fixed that range issue.
1 parent 95d4c97 commit 8c3b94f

File tree

2 files changed

+25
-21
lines changed

2 files changed

+25
-21
lines changed

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

+3-3
Original file line numberDiff line numberDiff line change
@@ -88,15 +88,15 @@ static void adjustBranch(unsigned Size, const MCFixup &Fixup, uint64_t &Value,
8888
/// Adjusts the value of a relative branch target before fixup application.
8989
static void adjustRelativeBranch(unsigned Size, const MCFixup &Fixup,
9090
uint64_t &Value, MCContext *Ctx = nullptr) {
91+
// Jumps are relative to the current instruction.
92+
Value -= 2;
93+
9194
// We have one extra bit of precision because the value is rightshifted by
9295
// one.
9396
signed_width(Size + 1, Value, std::string("branch target"), Fixup, Ctx);
9497

9598
// Rightshifts the value by one.
9699
AVR::fixups::adjustBranchTarget(Value);
97-
98-
// Jumps are relative to the current instruction.
99-
Value -= 1;
100100
}
101101

102102
/// 22-bit absolute fixup.

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

+22-18
Original file line numberDiff line numberDiff line change
@@ -19,25 +19,28 @@ end:
1919
x:
2020
rjmp x
2121
.short 0xc00f
22+
rjmp .+4094
2223

23-
; CHECK: rjmp (.Ltmp0+2)+2 ; encoding: [A,0b1100AAAA]
24-
; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp0+2)+2, kind: fixup_13_pcrel
25-
; CHECK: rjmp (.Ltmp1-2)+2 ; encoding: [A,0b1100AAAA]
26-
; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp1-2)+2, kind: fixup_13_pcrel
27-
; CHECK: rjmp foo ; encoding: [A,0b1100AAAA]
28-
; CHECK-NEXT: ; fixup A - offset: 0, value: foo, kind: fixup_13_pcrel
29-
; CHECK: rjmp (.Ltmp2+8)+2 ; encoding: [A,0b1100AAAA]
30-
; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp2+8)+2, kind: fixup_13_pcrel
31-
; CHECK: rjmp end ; encoding: [A,0b1100AAAA]
32-
; CHECK-NEXT: ; fixup A - offset: 0, value: end, kind: fixup_13_pcrel
33-
; CHECK: rjmp (.Ltmp3+0)+2 ; encoding: [A,0b1100AAAA]
34-
; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp3+0)+2, kind: fixup_13_pcrel
35-
; CHECK: rjmp (.Ltmp4-4)+2 ; encoding: [A,0b1100AAAA]
36-
; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp4-4)+2, kind: fixup_13_pcrel
37-
; CHECK: rjmp (.Ltmp5-6)+2 ; encoding: [A,0b1100AAAA]
38-
; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp5-6)+2, kind: fixup_13_pcrel
39-
; CHECK: rjmp x ; encoding: [A,0b1100AAAA]
40-
; CHECK-NEXT: ; fixup A - offset: 0, value: x, kind: fixup_13_pcrel
24+
; CHECK: rjmp (.Ltmp0+2)+2 ; encoding: [A,0b1100AAAA]
25+
; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp0+2)+2, kind: fixup_13_pcrel
26+
; CHECK: rjmp (.Ltmp1-2)+2 ; encoding: [A,0b1100AAAA]
27+
; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp1-2)+2, kind: fixup_13_pcrel
28+
; CHECK: rjmp foo ; encoding: [A,0b1100AAAA]
29+
; CHECK-NEXT: ; fixup A - offset: 0, value: foo, kind: fixup_13_pcrel
30+
; CHECK: rjmp (.Ltmp2+8)+2 ; encoding: [A,0b1100AAAA]
31+
; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp2+8)+2, kind: fixup_13_pcrel
32+
; CHECK: rjmp end ; encoding: [A,0b1100AAAA]
33+
; CHECK-NEXT: ; fixup A - offset: 0, value: end, kind: fixup_13_pcrel
34+
; CHECK: rjmp (.Ltmp3+0)+2 ; encoding: [A,0b1100AAAA]
35+
; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp3+0)+2, kind: fixup_13_pcrel
36+
; CHECK: rjmp (.Ltmp4-4)+2 ; encoding: [A,0b1100AAAA]
37+
; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp4-4)+2, kind: fixup_13_pcrel
38+
; CHECK: rjmp (.Ltmp5-6)+2 ; encoding: [A,0b1100AAAA]
39+
; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp5-6)+2, kind: fixup_13_pcrel
40+
; CHECK: rjmp x ; encoding: [A,0b1100AAAA]
41+
; CHECK-NEXT: ; fixup A - offset: 0, value: x, kind: fixup_13_pcrel
42+
; CHECK: rjmp (.Ltmp6+4094)+2 ; encoding: [A,0b1100AAAA]
43+
; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp6+4094)+2, kind: fixup_13_pcrel
4144

4245
; INST-LABEL: <foo>:
4346
; INST-NEXT: 01 c0 rjmp .+2
@@ -54,3 +57,4 @@ x:
5457
; INST-LABEL: <x>:
5558
; INST-NEXT: ff cf rjmp .-2
5659
; INST-NEXT: 0f c0 rjmp .+30
60+
; INST-NEXT: ff c7 rjmp .+4094

0 commit comments

Comments
 (0)