diff options
| author | Richard-Qin-X <richard.qin.001@gmail.com> | 2026-08-12 00:26:10 +0800 |
|---|---|---|
| committer | Richard-Qin-X <richard.qin.001@gmail.com> | 2026-08-12 00:26:10 +0800 |
| commit | d91d57297bdb30b6363e259ab75d517dc333e292 (patch) | |
| tree | b931c72127e25a4acbf1f7b38ffdcba74ef270c7 /backend/lib/Target/RISCV/RISCVAsmBackend.cpp | |
| parent | adf3e4f02e330e052dbb75e9601bae5273ccfe6c (diff) | |
| download | rcc-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.cpp | 26 |
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)) |
