[llvm] [AVR][MC] Fix incorrect range of relative jumps (PR #109124)
Ben Shi via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 18 04:39:12 PDT 2024
https://github.com/benshi001 created https://github.com/llvm/llvm-project/pull/109124
'rjmp .+4094' is legal but rejected by llvm-mc since 86a60e7f1e8f361f84ccb6e656e848dd4fbaa713, and this patch fixed that range issue.
>From efcf52b4e48e9826857747cd8a670ea0f2f23abf Mon Sep 17 00:00:00 2001
From: Ben Shi <bennshi at tencent.com>
Date: Wed, 18 Sep 2024 19:36:34 +0800
Subject: [PATCH] [AVR][MC] Fix incorrect range of relative jumps
'rjmp .+4094' is legal but rejected by llvm-mc since 86a60e7f1e8f361f84ccb6e656e848dd4fbaa713,
and this patch fixed that range issue.
---
.../Target/AVR/MCTargetDesc/AVRAsmBackend.cpp | 6 +--
llvm/test/MC/AVR/inst-rjmp.s | 40 ++++++++++---------
2 files changed, 25 insertions(+), 21 deletions(-)
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 74d703593f6667..cf2a9d106f3d18 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-commits
mailing list