-
Notifications
You must be signed in to change notification settings - Fork 13.3k
[AVR][MC] Fix incorrect range of relative jumps #109124
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
'rjmp .+4094' is legal but rejected by llvm-mc since 86a60e7, and this patch fixed that range issue.
@llvm/pr-subscribers-mc Author: Ben Shi (benshi001) Changes'rjmp .+4094' is legal but rejected by llvm-mc since 86a60e7, and this patch fixed that range issue. Full diff: https://github.com/llvm/llvm-project/pull/109124.diff 2 Files Affected:
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
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks good!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
@aykevl / @benshi001 could you create a backport to 19.1? (I think I can't assign milestones, so can't use the bot here) |
@llvmbot Please back port this PR to release/19.x |
Hmm, seems like the backport didn't get created? 🤔 |
/cherry-pick efcf52b |
Failed to cherry-pick: efcf52b https://github.com/llvm/llvm-project/actions/runs/11563217310 Please manually backport the fix and push it to your github fork. Once this is done, please create a pull request |
Ah! |
/cherry-pick 8c3b94f |
/pull-request #113969 |
'rjmp .+4094' is legal but rejected by llvm-mc since 86a60e7, and this patch fixed that range issue.