diff options
-rw-r--r-- | llvm/lib/Target/AVR/MCTargetDesc/AVRAsmBackend.cpp | 20 | ||||
-rw-r--r-- | llvm/lib/Target/AVR/MCTargetDesc/AVRMCExpr.cpp | 3 | ||||
-rw-r--r-- | llvm/test/MC/AVR/relocations.s | 44 | ||||
-rw-r--r-- | llvm/test/MC/AVR/symbol_relocation.s | 2 |
4 files changed, 54 insertions, 15 deletions
diff --git a/llvm/lib/Target/AVR/MCTargetDesc/AVRAsmBackend.cpp b/llvm/lib/Target/AVR/MCTargetDesc/AVRAsmBackend.cpp index 4016773e9b4..2d9dd4f8f83 100644 --- a/llvm/lib/Target/AVR/MCTargetDesc/AVRAsmBackend.cpp +++ b/llvm/lib/Target/AVR/MCTargetDesc/AVRAsmBackend.cpp @@ -265,15 +265,19 @@ void AVRAsmBackend::adjustFixupValue(const MCFixup &Fixup, adjust::ldi::fixup(Size, Fixup, Value, Ctx); break; case AVR::fixup_lo8_ldi: + adjust::ldi::lo8(Size, Fixup, Value, Ctx); + break; case AVR::fixup_lo8_ldi_pm: - if (Kind == AVR::fixup_lo8_ldi_pm) adjust::pm(Value); - + case AVR::fixup_lo8_ldi_gs: + adjust::pm(Value); adjust::ldi::lo8(Size, Fixup, Value, Ctx); break; case AVR::fixup_hi8_ldi: + adjust::ldi::hi8(Size, Fixup, Value, Ctx); + break; case AVR::fixup_hi8_ldi_pm: - if (Kind == AVR::fixup_hi8_ldi_pm) adjust::pm(Value); - + case AVR::fixup_hi8_ldi_gs: + adjust::pm(Value); adjust::ldi::hi8(Size, Fixup, Value, Ctx); break; case AVR::fixup_hh8_ldi: @@ -316,6 +320,13 @@ void AVRAsmBackend::adjustFixupValue(const MCFixup &Fixup, Value &= 0xffff; break; + case AVR::fixup_16_pm: + Value >>= 1; // Flash addresses are always shifted. + adjust::unsigned_width(16, Value, std::string("port number"), Fixup, Ctx); + + Value &= 0xffff; + break; + case AVR::fixup_6_adiw: adjust::fixup_6_adiw(Fixup, Value, Ctx); break; @@ -329,6 +340,7 @@ void AVRAsmBackend::adjustFixupValue(const MCFixup &Fixup, break; // Fixups which do not require adjustments. + case FK_Data_1: case FK_Data_2: case FK_Data_4: case FK_Data_8: diff --git a/llvm/lib/Target/AVR/MCTargetDesc/AVRMCExpr.cpp b/llvm/lib/Target/AVR/MCTargetDesc/AVRMCExpr.cpp index 4e13e7adf39..d4a67973af7 100644 --- a/llvm/lib/Target/AVR/MCTargetDesc/AVRMCExpr.cpp +++ b/llvm/lib/Target/AVR/MCTargetDesc/AVRMCExpr.cpp @@ -168,6 +168,9 @@ AVR::Fixups AVRMCExpr::getFixupKind() const { case VK_AVR_PM_HH8: Kind = isNegated() ? AVR::fixup_hh8_ldi_pm_neg : AVR::fixup_hh8_ldi_pm; break; + case VK_AVR_GS: + Kind = AVR::fixup_16_pm; + break; case VK_AVR_LO8_GS: Kind = AVR::fixup_lo8_ldi_gs; break; diff --git a/llvm/test/MC/AVR/relocations.s b/llvm/test/MC/AVR/relocations.s index da9925dcdbb..ab08d248721 100644 --- a/llvm/test/MC/AVR/relocations.s +++ b/llvm/test/MC/AVR/relocations.s @@ -2,11 +2,11 @@ ; CHECK: RELOCATION RECORDS FOR -; CHECK: RELOCATION RECORDS BAR +.global bar bar: jmp bar -; CHECK-NEXT: R_AVR_LDI SYMBOL+3 +; CHECK: R_AVR_LDI SYMBOL+3 ldi r21, SYMBOL+3 ; CHECK-NEXT: R_AVR_6_ADIW FOO @@ -31,81 +31,105 @@ rjmp foo-10 brcs foo+2 ; CHECK-NEXT: R_AVR_LO8_LDI bar+3 +; CHECK-NEXT: R_AVR_LO8_LDI abc +; CHECK-NEXT: R_AVR_LO8_LDI abc ldi r24, lo8(bar+3) ldi r16, +lo8(abc) ldi r16, lo8(+(abc)) ; CHECK-NEXT: R_AVR_HI8_LDI abc +; CHECK-NEXT: R_AVR_HI8_LDI abc +; CHECK-NEXT: R_AVR_HI8_LDI abc ldi r30, hi8(abc) ldi r16, +hi8(abc) ldi r16, hi8(+(abc)) ; CHECK-NEXT: R_AVR_LO8_LDI_NEG abc +; CHECK-NEXT: R_AVR_LO8_LDI_NEG abc ldi r16, -lo8(abc) ldi r16, lo8(-(abc)) ; CHECK-NEXT: R_AVR_HI8_LDI_NEG abc +; CHECK-NEXT: R_AVR_HI8_LDI_NEG abc ldi r16, -hi8(abc) ldi r16, hi8(-(abc)) ; CHECK-NEXT: R_AVR_HH8_LDI foo +; CHECK-NEXT: R_AVR_HH8_LDI foo +; CHECK-NEXT: R_AVR_HH8_LDI foo ldi r16, hh8(foo) ldi r16, +hh8(foo) ldi r16, hh8(+(foo)) ; CHECK-NEXT: R_AVR_HH8_LDI_NEG foo +; CHECK-NEXT: R_AVR_HH8_LDI_NEG foo ldi r16, -hh8(foo) ldi r16, hh8(-(foo)) ; CHECK-NEXT: R_AVR_HH8_LDI foo +; CHECK-NEXT: R_AVR_HH8_LDI foo +; CHECK-NEXT: R_AVR_HH8_LDI foo ldi r24, hlo8(foo) ldi r24, +hlo8(foo) ldi r24, hlo8(+(foo)) ; CHECK-NEXT: R_AVR_HH8_LDI_NEG foo +; CHECK-NEXT: R_AVR_HH8_LDI_NEG foo ldi r24, -hlo8(foo) ldi r24, hlo8(-(foo)) ; CHECK-NEXT: R_AVR_MS8_LDI bar +; CHECK-NEXT: R_AVR_MS8_LDI bar +; CHECK-NEXT: R_AVR_MS8_LDI bar ldi r24, hhi8(bar) ldi r24, +hhi8(bar) ldi r24, hhi8(+(bar)) ; CHECK-NEXT: R_AVR_MS8_LDI_NEG bar +; CHECK-NEXT: R_AVR_MS8_LDI_NEG bar ldi r24, -hhi8(bar) ldi r24, hhi8(-(bar)) ; CHECK-NEXT: R_AVR_LO8_LDI_PM foo +; CHECK-NEXT: R_AVR_LO8_LDI_PM foo +; CHECK-NEXT: R_AVR_LO8_LDI_PM foo ldi r17, pm_lo8(foo) ldi r25, +pm_lo8(foo) ldi r25, pm_lo8(+(foo)) ; CHECK-NEXT: R_AVR_HI8_LDI_PM bar +; CHECK-NEXT: R_AVR_HI8_LDI_PM foo +; CHECK-NEXT: R_AVR_HI8_LDI_PM foo ldi r22, pm_hi8(bar) ldi r25, +pm_hi8(foo) ldi r25, pm_hi8(+(foo)) ; CHECK-NEXT: R_AVR_HH8_LDI_PM baz +; CHECK-NEXT: R_AVR_HH8_LDI_PM foo +; CHECK-NEXT: R_AVR_HH8_LDI_PM foo ldi r25, pm_hh8(baz) ldi r25, +pm_hh8(foo) ldi r25, pm_hh8(+(foo)) -; CHECK-NEXT: R_AVR_LO8_LDI_PM_NEG +; CHECK-NEXT: R_AVR_LO8_LDI_PM_NEG foo +; CHECK-NEXT: R_AVR_LO8_LDI_PM_NEG foo ldi r25, -pm_lo8(foo) ldi r25, pm_lo8(-(foo)) -; CHECK-NEXT: R_AVR_HI8_LDI_PM_NEG +; CHECK-NEXT: R_AVR_HI8_LDI_PM_NEG foo +; CHECK-NEXT: R_AVR_HI8_LDI_PM_NEG foo ldi r25, -pm_hi8(foo) ldi r25, pm_hi8(-(foo)) -; CHECK-NEXT: R_AVR_HH8_LDI_PM_NEG +; CHECK-NEXT: R_AVR_HH8_LDI_PM_NEG foo +; CHECK-NEXT: R_AVR_HH8_LDI_PM_NEG foo ldi r25, -pm_hh8(foo) ldi r25, pm_hh8(-(foo)) -; CHECK-NEXT: R_AVR_LO8_LDI_GS +; CHECK-NEXT: R_AVR_LO8_LDI_GS foo ldi r17, lo8(gs(foo)) -; CHECK-NEXT: R_AVR_HI8_LDI_GS +; CHECK-NEXT: R_AVR_HI8_LDI_GS foo ldi r18, hi8(gs(foo)) ; CHECK-NEXT: R_AVR_16 @@ -126,11 +150,11 @@ ldi r18, hi8(gs(foo)) ; CHECK-NEXT: R_AVR_8_HLO8 .byte hlo8(foo) -; CHECK-NEXT: R_AVR_DIFF8 +; CHECK: R_AVR_DIFF8 .byte foo - bar -; CHECK-NEXT: R_AVR_DIFF16 +; CHECK: R_AVR_DIFF16 .short foo - bar -; CHECK-NEXT: R_AVR_DIFF32 +; CHECK: R_AVR_DIFF32 .long foo - bar diff --git a/llvm/test/MC/AVR/symbol_relocation.s b/llvm/test/MC/AVR/symbol_relocation.s index 2c62043916c..639e01dfdfb 100644 --- a/llvm/test/MC/AVR/symbol_relocation.s +++ b/llvm/test/MC/AVR/symbol_relocation.s @@ -12,5 +12,5 @@ foo: .globl ptr ptr: - .short foo + .short gs(foo) |