From d91d57297bdb30b6363e259ab75d517dc333e292 Mon Sep 17 00:00:00 2001 From: Richard-Qin-X Date: Wed, 12 Aug 2026 00:26:10 +0800 Subject: [RISCV] Support absolute address operand flags --- backend/lib/Target/RISCV/RISCVAsmBackend.cpp | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) (limited to 'backend/lib/Target/RISCV/RISCVAsmBackend.cpp') 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 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(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(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)) -- cgit v1.2.3