diff options
author | Chris Lattner <sabre@nondot.org> | 2003-08-06 06:16:35 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2003-08-06 06:16:35 +0000 |
commit | 2787d1a34bdec7267d521f34359e0eaf3d08949b (patch) | |
tree | aceb6aaa7f2fb09df43bc9222d81954ae90ac7af /utils/TableGen/InstrSelectorEmitter.cpp | |
parent | faca5ab1895da74d451d7187dc3f0d4191efeee1 (diff) | |
download | llvm-2787d1a34bdec7267d521f34359e0eaf3d08949b.tar.gz llvm-2787d1a34bdec7267d521f34359e0eaf3d08949b.tar.bz2 llvm-2787d1a34bdec7267d521f34359e0eaf3d08949b.tar.xz |
Add error checking code to the node type parser. Start the instruction pattern
reader
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7632 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils/TableGen/InstrSelectorEmitter.cpp')
-rw-r--r-- | utils/TableGen/InstrSelectorEmitter.cpp | 32 |
1 files changed, 29 insertions, 3 deletions
diff --git a/utils/TableGen/InstrSelectorEmitter.cpp b/utils/TableGen/InstrSelectorEmitter.cpp index 98bd994307..522cd11aaf 100644 --- a/utils/TableGen/InstrSelectorEmitter.cpp +++ b/utils/TableGen/InstrSelectorEmitter.cpp @@ -24,7 +24,6 @@ NodeType::ArgResultTypes NodeType::Translate(Record *R) { /// void InstrSelectorEmitter::ProcessNodeTypes() { std::vector<Record*> Nodes = Records.getAllDerivedDefinitions("DagNode"); - for (unsigned i = 0, e = Nodes.size(); i != e; ++i) { Record *Node = Nodes[i]; @@ -36,21 +35,48 @@ void InstrSelectorEmitter::ProcessNodeTypes() { ListInit *Args = Node->getValueAsListInit("ArgTypes"); std::vector<NodeType::ArgResultTypes> ArgTypes; - for (unsigned a = 0, e = Args->getSize(); a != e; ++a) + for (unsigned a = 0, e = Args->getSize(); a != e; ++a) { if (DefInit *DI = dynamic_cast<DefInit*>(Args->getElement(a))) ArgTypes.push_back(NodeType::Translate(DI->getDef())); else throw "In node " + Node->getName() + ", argument is not a Def!"; + if (a == 0 && ArgTypes.back() == NodeType::Arg0) + throw "In node " + Node->getName() + ", arg 0 cannot have type 'arg0'!"; + if (ArgTypes.back() == NodeType::Void) + throw "In node " + Node->getName() + ", args cannot be void type!"; + } + if (RetTy == NodeType::Arg0 && Args->getSize() == 0) + throw "In node " + Node->getName() + + ", invalid return type for nullary node!"; + // Add the node type mapping now... NodeTypes[Node] = NodeType(RetTy, ArgTypes); } } +/// ProcessInstructionPatterns - Read in all subclasses of Instruction, and +/// process those with a useful Pattern field. +/// +void InstrSelectorEmitter::ProcessInstructionPatterns() { + std::vector<Record*> Insts = Records.getAllDerivedDefinitions("Instruction"); + for (unsigned i = 0, e = Insts.size(); i != e; ++i) { + Record *Inst = Insts[i]; + if (DagInit *PatternInit = + dynamic_cast<DagInit*>(Inst->getValueInit("Pattern"))) { + + } + } +} + + void InstrSelectorEmitter::run(std::ostream &OS) { // Type-check all of the node types to ensure we "understand" them. ProcessNodeTypes(); - + // Read all of the instruction patterns in... + ProcessInstructionPatterns(); + + // Read all of the Expander patterns in... } |