Infer the spillsize/alignment of a register based on the register classes
[oota-llvm.git] / utils / TableGen / RegisterInfoEmitter.cpp
1 //===- RegisterInfoEmitter.cpp - Generate a Register File Desc. -*- C++ -*-===//
2 // 
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file was developed by the LLVM research group and is distributed under
6 // the University of Illinois Open Source License. See LICENSE.TXT for details.
7 // 
8 //===----------------------------------------------------------------------===//
9 //
10 // This tablegen backend is responsible for emitting a description of a target
11 // register file for a code generator.  It uses instances of the Register,
12 // RegisterAliases, and RegisterClass classes to gather this information.
13 //
14 //===----------------------------------------------------------------------===//
15
16 #include "RegisterInfoEmitter.h"
17 #include "CodeGenTarget.h"
18 #include "CodeGenRegisters.h"
19 #include "Record.h"
20 #include "Support/StringExtras.h"
21 #include "Support/STLExtras.h"
22 #include <set>
23 using namespace llvm;
24
25 // runEnums - Print out enum values for all of the registers.
26 void RegisterInfoEmitter::runEnums(std::ostream &OS) {
27   CodeGenTarget Target;
28   const std::vector<CodeGenRegister> &Registers = Target.getRegisters();
29
30   std::string Namespace = Registers[0].TheDef->getValueAsString("Namespace");
31
32   EmitSourceFileHeader("Target Register Enum Values", OS);
33   OS << "namespace llvm {\n\n";
34
35   if (!Namespace.empty())
36     OS << "namespace " << Namespace << " {\n";
37   OS << "  enum {\n    NoRegister,\n";
38
39   for (unsigned i = 0, e = Registers.size(); i != e; ++i)
40     OS << "    " << Registers[i].getName() << ", \t// " << i+1 << "\n";
41   
42   OS << "  };\n";
43   if (!Namespace.empty())
44     OS << "}\n";
45   OS << "} // End llvm namespace \n";
46 }
47
48 void RegisterInfoEmitter::runHeader(std::ostream &OS) {
49   EmitSourceFileHeader("Register Information Header Fragment", OS);
50   CodeGenTarget Target;
51   const std::string &TargetName = Target.getName();
52   std::string ClassName = TargetName + "GenRegisterInfo";
53
54   OS << "#include \"llvm/Target/MRegisterInfo.h\"\n\n";
55
56   OS << "namespace llvm {\n\n";
57
58   OS << "struct " << ClassName << " : public MRegisterInfo {\n"
59      << "  " << ClassName
60      << "(int CallFrameSetupOpcode = -1, int CallFrameDestroyOpcode = -1);\n"
61      << "  const unsigned* getCalleeSaveRegs() const;\n"
62      << "};\n\n";
63
64   std::vector<Record*> RegisterClasses =
65     Records.getAllDerivedDefinitions("RegisterClass");
66
67   OS << "namespace " << TargetName << " { // Register classes\n";
68   for (unsigned i = 0, e = RegisterClasses.size(); i != e; ++i) {
69     const std::string &Name = RegisterClasses[i]->getName();
70     if (Name.size() < 9 || Name[9] != '.')       // Ignore anonymous classes
71       OS << "  extern TargetRegisterClass *" << Name << "RegisterClass;\n";
72   }
73   OS << "} // end of namespace " << TargetName << "\n\n";
74   OS << "} // End llvm namespace \n";
75 }
76
77 // RegisterInfoEmitter::run - Main register file description emitter.
78 //
79 void RegisterInfoEmitter::run(std::ostream &OS) {
80   CodeGenTarget Target;
81   EmitSourceFileHeader("Register Information Source Fragment", OS);
82
83   OS << "namespace llvm {\n\n";
84
85   // Start out by emitting each of the register classes... to do this, we build
86   // a set of registers which belong to a register class, this is to ensure that
87   // each register is only in a single register class.
88   //
89   const std::vector<CodeGenRegisterClass> &RegisterClasses =
90     Target.getRegisterClasses();
91
92   std::set<Record*> RegistersFound;
93   std::vector<std::string> RegClassNames;
94
95   // Loop over all of the register classes... emitting each one.
96   OS << "namespace {     // Register classes...\n";
97
98   // RegClassesBelongedTo - Keep track of which register classes each reg
99   // belongs to.
100   std::multimap<Record*, const CodeGenRegisterClass*> RegClassesBelongedTo;
101
102   for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc) {
103     const CodeGenRegisterClass &RC = RegisterClasses[rc];
104
105     std::string Name = RC.getName();
106     if (Name.size() > 9 && Name[9] == '.') {
107       static unsigned AnonCounter = 0;
108       Name = "AnonRegClass_"+utostr(AnonCounter++);
109     }
110
111     RegClassNames.push_back(Name);
112
113     // Emit the register list now...
114     OS << "  // " << Name << " Register Class...\n  const unsigned " << Name
115        << "[] = {\n    ";
116     for (unsigned i = 0, e = RC.Elements.size(); i != e; ++i) {
117       Record *Reg = RC.Elements[i];
118       if (RegistersFound.count(Reg))
119         throw "Register '" + Reg->getName() +
120               "' included in multiple register classes!";
121       RegistersFound.insert(Reg);
122       OS << getQualifiedName(Reg) << ", ";
123
124       // Keep track of which regclasses this register is in.
125       RegClassesBelongedTo.insert(std::make_pair(Reg, &RC));
126     }
127     OS << "\n  };\n\n";
128
129     OS << "  struct " << Name << "Class : public TargetRegisterClass {\n"
130        << "    " << Name << "Class() : TargetRegisterClass("
131        << RC.SpillSize/8 << ", " << RC.SpillAlignment << ", " << Name << ", "
132        << Name << " + " << RC.Elements.size() << ") {}\n"
133        << RC.MethodDefinitions << "  } " << Name << "Instance;\n\n";
134   }
135
136   OS << "  const TargetRegisterClass* const RegisterClasses[] = {\n";
137   for (unsigned i = 0, e = RegClassNames.size(); i != e; ++i)
138     OS << "    &" << RegClassNames[i] << "Instance,\n";
139   OS << "  };\n";
140
141   // Emit register class aliases...
142   std::vector<Record*> RegisterAliasesRecs =
143     Records.getAllDerivedDefinitions("RegisterAliases");
144   std::map<Record*, std::set<Record*> > RegisterAliases;
145
146   for (unsigned i = 0, e = RegisterAliasesRecs.size(); i != e; ++i) {
147     Record *AS = RegisterAliasesRecs[i];
148     Record *R = AS->getValueAsDef("Reg");
149     ListInit *LI = AS->getValueAsListInit("Aliases");
150
151     // Add information that R aliases all of the elements in the list... and
152     // that everything in the list aliases R.
153     for (unsigned j = 0, e = LI->getSize(); j != e; ++j) {
154       DefInit *Reg = dynamic_cast<DefInit*>(LI->getElement(j));
155       if (!Reg) throw "ERROR: Alias list element is not a def!";
156       if (RegisterAliases[R].count(Reg->getDef()))
157         std::cerr << "Warning: register alias between " << getQualifiedName(R)
158                   << " and " << getQualifiedName(Reg->getDef())
159                   << " specified multiple times!\n";
160       RegisterAliases[R].insert(Reg->getDef());
161
162       if (RegisterAliases[Reg->getDef()].count(R))
163         std::cerr << "Warning: register alias between " << getQualifiedName(R)
164                   << " and " << getQualifiedName(Reg->getDef())
165                   << " specified multiple times!\n";
166       RegisterAliases[Reg->getDef()].insert(R);
167     }
168   }
169
170   if (!RegisterAliases.empty())
171     OS << "\n\n  // Register Alias Sets...\n";
172   
173   // Emit the empty alias list
174   OS << "  const unsigned Empty_AliasSet[] = { 0 };\n";
175   // Loop over all of the registers which have aliases, emitting the alias list
176   // to memory.
177   for (std::map<Record*, std::set<Record*> >::iterator
178          I = RegisterAliases.begin(), E = RegisterAliases.end(); I != E; ++I) {
179     OS << "  const unsigned " << I->first->getName() << "_AliasSet[] = { ";
180     for (std::set<Record*>::iterator ASI = I->second.begin(),
181            E = I->second.end(); ASI != E; ++ASI)
182       OS << getQualifiedName(*ASI) << ", ";
183     OS << "0 };\n";
184   }
185
186   OS << "\n  const MRegisterDesc RegisterDescriptors[] = { // Descriptors\n";
187   OS << "    { \"NOREG\",\t0,\t\t0,\t0 },\n";
188
189
190   // Now that register alias sets have been emitted, emit the register
191   // descriptors now.
192   const std::vector<CodeGenRegister> &Registers = Target.getRegisters();
193   for (unsigned i = 0, e = Registers.size(); i != e; ++i) {
194     const CodeGenRegister &Reg = Registers[i];
195     OS << "    { \"";
196     if (!Reg.TheDef->getValueAsString("Name").empty())
197       OS << Reg.TheDef->getValueAsString("Name");
198     else
199       OS << Reg.getName();
200     OS << "\",\t";
201     if (RegisterAliases.count(Reg.TheDef))
202       OS << Reg.getName() << "_AliasSet,\t";
203     else
204       OS << "Empty_AliasSet,\t";
205
206     // Figure out what the size and alignment of the spill slots are for this
207     // reg.  This may be explicitly declared in the register, or it may be
208     // inferred from the register classes it is part of.
209     std::multimap<Record*, const CodeGenRegisterClass*>::iterator I, E;
210     tie(I, E) = RegClassesBelongedTo.equal_range(Reg.TheDef);
211     unsigned SpillSize = Reg.DeclaredSpillSize;
212     unsigned SpillAlign = Reg.DeclaredSpillAlignment;
213     for (; I != E; ++I) {   // For each reg class this belongs to.
214       const CodeGenRegisterClass *RC = I->second;
215       if (SpillSize == 0)
216         SpillSize = RC->SpillSize;
217       else if (SpillSize != RC->SpillSize)
218         throw "Spill size for regclass '" + RC->getName() +
219               "' doesn't match spill sized already inferred for register '" +
220               Reg.getName() + "'!";
221       if (SpillAlign == 0)
222         SpillAlign = RC->SpillAlignment;
223       else if (SpillAlign != RC->SpillAlignment)
224         throw "Spill alignment for regclass '" + RC->getName() +
225               "' doesn't match spill sized already inferred for register '" +
226               Reg.getName() + "'!";
227     }
228
229     OS << SpillSize << ", " << SpillAlign << " },\n";    
230   }
231   OS << "  };\n";      // End of register descriptors...
232   OS << "}\n\n";       // End of anonymous namespace...
233
234   OS << "namespace " << Target.getName() << " { // Register classes\n";
235   for (unsigned i = 0, e = RegisterClasses.size(); i != e; ++i) {
236     const std::string &Name = RegisterClasses[i].getName();
237     if (Name.size() < 9 || Name[9] != '.')    // Ignore anonymous classes
238       OS << "  TargetRegisterClass *" << Name << "RegisterClass = &"
239          << Name << "Instance;\n";
240   }
241   OS << "} // end of namespace " << Target.getName() << "\n\n";
242
243
244
245   std::string ClassName = Target.getName() + "GenRegisterInfo";
246   
247   // Emit the constructor of the class...
248   OS << ClassName << "::" << ClassName
249      << "(int CallFrameSetupOpcode, int CallFrameDestroyOpcode)\n"
250      << "  : MRegisterInfo(RegisterDescriptors, " << Registers.size()+1
251      << ", RegisterClasses, RegisterClasses+" << RegClassNames.size() << ",\n "
252      << "                 CallFrameSetupOpcode, CallFrameDestroyOpcode) {}\n\n";
253   
254   // Emit the getCalleeSaveRegs method...
255   OS << "const unsigned* " << ClassName << "::getCalleeSaveRegs() const {\n"
256      << "  static const unsigned CalleeSaveRegs[] = {\n    ";
257
258   const std::vector<Record*> &CSR = Target.getCalleeSavedRegisters();
259   for (unsigned i = 0, e = CSR.size(); i != e; ++i)
260     OS << getQualifiedName(CSR[i]) << ", ";  
261   OS << " 0\n  };\n  return CalleeSaveRegs;\n}\n\n";
262   OS << "} // End llvm namespace \n";
263 }