Added options to print out basic blocks in a variety of different orderings
authorChris Lattner <sabre@nondot.org>
Wed, 13 Jun 2001 19:55:41 +0000 (19:55 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 13 Jun 2001 19:55:41 +0000 (19:55 +0000)
as a testcase for cfg iterators.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@30 91177308-0d34-0410-b5e6-96231b3b80d8

tools/dis/dis.cpp
tools/llvm-dis/dis.cpp
tools/llvm-dis/llvm-dis.cpp

index 3f45ee3c0d8052ef89cdb2db32efa427213ffb1f..ed1b79e3c4866307cb7fad6176e77d891acdb34d 100644 (file)
@@ -2,10 +2,17 @@
 // LLVM 'DIS' UTILITY 
 //
 // This utility may be invoked in the following manner:
-//  dis --help     - Output information about command line switches
 //  dis [options]      - Read LLVM bytecode from stdin, write assembly to stdout
 //  dis [options] x.bc - Read LLVM bytecode from the x.bc file, write assembly
 //                       to the x.ll file.
+//  Options:
+//      --help   - Output information about command line switches
+//       -dfo    - Print basic blocks in depth first order
+//       -rdfo   - Print basic blocks in reverse depth first order
+//       -po     - Print basic blocks in post order
+//       -rpo    - Print basic blocks in reverse post order
+//
+// TODO: add -vcg which prints VCG compatible output.
 //
 //===------------------------------------------------------------------------===
 
 #include "llvm/Assembly/Writer.h"
 #include "llvm/Bytecode/Reader.h"
 #include "llvm/Tools/CommandLine.h"
+#include "llvm/Method.h"
+#include "llvm/CFG.h"
 
 int main(int argc, char **argv) {
+  // WriteMode - The different orderings to print basic blocks in...
+  enum {
+    Default = 0,                  // Method Order (list order)
+    DepthFirst,                   // Depth First ordering
+    ReverseDepthFirst,            // Reverse Depth First ordering
+    PostOrder,                    // Post Order
+    ReversePostOrder              // Reverse Post Order
+  } WriteMode = Default;
+
   ToolCommandLine Opts(argc, argv, false);
 
   // We only support the options that the system parser does... if it left any
@@ -24,16 +42,28 @@ int main(int argc, char **argv) {
   //
   if (argc > 1) {
     for (int i = 1; i < argc; i++) {
-      if (string(argv[i]) != string("--help"))
+      if (string(argv[i]) == string("--help")) {
+       cerr << argv[0] << " usage:\n"
+            << "\tx.bc        - Parse <x.bc> file and output to x.ll\n"
+            << "\tno .bc file - Parse stdin and write to stdout.\n"
+            << "\t-dfo        - Write basic blocks in depth first order.\n"
+            << "\t-rdfo       - Write basic blocks in reverse DFO.\n"
+            << "\t-po         - Write basic blocks in postorder.\n"
+            << "\t-rpo        - Write basic blocks in reverse postorder.\n"
+            << "\t--help      - Print this usage information\n\n";
+       return 1;
+      } else if (string(argv[i]) == string("-dfo")) {
+       WriteMode = DepthFirst;
+      } else if (string(argv[i]) == string("-rdfo")) {
+       WriteMode = ReverseDepthFirst;
+      } else if (string(argv[i]) == string("-po")) {
+       WriteMode = PostOrder;
+      } else if (string(argv[i]) == string("-rpo")) {
+       WriteMode = ReversePostOrder;
+      } else {
        cerr << argv[0] << ": argument not recognized: '" << argv[i] << "'!\n";
+      }
     }
-    
-    cerr << argv[0] << " usage:\n"
-        << "  " << argv[0] << " --help  - Print this usage information\n" 
-        << "  " << argv[0] << " x.bc    - Parse <x.bc> file and output "
-        << "assembly to x.ll\n"
-        << "  " << argv[0] << "         - Parse stdin and write to stdout.\n";
-    return 1;
   }
   
   ostream *Out = &cout;  // Default to printing to stdout...
@@ -56,7 +86,44 @@ int main(int argc, char **argv) {
     
   // All that dis does is write the assembly out to a file... which is exactly
   // what the writer library is supposed to do...
-  (*Out) << C;
+  //
+  if (WriteMode == Default) {
+    (*Out) << C;           // Print out in list order
+  } else {
+    // TODO: This does not print anything other than the basic blocks in the
+    // methods... more should definately be printed.  It should be valid output
+    // consumable by the assembler.
+    //
+    for (Module::MethodListType::iterator I = C->getMethodList().begin(); 
+        I != C->getMethodList().end(); I++) {
+      Method *M = *I;
+      (*Out) << "-------------- Method: " << M->getName() << " -------------\n";
+
+      switch (WriteMode) {
+      case DepthFirst:                   // Depth First ordering
+       copy(cfg::df_begin(M), cfg::df_end(M),
+            ostream_iterator<BasicBlock*>(*Out, "\n"));
+       break;
+      case ReverseDepthFirst:            // Reverse Depth First ordering
+       copy(cfg::df_begin(M, true), cfg::df_end(M),
+            ostream_iterator<BasicBlock*>(*Out, "\n"));
+       break;
+      case PostOrder:                    // Post Order
+       copy(cfg::po_begin(M), cfg::po_end(M),
+            ostream_iterator<BasicBlock*>(*Out, "\n"));
+       break;
+      case ReversePostOrder: {           // Reverse Post Order
+       cfg::ReversePostOrderTraversal RPOT(M);
+       copy(RPOT.begin(), RPOT.end(),
+            ostream_iterator<BasicBlock*>(*Out, "\n"));
+       break;
+      }
+      default:
+       abort();
+       break;
+      }
+    }
+  }
   delete C;
 
   if (Out != &cout) delete Out;
index 3f45ee3c0d8052ef89cdb2db32efa427213ffb1f..ed1b79e3c4866307cb7fad6176e77d891acdb34d 100644 (file)
@@ -2,10 +2,17 @@
 // LLVM 'DIS' UTILITY 
 //
 // This utility may be invoked in the following manner:
-//  dis --help     - Output information about command line switches
 //  dis [options]      - Read LLVM bytecode from stdin, write assembly to stdout
 //  dis [options] x.bc - Read LLVM bytecode from the x.bc file, write assembly
 //                       to the x.ll file.
+//  Options:
+//      --help   - Output information about command line switches
+//       -dfo    - Print basic blocks in depth first order
+//       -rdfo   - Print basic blocks in reverse depth first order
+//       -po     - Print basic blocks in post order
+//       -rpo    - Print basic blocks in reverse post order
+//
+// TODO: add -vcg which prints VCG compatible output.
 //
 //===------------------------------------------------------------------------===
 
 #include "llvm/Assembly/Writer.h"
 #include "llvm/Bytecode/Reader.h"
 #include "llvm/Tools/CommandLine.h"
+#include "llvm/Method.h"
+#include "llvm/CFG.h"
 
 int main(int argc, char **argv) {
+  // WriteMode - The different orderings to print basic blocks in...
+  enum {
+    Default = 0,                  // Method Order (list order)
+    DepthFirst,                   // Depth First ordering
+    ReverseDepthFirst,            // Reverse Depth First ordering
+    PostOrder,                    // Post Order
+    ReversePostOrder              // Reverse Post Order
+  } WriteMode = Default;
+
   ToolCommandLine Opts(argc, argv, false);
 
   // We only support the options that the system parser does... if it left any
@@ -24,16 +42,28 @@ int main(int argc, char **argv) {
   //
   if (argc > 1) {
     for (int i = 1; i < argc; i++) {
-      if (string(argv[i]) != string("--help"))
+      if (string(argv[i]) == string("--help")) {
+       cerr << argv[0] << " usage:\n"
+            << "\tx.bc        - Parse <x.bc> file and output to x.ll\n"
+            << "\tno .bc file - Parse stdin and write to stdout.\n"
+            << "\t-dfo        - Write basic blocks in depth first order.\n"
+            << "\t-rdfo       - Write basic blocks in reverse DFO.\n"
+            << "\t-po         - Write basic blocks in postorder.\n"
+            << "\t-rpo        - Write basic blocks in reverse postorder.\n"
+            << "\t--help      - Print this usage information\n\n";
+       return 1;
+      } else if (string(argv[i]) == string("-dfo")) {
+       WriteMode = DepthFirst;
+      } else if (string(argv[i]) == string("-rdfo")) {
+       WriteMode = ReverseDepthFirst;
+      } else if (string(argv[i]) == string("-po")) {
+       WriteMode = PostOrder;
+      } else if (string(argv[i]) == string("-rpo")) {
+       WriteMode = ReversePostOrder;
+      } else {
        cerr << argv[0] << ": argument not recognized: '" << argv[i] << "'!\n";
+      }
     }
-    
-    cerr << argv[0] << " usage:\n"
-        << "  " << argv[0] << " --help  - Print this usage information\n" 
-        << "  " << argv[0] << " x.bc    - Parse <x.bc> file and output "
-        << "assembly to x.ll\n"
-        << "  " << argv[0] << "         - Parse stdin and write to stdout.\n";
-    return 1;
   }
   
   ostream *Out = &cout;  // Default to printing to stdout...
@@ -56,7 +86,44 @@ int main(int argc, char **argv) {
     
   // All that dis does is write the assembly out to a file... which is exactly
   // what the writer library is supposed to do...
-  (*Out) << C;
+  //
+  if (WriteMode == Default) {
+    (*Out) << C;           // Print out in list order
+  } else {
+    // TODO: This does not print anything other than the basic blocks in the
+    // methods... more should definately be printed.  It should be valid output
+    // consumable by the assembler.
+    //
+    for (Module::MethodListType::iterator I = C->getMethodList().begin(); 
+        I != C->getMethodList().end(); I++) {
+      Method *M = *I;
+      (*Out) << "-------------- Method: " << M->getName() << " -------------\n";
+
+      switch (WriteMode) {
+      case DepthFirst:                   // Depth First ordering
+       copy(cfg::df_begin(M), cfg::df_end(M),
+            ostream_iterator<BasicBlock*>(*Out, "\n"));
+       break;
+      case ReverseDepthFirst:            // Reverse Depth First ordering
+       copy(cfg::df_begin(M, true), cfg::df_end(M),
+            ostream_iterator<BasicBlock*>(*Out, "\n"));
+       break;
+      case PostOrder:                    // Post Order
+       copy(cfg::po_begin(M), cfg::po_end(M),
+            ostream_iterator<BasicBlock*>(*Out, "\n"));
+       break;
+      case ReversePostOrder: {           // Reverse Post Order
+       cfg::ReversePostOrderTraversal RPOT(M);
+       copy(RPOT.begin(), RPOT.end(),
+            ostream_iterator<BasicBlock*>(*Out, "\n"));
+       break;
+      }
+      default:
+       abort();
+       break;
+      }
+    }
+  }
   delete C;
 
   if (Out != &cout) delete Out;
index 3f45ee3c0d8052ef89cdb2db32efa427213ffb1f..ed1b79e3c4866307cb7fad6176e77d891acdb34d 100644 (file)
@@ -2,10 +2,17 @@
 // LLVM 'DIS' UTILITY 
 //
 // This utility may be invoked in the following manner:
-//  dis --help     - Output information about command line switches
 //  dis [options]      - Read LLVM bytecode from stdin, write assembly to stdout
 //  dis [options] x.bc - Read LLVM bytecode from the x.bc file, write assembly
 //                       to the x.ll file.
+//  Options:
+//      --help   - Output information about command line switches
+//       -dfo    - Print basic blocks in depth first order
+//       -rdfo   - Print basic blocks in reverse depth first order
+//       -po     - Print basic blocks in post order
+//       -rpo    - Print basic blocks in reverse post order
+//
+// TODO: add -vcg which prints VCG compatible output.
 //
 //===------------------------------------------------------------------------===
 
 #include "llvm/Assembly/Writer.h"
 #include "llvm/Bytecode/Reader.h"
 #include "llvm/Tools/CommandLine.h"
+#include "llvm/Method.h"
+#include "llvm/CFG.h"
 
 int main(int argc, char **argv) {
+  // WriteMode - The different orderings to print basic blocks in...
+  enum {
+    Default = 0,                  // Method Order (list order)
+    DepthFirst,                   // Depth First ordering
+    ReverseDepthFirst,            // Reverse Depth First ordering
+    PostOrder,                    // Post Order
+    ReversePostOrder              // Reverse Post Order
+  } WriteMode = Default;
+
   ToolCommandLine Opts(argc, argv, false);
 
   // We only support the options that the system parser does... if it left any
@@ -24,16 +42,28 @@ int main(int argc, char **argv) {
   //
   if (argc > 1) {
     for (int i = 1; i < argc; i++) {
-      if (string(argv[i]) != string("--help"))
+      if (string(argv[i]) == string("--help")) {
+       cerr << argv[0] << " usage:\n"
+            << "\tx.bc        - Parse <x.bc> file and output to x.ll\n"
+            << "\tno .bc file - Parse stdin and write to stdout.\n"
+            << "\t-dfo        - Write basic blocks in depth first order.\n"
+            << "\t-rdfo       - Write basic blocks in reverse DFO.\n"
+            << "\t-po         - Write basic blocks in postorder.\n"
+            << "\t-rpo        - Write basic blocks in reverse postorder.\n"
+            << "\t--help      - Print this usage information\n\n";
+       return 1;
+      } else if (string(argv[i]) == string("-dfo")) {
+       WriteMode = DepthFirst;
+      } else if (string(argv[i]) == string("-rdfo")) {
+       WriteMode = ReverseDepthFirst;
+      } else if (string(argv[i]) == string("-po")) {
+       WriteMode = PostOrder;
+      } else if (string(argv[i]) == string("-rpo")) {
+       WriteMode = ReversePostOrder;
+      } else {
        cerr << argv[0] << ": argument not recognized: '" << argv[i] << "'!\n";
+      }
     }
-    
-    cerr << argv[0] << " usage:\n"
-        << "  " << argv[0] << " --help  - Print this usage information\n" 
-        << "  " << argv[0] << " x.bc    - Parse <x.bc> file and output "
-        << "assembly to x.ll\n"
-        << "  " << argv[0] << "         - Parse stdin and write to stdout.\n";
-    return 1;
   }
   
   ostream *Out = &cout;  // Default to printing to stdout...
@@ -56,7 +86,44 @@ int main(int argc, char **argv) {
     
   // All that dis does is write the assembly out to a file... which is exactly
   // what the writer library is supposed to do...
-  (*Out) << C;
+  //
+  if (WriteMode == Default) {
+    (*Out) << C;           // Print out in list order
+  } else {
+    // TODO: This does not print anything other than the basic blocks in the
+    // methods... more should definately be printed.  It should be valid output
+    // consumable by the assembler.
+    //
+    for (Module::MethodListType::iterator I = C->getMethodList().begin(); 
+        I != C->getMethodList().end(); I++) {
+      Method *M = *I;
+      (*Out) << "-------------- Method: " << M->getName() << " -------------\n";
+
+      switch (WriteMode) {
+      case DepthFirst:                   // Depth First ordering
+       copy(cfg::df_begin(M), cfg::df_end(M),
+            ostream_iterator<BasicBlock*>(*Out, "\n"));
+       break;
+      case ReverseDepthFirst:            // Reverse Depth First ordering
+       copy(cfg::df_begin(M, true), cfg::df_end(M),
+            ostream_iterator<BasicBlock*>(*Out, "\n"));
+       break;
+      case PostOrder:                    // Post Order
+       copy(cfg::po_begin(M), cfg::po_end(M),
+            ostream_iterator<BasicBlock*>(*Out, "\n"));
+       break;
+      case ReversePostOrder: {           // Reverse Post Order
+       cfg::ReversePostOrderTraversal RPOT(M);
+       copy(RPOT.begin(), RPOT.end(),
+            ostream_iterator<BasicBlock*>(*Out, "\n"));
+       break;
+      }
+      default:
+       abort();
+       break;
+      }
+    }
+  }
   delete C;
 
   if (Out != &cout) delete Out;