diff options
Diffstat (limited to 'backend/lib/Target/RISCV/RISCVAsmBackend.cpp')
| -rw-r--r-- | backend/lib/Target/RISCV/RISCVAsmBackend.cpp | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/backend/lib/Target/RISCV/RISCVAsmBackend.cpp b/backend/lib/Target/RISCV/RISCVAsmBackend.cpp index ac17403..e118d79 100644 --- a/backend/lib/Target/RISCV/RISCVAsmBackend.cpp +++ b/backend/lib/Target/RISCV/RISCVAsmBackend.cpp @@ -21,6 +21,7 @@ enum class RISCVRelocation : std::uint32_t { Branch = 16, JAL = 17, CallPLT = 19, + GOTHigh20 = 20, PCRelativeHigh20 = 23, PCRelativeLow12I = 24, PCRelativeLow12S = 25, @@ -193,6 +194,7 @@ Expected<void> RISCVAsmBackend::applyFixup(mc::MCFixupKind Kind, std::span<std:: std::uint32_t Instruction = readWord(Data, Offset); if (isTargetKind(Kind, RISCVFixupKind::High20) || isTargetKind(Kind, RISCVFixupKind::PCRelativeHigh20) || + isTargetKind(Kind, RISCVFixupKind::GOTPCRelativeHigh20) || isTargetKind(Kind, RISCVFixupKind::CallPLT)) { const std::uint64_t Adjusted = static_cast<std::uint64_t>(Value) + 0x800U; const std::uint32_t High = static_cast<std::uint32_t>(Adjusted >> 12U); @@ -244,6 +246,13 @@ Expected<std::uint32_t> RISCVAsmBackend::relocationType(const mc::MCFixup &Fixup return std::unexpected(Kind.error()); return Relocation(RISCVRelocation::PCRelativeHigh20); } + if (isTargetKind(Fixup.Kind, RISCVFixupKind::GOTPCRelativeHigh20)) { + auto Kind = requireRelocationTargetKind( + Value, static_cast<std::uint32_t>(RISCVMCExprKind::GOTPCRelativeHigh), "R_RISCV_GOT_HI20"); + if (!Kind) + return std::unexpected(Kind.error()); + return Relocation(RISCVRelocation::GOTHigh20); + } if (isTargetKind(Fixup.Kind, RISCVFixupKind::PCRelativeLow12I) || isTargetKind(Fixup.Kind, RISCVFixupKind::PCRelativeLow12S)) { auto Kind = requireRelocationTargetKind( |
