diff options
| author | Chris Lattner <sabre@nondot.org> | 2003-08-01 06:27:59 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2003-08-01 06:27:59 +0000 |
| commit | c7d58024f8bed33e0b3e795e51a62ec30248aff3 (patch) | |
| tree | f8aedb5f9f052481cbe68d91ab8ba62bff00c1d5 /utils/TableGen/RegisterInfoEmitter.cpp | |
| parent | 58c5de16927ea5ba1b454a69ce7ee4fdc371b9f7 (diff) | |
add support for emitting register classes
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7473 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils/TableGen/RegisterInfoEmitter.cpp')
| -rw-r--r-- | utils/TableGen/RegisterInfoEmitter.cpp | 45 |
1 files changed, 44 insertions, 1 deletions
diff --git a/utils/TableGen/RegisterInfoEmitter.cpp b/utils/TableGen/RegisterInfoEmitter.cpp index 66e7b1250f..af04f791d5 100644 --- a/utils/TableGen/RegisterInfoEmitter.cpp +++ b/utils/TableGen/RegisterInfoEmitter.cpp @@ -8,6 +8,7 @@ #include "RegisterInfoEmitter.h" #include "Record.h" +#include "Support/StringExtras.h" #include <set> static void EmitSourceHeader(const std::string &Desc, std::ostream &o) { @@ -59,6 +60,12 @@ void RegisterInfoEmitter::runHeader(std::ostream &OS) { << "};\n\n"; } +static std::string getQualifiedRecordName(Record *R) { + std::string Namespace = R->getValueAsString("Namespace"); + if (Namespace.empty()) return R->getName(); + return Namespace + "::" + R->getName(); +} + // RegisterInfoEmitter::run - Main register file description emitter. // void RegisterInfoEmitter::run(std::ostream &OS) { @@ -71,6 +78,9 @@ void RegisterInfoEmitter::run(std::ostream &OS) { std::vector<Record*> RegisterClasses = Records.getAllDerivedDefinitions("RegisterClass"); + std::vector<Record*> Registers = Records.getAllDerivedDefinitions("Register"); + Record *RegisterClass = Records.getClass("Register"); + std::set<Record*> RegistersFound; // Loop over all of the register classes... emitting each one. @@ -79,7 +89,40 @@ void RegisterInfoEmitter::run(std::ostream &OS) { for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc) { Record *RC = RegisterClasses[rc]; std::string Name = RC->getName(); - //if (Name[ + if (Name[9] == '.') { + static unsigned AnonCounter = 0; + Name = "AnonRegClass_"+utostr(AnonCounter++); + } + + // Emit the register list now... + OS << " // " << Name << " Register Class...\n const unsigned " << Name + << "[] = {\n "; + ListInit *RegList = RC->getValueAsListInit("MemberList"); + for (unsigned i = 0, e = RegList->getSize(); i != e; ++i) { + Record *Reg = RegList->getElement(i); + if (!Reg->isSubClassOf(RegisterClass)) + throw "Register Class member '" + Reg->getName() + + " does not derive from the Register class!"; + if (RegistersFound.count(Reg)) + throw "Register '" + Reg->getName() + + "' included in multiple register classes!"; + OS << getQualifiedRecordName(Reg) << ", "; + } + OS << "\n };\n\n"; + + OS << " struct " << Name << "Class : public TargetRegisterClass {\n" + << " " << Name << "Class() : TargetRegisterClass(" + << RC->getValueAsInt("Size")/8 << ", " << RC->getValueAsInt("Alignment") + << ", " << Name << ", " << Name << " + " << RegList->getSize() + << ") {}\n"; + + if (CodeInit *CI = dynamic_cast<CodeInit*>(RC->getValueInit("Methods"))) + OS << CI->getValue(); + else + throw "Expected 'code' fragment for 'Methods' value in register class '"+ + RC->getName() + "'!"; + + OS << " } " << Name << "Instance;\n\n"; } |
