]> granicus.if.org Git - llvm/commitdiff
Return early from getUnconditionalBranchTargetOpValue if the branch target is
authorLang Hames <lhames@gmail.com>
Mon, 28 Oct 2013 20:51:11 +0000 (20:51 +0000)
committerLang Hames <lhames@gmail.com>
Mon, 28 Oct 2013 20:51:11 +0000 (20:51 +0000)
an MCExpr, in order to avoid writing an encoded zero value in the immediate
field.

When getUnconditionalBranchTargetOpValue is called with an MCExpr target, we
don't know what the final immediate field value should be. We shouldn't
explicitly set the immediate field to an encoded zero value as zero is encoded
with a non-zero bit pattern. This leads to bits being set that pollute the
final immediate value. The nature of the encoding is such that the polluted
bits only affect very large immediate values, explaining why this hasn't
caused problems earlier.

Fixes <rdar://problem/15155975>.

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

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

index e4c37276493a86566ff70bf16733ec97fa8b8593..4382d0d9714447f003a7f5c6257a9579a388028b 100644 (file)
@@ -641,7 +641,7 @@ getUnconditionalBranchTargetOpValue(const MCInst &MI, unsigned OpIdx,
   const MCOperand MO = MI.getOperand(OpIdx);
     
   if(MO.isExpr())
-    Val = ::getBranchTargetOpValue(MI, OpIdx, ARM::fixup_t2_uncondbranch, Fixups);
+    return ::getBranchTargetOpValue(MI, OpIdx, ARM::fixup_t2_uncondbranch, Fixups);
   else 
     Val = MO.getImm() >> 1;
 
index fdb22252ab3557a49d535199482fca7ff1ddbf2e..1954ba8299b4ddc959841c827463be52a9642c21 100644 (file)
@@ -226,12 +226,12 @@ _func:
         beq.w _bar
         bmi.w   #-183396
 
-@ CHECK: b.w   _bar                    @ encoding: [A,0xf0'A',A,0xb8'A']
+@ CHECK: b.w   _bar                    @ encoding: [A,0xf0'A',A,0x90'A']
           @   fixup A - offset: 0, value: _bar, kind: fixup_t2_uncondbranch
 @ CHECK: beq.w _bar                    @ encoding: [A,0xf0'A',A,0x80'A']
           @   fixup A - offset: 0, value: _bar, kind: fixup_t2_condbranch
 @ CHECK: it    eq                      @ encoding: [0x08,0xbf]
-@ CHECK: beq.w _bar                    @ encoding: [A,0xf0'A',A,0xb8'A']
+@ CHECK: beq.w _bar                    @ encoding: [A,0xf0'A',A,0x90'A']
           @   fixup A - offset: 0, value: _bar, kind: fixup_t2_uncondbranch
 @ CHECK: bmi.w   #-183396                @ encoding: [0x13,0xf5,0xce,0xa9]