[JITLink] Add R_RISCV_SUB6 relocation

Add R_RISCV_SUB6 relocation

Differential Revision: https://reviews.llvm.org/D120001
This commit is contained in:
luxufan 2022-02-22 18:56:32 +08:00
parent f46890711f
commit 3362f54d08
4 changed files with 21 additions and 1 deletions

View 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:

View 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:

View 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:

View 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