Fix signed overflow in when computing encodings for ADR instructions
authorMihai Popa <mihail.popa@gmail.com>
Tue, 13 Aug 2013 14:02:13 +0000 (14:02 +0000)
committerMihai Popa <mihail.popa@gmail.com>
Tue, 13 Aug 2013 14:02:13 +0000 (14:02 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@188268 91177308-0d34-0410-b5e6-96231b3b80d8

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

index 08732201b512adc20988dcb458c1c0e3bae716eb..c0c21d3c8572fda4bdafa3c72c33cccf8a6533c3 100644 (file)
@@ -671,7 +671,7 @@ getAdrLabelOpValue(const MCInst &MI, unsigned OpIdx,
   if (MO.isExpr())
     return ::getBranchTargetOpValue(MI, OpIdx, ARM::fixup_arm_adr_pcrel_12,
                                     Fixups);
-  int32_t offset = MO.getImm();
+  int64_t offset = MO.getImm();
   uint32_t Val = 0x2000;
 
   int SoImmVal;
index ead2ce104ebf0e9cf2c07176abfd07e99a653927..5d40a397660d82e0b6607832b17c6fb170441c3a 100644 (file)
@@ -153,7 +153,6 @@ Lforward:
 @ CHECK: adr   r1, #301989888          @ encoding: [0x12,0x14,0x8f,0xe2]
 @ CHECK: adr   r1, #-2147483647        @ encoding: [0x06,0x11,0x8f,0xe2]
 
-
 @------------------------------------------------------------------------------
 @ ADD
 @------------------------------------------------------------------------------
@@ -187,6 +186,7 @@ Lforward:
 
        add r0, #-4
        add r4, r5, #-21
+        add r0, pc, #0xc0000000
 
 @ CHECK: add   r4, r5, #61440          @ encoding: [0x0f,0x4a,0x85,0xe2]
 @ CHECK: add   r4, r5, r6              @ encoding: [0x06,0x40,0x85,0xe0]
@@ -217,6 +217,7 @@ Lforward:
 
 @ CHECK: sub   r0, r0, #4              @ encoding: [0x04,0x00,0x40,0xe2]
 @ CHECK: sub   r4, r5, #21             @ encoding: [0x15,0x40,0x45,0xe2]
+@ CHECK: adr    r0, #-1073741824        @ encoding: [0x03,0x01,0x8f,0xe2]
 
     @ Test right shift by 32, which is encoded as 0
     add r3, r1, r2, lsr #32