]> granicus.if.org Git - llvm/commitdiff
[AVR] Fix a bug so that we now emit R_AVR_16 fixups with the correct offset
authorDylan McKay <me@dylanmckay.io>
Sun, 30 Apr 2017 23:33:52 +0000 (23:33 +0000)
committerDylan McKay <me@dylanmckay.io>
Sun, 30 Apr 2017 23:33:52 +0000 (23:33 +0000)
Before this, the LDS/STS instructions would have their opcodes
overwritten while linking.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@301782 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/AVR/AVRInstrInfo.td
lib/Target/AVR/MCTargetDesc/AVRMCCodeEmitter.cpp
lib/Target/AVR/MCTargetDesc/AVRMCCodeEmitter.h
test/MC/AVR/inst-lds.s
test/MC/AVR/inst-sts.s

index 693d80a1c06fbf95d915d46b903e08f65f9027be..09104669366c38b3ba3e514340e7742c3af65cbf 100644 (file)
@@ -183,33 +183,33 @@ def call_target : Operand<iPTR>
 // A 16-bit address (which can lead to an R_AVR_16 relocation).
 def imm16 : Operand<i16>
 {
-    let EncoderMethod = "encodeImm<AVR::fixup_16>";
+    let EncoderMethod = "encodeImm<AVR::fixup_16, 2>";
 }
 
 /// A 6-bit immediate used in the ADIW/SBIW instructions.
 def imm_arith6 : Operand<i16>
 {
-    let EncoderMethod = "encodeImm<AVR::fixup_6_adiw>";
+    let EncoderMethod = "encodeImm<AVR::fixup_6_adiw, 0>";
 }
 
 /// An 8-bit immediate inside an instruction with the same format
 /// as the `LDI` instruction (the `FRdK` format).
 def imm_ldi8 : Operand<i8>
 {
-    let EncoderMethod = "encodeImm<AVR::fixup_ldi>";
+    let EncoderMethod = "encodeImm<AVR::fixup_ldi, 0>";
 }
 
 /// A 5-bit port number used in SBIC and friends (the `FIOBIT` format).
 def imm_port5 : Operand<i8>
 {
-    let EncoderMethod = "encodeImm<AVR::fixup_port5>";
+    let EncoderMethod = "encodeImm<AVR::fixup_port5, 0>";
 }
 
 /// A 6-bit port number used in the `IN` instruction and friends (the
 /// `FIORdA` format.
 def imm_port6 : Operand<i8>
 {
-    let EncoderMethod = "encodeImm<AVR::fixup_port6>";
+    let EncoderMethod = "encodeImm<AVR::fixup_port6, 0>";
 }
 
 // Addressing mode pattern reg+imm6
index c3d43ebb407ecde1817ad874e58af77a85aff009..4dbbce8c205e21cf5acb4039b81060d83606b111 100644 (file)
@@ -177,7 +177,7 @@ unsigned AVRMCCodeEmitter::encodeComplement(const MCInst &MI, unsigned OpNo,
   return (~0) - Imm;
 }
 
-template <AVR::Fixups Fixup>
+template <AVR::Fixups Fixup, unsigned Offset>
 unsigned AVRMCCodeEmitter::encodeImm(const MCInst &MI, unsigned OpNo,
                                      SmallVectorImpl<MCFixup> &Fixups,
                                      const MCSubtargetInfo &STI) const {
@@ -193,7 +193,7 @@ unsigned AVRMCCodeEmitter::encodeImm(const MCInst &MI, unsigned OpNo,
     }
 
     MCFixupKind FixupKind = static_cast<MCFixupKind>(Fixup);
-    Fixups.push_back(MCFixup::create(0, MO.getExpr(), FixupKind, MI.getLoc()));
+    Fixups.push_back(MCFixup::create(Offset, MO.getExpr(), FixupKind, MI.getLoc()));
 
     return 0;
   }
index 4cee8d904c9d16bcc15d37053a5f105910926c80..883abf8db78a93406f01346a8193165691d44db2 100644 (file)
@@ -69,7 +69,8 @@ private:
                             const MCSubtargetInfo &STI) const;
 
   /// Encodes an immediate value with a given fixup.
-  template <AVR::Fixups Fixup>
+  /// \tparam Offset The offset into the instruction for the fixup.
+  template <AVR::Fixups Fixup, unsigned Offset>
   unsigned encodeImm(const MCInst &MI, unsigned OpNo,
                      SmallVectorImpl<MCFixup> &Fixups,
                      const MCSubtargetInfo &STI) const;
index a3d3606075687d03321a4889c00c400e43b98fe3..e8151a32b860ef30d2ce22fd3e7d1f219681aac9 100644 (file)
@@ -12,5 +12,5 @@ foo:
 ; CHECK: lds r29, 190                 ; encoding: [0xd0,0x91,0xbe,0x00]
 ; CHECK: lds r22, 172                 ; encoding: [0x60,0x91,0xac,0x00]
 ; CHECK: lds r27, 92                  ; encoding: [0xb0,0x91,0x5c,0x00]
-; CHECK: lds r4, SYMBOL+12            ; encoding: [0x40'A',0x90'A',0x00,0x00]
-; CHECK:                              ;   fixup A - offset: 0, value: SYMBOL+12, kind: fixup_16
+; CHECK: lds r4, SYMBOL+12            ; encoding: [0x40,0x90,A,A]
+; CHECK:                              ;   fixup A - offset: 2, value: SYMBOL+12, kind: fixup_16
index 821c207b902395c0a5ae42524d1804fa460a8027..0f5af7da6f3a766062f51703842c1d34db879089 100644 (file)
@@ -9,6 +9,6 @@ foo:
 
 ; CHECK:  sts 3,   r5                 ; encoding: [0x50,0x92,0x03,0x00]
 ; CHECK:  sts 255, r7                 ; encoding: [0x70,0x92,0xff,0x00]
-; CHECK:  sts SYMBOL+1, r25           ; encoding: [0x90'A',0x93'A',0x00,0x00]
-; CHECK:                              ;   fixup A - offset: 0, value: SYMBOL+1, kind: fixup_16
+; CHECK:  sts SYMBOL+1, r25           ; encoding: [0x90,0x93,A,A]
+; CHECK:                              ;   fixup A - offset: 2, value: SYMBOL+1, kind: fixup_16