[PATCH] D117946: [JITLink][RISCV] Refactor range checking to make it compatible with all relocation types and add range checking for R_RISCV_BRANCH

fourdim via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sat Jan 22 00:18:30 PST 2022


fourdim created this revision.
fourdim added reviewers: lhames, jrtc27, luismarques.
Herald added subscribers: VincentWu, luke957, achieveartificialintelligence, vkmr, frasercrmck, evandro, apazos, sameer.abuasal, s.egerton, Jim, benna, psnobl, jocewei, PkmX, the_o, brucehoult, MartinMosbeck, rogfer01, edward-jones, zzheng, kito-cheng, niosHD, sabuasal, simoncook, johnrusso, rbar, asb, hiraditya.
fourdim requested review of this revision.
Herald added subscribers: llvm-commits, eopXD, MaskRay.
Herald added a project: LLVM.

This patch refactors the range checking function to make it compatible with all relocation types and supports range checking for R_RISCV_BRANCH. Moreover, it makes the checkAlignment function static.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D117946

Files:
  llvm/lib/ExecutionEngine/JITLink/ELF_riscv.cpp
  llvm/test/ExecutionEngine/JITLink/RISCV/ELF_branch.s


Index: llvm/test/ExecutionEngine/JITLink/RISCV/ELF_branch.s
===================================================================
--- llvm/test/ExecutionEngine/JITLink/RISCV/ELF_branch.s
+++ llvm/test/ExecutionEngine/JITLink/RISCV/ELF_branch.s
@@ -5,11 +5,11 @@
 # RUN:     -o %t/elf_riscv32_branch.o %s
 # RUN: llvm-jitlink -noexec \
 # RUN:     -slab-allocate 100Kb -slab-address 0xfff00000 -slab-page-size 4096 \
-# RUN:     -define-abs external_func=0xfe \
+# RUN:     -define-abs external_func=0xfff000fe \
 # RUN:     -check %s %t/elf_riscv64_branch.o
 # RUN: llvm-jitlink -noexec \
 # RUN:     -slab-allocate 100Kb -slab-address 0xfff00000 -slab-page-size 4096 \
-# RUN:     -define-abs external_func=0xfe \
+# RUN:     -define-abs external_func=0xfff000fe \
 # RUN:     -check %s %t/elf_riscv32_branch.o
 #
 
Index: llvm/lib/ExecutionEngine/JITLink/ELF_riscv.cpp
===================================================================
--- llvm/lib/ExecutionEngine/JITLink/ELF_riscv.cpp
+++ llvm/lib/ExecutionEngine/JITLink/ELF_riscv.cpp
@@ -163,8 +163,8 @@
   return (Num & (((1ULL << (Size + 1)) - 1) << Low)) >> Low;
 }
 
-inline Error checkAlignment(llvm::orc::ExecutorAddr loc, uint64_t v, int n,
-                            const Edge &E) {
+static inline Error checkAlignment(llvm::orc::ExecutorAddr loc, uint64_t v,
+                                   int n, const Edge &E) {
   if (v & (n - 1))
     return make_error<JITLinkError>("0x" + llvm::utohexstr(loc.getValue()) +
                                     " improper alignment for relocation " +
@@ -174,9 +174,9 @@
   return Error::success();
 }
 
-static inline bool isInRangeForImmS32(int64_t Value) {
-  return (Value >= std::numeric_limits<int32_t>::min() &&
-          Value <= std::numeric_limits<int32_t>::max());
+// Requires 0 < n <= 64.
+static inline bool isInRangeForImm(int64_t Value, int n) {
+  return Value == llvm::SignExtend64(Value, n);
 }
 
 class ELFJITLinker_riscv : public JITLinker<ELFJITLinker_riscv> {
@@ -208,6 +208,8 @@
     }
     case R_RISCV_BRANCH: {
       int64_t Value = E.getTarget().getAddress() + E.getAddend() - FixupAddress;
+      if (LLVM_UNLIKELY(!isInRangeForImm(Value >> 1, 12)))
+        return makeTargetOutOfRangeError(G, B, E);
       Error AlignmentIssue = checkAlignment(FixupAddress, Value, 2, E);
       if (AlignmentIssue) {
         return AlignmentIssue;
@@ -224,7 +226,7 @@
     case R_RISCV_HI20: {
       int64_t Value = (E.getTarget().getAddress() + E.getAddend()).getValue();
       int64_t Hi = Value + 0x800;
-      if (LLVM_UNLIKELY(!isInRangeForImmS32(Hi)))
+      if (LLVM_UNLIKELY(!isInRangeForImm(Hi, 32)))
         return makeTargetOutOfRangeError(G, B, E);
       uint32_t RawInstr = *(little32_t *)FixupPtr;
       *(little32_t *)FixupPtr =
@@ -244,7 +246,7 @@
     case R_RISCV_CALL: {
       int64_t Value = E.getTarget().getAddress() + E.getAddend() - FixupAddress;
       int64_t Hi = Value + 0x800;
-      if (LLVM_UNLIKELY(!isInRangeForImmS32(Hi)))
+      if (LLVM_UNLIKELY(!isInRangeForImm(Hi, 32)))
         return makeTargetOutOfRangeError(G, B, E);
       int32_t Lo = Value & 0xFFF;
       uint32_t RawInstrAuipc = *(little32_t *)FixupPtr;
@@ -258,7 +260,7 @@
     case R_RISCV_PCREL_HI20: {
       int64_t Value = E.getTarget().getAddress() + E.getAddend() - FixupAddress;
       int64_t Hi = Value + 0x800;
-      if (LLVM_UNLIKELY(!isInRangeForImmS32(Hi)))
+      if (LLVM_UNLIKELY(!isInRangeForImm(Hi, 32)))
         return makeTargetOutOfRangeError(G, B, E);
       uint32_t RawInstr = *(little32_t *)FixupPtr;
       *(little32_t *)FixupPtr =


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D117946.402187.patch
Type: text/x-patch
Size: 3597 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220122/f1dd065a/attachment.bin>


More information about the llvm-commits mailing list