+
+ // Emit information about the callee saved register classes.
+ OS << "const TargetRegisterClass* const*\n" << ClassName
+ << "::getCalleeSaveRegClasses() const {\n"
+ << " static const TargetRegisterClass * const "
+ << "CalleeSaveRegClasses[] = {\n ";
+
+ for (unsigned i = 0, e = CSR.size(); i != e; ++i) {
+ Record *R = CSR[i];
+ std::multimap<Record*, const CodeGenRegisterClass*>::iterator I, E;
+ tie(I, E) = RegClassesBelongedTo.equal_range(R);
+ if (I == E)
+ throw "Callee saved register '" + R->getName() +
+ "' must belong to a register class for spilling.\n";
+ const CodeGenRegisterClass *RC = (I++)->second;
+ for (; I != E; ++I)
+ if (RC->SpillSize < I->second->SpillSize)
+ RC = I->second;
+ OS << "&" << getQualifiedName(RC->TheDef) << "RegClass, ";
+ }
+ OS << " 0\n };\n return CalleeSaveRegClasses;\n}\n\n";
+
+ // Emit information about the dwarf register numbers.
+ OS << "int " << ClassName << "::getDwarfRegNum(unsigned RegNum) const {\n";
+ OS << " static const int DwarfRegNums[] = { -1, // NoRegister";
+ for (unsigned i = 0, e = Registers.size(); i != e; ++i) {
+ if (!(i % 16)) OS << "\n ";
+ const CodeGenRegister &Reg = Registers[i];
+ int DwarfRegNum = Reg.TheDef->getValueAsInt("DwarfNumber");
+ OS << DwarfRegNum;
+ if ((i + 1) != e) OS << ", ";
+ }
+ OS << "\n };\n";
+ OS << " assert(RegNum < (sizeof(DwarfRegNums)/sizeof(int)) &&\n";
+ OS << " \"RegNum exceeds number of registers\");\n";
+ OS << " return DwarfRegNums[RegNum];\n";
+ OS << "}\n\n";
+
+ OS << "} // End llvm namespace \n";