Fix undefined behavior (shift of negative value) in RuntimeDyldMachOAArch64::encodeAd...
authorAlexey Samsonov <vonosmas@gmail.com>
Sat, 10 Jan 2015 00:46:38 +0000 (00:46 +0000)
committerAlexey Samsonov <vonosmas@gmail.com>
Sat, 10 Jan 2015 00:46:38 +0000 (00:46 +0000)
Test Plan: regression test suite with/without UBSan.

Reviewers: lhames, ributzka

Subscribers: aemerson, llvm-commits

Differential Revision: http://reviews.llvm.org/D6908

llvm-svn: 225568

llvm/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldMachOAArch64.h

index 274c552..196fa62 100644 (file)
@@ -183,8 +183,8 @@ public:
       assert(isInt<33>(Addend) && "Invalid page reloc value.");
 
       // Encode the addend into the instruction.
-      uint32_t ImmLoValue = (uint32_t)(Addend << 17) & 0x60000000;
-      uint32_t ImmHiValue = (uint32_t)(Addend >> 9) & 0x00FFFFE0;
+      uint32_t ImmLoValue = ((uint64_t)Addend << 17) & 0x60000000;
+      uint32_t ImmHiValue = ((uint64_t)Addend >> 9) & 0x00FFFFE0;
       *p = (*p & 0x9F00001F) | ImmHiValue | ImmLoValue;
       break;
     }