|
@@ -848,6 +848,8 @@ RegisterInfoEmitter::runMCDesc(raw_ostream &OS, CodeGenTarget &Target,
|
|
// Loop over all of the register classes... emitting each one.
|
|
// Loop over all of the register classes... emitting each one.
|
|
OS << "namespace { // Register classes...\n";
|
|
OS << "namespace { // Register classes...\n";
|
|
|
|
|
|
|
|
+ SequenceToOffsetTable<std::string> RegClassStrings;
|
|
|
|
+
|
|
// Emit the register enum value arrays for each RegisterClass
|
|
// Emit the register enum value arrays for each RegisterClass
|
|
for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc) {
|
|
for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc) {
|
|
const CodeGenRegisterClass &RC = *RegisterClasses[rc];
|
|
const CodeGenRegisterClass &RC = *RegisterClasses[rc];
|
|
@@ -856,6 +858,8 @@ RegisterInfoEmitter::runMCDesc(raw_ostream &OS, CodeGenTarget &Target,
|
|
// Give the register class a legal C name if it's anonymous.
|
|
// Give the register class a legal C name if it's anonymous.
|
|
std::string Name = RC.getName();
|
|
std::string Name = RC.getName();
|
|
|
|
|
|
|
|
+ RegClassStrings.add(Name);
|
|
|
|
+
|
|
// Emit the register list now.
|
|
// Emit the register list now.
|
|
OS << " // " << Name << " Register Class...\n"
|
|
OS << " // " << Name << " Register Class...\n"
|
|
<< " const MCPhysReg " << Name
|
|
<< " const MCPhysReg " << Name
|
|
@@ -880,6 +884,11 @@ RegisterInfoEmitter::runMCDesc(raw_ostream &OS, CodeGenTarget &Target,
|
|
}
|
|
}
|
|
OS << "}\n\n";
|
|
OS << "}\n\n";
|
|
|
|
|
|
|
|
+ RegClassStrings.layout();
|
|
|
|
+ OS << "extern const char " << TargetName << "RegClassStrings[] = {\n";
|
|
|
|
+ RegClassStrings.emit(OS, printChar);
|
|
|
|
+ OS << "};\n\n";
|
|
|
|
+
|
|
OS << "extern const MCRegisterClass " << TargetName
|
|
OS << "extern const MCRegisterClass " << TargetName
|
|
<< "MCRegisterClasses[] = {\n";
|
|
<< "MCRegisterClasses[] = {\n";
|
|
|
|
|
|
@@ -892,8 +901,8 @@ RegisterInfoEmitter::runMCDesc(raw_ostream &OS, CodeGenTarget &Target,
|
|
assert((RC.SpillAlignment/8) <= 0xffff && "SpillAlignment too large.");
|
|
assert((RC.SpillAlignment/8) <= 0xffff && "SpillAlignment too large.");
|
|
assert(RC.CopyCost >= -128 && RC.CopyCost <= 127 && "Copy cost too large.");
|
|
assert(RC.CopyCost >= -128 && RC.CopyCost <= 127 && "Copy cost too large.");
|
|
|
|
|
|
- OS << " { " << '\"' << RC.getName() << "\", "
|
|
|
|
- << RC.getName() << ", " << RC.getName() << "Bits, "
|
|
|
|
|
|
+ OS << " { " << RC.getName() << ", " << RC.getName() << "Bits, "
|
|
|
|
+ << RegClassStrings.get(RC.getName()) << ", "
|
|
<< RC.getOrder().size() << ", sizeof(" << RC.getName() << "Bits), "
|
|
<< RC.getOrder().size() << ", sizeof(" << RC.getName() << "Bits), "
|
|
<< RC.getQualifiedName() + "RegClassID" << ", "
|
|
<< RC.getQualifiedName() + "RegClassID" << ", "
|
|
<< RC.SpillSize/8 << ", "
|
|
<< RC.SpillSize/8 << ", "
|
|
@@ -934,6 +943,7 @@ RegisterInfoEmitter::runMCDesc(raw_ostream &OS, CodeGenTarget &Target,
|
|
<< RegBank.getNumNativeRegUnits() << ", "
|
|
<< RegBank.getNumNativeRegUnits() << ", "
|
|
<< TargetName << "RegDiffLists, "
|
|
<< TargetName << "RegDiffLists, "
|
|
<< TargetName << "RegStrings, "
|
|
<< TargetName << "RegStrings, "
|
|
|
|
+ << TargetName << "RegClassStrings, "
|
|
<< TargetName << "SubRegIdxLists, "
|
|
<< TargetName << "SubRegIdxLists, "
|
|
<< (SubRegIndices.size() + 1) << ",\n"
|
|
<< (SubRegIndices.size() + 1) << ",\n"
|
|
<< TargetName << "SubRegIdxRanges, "
|
|
<< TargetName << "SubRegIdxRanges, "
|
|
@@ -1267,6 +1277,7 @@ RegisterInfoEmitter::runTargetDesc(raw_ostream &OS, CodeGenTarget &Target,
|
|
OS << "extern const MCRegisterDesc " << TargetName << "RegDesc[];\n";
|
|
OS << "extern const MCRegisterDesc " << TargetName << "RegDesc[];\n";
|
|
OS << "extern const MCPhysReg " << TargetName << "RegDiffLists[];\n";
|
|
OS << "extern const MCPhysReg " << TargetName << "RegDiffLists[];\n";
|
|
OS << "extern const char " << TargetName << "RegStrings[];\n";
|
|
OS << "extern const char " << TargetName << "RegStrings[];\n";
|
|
|
|
+ OS << "extern const char " << TargetName << "RegClassStrings[];\n";
|
|
OS << "extern const MCPhysReg " << TargetName << "RegUnitRoots[][2];\n";
|
|
OS << "extern const MCPhysReg " << TargetName << "RegUnitRoots[][2];\n";
|
|
OS << "extern const uint16_t " << TargetName << "SubRegIdxLists[];\n";
|
|
OS << "extern const uint16_t " << TargetName << "SubRegIdxLists[];\n";
|
|
OS << "extern const MCRegisterInfo::SubRegCoveredBits "
|
|
OS << "extern const MCRegisterInfo::SubRegCoveredBits "
|
|
@@ -1289,6 +1300,7 @@ RegisterInfoEmitter::runTargetDesc(raw_ostream &OS, CodeGenTarget &Target,
|
|
<< " " << RegBank.getNumNativeRegUnits() << ",\n"
|
|
<< " " << RegBank.getNumNativeRegUnits() << ",\n"
|
|
<< " " << TargetName << "RegDiffLists,\n"
|
|
<< " " << TargetName << "RegDiffLists,\n"
|
|
<< " " << TargetName << "RegStrings,\n"
|
|
<< " " << TargetName << "RegStrings,\n"
|
|
|
|
+ << " " << TargetName << "RegClassStrings,\n"
|
|
<< " " << TargetName << "SubRegIdxLists,\n"
|
|
<< " " << TargetName << "SubRegIdxLists,\n"
|
|
<< " " << SubRegIndices.size() + 1 << ",\n"
|
|
<< " " << SubRegIndices.size() + 1 << ",\n"
|
|
<< " " << TargetName << "SubRegIdxRanges,\n"
|
|
<< " " << TargetName << "SubRegIdxRanges,\n"
|