[LLVM][AVR] Support for R_AVR_6 fixup

Summary: Handle the emission of `R_AVR_6` ELF relocation type.

Reviewers: dylanmckay

Reviewed By: dylanmckay

Subscribers: hiraditya, Jim, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D78721

Patch by @LemonBoy https://reviews.llvm.org/p/LemonBoy/
This commit is contained in:
Dylan McKay 2020-05-17 16:46:32 +12:00
parent 1420f4efbe
commit 1335737ee1
2 changed files with 18 additions and 0 deletions

View File

@ -141,6 +141,18 @@ static void fixup_13_pcrel(unsigned Size, const MCFixup &Fixup, uint64_t &Value,
Value &= 0xfff;
}
/// 6-bit fixup for the immediate operand of the STD/LDD family of
/// instructions.
///
/// Resolves to:
/// 10q0 qq10 0000 1qqq
static void fixup_6(const MCFixup &Fixup, uint64_t &Value,
MCContext *Ctx = nullptr) {
unsigned_width(6, Value, std::string("immediate"), Fixup, Ctx);
Value = ((Value & 0x20) << 8) | ((Value & 0x18) << 7) | (Value & 0x07);
}
/// 6-bit fixup for the immediate operand of the ADIW family of
/// instructions.
///
@ -336,6 +348,9 @@ void AVRAsmBackend::adjustFixupValue(const MCFixup &Fixup,
Value &= 0xffff;
break;
case AVR::fixup_6:
adjust::fixup_6(Fixup, Value, Ctx);
break;
case AVR::fixup_6_adiw:
adjust::fixup_6_adiw(Fixup, Value, Ctx);
break;

View File

@ -9,6 +9,9 @@ bar:
; CHECK: R_AVR_LDI SYMBOL+0x3
ldi r21, SYMBOL+3
; CHECK: R_AVR_6 SYMBOL+0x4
ldd r8, Y+SYMBOL+4
; CHECK-NEXT: R_AVR_6_ADIW FOO
adiw r24, FOO