aboutsummaryrefslogtreecommitdiff
path: root/backend/unittests/Target/RISCVMCTest.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/unittests/Target/RISCVMCTest.cpp
parentadf3e4f02e330e052dbb75e9601bae5273ccfe6c (diff)
downloadrcc-project-d91d57297bdb30b6363e259ab75d517dc333e292.tar.gz
rcc-project-d91d57297bdb30b6363e259ab75d517dc333e292.tar.xz
[RISCV] Support absolute address operand flags
Diffstat (limited to 'backend/unittests/Target/RISCVMCTest.cpp')
-rw-r--r--backend/unittests/Target/RISCVMCTest.cpp46
1 files changed, 46 insertions, 0 deletions
diff --git a/backend/unittests/Target/RISCVMCTest.cpp b/backend/unittests/Target/RISCVMCTest.cpp
index 4836708..1064cf3 100644
--- a/backend/unittests/Target/RISCVMCTest.cpp
+++ b/backend/unittests/Target/RISCVMCTest.cpp
@@ -170,6 +170,45 @@ symbolExpression(rcc::mc::MCContext &Context, std::string_view Name, std::uint32
return false;
}
+ auto AbsoluteHighExpression = symbolExpression(
+ Context, "absolute", static_cast<std::uint32_t>(rcc::riscv::RISCVMCExprKind::AbsoluteHigh));
+ if (!AbsoluteHighExpression)
+ return false;
+ auto AbsoluteHigh =
+ instruction(LUI, {reg(X6), rcc::mc::MCOperand::expression(*AbsoluteHighExpression)});
+ auto AbsoluteHighEncoding = Emitter.encodeInstruction(AbsoluteHigh);
+ if (!AbsoluteHighEncoding || AbsoluteHighEncoding->Fixups.size() != 1 ||
+ AbsoluteHighEncoding->Fixups[0].Kind !=
+ rcc::riscv::fixupKind(rcc::riscv::RISCVFixupKind::High20)) {
+ return false;
+ }
+ auto AbsoluteHighValue = rcc::mc::evaluateAsRelocatable(**AbsoluteHighExpression);
+ auto AbsoluteHighRelocation =
+ AbsoluteHighValue
+ ? Backend.relocationType(AbsoluteHighEncoding->Fixups[0], *AbsoluteHighValue)
+ : rcc::Expected<std::uint32_t>{std::unexpected(AbsoluteHighValue.error())};
+ if (!AbsoluteHighRelocation || *AbsoluteHighRelocation != 26)
+ return false;
+
+ auto AbsoluteLowExpression = symbolExpression(
+ Context, "absolute", static_cast<std::uint32_t>(rcc::riscv::RISCVMCExprKind::AbsoluteLow));
+ if (!AbsoluteLowExpression)
+ return false;
+ auto AbsoluteLow =
+ instruction(ADDI, {reg(X6), reg(X6), rcc::mc::MCOperand::expression(*AbsoluteLowExpression)});
+ auto AbsoluteLowEncoding = Emitter.encodeInstruction(AbsoluteLow);
+ if (!AbsoluteLowEncoding || AbsoluteLowEncoding->Fixups.size() != 1 ||
+ AbsoluteLowEncoding->Fixups[0].Kind !=
+ rcc::riscv::fixupKind(rcc::riscv::RISCVFixupKind::Low12I)) {
+ return false;
+ }
+ auto AbsoluteLowValue = rcc::mc::evaluateAsRelocatable(**AbsoluteLowExpression);
+ auto AbsoluteLowRelocation =
+ AbsoluteLowValue ? Backend.relocationType(AbsoluteLowEncoding->Fixups[0], *AbsoluteLowValue)
+ : rcc::Expected<std::uint32_t>{std::unexpected(AbsoluteLowValue.error())};
+ if (!AbsoluteLowRelocation || *AbsoluteLowRelocation != 27)
+ return false;
+
auto BranchExpression = symbolExpression(Context, "block");
if (!BranchExpression)
return false;
@@ -251,6 +290,13 @@ int main() {
return fail(Target.error().message());
rcc::riscv::RISCVMCCodeEmitter Emitter(*Target);
rcc::riscv::RISCVAsmBackend Backend;
+ rcc::riscv::RISCVInstPrinter Printer(*Target);
+ auto PrintedHigh = Printer.printTargetExpression(
+ static_cast<std::uint32_t>(rcc::riscv::RISCVMCExprKind::AbsoluteHigh), "symbol");
+ auto PrintedLow = Printer.printTargetExpression(
+ static_cast<std::uint32_t>(rcc::riscv::RISCVMCExprKind::AbsoluteLow), "symbol");
+ if (!PrintedHigh || *PrintedHigh != "%hi(symbol)" || !PrintedLow || *PrintedLow != "%lo(symbol)")
+ return fail("RISC-V absolute address modifiers do not print canonically");
if (!testEncodings(Emitter))
return fail("RISC-V MC encodings differ from the RV64GC reference encodings");
if (!testFixups(Emitter, Backend))