Correct encoding of BL with immediate offset.
authorOwen Anderson <resistor@mac.com>
Fri, 26 Aug 2011 22:54:51 +0000 (22:54 +0000)
committerOwen Anderson <resistor@mac.com>
Fri, 26 Aug 2011 22:54:51 +0000 (22:54 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@138673 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM/MCTargetDesc/ARMMCCodeEmitter.cpp
test/MC/ARM/basic-arm-instructions.s

index 434eb28c698b3de3072a8504224c100dfd7dcbee..19a37356b2299591d76a9b2e7c471ee9978b359d 100644 (file)
@@ -532,11 +532,16 @@ getBranchTargetOpValue(const MCInst &MI, unsigned OpIdx,
 uint32_t ARMMCCodeEmitter::
 getARMBranchTargetOpValue(const MCInst &MI, unsigned OpIdx,
                           SmallVectorImpl<MCFixup> &Fixups) const {
-  if (HasConditionalBranch(MI)) 
-    return ::getBranchTargetOpValue(MI, OpIdx,
-                                    ARM::fixup_arm_condbranch, Fixups);
-  return ::getBranchTargetOpValue(MI, OpIdx, 
-                                  ARM::fixup_arm_uncondbranch, Fixups);
+  const MCOperand MO = MI.getOperand(OpIdx);
+  if (MO.isExpr()) {
+    if (HasConditionalBranch(MI)) 
+      return ::getBranchTargetOpValue(MI, OpIdx,
+                                      ARM::fixup_arm_condbranch, Fixups);
+    return ::getBranchTargetOpValue(MI, OpIdx, 
+                                    ARM::fixup_arm_uncondbranch, Fixups);
+  }
+
+  return MO.getImm() >> 2;
 }
 
 
index 0a411b4ccdbd9fc4257719958a647b78a82b84b4..cd4045610bd30143630fc85c17d8da4fd821190c 100644 (file)
@@ -363,11 +363,13 @@ Lforward:
 
   bl _bar
   blx _bar
+  blls #28634268
 
 @ CHECK: bl  _bar @ encoding: [A,A,A,0xeb]
 @ CHECK:   @   fixup A - offset: 0, value: _bar, kind: fixup_arm_uncondbranch
 @ CHECK: blx   _bar @ encoding: [A,A,A,0xfa]
            @   fixup A - offset: 0, value: _bar, kind: fixup_arm_uncondbranch
+@ CHECK: blls  #28634268               @ encoding: [0x27,0x3b,0x6d,0x9b]
 
 @------------------------------------------------------------------------------
 @ BLX (register)