Index: ELF/Arch/AVR.cpp =================================================================== --- ELF/Arch/AVR.cpp +++ ELF/Arch/AVR.cpp @@ -35,6 +35,7 @@ using namespace llvm; using namespace llvm::object; +using namespace llvm::support; using namespace llvm::support::endian; using namespace llvm::ELF; using namespace lld; @@ -52,6 +53,9 @@ RelExpr AVR::getRelExpr(uint32_t Type, const SymbolBody &S, const InputFile &File, const uint8_t *Loc) const { switch (Type) { + case R_AVR_HI8_LDI: + case R_AVR_LO8_LDI: + case R_AVR_LDI: case R_AVR_CALL: return R_ABS; default: @@ -62,6 +66,13 @@ void AVR::relocateOne(uint8_t *Loc, uint32_t Type, uint64_t Val) const { switch (Type) { + case R_AVR_HI8_LDI: + break; + case R_AVR_LO8_LDI: + case R_AVR_LDI: { + write(Loc, read(Loc) + Val); + break; + } case R_AVR_CALL: { uint16_t Hi = Val >> 17; uint16_t Lo = Val >> 1; @@ -70,7 +81,7 @@ break; } default: - error(getErrorLocation(Loc) + "unrecognized reloc " + toString(Type)); + error(getErrorLocation(Loc) + "unrecognized reloc " + Twine(Type)); } } Index: test/ELF/basic-avr.s =================================================================== --- test/ELF/basic-avr.s +++ test/ELF/basic-avr.s @@ -5,10 +5,20 @@ main: call foo + ldi r17, lo8(foo) + ldi r18, hi8(bar) + ldi r19, foo foo: jmp foo +bar: + call foo # CHECK: main: -# CHECK-NEXT: 0: 0e 94 02 00 +# CHECK-NEXT: 0: 0e 94 05 00 +# CHECK-NEXT: 4: 1a e0 +# CHECK-NEXT: 6: 20 e0 +# CHECK-NEXT: 8: 3a e0 # CHECK: foo: -# CHECK-NEXT: 4: 0c 94 02 00 +# CHECK-NEXT: a: 0c 94 05 00 +# CHECK: bar: +# CHECK-NEXT: e: 0e 94 05 00