[llvm-branch-commits] [llvm] 936710a - [AVR][MC] Fix incorrect range of relative jumps (#109124)
Tobias Hieta via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Tue Oct 29 02:04:25 PDT 2024
Author: Ben Shi
Date: 2024-10-29T10:04:20+01:00
New Revision: 936710a0a18bdf8ac1655f6e3bb518b20bb41aea
URL: https://github.com/llvm/llvm-project/commit/936710a0a18bdf8ac1655f6e3bb518b20bb41aea
DIFF: https://github.com/llvm/llvm-project/commit/936710a0a18bdf8ac1655f6e3bb518b20bb41aea.diff
LOG: [AVR][MC] Fix incorrect range of relative jumps (#109124)
'rjmp .+4094' is legal but rejected by llvm-mc since
86a60e7f1e8f361f84ccb6e656e848dd4fbaa713, and this patch fixed that
range issue.
(cherry picked from commit 8c3b94f420a20a45dd07f3e12d6a6d649858f452)
Added:
Modified:
llvm/lib/Target/AVR/MCTargetDesc/AVRAsmBackend.cpp
llvm/test/MC/AVR/inst-rjmp.s
Removed:
################################################################################
diff --git a/llvm/lib/Target/AVR/MCTargetDesc/AVRAsmBackend.cpp b/llvm/lib/Target/AVR/MCTargetDesc/AVRAsmBackend.cpp
index 388d58a82214d1..c0bc1276967bf0 100644
--- a/llvm/lib/Target/AVR/MCTargetDesc/AVRAsmBackend.cpp
+++ b/llvm/lib/Target/AVR/MCTargetDesc/AVRAsmBackend.cpp
@@ -88,15 +88,15 @@ static void adjustBranch(unsigned Size, const MCFixup &Fixup, uint64_t &Value,
/// Adjusts the value of a relative branch target before fixup application.
static void adjustRelativeBranch(unsigned Size, const MCFixup &Fixup,
uint64_t &Value, MCContext *Ctx = nullptr) {
+ // Jumps are relative to the current instruction.
+ Value -= 2;
+
// We have one extra bit of precision because the value is rightshifted by
// one.
signed_width(Size + 1, Value, std::string("branch target"), Fixup, Ctx);
// Rightshifts the value by one.
AVR::fixups::adjustBranchTarget(Value);
-
- // Jumps are relative to the current instruction.
- Value -= 1;
}
/// 22-bit absolute fixup.
diff --git a/llvm/test/MC/AVR/inst-rjmp.s b/llvm/test/MC/AVR/inst-rjmp.s
index cc843a58b55d2c..2d7aa401feacf0 100644
--- a/llvm/test/MC/AVR/inst-rjmp.s
+++ b/llvm/test/MC/AVR/inst-rjmp.s
@@ -19,25 +19,28 @@ end:
x:
rjmp x
.short 0xc00f
+ rjmp .+4094
-; CHECK: rjmp (.Ltmp0+2)+2 ; encoding: [A,0b1100AAAA]
-; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp0+2)+2, kind: fixup_13_pcrel
-; CHECK: rjmp (.Ltmp1-2)+2 ; encoding: [A,0b1100AAAA]
-; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp1-2)+2, kind: fixup_13_pcrel
-; CHECK: rjmp foo ; encoding: [A,0b1100AAAA]
-; CHECK-NEXT: ; fixup A - offset: 0, value: foo, kind: fixup_13_pcrel
-; CHECK: rjmp (.Ltmp2+8)+2 ; encoding: [A,0b1100AAAA]
-; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp2+8)+2, kind: fixup_13_pcrel
-; CHECK: rjmp end ; encoding: [A,0b1100AAAA]
-; CHECK-NEXT: ; fixup A - offset: 0, value: end, kind: fixup_13_pcrel
-; CHECK: rjmp (.Ltmp3+0)+2 ; encoding: [A,0b1100AAAA]
-; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp3+0)+2, kind: fixup_13_pcrel
-; CHECK: rjmp (.Ltmp4-4)+2 ; encoding: [A,0b1100AAAA]
-; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp4-4)+2, kind: fixup_13_pcrel
-; CHECK: rjmp (.Ltmp5-6)+2 ; encoding: [A,0b1100AAAA]
-; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp5-6)+2, kind: fixup_13_pcrel
-; CHECK: rjmp x ; encoding: [A,0b1100AAAA]
-; CHECK-NEXT: ; fixup A - offset: 0, value: x, kind: fixup_13_pcrel
+; CHECK: rjmp (.Ltmp0+2)+2 ; encoding: [A,0b1100AAAA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp0+2)+2, kind: fixup_13_pcrel
+; CHECK: rjmp (.Ltmp1-2)+2 ; encoding: [A,0b1100AAAA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp1-2)+2, kind: fixup_13_pcrel
+; CHECK: rjmp foo ; encoding: [A,0b1100AAAA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: foo, kind: fixup_13_pcrel
+; CHECK: rjmp (.Ltmp2+8)+2 ; encoding: [A,0b1100AAAA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp2+8)+2, kind: fixup_13_pcrel
+; CHECK: rjmp end ; encoding: [A,0b1100AAAA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: end, kind: fixup_13_pcrel
+; CHECK: rjmp (.Ltmp3+0)+2 ; encoding: [A,0b1100AAAA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp3+0)+2, kind: fixup_13_pcrel
+; CHECK: rjmp (.Ltmp4-4)+2 ; encoding: [A,0b1100AAAA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp4-4)+2, kind: fixup_13_pcrel
+; CHECK: rjmp (.Ltmp5-6)+2 ; encoding: [A,0b1100AAAA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp5-6)+2, kind: fixup_13_pcrel
+; CHECK: rjmp x ; encoding: [A,0b1100AAAA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: x, kind: fixup_13_pcrel
+; CHECK: rjmp (.Ltmp6+4094)+2 ; encoding: [A,0b1100AAAA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp6+4094)+2, kind: fixup_13_pcrel
; INST-LABEL: <foo>:
; INST-NEXT: 01 c0 rjmp .+2
@@ -54,3 +57,4 @@ x:
; INST-LABEL: <x>:
; INST-NEXT: ff cf rjmp .-2
; INST-NEXT: 0f c0 rjmp .+30
+; INST-NEXT: ff c7 rjmp .+4094
More information about the llvm-branch-commits
mailing list