diff options
| author | Chris Lattner <sabre@nondot.org> | 2004-08-21 04:05:00 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2004-08-21 04:05:00 +0000 |
| commit | 056afeface2ac98664ed8fa4799b46178a4a6fe3 (patch) | |
| tree | b20825736e75aae16c585715fa1f6feab2fe5233 /utils/TableGen/CodeGenTarget.cpp | |
| parent | 7a680c60646fb3b06085f1fe6a7a1917c35010c6 (diff) | |
Start parsing register classes into a more structured form
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@15961 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils/TableGen/CodeGenTarget.cpp')
| -rw-r--r-- | utils/TableGen/CodeGenTarget.cpp | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/utils/TableGen/CodeGenTarget.cpp b/utils/TableGen/CodeGenTarget.cpp index c495519e58..e0d585c618 100644 --- a/utils/TableGen/CodeGenTarget.cpp +++ b/utils/TableGen/CodeGenTarget.cpp @@ -121,6 +121,38 @@ const std::string &CodeGenRegister::getName() const { return TheDef->getName(); } +void CodeGenTarget::ReadRegisterClasses() const { + std::vector<Record*> RegClasses = + Records.getAllDerivedDefinitions("RegisterClass"); + if (RegClasses.empty()) + throw std::string("No 'RegisterClass' subclasses defined!"); + + RegisterClasses.reserve(RegClasses.size()); + RegisterClasses.assign(RegClasses.begin(), RegClasses.end()); +} + +CodeGenRegisterClass::CodeGenRegisterClass(Record *R) : TheDef(R) { + SpillSize = R->getValueAsInt("Size"); + SpillAlignment = R->getValueAsInt("Alignment"); + + ListInit *RegList = R->getValueAsListInit("MemberList"); + for (unsigned i = 0, e = RegList->getSize(); i != e; ++i) { + DefInit *RegDef = dynamic_cast<DefInit*>(RegList->getElement(i)); + if (!RegDef) throw "Register class member is not a record!"; + Record *Reg = RegDef->getDef(); + + if (!Reg->isSubClassOf("Register")) + throw "Register Class member '" + Reg->getName() + + "' does not derive from the Register class!"; + Elements.push_back(Reg); + } +} + +const std::string &CodeGenRegisterClass::getName() const { + return TheDef->getName(); +} + + void CodeGenTarget::ReadInstructions() const { std::vector<Record*> Insts = Records.getAllDerivedDefinitions("Instruction"); |
