diff options
author | Chris Lattner <sabre@nondot.org> | 2004-08-01 07:42:39 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2004-08-01 07:42:39 +0000 |
commit | 87c5905e0b6f551e21c9a96f1b6418920d908210 (patch) | |
tree | 0fb421aeb2b4b36d9de64878b7787154a022917e /utils | |
parent | 3fa861ac6c0be7066e5287092035dbf73a1ae21f (diff) | |
download | llvm-87c5905e0b6f551e21c9a96f1b6418920d908210.tar.gz llvm-87c5905e0b6f551e21c9a96f1b6418920d908210.tar.bz2 llvm-87c5905e0b6f551e21c9a96f1b6418920d908210.tar.xz |
Parse the operand list of the instruction. We currently support register and immediate operands.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@15390 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils')
-rw-r--r-- | utils/TableGen/CodeGenInstruction.h | 19 | ||||
-rw-r--r-- | utils/TableGen/CodeGenTarget.cpp | 41 | ||||
-rw-r--r-- | utils/TableGen/CodeGenTarget.h | 1 |
3 files changed, 54 insertions, 7 deletions
diff --git a/utils/TableGen/CodeGenInstruction.h b/utils/TableGen/CodeGenInstruction.h index 88f2c17d9d..5269cc76e2 100644 --- a/utils/TableGen/CodeGenInstruction.h +++ b/utils/TableGen/CodeGenInstruction.h @@ -14,6 +14,7 @@ #ifndef CODEGEN_INSTRUCTION_H #define CODEGEN_INSTRUCTION_H +#include "llvm/CodeGen/ValueTypes.h" #include <string> #include <vector> #include <utility> @@ -29,10 +30,21 @@ namespace llvm { /// AsmString - The format string used to emit a .s file for the /// instruction. std::string AsmString; + + /// OperandInfo - For each operand declared in the OperandList of the + /// instruction, keep track of its record (which specifies the class of the + /// operand), its type, and the name given to the operand, if any. + struct OperandInfo { + Record *Rec; + MVT::ValueType Ty; + std::string Name; + OperandInfo(Record *R, MVT::ValueType T, const std::string &N) + : Rec(R), Ty(T), Name(N) {} + }; /// OperandList - The list of declared operands, along with their declared /// type (which is a record). - std::vector<std::pair<Record*, std::string> > OperandList; + std::vector<OperandInfo> OperandList; // Various boolean values we track for the instruction. bool isReturn; @@ -43,6 +55,11 @@ namespace llvm { bool isTerminator; CodeGenInstruction(Record *R); + + /// getOperandNamed - Return the index of the operand with the specified + /// non-empty name. If the instruction does not have an operand with the + /// specified name, throw an exception. + unsigned getOperandNamed(const std::string &Name) const; }; } diff --git a/utils/TableGen/CodeGenTarget.cpp b/utils/TableGen/CodeGenTarget.cpp index 422e8d0b4f..eef6afe7b0 100644 --- a/utils/TableGen/CodeGenTarget.cpp +++ b/utils/TableGen/CodeGenTarget.cpp @@ -129,16 +129,47 @@ CodeGenInstruction::CodeGenInstruction(Record *R) : TheDef(R) { isTwoAddress = R->getValueAsBit("isTwoAddress"); isTerminator = R->getValueAsBit("isTerminator"); - - //TODO: Parse OperandList try { DagInit *DI = R->getValueAsDag("OperandList"); - // Cannot handle instructions with operands yet. - if (DI->getNumArgs()) - AsmString.clear(); + for (unsigned i = 0, e = DI->getNumArgs(); i != e; ++i) + if (DefInit *Arg = dynamic_cast<DefInit*>(DI->getArg(i))) { + Record *Rec = Arg->getDef(); + MVT::ValueType Ty; + if (Rec->isSubClassOf("RegisterClass")) + Ty = getValueType(Rec->getValueAsDef("RegType")); + else if (Rec->getName() == "i8imm") + Ty = MVT::i8; + else if (Rec->getName() == "i16imm") + Ty = MVT::i16; + else if (Rec->getName() == "i32imm") + Ty = MVT::i32; + else if (Rec->getName() == "i64imm") + Ty = MVT::i64; + else + throw "Unknown operand class '" + Rec->getName() + + "' in instruction '" + R->getName() + "' instruction!"; + + OperandList.push_back(OperandInfo(Rec, Ty, DI->getArgName(i))); + } else { + throw "Illegal operand for the '" + R->getName() + "' instruction!"; + } } catch (...) { + // Error parsing operands list, just ignore it. + AsmString.clear(); + OperandList.clear(); } } + +/// getOperandNamed - Return the index of the operand with the specified +/// non-empty name. If the instruction does not have an operand with the +/// specified name, throw an exception. +unsigned CodeGenInstruction::getOperandNamed(const std::string &Name) const { + assert(!Name.empty() && "Cannot search for operand with no name!"); + for (unsigned i = 0, e = OperandList.size(); i != e; ++i) + if (OperandList[i].Name == Name) return i; + throw "Instruction '" + TheDef->getName() + + "' does not have an operand named '$" + Name + "'!"; +} diff --git a/utils/TableGen/CodeGenTarget.h b/utils/TableGen/CodeGenTarget.h index c3bd1e1153..e711b8190c 100644 --- a/utils/TableGen/CodeGenTarget.h +++ b/utils/TableGen/CodeGenTarget.h @@ -18,7 +18,6 @@ #define CODEGEN_TARGET_H #include "CodeGenInstruction.h" -#include "llvm/CodeGen/ValueTypes.h" #include <iosfwd> #include <map> |