]> granicus.if.org Git - llvm/commitdiff
[JITLink] Fixed a signedness bug when processing X86_64_RELOC_SUBTRACTOR.
authorLang Hames <lhames@gmail.com>
Thu, 9 May 2019 23:17:41 +0000 (23:17 +0000)
committerLang Hames <lhames@gmail.com>
Thu, 9 May 2019 23:17:41 +0000 (23:17 +0000)
Subtractor relocation addends are signed, so we need to read them via signed
int pointers. Accidentally treating 32-bit addends as unsigned leads to
out-of-range errors when we try to add very large (>INT32_MAX) bogus addends.

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

lib/ExecutionEngine/JITLink/MachO_x86_64.cpp
test/ExecutionEngine/JITLink/X86/MachO_x86-64_relocations.s

index 2f0eaf206e961520363dd5b3fd3c279862015a6d..7b4ddc3019a1d9ed7c50a6afdf7c7d9bcc3a0e8e 100644 (file)
@@ -157,9 +157,9 @@ private:
     // Read the current fixup value.
     uint64_t FixupValue = 0;
     if (SubRI.r_length == 3)
-      FixupValue = *(const ulittle64_t *)FixupContent;
+      FixupValue = *(const little64_t *)FixupContent;
     else
-      FixupValue = *(const ulittle32_t *)FixupContent;
+      FixupValue = *(const little32_t *)FixupContent;
 
     // Find 'ToAtom' using symbol number or address, depending on whether the
     // paired UNSIGNED relocation is extern.
index 9ff382dd74396cce881cc00b80ad15bc4907a9fa..a6aa72327c9b1f55f070a069deb1ea6c436e874c 100644 (file)
@@ -180,32 +180,32 @@ anon_minuend_long1:
 # Both forms "A: .quad A - B + C" and "A: .quad B - A + C" are tested.
 #
 # Check "A: .quad B - A + C".
-# jitlink-check: *{8}subtrahend_quad2 = (named_data - subtrahend_quad2 + 2)
+# jitlink-check: *{8}subtrahend_quad2 = (named_data - subtrahend_quad2 - 2)
         .globl  subtrahend_quad2
         .p2align  3
 subtrahend_quad2:
-        .quad named_data - subtrahend_quad2 + 2
+        .quad named_data - subtrahend_quad2 - 2
 
 # Check "A: .long B - A + C".
-# jitlink-check: *{4}subtrahend_long2 = (named_data - subtrahend_long2 + 2)[31:0]
+# jitlink-check: *{4}subtrahend_long2 = (named_data - subtrahend_long2 - 2)[31:0]
         .globl  subtrahend_long2
         .p2align  2
 subtrahend_long2:
-        .long named_data - subtrahend_long2 + 2
+        .long named_data - subtrahend_long2 - 2
 
 # Check "A: .quad A - B + C".
-# jitlink-check: *{8}minuend_quad3 = (minuend_quad3 - named_data + 2)
+# jitlink-check: *{8}minuend_quad3 = (minuend_quad3 - named_data - 2)
         .globl  minuend_quad3
         .p2align  3
 minuend_quad3:
-        .quad minuend_quad3 - named_data + 2
+        .quad minuend_quad3 - named_data - 2
 
 # Check "A: .long B - A + C".
-# jitlink-check: *{4}minuend_long3 = (minuend_long3 - named_data + 2)[31:0]
+# jitlink-check: *{4}minuend_long3 = (minuend_long3 - named_data - 2)[31:0]
         .globl  minuend_long3
         .p2align  2
 minuend_long3:
-        .long minuend_long3 - named_data + 2
+        .long minuend_long3 - named_data - 2
 
 # Check X86_64_RELOC_SUBTRACTOR handling for exprs of the form
 # "A: .quad/long B - C + D", where 'B' or 'C' is at a fixed offset from 'A'