aboutsummaryrefslogtreecommitdiff
path: root/backend/lib/Target/RISCV/RISCVAsmBackend.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'backend/lib/Target/RISCV/RISCVAsmBackend.cpp')
-rw-r--r--backend/lib/Target/RISCV/RISCVAsmBackend.cpp9
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(