[JITLink] Add R_RISCV_SUB6 relocation
authorluxufan <xufan@nj.iscas.ac.cn>
Tue, 22 Feb 2022 10:56:32 +0000 (18:56 +0800)
committerluxufan <xufan@nj.iscas.ac.cn>
Mon, 28 Feb 2022 17:45:03 +0000 (01:45 +0800)
Add R_RISCV_SUB6 relocation

Differential Revision: https://reviews.llvm.org/D120001

llvm/include/llvm/ExecutionEngine/JITLink/riscv.h
llvm/lib/ExecutionEngine/JITLink/ELF_riscv.cpp
llvm/lib/ExecutionEngine/JITLink/riscv.cpp
llvm/test/ExecutionEngine/JITLink/RISCV/riscv_reloc_add.s

index 2d32a74..95f45fa 100644 (file)
@@ -152,6 +152,12 @@ enum EdgeKind_riscv : Edge::Kind {
   ///   Fixup <- (Target - *{1}Fixup - Addend)
   R_RISCV_SUB8,
 
+  /// 6 bits label subtraction
+  ///
+  /// Fixup expression
+  ///   Fixup <- (Target - *{1}Fixup - Addend)
+  R_RISCV_SUB6,
+
   /// Local label assignment
   ///
   /// Fixup expression:
index 469a81d..29fe59c 100644 (file)
@@ -372,6 +372,13 @@ private:
       *FixupPtr = static_cast<uint8_t>(Value);
       break;
     }
+    case R_RISCV_SUB6: {
+      int64_t Value =
+          *(reinterpret_cast<const uint8_t *>(FixupAddress.getValue())) &
+          0x3f - E.getTarget().getAddress().getValue() - E.getAddend();
+      *FixupPtr = (*FixupPtr & 0xc0) | (static_cast<uint8_t>(Value) & 0x3f);
+      break;
+    }
     case R_RISCV_SET6: {
       int64_t Value = (E.getTarget().getAddress() + E.getAddend()).getValue();
       uint32_t RawData = *(little32_t *)FixupPtr;
@@ -457,6 +464,8 @@ private:
       return EdgeKind_riscv::R_RISCV_SUB16;
     case ELF::R_RISCV_SUB8:
       return EdgeKind_riscv::R_RISCV_SUB8;
+    case ELF::R_RISCV_SUB6:
+      return EdgeKind_riscv::R_RISCV_SUB6;
     case ELF::R_RISCV_SET6:
       return EdgeKind_riscv::R_RISCV_SET6;
     case ELF::R_RISCV_SET8:
index 0bd57b6..3848cc6 100644 (file)
@@ -58,6 +58,8 @@ const char *getEdgeKindName(Edge::Kind K) {
     return "R_RISCV_SUB16";
   case R_RISCV_SUB8:
     return "R_RISCV_SUB8";
+  case R_RISCV_SUB6:
+    return "R_RISCV_SUB6";
   case R_RISCV_SET6:
     return "R_RISCV_SET6";
   case R_RISCV_SET8:
index 80021a5..c334ce4 100644 (file)
@@ -8,6 +8,7 @@
 # jitlink-check: *{4}(named_data+8) = 0x8
 # jitlink-check: *{2}(named_data+12) = 0x8
 # jitlink-check: *{1}(named_data+14) = 0x8
+# jitlink-check: *{1}(named_data+15) = 0x8
 
 .global main
 main:
@@ -20,8 +21,10 @@ main:
 .section ".rodata","",@progbits
 .type named_data,@object
 named_data:
+.reloc named_data+15, R_RISCV_SUB6, .L0
 .dword .L1 - .L0
 .word .L1 - .L0
 .half .L1 - .L0
 .byte .L1 - .L0
-.size named_data, 15
+.byte 0x8
+.size named_data, 16