From: Lang Hames Date: Thu, 9 May 2019 23:17:41 +0000 (+0000) Subject: [JITLink] Fixed a signedness bug when processing X86_64_RELOC_SUBTRACTOR. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=76e6710242e15da426f00dd4503bdf385956780b;p=llvm [JITLink] Fixed a signedness bug when processing X86_64_RELOC_SUBTRACTOR. 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 --- diff --git a/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp b/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp index 2f0eaf206e9..7b4ddc3019a 100644 --- a/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp +++ b/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp @@ -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. diff --git a/test/ExecutionEngine/JITLink/X86/MachO_x86-64_relocations.s b/test/ExecutionEngine/JITLink/X86/MachO_x86-64_relocations.s index 9ff382dd743..a6aa72327c9 100644 --- a/test/ExecutionEngine/JITLink/X86/MachO_x86-64_relocations.s +++ b/test/ExecutionEngine/JITLink/X86/MachO_x86-64_relocations.s @@ -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'