diff options
author | Daniel Dunbar <daniel@zuster.org> | 2009-07-17 18:51:11 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2009-07-17 18:51:11 +0000 |
commit | 22be5225ff88ffaab83c36fa133e70586b91166d (patch) | |
tree | 53b902f74573cc4932350065ddbf67a292e2d75a | |
parent | 75402822d6acc1fe62d911771cd7cf8358c718d7 (diff) | |
download | external_llvm-22be5225ff88ffaab83c36fa133e70586b91166d.zip external_llvm-22be5225ff88ffaab83c36fa133e70586b91166d.tar.gz external_llvm-22be5225ff88ffaab83c36fa133e70586b91166d.tar.bz2 |
tblgen/AsmMatcher: Emit simple matcher for register names.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@76212 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | utils/TableGen/AsmMatcherEmitter.cpp | 33 |
1 files changed, 30 insertions, 3 deletions
diff --git a/utils/TableGen/AsmMatcherEmitter.cpp b/utils/TableGen/AsmMatcherEmitter.cpp index e0ee944..1d4ad09 100644 --- a/utils/TableGen/AsmMatcherEmitter.cpp +++ b/utils/TableGen/AsmMatcherEmitter.cpp @@ -17,8 +17,35 @@ #include "Record.h" using namespace llvm; -void AsmMatcherEmitter::run(raw_ostream &O) { - EmitSourceFileHeader("Assembly Matcher Source Fragment", O); - +void AsmMatcherEmitter::run(raw_ostream &OS) { CodeGenTarget Target; + const std::vector<CodeGenRegister> &Registers = Target.getRegisters(); + + std::string Namespace = Registers[0].TheDef->getValueAsString("Namespace"); + + EmitSourceFileHeader("Assembly Matcher Source Fragment", OS); + OS << "namespace llvm {\n\n"; + + // Emit the function to match a register name to number. + + if (!Namespace.empty()) + OS << "namespace " << Namespace << " {\n"; + OS << "bool MatchRegisterName(const std::string &Name, unsigned &RegNo) {\n"; + + // FIXME: TableGen should have a fast string matcher generator. + for (unsigned i = 0, e = Registers.size(); i != e; ++i) { + const CodeGenRegister &Reg = Registers[i]; + if (Reg.TheDef->getValueAsString("AsmName").empty()) + continue; + + OS << " if (Name == \"" + << Reg.TheDef->getValueAsString("AsmName") << "\")\n" + << " return RegNo=" << i + 1 << ", false;\n"; + } + OS << " return true;\n"; + OS << "}\n"; + + if (!Namespace.empty()) + OS << "}\n"; + OS << "} // End llvm namespace \n"; } |