Add a (progn)-like construct for (actions). Implemented as a DAG list.
authorMikhail Glushenkov <foldr@codedgers.com>
Sun, 7 Dec 2008 16:42:22 +0000 (16:42 +0000)
committerMikhail Glushenkov <foldr@codedgers.com>
Sun, 7 Dec 2008 16:42:22 +0000 (16:42 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@60658 91177308-0d34-0410-b5e6-96231b3b80d8

utils/TableGen/LLVMCConfigurationEmitter.cpp

index 175de459259bbceea2fb84b3a12d48f944fa73f2..3456b9abce4814cd65b6d8bfb68b49604c9e6791 100644 (file)
@@ -802,11 +802,8 @@ void WalkCase(Init* Case, F1 TestCallback, F2 StatementCallback) {
 /// CheckForSuperfluousOptions() to walk the 'case' DAG.
 class ExtractOptionNames {
   llvm::StringSet<>& OptionNames_;
-public:
-  ExtractOptionNames(llvm::StringSet<>& OptionNames) : OptionNames_(OptionNames)
-  {}
 
-  void operator()(const Init* Statement) {
+  void processDag(const Init* Statement) {
     const DagInit& Stmt = InitPtrToDag(Statement);
     const std::string& ActionName = Stmt.getOperator()->getAsString();
     if (ActionName == "forward" || ActionName == "forward_as" ||
@@ -819,10 +816,26 @@ public:
     }
     else if (ActionName == "and" || ActionName == "or") {
       for (unsigned i = 0, NumArgs = Stmt.getNumArgs(); i < NumArgs; ++i) {
-        this->operator()(Stmt.getArg(i));
+        this->processDag(Stmt.getArg(i));
       }
     }
   }
+
+public:
+  ExtractOptionNames(llvm::StringSet<>& OptionNames) : OptionNames_(OptionNames)
+  {}
+
+  void operator()(const Init* Statement) {
+    if (typeid(*Statement) == typeid(ListInit)) {
+      const ListInit& DagList = *static_cast<const ListInit*>(Statement);
+      for (ListInit::const_iterator B = DagList.begin(), E = DagList.end();
+           B != E; ++B)
+        this->processDag(*B);
+    }
+    else {
+      this->processDag(Statement);
+    }
+  }
 };
 
 /// CheckForSuperfluousOptions - Check that there are no side
@@ -1185,12 +1198,9 @@ void EmitForwardOptionPropertyHandlingCode (const OptionDescription& D,
 /// EmitCaseConstructHandler().
 class EmitActionHandler {
   const OptionDescriptions& OptDescs;
- public:
-  EmitActionHandler(const OptionDescriptions& OD)
-    : OptDescs(OD) {}
 
-  void operator()(const Init* Statement, const char* IndentLevel,
-                  std::ostream& O) const
+  void processActionDag(const Init* Statement, const char* IndentLevel,
+                        std::ostream& O) const
   {
     const DagInit& Dag = InitPtrToDag(Statement);
     const std::string& ActionName = Dag.getOperator()->getAsString();
@@ -1246,6 +1256,23 @@ class EmitActionHandler {
       throw "Unknown action name: " + ActionName + "!";
     }
   }
+ public:
+  EmitActionHandler(const OptionDescriptions& OD)
+    : OptDescs(OD) {}
+
+  void operator()(const Init* Statement, const char* IndentLevel,
+                  std::ostream& O) const
+  {
+    if (typeid(*Statement) == typeid(ListInit)) {
+      const ListInit& DagList = *static_cast<const ListInit*>(Statement);
+      for (ListInit::const_iterator B = DagList.begin(), E = DagList.end();
+           B != E; ++B)
+        this->processActionDag(*B, IndentLevel, O);
+    }
+    else {
+      this->processActionDag(Statement, IndentLevel, O);
+    }
+  }
 };
 
 // EmitGenerateActionMethod - Emit one of two versions of the