From e12e0d66c03c89d8ff0b08a4285f5b74a85a5812 Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Tue, 19 Jan 2021 11:16:27 -0800 Subject: [PATCH] [ELF] Error for out-of-range R_PPC64_ADDR16_HA, R_PPC64_ADDR16_HI and their friends There are no tests for REL16_* and TPREL16_*. --- lld/ELF/Arch/PPC64.cpp | 7 +++++-- lld/test/ELF/ppc64-reloc-addr16-err.s | 20 ++++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 lld/test/ELF/ppc64-reloc-addr16-err.s diff --git a/lld/ELF/Arch/PPC64.cpp b/lld/ELF/Arch/PPC64.cpp index 477f76b..ebd94f6 100644 --- a/lld/ELF/Arch/PPC64.cpp +++ b/lld/ELF/Arch/PPC64.cpp @@ -407,7 +407,7 @@ public: // document. static uint16_t lo(uint64_t v) { return v; } static uint16_t hi(uint64_t v) { return v >> 16; } -static uint16_t ha(uint64_t v) { return (v + 0x8000) >> 16; } +static uint64_t ha(uint64_t v) { return (v + 0x8000) >> 16; } static uint16_t higher(uint64_t v) { return v >> 32; } static uint16_t highera(uint64_t v) { return (v + 0x8000) >> 32; } static uint16_t highest(uint64_t v) { return v >> 48; } @@ -1219,12 +1219,15 @@ void PPC64::relocate(uint8_t *loc, const Relocation &rel, uint64_t val) const { case R_PPC64_TPREL16_HA: if (config->tocOptimize && shouldTocOptimize && ha(val) == 0) writeFromHalf16(loc, NOP); - else + else { + checkInt(loc, val + 0x8000, 32, rel); write16(loc, ha(val)); + } break; case R_PPC64_ADDR16_HI: case R_PPC64_REL16_HI: case R_PPC64_TPREL16_HI: + checkInt(loc, val, 32, rel); write16(loc, hi(val)); break; case R_PPC64_ADDR16_HIGHER: diff --git a/lld/test/ELF/ppc64-reloc-addr16-err.s b/lld/test/ELF/ppc64-reloc-addr16-err.s new file mode 100644 index 0000000..1b221d5 --- /dev/null +++ b/lld/test/ELF/ppc64-reloc-addr16-err.s @@ -0,0 +1,20 @@ +# REQUIRES: ppc +# RUN: llvm-mc -filetype=obj -triple=ppc64le --defsym HI=1 %s -o %thi.o +# RUN: ld.lld %thi.o --defsym=a=0x7fffffff -o /dev/null +# RUN: not ld.lld %thi.o --defsym=a=0x80000000 -o /dev/null +# RUN: ld.lld %thi.o --defsym=a=0xffffffff80000000 -o /dev/null +# RUN: not ld.lld %thi.o --defsym=a=0xffffffff7fffffff -o /dev/null + +# RUN: llvm-mc -filetype=obj -triple=ppc64le --defsym HA=1 %s -o %tha.o +# RUN: ld.lld %tha.o --defsym=a=0x7fff7fff -o /dev/null +# RUN: not ld.lld %tha.o --defsym=a=0x7fff8000 -o /dev/null +# RUN: ld.lld %tha.o --defsym=a=0xffffffff7fff8000 -o /dev/null +# RUN: not ld.lld %tha.o --defsym=a=0xffffffff7fff7fff -o /dev/null + +.ifdef HI +lis 4, a@h # R_PPC64_ADDR16_HI +.endif + +.ifdef HA +lis 4, a@ha # R_PPC64_ADDR16_HA +.endif -- 2.7.4