[llvm-branch-commits] [lld] e12e0d6 - [ELF] Error for out-of-range R_PPC64_ADDR16_HA, R_PPC64_ADDR16_HI and their friends

Fangrui Song via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Tue Jan 19 11:48:53 PST 2021


Author: Fangrui Song
Date: 2021-01-19T11:42:52-08:00
New Revision: e12e0d66c03c89d8ff0b08a4285f5b74a85a5812

URL: https://github.com/llvm/llvm-project/commit/e12e0d66c03c89d8ff0b08a4285f5b74a85a5812
DIFF: https://github.com/llvm/llvm-project/commit/e12e0d66c03c89d8ff0b08a4285f5b74a85a5812.diff

LOG: [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_*.

Added: 
    lld/test/ELF/ppc64-reloc-addr16-err.s

Modified: 
    lld/ELF/Arch/PPC64.cpp

Removed: 
    


################################################################################
diff  --git a/lld/ELF/Arch/PPC64.cpp b/lld/ELF/Arch/PPC64.cpp
index 477f76bd31b7..ebd94f6690da 100644
--- a/lld/ELF/Arch/PPC64.cpp
+++ b/lld/ELF/Arch/PPC64.cpp
@@ -407,7 +407,7 @@ class PPC64 final : public TargetInfo {
 // 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 000000000000..1b221d5436cc
--- /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 at h  # R_PPC64_ADDR16_HI
+.endif
+
+.ifdef HA
+lis 4, a at ha  # R_PPC64_ADDR16_HA
+.endif


        


More information about the llvm-branch-commits mailing list