summaryrefslogtreecommitdiff
path: root/support
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2003-08-03 18:17:54 +0000
committerChris Lattner <sabre@nondot.org>2003-08-03 18:17:54 +0000
commit13c5b4cdc8b601bdb464bf31f316233fd02e1d49 (patch)
tree6375fc4b74ec22ef96413d18da14c21766ed3263 /support
parent7cf0ce4b8d122575c3348b5fa4947014c3d8432d (diff)
downloadllvm-13c5b4cdc8b601bdb464bf31f316233fd02e1d49.tar.gz
llvm-13c5b4cdc8b601bdb464bf31f316233fd02e1d49.tar.bz2
llvm-13c5b4cdc8b601bdb464bf31f316233fd02e1d49.tar.xz
* Changes to allow lists of any type
* Reorganize Target class a bit * Fix string out of range access bug git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7520 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'support')
-rw-r--r--support/tools/TableGen/RegisterInfoEmitter.cpp57
1 files changed, 31 insertions, 26 deletions
diff --git a/support/tools/TableGen/RegisterInfoEmitter.cpp b/support/tools/TableGen/RegisterInfoEmitter.cpp
index bba9723a3e..f8a7b82258 100644
--- a/support/tools/TableGen/RegisterInfoEmitter.cpp
+++ b/support/tools/TableGen/RegisterInfoEmitter.cpp
@@ -41,20 +41,24 @@ void RegisterInfoEmitter::runEnums(std::ostream &OS) {
OS << "}\n";
}
-static Record *getRegisterInfo(RecordKeeper &RC) {
- std::vector<Record*> RegisterInfos =
- Records.getAllDerivedDefinitions("RegisterInfo");
+static Record *getTarget(RecordKeeper &RC) {
+ std::vector<Record*> Targets = RC.getAllDerivedDefinitions("Target");
- if (RegisterInfos.size() != 1)
- throw std::string("ERROR: Multiple subclasses of RegisterInfo defined!");
- return RegisterInfos[0];
+ if (Targets.size() != 1)
+ throw std::string("ERROR: Multiple subclasses of Target defined!");
+ return Targets[0];
+}
+
+static std::string getQualifiedName(Record *R) {
+ std::string Namespace = R->getValueAsString("Namespace");
+ if (Namespace.empty()) return R->getName();
+ return Namespace + "::" + R->getName();
}
void RegisterInfoEmitter::runHeader(std::ostream &OS) {
EmitSourceHeader("Register Information Header Fragment", OS);
- std::string ClassName =
- getRegisterInfo(Records)->getValueAsString("ClassName");
+ std::string ClassName = getTarget(Records)->getName() + "GenRegisterInfo";
OS << "#include \"llvm/Target/MRegisterInfo.h\"\n\n";
@@ -65,12 +69,6 @@ void RegisterInfoEmitter::runHeader(std::ostream &OS) {
<< "};\n\n";
}
-static std::string getQualifiedName(Record *R) {
- std::string Namespace = R->getValueAsString("Namespace");
- if (Namespace.empty()) return R->getName();
- return Namespace + "::" + R->getName();
-}
-
// RegisterInfoEmitter::run - Main register file description emitter.
//
void RegisterInfoEmitter::run(std::ostream &OS) {
@@ -95,7 +93,7 @@ void RegisterInfoEmitter::run(std::ostream &OS) {
for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc) {
Record *RC = RegisterClasses[rc];
std::string Name = RC->getName();
- if (Name[9] == '.') {
+ if (Name.size() > 9 && Name[9] == '.') {
static unsigned AnonCounter = 0;
Name = "AnonRegClass_"+utostr(AnonCounter++);
}
@@ -107,7 +105,9 @@ void RegisterInfoEmitter::run(std::ostream &OS) {
<< "[] = {\n ";
ListInit *RegList = RC->getValueAsListInit("MemberList");
for (unsigned i = 0, e = RegList->getSize(); i != e; ++i) {
- Record *Reg = RegList->getElement(i);
+ DefInit *RegDef = dynamic_cast<DefInit*>(RegList->getElement(i));
+ if (!RegDef) throw "Register class member is not a record!";
+ Record *Reg = RegDef->getDef();
if (!Reg->isSubClassOf(RegisterClass))
throw "Register Class member '" + Reg->getName() +
" does not derive from the Register class!";
@@ -152,17 +152,19 @@ void RegisterInfoEmitter::run(std::ostream &OS) {
// Add information that R aliases all of the elements in the list... and
// that everything in the list aliases R.
for (unsigned j = 0, e = LI->getSize(); j != e; ++j) {
- if (RegisterAliases[R].count(LI->getElement(j)))
+ DefInit *Reg = dynamic_cast<DefInit*>(LI->getElement(j));
+ if (!Reg) throw "ERROR: Alias list element is not a def!";
+ if (RegisterAliases[R].count(Reg->getDef()))
std::cerr << "Warning: register alias between " << getQualifiedName(R)
- << " and " << getQualifiedName(LI->getElement(j))
+ << " and " << getQualifiedName(Reg->getDef())
<< " specified multiple times!\n";
- RegisterAliases[R].insert(LI->getElement(j));
+ RegisterAliases[R].insert(Reg->getDef());
- if (RegisterAliases[LI->getElement(j)].count(R))
+ if (RegisterAliases[Reg->getDef()].count(R))
std::cerr << "Warning: register alias between " << getQualifiedName(R)
- << " and " << getQualifiedName(LI->getElement(j))
+ << " and " << getQualifiedName(Reg->getDef())
<< " specified multiple times!\n";
- RegisterAliases[LI->getElement(j)].insert(R);
+ RegisterAliases[Reg->getDef()].insert(R);
}
}
@@ -196,8 +198,8 @@ void RegisterInfoEmitter::run(std::ostream &OS) {
OS << " };\n"; // End of register descriptors...
OS << "}\n\n"; // End of anonymous namespace...
- Record *RegisterInfo = getRegisterInfo(Records);
- std::string ClassName = RegisterInfo->getValueAsString("ClassName");
+ Record *Target = getTarget(Records);
+ std::string ClassName = Target->getName() + "GenRegisterInfo";
// Emit the constructor of the class...
OS << ClassName << "::" << ClassName
@@ -210,8 +212,11 @@ void RegisterInfoEmitter::run(std::ostream &OS) {
OS << "const unsigned* " << ClassName << "::getCalleeSaveRegs() const {\n"
<< " static const unsigned CalleeSaveRegs[] = {\n ";
- ListInit *LI = RegisterInfo->getValueAsListInit("CalleeSavedRegisters");
+ ListInit *LI = Target->getValueAsListInit("CalleeSavedRegisters");
for (unsigned i = 0, e = LI->getSize(); i != e; ++i)
- OS << getQualifiedName(LI->getElement(i)) << ", ";
+ if (DefInit *DI = dynamic_cast<DefInit*>(LI->getElement(i)))
+ OS << getQualifiedName(DI->getDef()) << ", ";
+ else
+ throw "Expected register definition in CalleeSavedRegisters list!";
OS << " 0\n };\n return CalleeSaveRegs;\n}\n\n";
}