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 /support | |
parent | faca5ab1895da74d451d7187dc3f0d4191efeee1 (diff) |
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 'support')
-rw-r--r-- | support/tools/TableGen/InstrSelectorEmitter.cpp | 32 | ||||
-rw-r--r-- | support/tools/TableGen/InstrSelectorEmitter.h | 9 |
2 files changed, 34 insertions, 7 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... } diff --git a/support/tools/TableGen/InstrSelectorEmitter.h b/support/tools/TableGen/InstrSelectorEmitter.h index 5033a417d6..941763eb03 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 |