aboutsummaryrefslogtreecommitdiff
path: root/backend/lib/CodeGen/MachineIRBuilder.cpp
diff options
context:
space:
mode:
authorRichard-Qin-X <richard.qin.001@gmail.com>2026-08-01 16:07:24 +0800
committerRichard-Qin-X <richard.qin.001@gmail.com>2026-08-01 16:07:24 +0800
commit924dcd36ebed84f04729de05ec08b311a36a04c1 (patch)
tree300af742968d4d48915ef178855741f7087fc979 /backend/lib/CodeGen/MachineIRBuilder.cpp
parentcfdbcc469f9691bd9dce3b0b86982a63d86ca6b7 (diff)
downloadrcc-project-924dcd36ebed84f04729de05ec08b311a36a04c1.tar.gz
rcc-project-924dcd36ebed84f04729de05ec08b311a36a04c1.tar.xz
[CodeGen] Add target register descriptions
Introduce an immutable register topology for units, subregisters, classes, banks, and preserved masks. Bind instruction descriptors to this topology through TargetDescription so builders, cloning, and verification share one target-aware contract. Add the test-only TestTarget model and positive and negative target fact coverage.
Diffstat (limited to 'backend/lib/CodeGen/MachineIRBuilder.cpp')
-rw-r--r--backend/lib/CodeGen/MachineIRBuilder.cpp39
1 files changed, 21 insertions, 18 deletions
diff --git a/backend/lib/CodeGen/MachineIRBuilder.cpp b/backend/lib/CodeGen/MachineIRBuilder.cpp
index 74ca55b..7f6421b 100644
--- a/backend/lib/CodeGen/MachineIRBuilder.cpp
+++ b/backend/lib/CodeGen/MachineIRBuilder.cpp
@@ -20,16 +20,15 @@
namespace rcc {
-MachineInstrBuilder::MachineInstrBuilder(MachineFunction &Function,
- const InstructionSet &Instructions,
+MachineInstrBuilder::MachineInstrBuilder(MachineFunction &Function, const TargetDescription &Target,
const InstructionDescriptor &Descriptor,
MachineBasicBlock &InsertBlock,
MachineInstr *InsertBefore) noexcept
- : Function(&Function), Instructions(&Instructions), Descriptor(&Descriptor),
- InsertBlock(&InsertBlock), InsertBefore(InsertBefore) {}
+ : Function(&Function), Target(&Target), Descriptor(&Descriptor), InsertBlock(&InsertBlock),
+ InsertBefore(InsertBefore) {}
MachineInstrBuilder::MachineInstrBuilder(MachineInstrBuilder &&Other) noexcept
- : Function(Other.Function), Instructions(Other.Instructions), Descriptor(Other.Descriptor),
+ : Function(Other.Function), Target(Other.Target), Descriptor(Other.Descriptor),
InsertBlock(Other.InsertBlock), InsertBefore(Other.InsertBefore),
ExplicitOperands(std::move(Other.ExplicitOperands)),
ExtraImplicitOperands(std::move(Other.ExtraImplicitOperands)),
@@ -37,7 +36,7 @@ MachineInstrBuilder::MachineInstrBuilder(MachineInstrBuilder &&Other) noexcept
Flags(Other.Flags), Location(std::move(Other.Location)), Origin(Other.Origin),
IsBuilt(Other.IsBuilt) {
Other.Function = nullptr;
- Other.Instructions = nullptr;
+ Other.Target = nullptr;
Other.Descriptor = nullptr;
Other.InsertBlock = nullptr;
Other.InsertBefore = nullptr;
@@ -49,7 +48,7 @@ MachineInstrBuilder &MachineInstrBuilder::operator=(MachineInstrBuilder &&Other)
return *this;
Function = Other.Function;
- Instructions = Other.Instructions;
+ Target = Other.Target;
Descriptor = Other.Descriptor;
InsertBlock = Other.InsertBlock;
InsertBefore = Other.InsertBefore;
@@ -63,7 +62,7 @@ MachineInstrBuilder &MachineInstrBuilder::operator=(MachineInstrBuilder &&Other)
IsBuilt = Other.IsBuilt;
Other.Function = nullptr;
- Other.Instructions = nullptr;
+ Other.Target = nullptr;
Other.Descriptor = nullptr;
Other.InsertBlock = nullptr;
Other.InsertBefore = nullptr;
@@ -448,12 +447,12 @@ Expected<MachineInstr *> MachineInstrBuilder::build() {
}
}
- auto ExplicitValidation = Instructions->validateExplicitOperands(
+ auto ExplicitValidation = Target->validateExplicitOperands(
Descriptor->InstructionOpcode, ExplicitOperands, Function->registerInfo());
if (!ExplicitValidation)
return std::unexpected(ExplicitValidation.error());
- auto DefaultImplicit = Instructions->createDefaultImplicitOperands(*Descriptor);
+ auto DefaultImplicit = Target->createDefaultImplicitOperands(*Descriptor);
if (!DefaultImplicit)
return std::unexpected(DefaultImplicit.error());
@@ -463,19 +462,23 @@ Expected<MachineInstr *> MachineInstrBuilder::build() {
ImplicitOperands.push_back(&Operand);
for (const MachineOperand &Operand : ExtraImplicitOperands)
ImplicitOperands.push_back(&Operand);
- auto ImplicitValidation =
- Instructions->validateImplicitOperands(Descriptor->InstructionOpcode, ImplicitOperands);
+ auto ImplicitValidation = Target->validateImplicitOperands(
+ Descriptor->InstructionOpcode, ImplicitOperands, Function->registerInfo());
if (!ImplicitValidation)
return std::unexpected(ImplicitValidation.error());
const std::vector<MachineOperandTie> Ties = collectOperandTies();
- auto TieValidation =
- Instructions->validateOperandTies(Descriptor->InstructionOpcode, ExplicitOperands, Ties);
+ auto TieValidation = Target->validateOperandTies(Descriptor->InstructionOpcode, ExplicitOperands,
+ Ties, Function->registerInfo());
if (!TieValidation)
return std::unexpected(TieValidation.error());
- auto MemoryValidation =
- Instructions->validateMemOperands(Descriptor->InstructionOpcode, MemOperands);
+ auto EarlyClobberValidation =
+ Target->validateEarlyClobber(ExplicitOperands, ImplicitOperands, Ties);
+ if (!EarlyClobberValidation)
+ return std::unexpected(EarlyClobberValidation.error());
+
+ auto MemoryValidation = Target->validateMemOperands(Descriptor->InstructionOpcode, MemOperands);
if (!MemoryValidation)
return std::unexpected(MemoryValidation.error());
@@ -577,7 +580,7 @@ Expected<MachineInstrBuilder> MachineIRBuilder::buildInstr(Opcode InstructionOpc
if (InsertBlock == nullptr) {
return makeUnexpected(ErrorCode::InvalidArgument, "machine IR builder has no insertion point");
}
- const InstructionDescriptor *Descriptor = Instructions->descriptor(InstructionOpcode);
+ const InstructionDescriptor *Descriptor = Target->instructionDescriptor(InstructionOpcode);
if (Descriptor == nullptr) {
return makeUnexpected(ErrorCode::InvalidArgument,
"machine IR builder opcode is not registered");
@@ -589,7 +592,7 @@ Expected<MachineInstrBuilder> MachineIRBuilder::buildInstr(Opcode InstructionOpc
return makeUnexpected(ErrorCode::InvalidArgument,
"machine IR builder insertion cursor is stale");
}
- return MachineInstrBuilder(*Function, *Instructions, *Descriptor, *InsertBlock, InsertBefore);
+ return MachineInstrBuilder(*Function, *Target, *Descriptor, *InsertBlock, InsertBefore);
}
} // namespace rcc