diff --git a/llvm/lib/Bytecode/Reader/AnalyzerWrappers.cpp b/llvm/lib/Bytecode/Reader/AnalyzerWrappers.cpp
index 2caf069..fd23dc8 100644
--- a/llvm/lib/Bytecode/Reader/AnalyzerWrappers.cpp
+++ b/llvm/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
