aboutsummaryrefslogtreecommitdiff
path: root/backend/lib/Tooling
diff options
context:
space:
mode:
authorRichard-Qin-X <richard.qin.001@gmail.com>2026-08-24 16:37:25 +0800
committerRichard-Qin-X <richard.qin.001@gmail.com>2026-08-24 16:37:25 +0800
commit540c73a2f450af3d0aec6e039fab054471efdbb1 (patch)
tree9b260322eaeeac8b8741a30a273f7d407b683e5e /backend/lib/Tooling
parent936ac5647f82def050e6654d44d24a88906f4d7a (diff)
downloadrcc-project-540c73a2f450af3d0aec6e039fab054471efdbb1.tar.gz
rcc-project-540c73a2f450af3d0aec6e039fab054471efdbb1.tar.xz
[RISCV] Match LLVM frame lowering semantics
Diffstat (limited to 'backend/lib/Tooling')
-rw-r--r--backend/lib/Tooling/MIRFuzzer.cpp5
-rw-r--r--backend/lib/Tooling/PipelineDriver.cpp16
2 files changed, 16 insertions, 5 deletions
diff --git a/backend/lib/Tooling/MIRFuzzer.cpp b/backend/lib/Tooling/MIRFuzzer.cpp
index 7f1cc66..79e1b50 100644
--- a/backend/lib/Tooling/MIRFuzzer.cpp
+++ b/backend/lib/Tooling/MIRFuzzer.cpp
@@ -298,7 +298,10 @@ private:
auto Features = riscv::RISCVSubtargetFeatures::fromFeatureList(Invocation.Features);
if (!Features)
return std::unexpected(Features.error());
- const riscv::RISCVSubtarget Subtarget(*Features, Invocation.Relocation, Invocation.Code);
+ auto ABI = riscv::parseRISCVABI(Invocation.ABI);
+ if (!ABI)
+ return std::unexpected(ABI.error());
+ const riscv::RISCVSubtarget Subtarget(*Features, Invocation.Relocation, Invocation.Code, *ABI);
auto Names = riscv::canonicalPipelinePassNames(*Function, Subtarget);
if (!Names)
return std::unexpected(Names.error());
diff --git a/backend/lib/Tooling/PipelineDriver.cpp b/backend/lib/Tooling/PipelineDriver.cpp
index 959ff4c..5bf57cf 100644
--- a/backend/lib/Tooling/PipelineDriver.cpp
+++ b/backend/lib/Tooling/PipelineDriver.cpp
@@ -262,7 +262,10 @@ runFunction(MachineFunction &Function, mir::MIRDocument &Document, const TargetD
riscv::RISCVSubtargetFeatures Features, bool AllowSnapshots,
MachinePassInstrumentation *Instrumentation) {
FunctionRunResult Result;
- const riscv::RISCVSubtarget Subtarget(Features, Invocation.Relocation, Invocation.Code);
+ auto ABI = riscv::parseRISCVABI(Invocation.ABI);
+ if (!ABI)
+ return std::unexpected(ABI.error());
+ const riscv::RISCVSubtarget Subtarget(Features, Invocation.Relocation, Invocation.Code, *ABI);
MachinePassManagerOptions ManagerOptions{
.VerifyBefore = true,
.VerifyEach = Controls.VerifyEach,
@@ -455,11 +458,16 @@ Expected<void> verifyRV64GCInvocation(const BackendInvocation &Invocation) {
auto Features = riscv::RISCVSubtargetFeatures::fromFeatureList(Invocation.Features);
if (!Features)
return std::unexpected(Features.error());
+ auto ABI = riscv::parseRISCVABI(Invocation.ABI);
+ if (!ABI)
+ return std::unexpected(ABI.error());
+ if (*ABI == riscv::RISCVABI::LP64D && !Features->has(riscv::RISCVExtension::D)) {
+ return makeUnexpected(ErrorCode::InvalidInvocation, "RISC-V LP64D requires the D extension");
+ }
if (Invocation.Triple != Expected.Triple || Invocation.CPU != Expected.CPU ||
- Invocation.TuneCPU != Expected.TuneCPU || Invocation.ABI != Expected.ABI ||
- Invocation.DataLayout != Expected.DataLayout) {
+ Invocation.TuneCPU != Expected.TuneCPU || Invocation.DataLayout != Expected.DataLayout) {
return makeUnexpected(ErrorCode::InvalidInvocation,
- "backend invocation does not select the supported RV64 LP64D target");
+ "backend invocation does not select a supported RV64 target");
}
if (Invocation.MIRReferenceRevision != LLVMReferenceRevision ||
Invocation.GenericOpcodeVersion != GenericOpcodeReferenceVersion ||