Explicitly check for non-consant reference in an LDRi12 instruction. Add FIXME
authorJim Grosbach <grosbach@apple.com>
Mon, 1 Nov 2010 23:45:50 +0000 (23:45 +0000)
committerJim Grosbach <grosbach@apple.com>
Mon, 1 Nov 2010 23:45:50 +0000 (23:45 +0000)
for handling the fixup necessary.

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

lib/Target/ARM/ARMMCCodeEmitter.cpp

index afebadc8189375555e9d7745ea3a858469a38a67..5757046e9932fea181a1cc30734634aab50892a4 100644 (file)
@@ -178,6 +178,15 @@ unsigned ARMMCCodeEmitter::getAddrModeImm12OpValue(const MCInst &MI,
   // {11-0}  = imm12
   const MCOperand &MO  = MI.getOperand(OpIdx);
   const MCOperand &MO1 = MI.getOperand(OpIdx + 1);
+  uint32_t Binary = 0;
+
+  // If The first operand isn't a register, we have a label reference.
+  if (!MO.isReg()) {
+    Binary |= ARM::PC << 13;     // Rn is PC.
+    // FIXME: Add a fixup referencing the label.
+    return Binary;
+  }
+
   unsigned Reg = getARMRegisterNumbering(MO.getReg());
   int32_t Imm12 = MO1.getImm();
   bool isAdd = Imm12 >= 0;
@@ -187,7 +196,7 @@ unsigned ARMMCCodeEmitter::getAddrModeImm12OpValue(const MCInst &MI,
   // Immediate is always encoded as positive. The 'U' bit controls add vs sub.
   if (Imm12 < 0)
     Imm12 = -Imm12;
-  uint32_t Binary = Imm12 & 0xfff;
+  Binary = Imm12 & 0xfff;
   if (isAdd)
     Binary |= (1 << 12);
   Binary |= (Reg << 13);