diff --git a/llvm/include/llvm/ExecutionEngine/JITLink/riscv.h b/llvm/include/llvm/ExecutionEngine/JITLink/riscv.h --- a/llvm/include/llvm/ExecutionEngine/JITLink/riscv.h +++ b/llvm/include/llvm/ExecutionEngine/JITLink/riscv.h @@ -152,6 +152,12 @@ /// 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: diff --git a/llvm/lib/ExecutionEngine/JITLink/ELF_riscv.cpp b/llvm/lib/ExecutionEngine/JITLink/ELF_riscv.cpp --- a/llvm/lib/ExecutionEngine/JITLink/ELF_riscv.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/ELF_riscv.cpp @@ -372,6 +372,13 @@ *FixupPtr = static_cast(Value); break; } + case R_RISCV_SUB6: { + int64_t Value = + *(reinterpret_cast(FixupAddress.getValue())) & + 0x3f - E.getTarget().getAddress().getValue() - E.getAddend(); + *FixupPtr = (*FixupPtr & 0xc0) | (static_cast(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 @@ 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: diff --git a/llvm/lib/ExecutionEngine/JITLink/riscv.cpp b/llvm/lib/ExecutionEngine/JITLink/riscv.cpp --- a/llvm/lib/ExecutionEngine/JITLink/riscv.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/riscv.cpp @@ -58,6 +58,8 @@ 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: diff --git a/llvm/test/ExecutionEngine/JITLink/RISCV/riscv_reloc_add.s b/llvm/test/ExecutionEngine/JITLink/RISCV/riscv_reloc_add.s --- a/llvm/test/ExecutionEngine/JITLink/RISCV/riscv_reloc_add.s +++ b/llvm/test/ExecutionEngine/JITLink/RISCV/riscv_reloc_add.s @@ -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 @@ .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