summaryrefslogtreecommitdiff
path: root/utils
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2003-08-06 21:47:14 +0000
committerChris Lattner <sabre@nondot.org>2003-08-06 21:47:14 +0000
commit38aa542f3679af5925315626a37e2d085954ce9f (patch)
treeb80875f33c99a1d97b8c3f59beef5b92c6f1553e /utils
parent6a8097550529944887ccb3cc50b4c3d548f978c6 (diff)
Export the register classes so that the instruction selector can get at them as needed
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7651 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils')
-rw-r--r--utils/TableGen/InstrSelectorEmitter.cpp10
-rw-r--r--utils/TableGen/RegisterInfoEmitter.cpp27
2 files changed, 30 insertions, 7 deletions
diff --git a/utils/TableGen/InstrSelectorEmitter.cpp b/utils/TableGen/InstrSelectorEmitter.cpp
index 522cd11aaff..e5bab478e90 100644
--- a/utils/TableGen/InstrSelectorEmitter.cpp
+++ b/utils/TableGen/InstrSelectorEmitter.cpp
@@ -10,11 +10,11 @@
NodeType::ArgResultTypes NodeType::Translate(Record *R) {
const std::string &Name = R->getName();
- if (Name == "DNRT_void") return Void;
- if (Name == "DNRT_val" || Name == "DNAT_val") return Val;
- if (Name == "DNRT_arg0" || Name == "DNAT_arg0") return Arg0;
- if (Name == "DNAT_ptr") return Ptr;
- throw "Unknown DagNodeResult Type '" + Name + "'!";
+ if (Name == "DNVT_void") return Void;
+ if (Name == "DNVT_val" ) return Val;
+ if (Name == "DNVT_arg0") return Arg0;
+ if (Name == "DNVT_ptr" ) return Ptr;
+ throw "Unknown DagNodeValType '" + Name + "'!";
}
diff --git a/utils/TableGen/RegisterInfoEmitter.cpp b/utils/TableGen/RegisterInfoEmitter.cpp
index a4ad8d5a734..396f3409498 100644
--- a/utils/TableGen/RegisterInfoEmitter.cpp
+++ b/utils/TableGen/RegisterInfoEmitter.cpp
@@ -36,8 +36,8 @@ void RegisterInfoEmitter::runEnums(std::ostream &OS) {
void RegisterInfoEmitter::runHeader(std::ostream &OS) {
EmitSourceFileHeader("Register Information Header Fragment", OS);
-
- std::string ClassName = getTarget(Records)->getName() + "GenRegisterInfo";
+ const std::string &TargetName = getTarget(Records)->getName();
+ std::string ClassName = TargetName + "GenRegisterInfo";
OS << "#include \"llvm/Target/MRegisterInfo.h\"\n\n";
@@ -46,6 +46,17 @@ void RegisterInfoEmitter::runHeader(std::ostream &OS) {
<< "(int CallFrameSetupOpcode = -1, int CallFrameDestroyOpcode = -1);\n"
<< " const unsigned* getCalleeSaveRegs() const;\n"
<< "};\n\n";
+
+ std::vector<Record*> RegisterClasses =
+ Records.getAllDerivedDefinitions("RegisterClass");
+
+ OS << "namespace " << TargetName << " { // Register classes\n";
+ for (unsigned i = 0, e = RegisterClasses.size(); i != e; ++i) {
+ const std::string &Name = RegisterClasses[i]->getName();
+ if (Name.size() < 9 || Name[9] != '.') // Ignore anonymous classes
+ OS << " extern TargetRegisterClass *" << Name << "RegisterClass;\n";
+ }
+ OS << "} // end of namespace " << TargetName << "\n\n";
}
// RegisterInfoEmitter::run - Main register file description emitter.
@@ -183,6 +194,18 @@ void RegisterInfoEmitter::run(std::ostream &OS) {
OS << "}\n\n"; // End of anonymous namespace...
Record *Target = getTarget(Records);
+
+ OS << "namespace " << Target->getName() << " { // Register classes\n";
+ for (unsigned i = 0, e = RegisterClasses.size(); i != e; ++i) {
+ const std::string &Name = RegisterClasses[i]->getName();
+ if (Name.size() < 9 || Name[9] != '.') // Ignore anonymous classes
+ OS << " TargetRegisterClass *" << Name << "RegisterClass = &"
+ << Name << "Instance;\n";
+ }
+ OS << "} // end of namespace " << Target->getName() << "\n\n";
+
+
+
std::string ClassName = Target->getName() + "GenRegisterInfo";
// Emit the constructor of the class...