summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/Target/AVR/MCTargetDesc/AVRAsmBackend.cpp20
-rw-r--r--llvm/lib/Target/AVR/MCTargetDesc/AVRMCExpr.cpp3
-rw-r--r--llvm/test/MC/AVR/relocations.s44
-rw-r--r--llvm/test/MC/AVR/symbol_relocation.s2
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)
OpenPOWER on IntegriCloud