From 112967833e4f8f4943beb71dfe5fdfe17788cadd Mon Sep 17 00:00:00 2001 From: Lang Hames Date: Thu, 9 May 2019 23:17:41 +0000 Subject: [PATCH] [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. llvm-svn: 360392 --- llvm/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp | 4 ++-- .../JITLink/X86/MachO_x86-64_relocations.s | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/llvm/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp b/llvm/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp index 2f0eaf2..7b4ddc3 100644 --- a/llvm/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp +++ b/llvm/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/llvm/test/ExecutionEngine/JITLink/X86/MachO_x86-64_relocations.s b/llvm/test/ExecutionEngine/JITLink/X86/MachO_x86-64_relocations.s index 9ff382d..a6aa723 100644 --- a/llvm/test/ExecutionEngine/JITLink/X86/MachO_x86-64_relocations.s +++ b/llvm/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' -- 2.7.4