RegisterInfoEmitter.cpp revision d0fde30ce850b78371fd1386338350591f9ff494
13112326c88b7090f770c4ff8a1546ef84fd2e8bbChris Lattner//===- RegisterInfoEmitter.cpp - Generate a Register File Desc. -*- C++ -*-===// 201d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell// 301d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell// The LLVM Compiler Infrastructure 401d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell// 501d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell// This file was developed by the LLVM research group and is distributed under 601d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell// the University of Illinois Open Source License. See LICENSE.TXT for details. 701d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell// 801d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell//===----------------------------------------------------------------------===// 93112326c88b7090f770c4ff8a1546ef84fd2e8bbChris Lattner// 103112326c88b7090f770c4ff8a1546ef84fd2e8bbChris Lattner// This tablegen backend is responsible for emitting a description of a target 113112326c88b7090f770c4ff8a1546ef84fd2e8bbChris Lattner// register file for a code generator. It uses instances of the Register, 123112326c88b7090f770c4ff8a1546ef84fd2e8bbChris Lattner// RegisterAliases, and RegisterClass classes to gather this information. 133112326c88b7090f770c4ff8a1546ef84fd2e8bbChris Lattner// 143112326c88b7090f770c4ff8a1546ef84fd2e8bbChris Lattner//===----------------------------------------------------------------------===// 153112326c88b7090f770c4ff8a1546ef84fd2e8bbChris Lattner 163112326c88b7090f770c4ff8a1546ef84fd2e8bbChris Lattner#include "RegisterInfoEmitter.h" 177884b750c33b750177b3f22af75c874c97f728d8Chris Lattner#include "CodeGenWrappers.h" 183112326c88b7090f770c4ff8a1546ef84fd2e8bbChris Lattner#include "Record.h" 19c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner#include "Support/StringExtras.h" 2054d156d33324b7715453993f21684915a28e310aChris Lattner#include <set> 213112326c88b7090f770c4ff8a1546ef84fd2e8bbChris Lattner 22d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm { 23d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 2454d156d33324b7715453993f21684915a28e310aChris Lattner// runEnums - Print out enum values for all of the registers. 2554d156d33324b7715453993f21684915a28e310aChris Lattnervoid RegisterInfoEmitter::runEnums(std::ostream &OS) { 2654d156d33324b7715453993f21684915a28e310aChris Lattner std::vector<Record*> Registers = Records.getAllDerivedDefinitions("Register"); 2754d156d33324b7715453993f21684915a28e310aChris Lattner 2854d156d33324b7715453993f21684915a28e310aChris Lattner if (Registers.size() == 0) 2954d156d33324b7715453993f21684915a28e310aChris Lattner throw std::string("No 'Register' subclasses defined!"); 3054d156d33324b7715453993f21684915a28e310aChris Lattner 3154d156d33324b7715453993f21684915a28e310aChris Lattner std::string Namespace = Registers[0]->getValueAsString("Namespace"); 3254d156d33324b7715453993f21684915a28e310aChris Lattner 330e5e49e6888c354ff95fc9e56d0881af78cb4269Chris Lattner EmitSourceFileHeader("Target Register Enum Values", OS); 3454d156d33324b7715453993f21684915a28e310aChris Lattner 3554d156d33324b7715453993f21684915a28e310aChris Lattner if (!Namespace.empty()) 3654d156d33324b7715453993f21684915a28e310aChris Lattner OS << "namespace " << Namespace << " {\n"; 3754d156d33324b7715453993f21684915a28e310aChris Lattner OS << " enum {\n NoRegister,\n"; 3854d156d33324b7715453993f21684915a28e310aChris Lattner 3954d156d33324b7715453993f21684915a28e310aChris Lattner for (unsigned i = 0, e = Registers.size(); i != e; ++i) 400bb66fc30e60d92d65dd6b887aed38dd644c2eb6Chris Lattner OS << " " << Registers[i]->getName() << ", \t// " << i+1 << "\n"; 4154d156d33324b7715453993f21684915a28e310aChris Lattner 4254d156d33324b7715453993f21684915a28e310aChris Lattner OS << " };\n"; 4354d156d33324b7715453993f21684915a28e310aChris Lattner if (!Namespace.empty()) 4454d156d33324b7715453993f21684915a28e310aChris Lattner OS << "}\n"; 45d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke EmitSourceFileTail(OS); 4654d156d33324b7715453993f21684915a28e310aChris Lattner} 4754d156d33324b7715453993f21684915a28e310aChris Lattner 489fff8919eefa377936918eec763b392e59049353Chris Lattnervoid RegisterInfoEmitter::runHeader(std::ostream &OS) { 490e5e49e6888c354ff95fc9e56d0881af78cb4269Chris Lattner EmitSourceFileHeader("Register Information Header Fragment", OS); 507884b750c33b750177b3f22af75c874c97f728d8Chris Lattner const std::string &TargetName = CodeGenTarget().getName(); 5138aa542f3679af5925315626a37e2d085954ce9fChris Lattner std::string ClassName = TargetName + "GenRegisterInfo"; 523112326c88b7090f770c4ff8a1546ef84fd2e8bbChris Lattner 5354d156d33324b7715453993f21684915a28e310aChris Lattner OS << "#include \"llvm/Target/MRegisterInfo.h\"\n\n"; 543112326c88b7090f770c4ff8a1546ef84fd2e8bbChris Lattner 5554d156d33324b7715453993f21684915a28e310aChris Lattner OS << "struct " << ClassName << " : public MRegisterInfo {\n" 569fff8919eefa377936918eec763b392e59049353Chris Lattner << " " << ClassName 579fff8919eefa377936918eec763b392e59049353Chris Lattner << "(int CallFrameSetupOpcode = -1, int CallFrameDestroyOpcode = -1);\n" 583112326c88b7090f770c4ff8a1546ef84fd2e8bbChris Lattner << " const unsigned* getCalleeSaveRegs() const;\n" 593112326c88b7090f770c4ff8a1546ef84fd2e8bbChris Lattner << "};\n\n"; 6038aa542f3679af5925315626a37e2d085954ce9fChris Lattner 6138aa542f3679af5925315626a37e2d085954ce9fChris Lattner std::vector<Record*> RegisterClasses = 6238aa542f3679af5925315626a37e2d085954ce9fChris Lattner Records.getAllDerivedDefinitions("RegisterClass"); 6338aa542f3679af5925315626a37e2d085954ce9fChris Lattner 6438aa542f3679af5925315626a37e2d085954ce9fChris Lattner OS << "namespace " << TargetName << " { // Register classes\n"; 6538aa542f3679af5925315626a37e2d085954ce9fChris Lattner for (unsigned i = 0, e = RegisterClasses.size(); i != e; ++i) { 66c7df109b6c4f7cbf8cc4dbee90291d4e452c7d56Chris Lattner if (RegisterClasses[i]->getValueAsBit("isDummyClass")) 67c7df109b6c4f7cbf8cc4dbee90291d4e452c7d56Chris Lattner continue; // Ignore dummies 68c7df109b6c4f7cbf8cc4dbee90291d4e452c7d56Chris Lattner 6938aa542f3679af5925315626a37e2d085954ce9fChris Lattner const std::string &Name = RegisterClasses[i]->getName(); 70c7df109b6c4f7cbf8cc4dbee90291d4e452c7d56Chris Lattner if (Name.size() < 9 || Name[9] != '.') // Ignore anonymous classes 7138aa542f3679af5925315626a37e2d085954ce9fChris Lattner OS << " extern TargetRegisterClass *" << Name << "RegisterClass;\n"; 7238aa542f3679af5925315626a37e2d085954ce9fChris Lattner } 7338aa542f3679af5925315626a37e2d085954ce9fChris Lattner OS << "} // end of namespace " << TargetName << "\n\n"; 74d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke EmitSourceFileTail(OS); 753112326c88b7090f770c4ff8a1546ef84fd2e8bbChris Lattner} 763112326c88b7090f770c4ff8a1546ef84fd2e8bbChris Lattner 7754d156d33324b7715453993f21684915a28e310aChris Lattner// RegisterInfoEmitter::run - Main register file description emitter. 7854d156d33324b7715453993f21684915a28e310aChris Lattner// 7954d156d33324b7715453993f21684915a28e310aChris Lattnervoid RegisterInfoEmitter::run(std::ostream &OS) { 800e5e49e6888c354ff95fc9e56d0881af78cb4269Chris Lattner EmitSourceFileHeader("Register Information Source Fragment", OS); 8154d156d33324b7715453993f21684915a28e310aChris Lattner 8254d156d33324b7715453993f21684915a28e310aChris Lattner // Start out by emitting each of the register classes... to do this, we build 8354d156d33324b7715453993f21684915a28e310aChris Lattner // a set of registers which belong to a register class, this is to ensure that 8454d156d33324b7715453993f21684915a28e310aChris Lattner // each register is only in a single register class. 8554d156d33324b7715453993f21684915a28e310aChris Lattner // 8654d156d33324b7715453993f21684915a28e310aChris Lattner std::vector<Record*> RegisterClasses = 8754d156d33324b7715453993f21684915a28e310aChris Lattner Records.getAllDerivedDefinitions("RegisterClass"); 8854d156d33324b7715453993f21684915a28e310aChris Lattner 89c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner std::vector<Record*> Registers = Records.getAllDerivedDefinitions("Register"); 90c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner 9154d156d33324b7715453993f21684915a28e310aChris Lattner std::set<Record*> RegistersFound; 929fff8919eefa377936918eec763b392e59049353Chris Lattner std::vector<std::string> RegClassNames; 9354d156d33324b7715453993f21684915a28e310aChris Lattner 9454d156d33324b7715453993f21684915a28e310aChris Lattner // Loop over all of the register classes... emitting each one. 9554d156d33324b7715453993f21684915a28e310aChris Lattner OS << "namespace { // Register classes...\n"; 969fff8919eefa377936918eec763b392e59049353Chris Lattner 9754d156d33324b7715453993f21684915a28e310aChris Lattner for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc) { 9854d156d33324b7715453993f21684915a28e310aChris Lattner Record *RC = RegisterClasses[rc]; 99c7df109b6c4f7cbf8cc4dbee90291d4e452c7d56Chris Lattner if (RC->getValueAsBit("isDummyClass")) continue; // Ignore dummies 100c7df109b6c4f7cbf8cc4dbee90291d4e452c7d56Chris Lattner 10154d156d33324b7715453993f21684915a28e310aChris Lattner std::string Name = RC->getName(); 10213c5b4cdc8b601bdb464bf31f316233fd02e1d49Chris Lattner if (Name.size() > 9 && Name[9] == '.') { 103c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner static unsigned AnonCounter = 0; 104c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner Name = "AnonRegClass_"+utostr(AnonCounter++); 105c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner } 106c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner 1079fff8919eefa377936918eec763b392e59049353Chris Lattner RegClassNames.push_back(Name); 1089fff8919eefa377936918eec763b392e59049353Chris Lattner 109c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner // Emit the register list now... 110c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner OS << " // " << Name << " Register Class...\n const unsigned " << Name 111c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner << "[] = {\n "; 112c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner ListInit *RegList = RC->getValueAsListInit("MemberList"); 113c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner for (unsigned i = 0, e = RegList->getSize(); i != e; ++i) { 11413c5b4cdc8b601bdb464bf31f316233fd02e1d49Chris Lattner DefInit *RegDef = dynamic_cast<DefInit*>(RegList->getElement(i)); 11513c5b4cdc8b601bdb464bf31f316233fd02e1d49Chris Lattner if (!RegDef) throw "Register class member is not a record!"; 11613c5b4cdc8b601bdb464bf31f316233fd02e1d49Chris Lattner Record *Reg = RegDef->getDef(); 117a40e5ad69f5ab5da1671a5e84e75a60202ad03d5Chris Lattner if (!Reg->isSubClassOf("Register")) 118c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner throw "Register Class member '" + Reg->getName() + 119c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner " does not derive from the Register class!"; 120c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner if (RegistersFound.count(Reg)) 121c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner throw "Register '" + Reg->getName() + 122c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner "' included in multiple register classes!"; 1239fff8919eefa377936918eec763b392e59049353Chris Lattner RegistersFound.insert(Reg); 1249fff8919eefa377936918eec763b392e59049353Chris Lattner OS << getQualifiedName(Reg) << ", "; 125c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner } 126c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner OS << "\n };\n\n"; 127c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner 128c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner OS << " struct " << Name << "Class : public TargetRegisterClass {\n" 129c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner << " " << Name << "Class() : TargetRegisterClass(" 130c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner << RC->getValueAsInt("Size")/8 << ", " << RC->getValueAsInt("Alignment") 131c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner << ", " << Name << ", " << Name << " + " << RegList->getSize() 132c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner << ") {}\n"; 133c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner 134c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner if (CodeInit *CI = dynamic_cast<CodeInit*>(RC->getValueInit("Methods"))) 135c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner OS << CI->getValue(); 136c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner else 137c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner throw "Expected 'code' fragment for 'Methods' value in register class '"+ 138c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner RC->getName() + "'!"; 139c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner 140c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner OS << " } " << Name << "Instance;\n\n"; 1419fff8919eefa377936918eec763b392e59049353Chris Lattner } 1429fff8919eefa377936918eec763b392e59049353Chris Lattner 1439fff8919eefa377936918eec763b392e59049353Chris Lattner OS << " const TargetRegisterClass* const RegisterClasses[] = {\n"; 1449fff8919eefa377936918eec763b392e59049353Chris Lattner for (unsigned i = 0, e = RegClassNames.size(); i != e; ++i) 1459fff8919eefa377936918eec763b392e59049353Chris Lattner OS << " &" << RegClassNames[i] << "Instance,\n"; 1469fff8919eefa377936918eec763b392e59049353Chris Lattner OS << " };\n"; 14754d156d33324b7715453993f21684915a28e310aChris Lattner 1489fff8919eefa377936918eec763b392e59049353Chris Lattner // Emit register class aliases... 1499fff8919eefa377936918eec763b392e59049353Chris Lattner std::vector<Record*> RegisterAliasesRecs = 1509fff8919eefa377936918eec763b392e59049353Chris Lattner Records.getAllDerivedDefinitions("RegisterAliases"); 1519fff8919eefa377936918eec763b392e59049353Chris Lattner std::map<Record*, std::set<Record*> > RegisterAliases; 15273ff5120eb8b8c0ccbfed8a17f1024c67a75f319Alkis Evlogimenos 1539fff8919eefa377936918eec763b392e59049353Chris Lattner for (unsigned i = 0, e = RegisterAliasesRecs.size(); i != e; ++i) { 1549fff8919eefa377936918eec763b392e59049353Chris Lattner Record *AS = RegisterAliasesRecs[i]; 1559fff8919eefa377936918eec763b392e59049353Chris Lattner Record *R = AS->getValueAsDef("Reg"); 1569fff8919eefa377936918eec763b392e59049353Chris Lattner ListInit *LI = AS->getValueAsListInit("Aliases"); 1579fff8919eefa377936918eec763b392e59049353Chris Lattner 1589fff8919eefa377936918eec763b392e59049353Chris Lattner // Add information that R aliases all of the elements in the list... and 1599fff8919eefa377936918eec763b392e59049353Chris Lattner // that everything in the list aliases R. 1609fff8919eefa377936918eec763b392e59049353Chris Lattner for (unsigned j = 0, e = LI->getSize(); j != e; ++j) { 16113c5b4cdc8b601bdb464bf31f316233fd02e1d49Chris Lattner DefInit *Reg = dynamic_cast<DefInit*>(LI->getElement(j)); 16213c5b4cdc8b601bdb464bf31f316233fd02e1d49Chris Lattner if (!Reg) throw "ERROR: Alias list element is not a def!"; 16313c5b4cdc8b601bdb464bf31f316233fd02e1d49Chris Lattner if (RegisterAliases[R].count(Reg->getDef())) 1649fff8919eefa377936918eec763b392e59049353Chris Lattner std::cerr << "Warning: register alias between " << getQualifiedName(R) 16513c5b4cdc8b601bdb464bf31f316233fd02e1d49Chris Lattner << " and " << getQualifiedName(Reg->getDef()) 1669fff8919eefa377936918eec763b392e59049353Chris Lattner << " specified multiple times!\n"; 16713c5b4cdc8b601bdb464bf31f316233fd02e1d49Chris Lattner RegisterAliases[R].insert(Reg->getDef()); 1689fff8919eefa377936918eec763b392e59049353Chris Lattner 16913c5b4cdc8b601bdb464bf31f316233fd02e1d49Chris Lattner if (RegisterAliases[Reg->getDef()].count(R)) 1709fff8919eefa377936918eec763b392e59049353Chris Lattner std::cerr << "Warning: register alias between " << getQualifiedName(R) 17113c5b4cdc8b601bdb464bf31f316233fd02e1d49Chris Lattner << " and " << getQualifiedName(Reg->getDef()) 1729fff8919eefa377936918eec763b392e59049353Chris Lattner << " specified multiple times!\n"; 17313c5b4cdc8b601bdb464bf31f316233fd02e1d49Chris Lattner RegisterAliases[Reg->getDef()].insert(R); 1749fff8919eefa377936918eec763b392e59049353Chris Lattner } 1759fff8919eefa377936918eec763b392e59049353Chris Lattner } 1769fff8919eefa377936918eec763b392e59049353Chris Lattner 1779fff8919eefa377936918eec763b392e59049353Chris Lattner if (!RegisterAliases.empty()) 1789fff8919eefa377936918eec763b392e59049353Chris Lattner OS << "\n\n // Register Alias Sets...\n"; 1799fff8919eefa377936918eec763b392e59049353Chris Lattner 18073ff5120eb8b8c0ccbfed8a17f1024c67a75f319Alkis Evlogimenos // Emit the empty alias list 18173ff5120eb8b8c0ccbfed8a17f1024c67a75f319Alkis Evlogimenos OS << " const unsigned Empty_AliasSet[] = { 0 };\n"; 1829fff8919eefa377936918eec763b392e59049353Chris Lattner // Loop over all of the registers which have aliases, emitting the alias list 1839fff8919eefa377936918eec763b392e59049353Chris Lattner // to memory. 1849fff8919eefa377936918eec763b392e59049353Chris Lattner for (std::map<Record*, std::set<Record*> >::iterator 1859fff8919eefa377936918eec763b392e59049353Chris Lattner I = RegisterAliases.begin(), E = RegisterAliases.end(); I != E; ++I) { 1869fff8919eefa377936918eec763b392e59049353Chris Lattner OS << " const unsigned " << I->first->getName() << "_AliasSet[] = { "; 1879fff8919eefa377936918eec763b392e59049353Chris Lattner for (std::set<Record*>::iterator ASI = I->second.begin(), 1889fff8919eefa377936918eec763b392e59049353Chris Lattner E = I->second.end(); ASI != E; ++ASI) 1899fff8919eefa377936918eec763b392e59049353Chris Lattner OS << getQualifiedName(*ASI) << ", "; 1909fff8919eefa377936918eec763b392e59049353Chris Lattner OS << "0 };\n"; 19154d156d33324b7715453993f21684915a28e310aChris Lattner } 1923112326c88b7090f770c4ff8a1546ef84fd2e8bbChris Lattner 1939fff8919eefa377936918eec763b392e59049353Chris Lattner OS << "\n const MRegisterDesc RegisterDescriptors[] = { // Descriptors\n"; 1949fff8919eefa377936918eec763b392e59049353Chris Lattner OS << " { \"NOREG\",\t0,\t\t0,\t0 },\n"; 1959fff8919eefa377936918eec763b392e59049353Chris Lattner // Now that register alias sets have been emitted, emit the register 1969fff8919eefa377936918eec763b392e59049353Chris Lattner // descriptors now. 1979fff8919eefa377936918eec763b392e59049353Chris Lattner for (unsigned i = 0, e = Registers.size(); i != e; ++i) { 1989fff8919eefa377936918eec763b392e59049353Chris Lattner Record *Reg = Registers[i]; 199a8af7799dd4b9dda7016f72b2e5f7b7d07780a8aChris Lattner OS << " { \""; 200a8af7799dd4b9dda7016f72b2e5f7b7d07780a8aChris Lattner if (!Reg->getValueAsString("Name").empty()) 201a8af7799dd4b9dda7016f72b2e5f7b7d07780a8aChris Lattner OS << Reg->getValueAsString("Name"); 202a8af7799dd4b9dda7016f72b2e5f7b7d07780a8aChris Lattner else 203a8af7799dd4b9dda7016f72b2e5f7b7d07780a8aChris Lattner OS << Reg->getName(); 204a8af7799dd4b9dda7016f72b2e5f7b7d07780a8aChris Lattner OS << "\",\t"; 2059fff8919eefa377936918eec763b392e59049353Chris Lattner if (RegisterAliases.count(Reg)) 2069fff8919eefa377936918eec763b392e59049353Chris Lattner OS << Reg->getName() << "_AliasSet,\t"; 2079fff8919eefa377936918eec763b392e59049353Chris Lattner else 20873ff5120eb8b8c0ccbfed8a17f1024c67a75f319Alkis Evlogimenos OS << "Empty_AliasSet,\t"; 2099fff8919eefa377936918eec763b392e59049353Chris Lattner OS << "0, 0 },\n"; 2109fff8919eefa377936918eec763b392e59049353Chris Lattner } 2119fff8919eefa377936918eec763b392e59049353Chris Lattner OS << " };\n"; // End of register descriptors... 2129fff8919eefa377936918eec763b392e59049353Chris Lattner OS << "}\n\n"; // End of anonymous namespace... 2139fff8919eefa377936918eec763b392e59049353Chris Lattner 2147884b750c33b750177b3f22af75c874c97f728d8Chris Lattner CodeGenTarget Target; 21538aa542f3679af5925315626a37e2d085954ce9fChris Lattner 2167884b750c33b750177b3f22af75c874c97f728d8Chris Lattner OS << "namespace " << Target.getName() << " { // Register classes\n"; 21738aa542f3679af5925315626a37e2d085954ce9fChris Lattner for (unsigned i = 0, e = RegisterClasses.size(); i != e; ++i) { 218c7df109b6c4f7cbf8cc4dbee90291d4e452c7d56Chris Lattner if (RegisterClasses[i]->getValueAsBit("isDummyClass")) 219c7df109b6c4f7cbf8cc4dbee90291d4e452c7d56Chris Lattner continue; // Ignore dummies 220c7df109b6c4f7cbf8cc4dbee90291d4e452c7d56Chris Lattner 22138aa542f3679af5925315626a37e2d085954ce9fChris Lattner const std::string &Name = RegisterClasses[i]->getName(); 22238aa542f3679af5925315626a37e2d085954ce9fChris Lattner if (Name.size() < 9 || Name[9] != '.') // Ignore anonymous classes 22338aa542f3679af5925315626a37e2d085954ce9fChris Lattner OS << " TargetRegisterClass *" << Name << "RegisterClass = &" 22438aa542f3679af5925315626a37e2d085954ce9fChris Lattner << Name << "Instance;\n"; 22538aa542f3679af5925315626a37e2d085954ce9fChris Lattner } 2267884b750c33b750177b3f22af75c874c97f728d8Chris Lattner OS << "} // end of namespace " << Target.getName() << "\n\n"; 22738aa542f3679af5925315626a37e2d085954ce9fChris Lattner 22838aa542f3679af5925315626a37e2d085954ce9fChris Lattner 22938aa542f3679af5925315626a37e2d085954ce9fChris Lattner 2307884b750c33b750177b3f22af75c874c97f728d8Chris Lattner std::string ClassName = Target.getName() + "GenRegisterInfo"; 2319fff8919eefa377936918eec763b392e59049353Chris Lattner 2329fff8919eefa377936918eec763b392e59049353Chris Lattner // Emit the constructor of the class... 2339fff8919eefa377936918eec763b392e59049353Chris Lattner OS << ClassName << "::" << ClassName 2349fff8919eefa377936918eec763b392e59049353Chris Lattner << "(int CallFrameSetupOpcode, int CallFrameDestroyOpcode)\n" 2359fff8919eefa377936918eec763b392e59049353Chris Lattner << " : MRegisterInfo(RegisterDescriptors, " << Registers.size()+1 2369fff8919eefa377936918eec763b392e59049353Chris Lattner << ", RegisterClasses, RegisterClasses+" << RegClassNames.size() << ",\n " 2379fff8919eefa377936918eec763b392e59049353Chris Lattner << " CallFrameSetupOpcode, CallFrameDestroyOpcode) {}\n\n"; 2389fff8919eefa377936918eec763b392e59049353Chris Lattner 2399fff8919eefa377936918eec763b392e59049353Chris Lattner // Emit the getCalleeSaveRegs method... 2409fff8919eefa377936918eec763b392e59049353Chris Lattner OS << "const unsigned* " << ClassName << "::getCalleeSaveRegs() const {\n" 2419fff8919eefa377936918eec763b392e59049353Chris Lattner << " static const unsigned CalleeSaveRegs[] = {\n "; 2429fff8919eefa377936918eec763b392e59049353Chris Lattner 2437884b750c33b750177b3f22af75c874c97f728d8Chris Lattner const std::vector<Record*> &CSR = Target.getCalleeSavedRegisters(); 2447884b750c33b750177b3f22af75c874c97f728d8Chris Lattner for (unsigned i = 0, e = CSR.size(); i != e; ++i) 2457884b750c33b750177b3f22af75c874c97f728d8Chris Lattner OS << getQualifiedName(CSR[i]) << ", "; 2469fff8919eefa377936918eec763b392e59049353Chris Lattner OS << " 0\n };\n return CalleeSaveRegs;\n}\n\n"; 247d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke EmitSourceFileTail(OS); 2483112326c88b7090f770c4ff8a1546ef84fd2e8bbChris Lattner} 249d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 250d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace 251