summaryrefslogtreecommitdiff
path: root/llvm/utils/TableGen/RegisterInfoEmitter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/utils/TableGen/RegisterInfoEmitter.cpp')
-rw-r--r--llvm/utils/TableGen/RegisterInfoEmitter.cpp86
1 files changed, 55 insertions, 31 deletions
diff --git a/llvm/utils/TableGen/RegisterInfoEmitter.cpp b/llvm/utils/TableGen/RegisterInfoEmitter.cpp
index eac908d9bc2b..ef7b13e8940f 100644
--- a/llvm/utils/TableGen/RegisterInfoEmitter.cpp
+++ b/llvm/utils/TableGen/RegisterInfoEmitter.cpp
@@ -68,19 +68,22 @@ public:
}
// runEnums - Print out enum values for all of the registers.
- void runEnums(raw_ostream &OS);
+ void runEnums(raw_ostream &OS, raw_ostream &MainOS, StringRef FilenamePrefix);
// runMCDesc - Print out MC register descriptions.
- void runMCDesc(raw_ostream &OS);
+ void runMCDesc(raw_ostream &OS, raw_ostream &MainOS,
+ StringRef FilenamePrefix);
// runTargetHeader - Emit a header fragment for the register info emitter.
- void runTargetHeader(raw_ostream &OS);
+ void runTargetHeader(raw_ostream &OS, raw_ostream &MainOS,
+ StringRef FilenamePrefix);
// runTargetDesc - Output the target register and register file descriptions.
- void runTargetDesc(raw_ostream &OS);
+ void runTargetDesc(raw_ostream &OS, raw_ostream &MainOS,
+ StringRef FilenamePrefix);
// run - Output the register file description.
- void run(raw_ostream &OS);
+ TableGenOutputFiles run(StringRef FilenamePrefix);
void debugDump(raw_ostream &OS);
@@ -97,8 +100,19 @@ private:
} // end anonymous namespace
+static void emitInclude(StringRef FilenamePrefix, StringRef IncludeFile,
+ StringRef GuardMacro, raw_ostream &OS) {
+ OS << "#ifdef " << GuardMacro << '\n';
+ OS << "#undef " << GuardMacro << '\n';
+ OS << "#include \"" << FilenamePrefix << IncludeFile << "\"\n";
+ OS << "#endif\n\n";
+}
+
// runEnums - Print out enum values for all of the registers.
-void RegisterInfoEmitter::runEnums(raw_ostream &OS) {
+void RegisterInfoEmitter::runEnums(raw_ostream &OS, raw_ostream &MainOS,
+ StringRef FilenamePrefix) {
+ emitInclude(FilenamePrefix, "Enums.inc", "GET_REGINFO_ENUM", MainOS);
+
const auto &Registers = RegBank.getRegisters();
// Register enums are stored as uint16_t in the tables. Make sure we'll fit.
@@ -108,9 +122,6 @@ void RegisterInfoEmitter::runEnums(raw_ostream &OS) {
emitSourceFileHeader("Target Register Enum Values", OS);
- OS << "\n#ifdef GET_REGINFO_ENUM\n";
- OS << "#undef GET_REGINFO_ENUM\n\n";
-
OS << "namespace llvm {\n\n";
OS << "class MCRegisterClass;\n"
@@ -194,7 +205,6 @@ void RegisterInfoEmitter::runEnums(raw_ostream &OS) {
OS << '\n';
OS << "} // end namespace llvm\n\n";
- OS << "#endif // GET_REGINFO_ENUM\n\n";
}
static void printInt(raw_ostream &OS, int Val) { OS << Val; }
@@ -902,11 +912,11 @@ void RegisterInfoEmitter::emitComposeSubRegIndexLaneMask(raw_ostream &OS,
//
// runMCDesc - Print out MC register descriptions.
//
-void RegisterInfoEmitter::runMCDesc(raw_ostream &OS) {
- emitSourceFileHeader("MC Register Information", OS);
+void RegisterInfoEmitter::runMCDesc(raw_ostream &OS, raw_ostream &MainOS,
+ StringRef FilenamePrefix) {
+ emitInclude(FilenamePrefix, "MCDesc.inc", "GET_REGINFO_MC_DESC", MainOS);
- OS << "\n#ifdef GET_REGINFO_MC_DESC\n";
- OS << "#undef GET_REGINFO_MC_DESC\n\n";
+ emitSourceFileHeader("MC Register Information", OS);
const auto &Regs = RegBank.getRegisters();
@@ -1131,14 +1141,13 @@ void RegisterInfoEmitter::runMCDesc(raw_ostream &OS) {
OS << "}\n\n";
OS << "} // end namespace llvm\n\n";
- OS << "#endif // GET_REGINFO_MC_DESC\n\n";
}
-void RegisterInfoEmitter::runTargetHeader(raw_ostream &OS) {
- emitSourceFileHeader("Register Information Header Fragment", OS);
+void RegisterInfoEmitter::runTargetHeader(raw_ostream &OS, raw_ostream &MainOS,
+ StringRef FilenamePrefix) {
+ emitInclude(FilenamePrefix, "Header.inc", "GET_REGINFO_HEADER", MainOS);
- OS << "\n#ifdef GET_REGINFO_HEADER\n";
- OS << "#undef GET_REGINFO_HEADER\n\n";
+ emitSourceFileHeader("Register Information Header Fragment", OS);
const std::string &TargetName = Target.getName().str();
std::string ClassName = TargetName + "GenRegisterInfo";
@@ -1215,17 +1224,17 @@ void RegisterInfoEmitter::runTargetHeader(raw_ostream &OS) {
OS << "} // end namespace " << RegisterClasses.front().Namespace << "\n\n";
}
OS << "} // end namespace llvm\n\n";
- OS << "#endif // GET_REGINFO_HEADER\n\n";
}
//
// runTargetDesc - Output the target register and register file descriptions.
//
-void RegisterInfoEmitter::runTargetDesc(raw_ostream &OS) {
- emitSourceFileHeader("Target Register and Register Classes Information", OS);
+void RegisterInfoEmitter::runTargetDesc(raw_ostream &OS, raw_ostream &MainOS,
+ StringRef FilenamePrefix) {
+ emitInclude(FilenamePrefix, "TargetDesc.inc", "GET_REGINFO_TARGET_DESC",
+ MainOS);
- OS << "\n#ifdef GET_REGINFO_TARGET_DESC\n";
- OS << "#undef GET_REGINFO_TARGET_DESC\n\n";
+ emitSourceFileHeader("Target Register and Register Classes Information", OS);
OS << "namespace llvm {\n\n";
@@ -1840,25 +1849,40 @@ void RegisterInfoEmitter::runTargetDesc(raw_ostream &OS) {
<< "}\n\n";
OS << "} // end namespace llvm\n\n";
- OS << "#endif // GET_REGINFO_TARGET_DESC\n\n";
}
-void RegisterInfoEmitter::run(raw_ostream &OS) {
+TableGenOutputFiles RegisterInfoEmitter::run(StringRef FilenamePrefix) {
TGTimer &Timer = Records.getTimer();
Timer.startTimer("Print enums");
- runEnums(OS);
+ std::string Main;
+ raw_string_ostream MainOS(Main);
+ std::string Enums;
+ raw_string_ostream EnumsOS(Enums);
+ runEnums(EnumsOS, MainOS, FilenamePrefix);
Timer.startTimer("Print MC registers");
- runMCDesc(OS);
+ std::string MCDesc;
+ raw_string_ostream MCDescOS(MCDesc);
+ runMCDesc(MCDescOS, MainOS, FilenamePrefix);
Timer.startTimer("Print header fragment");
- runTargetHeader(OS);
+ std::string Header;
+ raw_string_ostream HeaderOS(Header);
+ runTargetHeader(HeaderOS, MainOS, FilenamePrefix);
Timer.startTimer("Print target registers");
- runTargetDesc(OS);
+ std::string TargetDesc;
+ raw_string_ostream TargetDescOS(TargetDesc);
+ runTargetDesc(TargetDescOS, MainOS, FilenamePrefix);
if (RegisterInfoDebug)
debugDump(errs());
+
+ return {Main,
+ {{"Enums.inc", Enums},
+ {"MCDesc.inc", MCDesc},
+ {"Header.inc", Header},
+ {"TargetDesc.inc", TargetDesc}}};
}
void RegisterInfoEmitter::debugDump(raw_ostream &OS) {
@@ -1935,5 +1959,5 @@ void RegisterInfoEmitter::debugDump(raw_ostream &OS) {
}
}
-static TableGen::Emitter::OptClass<RegisterInfoEmitter>
+static TableGen::Emitter::MultiFileOptClass<RegisterInfoEmitter>
X("gen-register-info", "Generate registers and register classes info");