diff options
Diffstat (limited to 'support/tools/TableGen/InstrSelectorEmitter.cpp')
-rw-r--r-- | support/tools/TableGen/InstrSelectorEmitter.cpp | 32 |
1 files changed, 29 insertions, 3 deletions
diff --git a/support/tools/TableGen/InstrSelectorEmitter.cpp b/support/tools/TableGen/InstrSelectorEmitter.cpp index 98bd994307..522cd11aaf 100644 --- a/support/tools/TableGen/InstrSelectorEmitter.cpp +++ b/support/tools/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... } |