emit the register table as a massive string to avoid relocations.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@81741 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2009-09-14 01:26:18 +00:00
parent 44da5fbf97
commit f6761be50d

View File

@ -767,6 +767,7 @@ void AsmWriterEmitter::EmitGetRegisterName(raw_ostream &O) {
std::string ClassName = AsmWriter->getValueAsString("AsmWriterClassName"); std::string ClassName = AsmWriter->getValueAsString("AsmWriterClassName");
const std::vector<CodeGenRegister> &Registers = Target.getRegisters(); const std::vector<CodeGenRegister> &Registers = Target.getRegisters();
StringToOffsetTable StringTable;
O << O <<
"\n\n/// getRegisterName - This method is automatically generated by tblgen\n" "\n\n/// getRegisterName - This method is automatically generated by tblgen\n"
"/// from the register set description. This returns the assembler name\n" "/// from the register set description. This returns the assembler name\n"
@ -776,19 +777,29 @@ void AsmWriterEmitter::EmitGetRegisterName(raw_ostream &O) {
<< " assert(RegNo && RegNo < " << (Registers.size()+1) << " assert(RegNo && RegNo < " << (Registers.size()+1)
<< " && \"Invalid register number!\");\n" << " && \"Invalid register number!\");\n"
<< "\n" << "\n"
<< " static const char *const RegAsmNames[] = {\n"; << " static const unsigned RegAsmOffset[] = {\n ";
for (unsigned i = 0, e = Registers.size(); i != e; ++i) { for (unsigned i = 0, e = Registers.size(); i != e; ++i) {
const CodeGenRegister &Reg = Registers[i]; const CodeGenRegister &Reg = Registers[i];
std::string AsmName = Reg.TheDef->getValueAsString("AsmName"); std::string AsmName = Reg.TheDef->getValueAsString("AsmName");
if (AsmName.empty()) if (AsmName.empty())
AsmName = Reg.getName(); AsmName = Reg.getName();
O << " \"" << AsmName << "\",\n";
if ((i % 16) == 0)
O << "\n ";
O << StringTable.GetOrAddStringOffset(AsmName) << ", ";
} }
O << " 0\n" O << "0\n"
<< " };\n" << " };\n"
<< "\n" << "\n";
<< " return RegAsmNames[RegNo-1];\n"
O << " const char *AsmStrs =\n";
StringTable.EmitString(O);
O << ";\n";
O << " return AsmStrs+RegAsmOffset[RegNo-1];\n"
<< "}\n"; << "}\n";
} }