aboutsummaryrefslogtreecommitdiff
path: root/backend/lib/Target/RISCV/RISCVAsmBackend.cpp
diff options
context:
space:
mode:
authorRichard-Qin-X <richard.qin.001@gmail.com>2026-08-12 00:26:10 +0800
committerRichard-Qin-X <richard.qin.001@gmail.com>2026-08-12 00:26:10 +0800
commitd91d57297bdb30b6363e259ab75d517dc333e292 (patch)
treeb931c72127e25a4acbf1f7b38ffdcba74ef270c7 /backend/lib/Target/RISCV/RISCVAsmBackend.cpp
parentadf3e4f02e330e052dbb75e9601bae5273ccfe6c (diff)
downloadrcc-project-d91d57297bdb30b6363e259ab75d517dc333e292.tar.gz
rcc-project-d91d57297bdb30b6363e259ab75d517dc333e292.tar.xz
[RISCV] Support absolute address operand flags
Diffstat (limited to 'backend/lib/Target/RISCV/RISCVAsmBackend.cpp')
-rw-r--r--backend/lib/Target/RISCV/RISCVAsmBackend.cpp26
1 files changed, 20 insertions, 6 deletions
diff --git a/backend/lib/Target/RISCV/RISCVAsmBackend.cpp b/backend/lib/Target/RISCV/RISCVAsmBackend.cpp
index 4e07933..ac17403 100644
--- a/backend/lib/Target/RISCV/RISCVAsmBackend.cpp
+++ b/backend/lib/Target/RISCV/RISCVAsmBackend.cpp
@@ -261,16 +261,30 @@ Expected<std::uint32_t> RISCVAsmBackend::relocationType(const mc::MCFixup &Fixup
return std::unexpected(Kind.error());
return Relocation(RISCVRelocation::CallPLT);
}
+ if (isTargetKind(Fixup.Kind, RISCVFixupKind::High20)) {
+ if (Value.TargetKind != 0) {
+ auto Kind = requireRelocationTargetKind(
+ Value, static_cast<std::uint32_t>(RISCVMCExprKind::AbsoluteHigh), "R_RISCV_HI20");
+ if (!Kind)
+ return std::unexpected(Kind.error());
+ }
+ return Relocation(RISCVRelocation::High20);
+ }
+ if (isTargetKind(Fixup.Kind, RISCVFixupKind::Low12I) ||
+ isTargetKind(Fixup.Kind, RISCVFixupKind::Low12S)) {
+ if (Value.TargetKind != 0) {
+ auto Kind = requireRelocationTargetKind(
+ Value, static_cast<std::uint32_t>(RISCVMCExprKind::AbsoluteLow), "R_RISCV_LO12");
+ if (!Kind)
+ return std::unexpected(Kind.error());
+ }
+ return Relocation(isTargetKind(Fixup.Kind, RISCVFixupKind::Low12I) ? RISCVRelocation::Low12I
+ : RISCVRelocation::Low12S);
+ }
if (Value.TargetKind != 0) {
return makeUnexpected(ErrorCode::RelocationFailed,
"RISC-V relocation has an unsupported target expression");
}
- if (isTargetKind(Fixup.Kind, RISCVFixupKind::High20))
- return Relocation(RISCVRelocation::High20);
- if (isTargetKind(Fixup.Kind, RISCVFixupKind::Low12I))
- return Relocation(RISCVRelocation::Low12I);
- if (isTargetKind(Fixup.Kind, RISCVFixupKind::Low12S))
- return Relocation(RISCVRelocation::Low12S);
if (isTargetKind(Fixup.Kind, RISCVFixupKind::JAL))
return Relocation(RISCVRelocation::JAL);
if (isTargetKind(Fixup.Kind, RISCVFixupKind::Branch))