Implemented the bulk of the functionality. Cleaned up the code.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@14113 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Bytecode/Reader/AnalyzerWrappers.cpp b/lib/Bytecode/Reader/AnalyzerWrappers.cpp
index 2caf069..fd23dc8 100644
--- a/lib/Bytecode/Reader/AnalyzerWrappers.cpp
+++ b/lib/Bytecode/Reader/AnalyzerWrappers.cpp
@@ -18,6 +18,7 @@
 #include "Support/StringExtras.h"
 #include "Config/unistd.h"
 #include <cerrno>
+#include <iomanip>
 
 using namespace llvm;
 
@@ -46,7 +47,7 @@
 }
 
 BytecodeFileAnalyzer::BytecodeFileAnalyzer(const std::string &Filename, 
-	                                   BytecodeAnalysis& bca) {
+                                           BytecodeAnalysis& bca) {
   Buffer = (unsigned char*)ReadFileIntoAddressSpace(Filename, Length);
   if (Buffer == 0)
     throw "Error reading file '" + Filename + "'.";
@@ -84,16 +85,16 @@
 
   public:
     BytecodeBufferAnalyzer(const unsigned char *Buf, unsigned Length,
-	                   BytecodeAnalysis& bca, const std::string &ModuleID);
+                           BytecodeAnalysis& bca, const std::string &ModuleID);
     ~BytecodeBufferAnalyzer();
 
   };
 }
 
 BytecodeBufferAnalyzer::BytecodeBufferAnalyzer(const unsigned char *Buf,
-					       unsigned Length,
-					       BytecodeAnalysis& bca,
-					       const std::string &ModuleID) {
+                                               unsigned Length,
+                                               BytecodeAnalysis& bca,
+                                               const std::string &ModuleID) {
   // If not aligned, allocate a new buffer to hold the bytecode...
   const unsigned char *ParseBegin = 0;
   if ((intptr_t)Buf & 3) {
@@ -200,28 +201,118 @@
 /// This function prints the contents of rhe BytecodeAnalysis structure in
 /// a human legible form.
 /// @brief Print BytecodeAnalysis structure to an ostream
+namespace {
+inline static void print(std::ostream& Out, const char*title, 
+  unsigned val, bool nl = true ) {
+  Out << std::setw(30) << std::right << title 
+      << std::setw(0) << ": "
+      << std::setw(9) << val << "\n";
+}
+
+inline static void print(std::ostream&Out, const char*title, 
+  double val ) {
+  Out << std::setw(30) << std::right << title 
+      << std::setw(0) << ": "
+      << std::setw(9) << std::setprecision(6) << val << "\n" ;
+}
+
+inline static void print(std::ostream&Out, const char*title, 
+  double top, double bot ) {
+  Out << std::setw(30) << std::right << title 
+      << std::setw(0) << ": "
+      << std::setw(9) << std::setprecision(6) << top 
+      << " (" << std::left << std::setw(0) << std::setprecision(4) 
+      << (top/bot)*100.0 << "%)\n";
+}
+inline static void print(std::ostream&Out, const char*title, 
+  std::string val, bool nl = true) {
+  Out << std::setw(30) << std::right << title 
+      << std::setw(0) << ": "
+      << std::left << val << (nl ? "\n" : "");
+}
+
+}
+
 void llvm::PrintBytecodeAnalysis(BytecodeAnalysis& bca, std::ostream& Out )
 {
-  Out << "       Bytecode Analysis of: " << bca.ModuleId << "\n";
-  Out << "                  File Size: " << bca.byteSize << "\n";
-  Out << "            Number Of Types: " << bca.numTypes << "\n";
-  Out << "        Number Of Constants: " << bca.numConstants << "\n";
-  Out << " Number Of Global Variables: " << bca.numGlobalVars << "\n";
-  Out << "        Number Of Functions: " << bca.numFunctions << "\n";
-  Out << "     Number Of Basic Blocks: " << bca.numBasicBlocks << "\n";
-  Out << "     Number Of Instructions: " << bca.numInstructions << "\n";
-  Out << "         Number Of Operands: " << bca.numOperands << "\n";
-  Out << "Number Of Compaction Tables: " << bca.numCmpctnTables << "\n";
-  Out << "    Number Of Symbol Tables: " << bca.numSymTab << "\n";
-  Out << "   Maximum Type Slot Number: " << bca.maxTypeSlot << "\n";
-  Out << "  Maximum Value Slot Number: " << bca.maxValueSlot << "\n";
-  Out << "           Bytecode Density: " << bca.density << "\n";
+  print(Out, "Bytecode Analysis Of Module",     bca.ModuleId);
+  print(Out, "File Size",                       bca.byteSize);
+  print(Out, "Bytecode Compression Index",std::string("TBD"));
+  print(Out, "Number Of Bytecode Blocks",       bca.numBlocks);
+  print(Out, "Number Of Types",                 bca.numTypes);
+  print(Out, "Number Of Values",                bca.numValues);
+  print(Out, "Number Of Constants",             bca.numConstants);
+  print(Out, "Number Of Global Variables",      bca.numGlobalVars);
+  print(Out, "Number Of Functions",             bca.numFunctions);
+  print(Out, "Number Of Basic Blocks",          bca.numBasicBlocks);
+  print(Out, "Number Of Instructions",          bca.numInstructions);
+  print(Out, "Number Of Operands",              bca.numOperands);
+  print(Out, "Number Of Compaction Tables",     bca.numCmpctnTables);
+  print(Out, "Number Of Symbol Tables",         bca.numSymTab);
+  print(Out, "Maximum Type Slot Number",        bca.maxTypeSlot);
+  print(Out, "Maximum Value Slot Number",       bca.maxValueSlot);
+  print(Out, "Bytes Thrown To Alignment",       double(bca.numAlignment), 
+    double(bca.byteSize));
+  print(Out, "File Density (bytes/def)",        bca.fileDensity);
+  print(Out, "Globals Density (bytes/def)",     bca.globalsDensity);
+  print(Out, "Function Density (bytes/func)",   bca.functionDensity);
+  print(Out, "Number of VBR 32-bit Integers",   bca.vbrCount32);
+  print(Out, "Number of VBR 64-bit Integers",   bca.vbrCount64);
+  print(Out, "Number of VBR Compressed Bytes",  bca.vbrCompBytes);
+  print(Out, "Number of VBR Expanded Bytes",    bca.vbrExpdBytes);
+  print(Out, "VBR Savings", 
+    double(bca.vbrExpdBytes)-double(bca.vbrCompBytes),
+    double(bca.byteSize));
 
-  if ( bca.detailedResults )
-    Out << "Detailed Results Not Implemented Yet.\n";
+  if ( bca.detailedResults ) {
+    print(Out, "Module Bytes",
+        double(bca.BlockSizes[BytecodeFormat::Module]),
+        double(bca.byteSize));
+    print(Out, "Function Bytes", 
+        double(bca.BlockSizes[BytecodeFormat::Function]),
+        double(bca.byteSize));
+    print(Out, "Constant Pool Bytes", 
+        double(bca.BlockSizes[BytecodeFormat::ConstantPool]),
+        double(bca.byteSize));
+    print(Out, "Symbol Table Bytes", 
+        double(bca.BlockSizes[BytecodeFormat::SymbolTable]),
+        double(bca.byteSize));
+    print(Out, "Module Global Info Bytes", 
+        double(bca.BlockSizes[BytecodeFormat::ModuleGlobalInfo]),
+        double(bca.byteSize));
+    print(Out, "Global Type Plane Bytes", 
+        double(bca.BlockSizes[BytecodeFormat::GlobalTypePlane]),
+        double(bca.byteSize));
+    print(Out, "Basic Block Bytes", 
+        double(bca.BlockSizes[BytecodeFormat::BasicBlock]),
+        double(bca.byteSize));
+    print(Out, "Instruction List Bytes", 
+        double(bca.BlockSizes[BytecodeFormat::InstructionList]),
+        double(bca.byteSize));
+    print(Out, "Compaction Table Bytes", 
+        double(bca.BlockSizes[BytecodeFormat::CompactionTable]),
+        double(bca.byteSize));
+
+    std::map<unsigned,BytecodeAnalysis::BytecodeFunctionInfo>::iterator I = 
+      bca.FunctionInfo.begin();
+    std::map<unsigned,BytecodeAnalysis::BytecodeFunctionInfo>::iterator E = 
+      bca.FunctionInfo.end();
+
+    while ( I != E ) {
+      Out << std::left << std::setw(0);
+      Out << "Function: " << I->second.name << " Slot=" << I->first << "\n";
+      print(Out,"Type:", I->second.description);
+      print(Out,"Byte Size", I->second.byteSize);
+      print(Out,"Instructions", I->second.numInstructions);
+      print(Out,"Basic Blocks", I->second.numBasicBlocks);
+      print(Out,"Operand", I->second.numOperands);
+      print(Out,"Function Density", I->second.density);
+      print(Out,"VBR Effectiveness", I->second.vbrEffectiveness);
+      ++I;
+    }
+  }
 
   if ( bca.dumpBytecode )
     Out << bca.BytecodeDump;
 }
-
 // vim: sw=2