diff --git a/support/tools/TableGen/InstrSelectorEmitter.cpp b/support/tools/TableGen/InstrSelectorEmitter.cpp index 98bd9943074..522cd11aaff 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 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 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(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 Insts = Records.getAllDerivedDefinitions("Instruction"); + for (unsigned i = 0, e = Insts.size(); i != e; ++i) { + Record *Inst = Insts[i]; + if (DagInit *PatternInit = + dynamic_cast(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... } diff --git a/support/tools/TableGen/InstrSelectorEmitter.h b/support/tools/TableGen/InstrSelectorEmitter.h index 5033a417d63..941763eb03c 100644 --- a/support/tools/TableGen/InstrSelectorEmitter.h +++ b/support/tools/TableGen/InstrSelectorEmitter.h @@ -17,12 +17,10 @@ struct NodeType { // Both argument and return types... Val, // A non-void type Arg0, // Value matches the type of Arg0 + Ptr, // Tree node is the type of the target pointer // Return types Void, // Tree node always returns void - - // Argument types - Ptr, // Tree node is the target argument type }; ArgResultTypes ResultType; @@ -36,7 +34,6 @@ struct NodeType { NodeType(const NodeType &N) : ResultType(N.ResultType), ArgTypes(N.ArgTypes){} static ArgResultTypes Translate(Record *R); - }; class InstrSelectorEmitter : public TableGenBackend { @@ -54,6 +51,10 @@ private: // RecordKeeper, turning them into the more accessible NodeTypes data // structure. void ProcessNodeTypes(); + + // ProcessInstructionPatterns - Read in all subclasses of Instruction, and + // process those with a useful Pattern field. + void ProcessInstructionPatterns(); }; #endif diff --git a/utils/TableGen/InstrSelectorEmitter.cpp b/utils/TableGen/InstrSelectorEmitter.cpp index 98bd9943074..522cd11aaff 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 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 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(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 Insts = Records.getAllDerivedDefinitions("Instruction"); + for (unsigned i = 0, e = Insts.size(); i != e; ++i) { + Record *Inst = Insts[i]; + if (DagInit *PatternInit = + dynamic_cast(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... } diff --git a/utils/TableGen/InstrSelectorEmitter.h b/utils/TableGen/InstrSelectorEmitter.h index 5033a417d63..941763eb03c 100644 --- a/utils/TableGen/InstrSelectorEmitter.h +++ b/utils/TableGen/InstrSelectorEmitter.h @@ -17,12 +17,10 @@ struct NodeType { // Both argument and return types... Val, // A non-void type Arg0, // Value matches the type of Arg0 + Ptr, // Tree node is the type of the target pointer // Return types Void, // Tree node always returns void - - // Argument types - Ptr, // Tree node is the target argument type }; ArgResultTypes ResultType; @@ -36,7 +34,6 @@ struct NodeType { NodeType(const NodeType &N) : ResultType(N.ResultType), ArgTypes(N.ArgTypes){} static ArgResultTypes Translate(Record *R); - }; class InstrSelectorEmitter : public TableGenBackend { @@ -54,6 +51,10 @@ private: // RecordKeeper, turning them into the more accessible NodeTypes data // structure. void ProcessNodeTypes(); + + // ProcessInstructionPatterns - Read in all subclasses of Instruction, and + // process those with a useful Pattern field. + void ProcessInstructionPatterns(); }; #endif