diff --git a/llvm/lib/Bytecode/Reader/Analyzer.cpp b/llvm/lib/Bytecode/Reader/Analyzer.cpp
index 9468094..b85e300 100644
--- a/llvm/lib/Bytecode/Reader/Analyzer.cpp
+++ b/llvm/lib/Bytecode/Reader/Analyzer.cpp
@@ -1,4 +1,4 @@
-//===-- BytecodeHandler.cpp - Parsing Handler -------------------*- C++ -*-===//
+//===-- Analyzer.cpp - Analysis and Dumping of Bytecode 000000---*- C++ -*-===//
 // 
 //                     The LLVM Compiler Infrastructure
 //
@@ -7,33 +7,62 @@
 // 
 //===----------------------------------------------------------------------===//
 //
-//  This header file defines the BytecodeHandler class that gets called by the
-//  AbstractBytecodeParser when parsing events occur.
+//  This file implements the AnalyzerHandler class and PrintBytecodeAnalysis
+//  function which together comprise the basic functionality of the llmv-abcd
+//  tool. The AnalyzerHandler collects information about the bytecode file into
+//  the BytecodeAnalysis structure. The PrintBytecodeAnalysis function prints
+//  out the content of that structure.
+//  @see include/llvm/Bytecode/Analysis.h
 //
 //===----------------------------------------------------------------------===//
 
-#include "AnalyzerInternals.h"
-#include <iostream>
+#include "Reader.h"
+#include "llvm/Constants.h"
+#include "llvm/DerivedTypes.h"
+#include "llvm/Module.h"
+#include "llvm/Analysis/Verifier.h"
+#include "llvm/Bytecode/Analyzer.h"
+#include "llvm/Bytecode/BytecodeHandler.h"
+#include <iomanip>
+#include <sstream>
 
 using namespace llvm;
 
-
 namespace {
 
+/// @brief Bytecode reading handler for analyzing bytecode.
 class AnalyzerHandler : public BytecodeHandler {
-  BytecodeAnalysis& bca;
-  BytecodeAnalysis::BytecodeFunctionInfo* currFunc;
+  BytecodeAnalysis& bca;     ///< The structure in which data is recorded
+  std::ostringstream dump;   ///< A convenience for dumping data.
+  /// @brief Keeps track of current function
+  BytecodeAnalysis::BytecodeFunctionInfo* currFunc; 
+  Module* M; ///< Keeps track of current module
+
+/// @name Constructor
+/// @{
 public:
+  /// The only way to construct an AnalyzerHandler. All that is needed is a
+  /// reference to the BytecodeAnalysis structure where the output will be
+  /// placed.
   AnalyzerHandler(BytecodeAnalysis& TheBca) 
     : bca(TheBca) 
+    , dump()
     , currFunc(0)
     { }  
 
-  virtual bool handleError(const std::string& str ) {
-    return false;
+/// @}
+/// @name BytecodeHandler Implementations
+/// @{
+public:
+  virtual void handleError(const std::string& str ) { 
+    dump << "ERROR: " << str << "\n";
+    bca.BytecodeDump = dump.str() ;
   }
 
-  virtual void handleStart() {
+  virtual void handleStart( Module* Mod, unsigned theSize ) {
+    M = Mod;
+    dump << "Bytecode {\n";
+    bca.byteSize = theSize;
     bca.ModuleId.clear();
     bca.numBlocks = 0;
     bca.numTypes = 0;
@@ -72,6 +101,9 @@
   }
 
   virtual void handleFinish() {
+    dump << "} End Bytecode\n"; 
+    bca.BytecodeDump = dump.str() ;
+
     bca.fileDensity = double(bca.byteSize) / double( bca.numTypes + bca.numValues );
     double globalSize = 0.0;
     globalSize += double(bca.BlockSizes[BytecodeFormat::ConstantPool]);
@@ -81,83 +113,157 @@
       bca.numGlobalVars );
     bca.functionDensity = double(bca.BlockSizes[BytecodeFormat::Function]) / 
       double(bca.numFunctions);
+
+    if ( bca.progressiveVerify ) {
+      try {
+	verifyModule(*M, ThrowExceptionAction);
+      } catch ( std::string& msg ) {
+	bca.VerifyInfo += "Verify@Finish: " + msg + "\n";
+      }
+    }
   }
 
   virtual void handleModuleBegin(const std::string& id) {
+    dump << "  Module " << id << " {\n";
     bca.ModuleId = id;
   }
 
-  virtual void handleModuleEnd(const std::string& id) { }
+  virtual void handleModuleEnd(const std::string& id) { 
+    dump << "  } End Module " << id << "\n";
+    if ( bca.progressiveVerify ) {
+      try {
+	verifyModule(*M, ThrowExceptionAction);
+      } catch ( std::string& msg ) {
+	bca.VerifyInfo += "Verify@EndModule: " + msg + "\n";
+      }
+    }
+  }
 
   virtual void handleVersionInfo(
     unsigned char RevisionNum,        ///< Byte code revision number
     Module::Endianness Endianness,    ///< Endianness indicator
     Module::PointerSize PointerSize   ///< PointerSize indicator
-  ) { }
+  ) { 
+    dump << "    RevisionNum: " << int(RevisionNum) 
+	 << " Endianness: " << Endianness
+	 << " PointerSize: " << PointerSize << "\n";
+  }
 
-  virtual void handleModuleGlobalsBegin(unsigned size) { }
+  virtual void handleModuleGlobalsBegin() { 
+    dump << "    BLOCK: ModuleGlobalInfo {\n";
+  }
 
   virtual void handleGlobalVariable( 
-    const Type* ElemType,     ///< The type of the global variable
-    bool isConstant,          ///< Whether the GV is constant or not
-    GlobalValue::LinkageTypes ///< The linkage type of the GV
+    const Type* ElemType,     
+    bool isConstant,          
+    GlobalValue::LinkageTypes Linkage,
+    unsigned SlotNum,
+    unsigned initSlot
   ) {
     bca.numGlobalVars++;
     bca.numValues++;
+
+    dump << "      GV: "
+         << ( initSlot == 0 ? "Uni" : "I" ) << "nitialized, "
+	 << ( isConstant? "Constant, " : "Variable, ")
+	 << " Linkage=" << Linkage << " Type=" 
+	 << ElemType->getDescription() 
+	 << " Slot=" << SlotNum << " InitSlot=" << initSlot 
+	 << "\n";
   }
 
-  virtual void handleInitializedGV( 
-    const Type* ElemType,     ///< The type of the global variable
-    bool isConstant,          ///< Whether the GV is constant or not
-    GlobalValue::LinkageTypes,///< The linkage type of the GV
-    unsigned initSlot         ///< Slot number of GV's initializer
-  ) {
-    bca.numGlobalVars++;
-    bca.numValues++;
+  virtual void handleType( const Type* Ty ) { 
+    bca.numTypes++; 
+    dump << "      Type: " << Ty->getDescription() << "\n";
   }
 
-  virtual void handleType( const Type* Ty ) { bca.numTypes++; }
-
   virtual void handleFunctionDeclaration( 
-    Function* Func,	    ///< The function
-    const FunctionType* FuncType    ///< The type of the function
+    Function* Func	    ///< The function
   ) {
     bca.numFunctions++;
     bca.numValues++;
+    dump << "      Function Decl: " << Func->getType()->getDescription() << "\n";
   }
 
-  virtual void handleModuleGlobalsEnd() { }
+  virtual void handleGlobalInitializer(GlobalVariable* GV, Constant* CV) {
+    dump << "      Initializer: GV=";
+    GV->print(dump);
+    dump << " CV=";
+    CV->print(dump);
+    dump << "\n";
+  }
 
-  virtual void handleCompactionTableBegin() { }
+  virtual void handleModuleGlobalsEnd() { 
+    dump << "    } END BLOCK: ModuleGlobalInfo\n";
+    if ( bca.progressiveVerify ) {
+      try {
+	verifyModule(*M, ThrowExceptionAction);
+      } catch ( std::string& msg ) {
+	bca.VerifyInfo += "Verify@EndModuleGlobalInfo: " + msg + "\n";
+      }
+    }
+  }
+
+  virtual void handleCompactionTableBegin() { 
+    dump << "    BLOCK: CompactionTable {\n";
+  }
 
   virtual void handleCompactionTablePlane( unsigned Ty, unsigned NumEntries) {
     bca.numCmpctnTables++;
+    dump << "      Plane: Ty=" << Ty << " Size=" << NumEntries << "\n";
   }
 
   virtual void handleCompactionTableType( unsigned i, unsigned TypSlot, 
-      const Type* ) {}
+      const Type* Ty ) {
+    dump << "        Type: " << i << " Slot:" << TypSlot 
+	      << " is " << Ty->getDescription() << "\n"; 
+  }
 
   virtual void handleCompactionTableValue( 
     unsigned i, 
+    unsigned TypSlot,
     unsigned ValSlot, 
-    const Type* ) { }
+    const Type* Ty ) { 
+    dump << "        Value: " << i << " TypSlot: " << TypSlot 
+	 << " ValSlot:" << ValSlot << " is " << Ty->getDescription() 
+	 << "\n";
+  }
 
-  virtual void handleCompactionTableEnd() { }
+  virtual void handleCompactionTableEnd() { 
+    dump << "    } END BLOCK: CompactionTable\n";
+  }
 
-  virtual void handleSymbolTableBegin() { bca.numSymTab++; }
+  virtual void handleSymbolTableBegin(Function* CF, SymbolTable* ST) { 
+    bca.numSymTab++; 
+    dump << "    BLOCK: SymbolTable {\n";
+  }
 
-  virtual void handleSymbolTablePlane( unsigned Ty, unsigned NumEntries, 
-    const Type* Typ) { }
+  virtual void handleSymbolTablePlane(unsigned Ty, unsigned NumEntries, 
+    const Type* Typ) { 
+    dump << "      Plane: Ty=" << Ty << " Size=" << NumEntries
+	 << " Type: " << Typ->getDescription() << "\n"; 
+  }
 
-  virtual void handleSymbolTableType( unsigned i, unsigned slot, 
-    const std::string& name ) { }
+  virtual void handleSymbolTableType(unsigned i, unsigned slot, 
+    const std::string& name ) { 
+    dump << "        Type " << i << " Slot=" << slot
+	      << " Name: " << name << "\n"; 
+  }
 
-  virtual void handleSymbolTableValue( unsigned i, unsigned slot, 
-    const std::string& name ) { }
+  virtual void handleSymbolTableValue(unsigned i, unsigned slot, 
+    const std::string& name ) { 
+    dump << "        Value " << i << " Slot=" << slot
+	      << " Name: " << name << "\n";
+  }
 
-  virtual void handleSymbolTableEnd() { }
+  virtual void handleSymbolTableEnd() { 
+    dump << "    } END BLOCK: SymbolTable\n";
+  }
 
-  virtual void handleFunctionBegin( Function* Func, unsigned Size) {
+  virtual void handleFunctionBegin(Function* Func, unsigned Size) {
+    dump << "BLOCK: Function {\n";
+    dump << "  Linkage: " << Func->getLinkage() << "\n";
+    dump << "  Type: " << Func->getType()->getDescription() << "\n";
     const FunctionType* FType = 
       cast<FunctionType>(Func->getType()->getElementType());
     currFunc = &bca.FunctionInfo[Func];
@@ -175,21 +281,38 @@
     currFunc->vbrCount64 = 0;
     currFunc->vbrCompBytes = 0;
     currFunc->vbrExpdBytes = 0;
+
   }
 
   virtual void handleFunctionEnd( Function* Func) {
+    dump << "} END BLOCK: Function\n";
     currFunc->density = double(currFunc->byteSize) /
       double(currFunc->numInstructions+currFunc->numBasicBlocks);
+
+    if ( bca.progressiveVerify ) {
+      try {
+	verifyModule(*M, ThrowExceptionAction);
+      } catch ( std::string& msg ) {
+	bca.VerifyInfo += "Verify@EndFunction: " + msg + "\n";
+      }
+    }
   }
 
   virtual void handleBasicBlockBegin( unsigned blocknum) {
+    dump << "  BLOCK: BasicBlock #" << blocknum << "{\n";
     bca.numBasicBlocks++;
     bca.numValues++;
     if ( currFunc ) currFunc->numBasicBlocks++;
   }
 
   virtual bool handleInstruction( unsigned Opcode, const Type* iType, 
-    std::vector<unsigned>& Operands, unsigned Size) {
+				std::vector<unsigned>& Operands, unsigned Size){
+    dump << "    INST: OpCode=" 
+	 << Instruction::getOpcodeName(Opcode) << " Type=" 
+	 << iType->getDescription() << "\n";
+    for ( unsigned i = 0; i < Operands.size(); ++i ) 
+      dump << "      Op#" << i << " Slot=" << Operands[i] << "\n";
+
     bca.numInstructions++;
     bca.numValues++;
     bca.instructionSize += Size;
@@ -204,46 +327,100 @@
     return Instruction::isTerminator(Opcode); 
   }
 
-  virtual void handleBasicBlockEnd(unsigned blocknum) { }
+  virtual void handleBasicBlockEnd(unsigned blocknum) { 
+    dump << "  } END BLOCK: BasicBlock #" << blocknum << "{\n";
+  }
 
-  virtual void handleGlobalConstantsBegin() { }
+  virtual void handleGlobalConstantsBegin() { 
+    dump << "    BLOCK: GlobalConstants {\n";
+  }
 
-  virtual void handleConstantExpression( unsigned Opcode, const Type* Typ, 
-      std::vector<std::pair<const Type*,unsigned> > ArgVec ) {
+  virtual void handleConstantExpression( unsigned Opcode, 
+      std::vector<Constant*> ArgVec, Constant* C ) {
+    dump << "      EXPR: " << Instruction::getOpcodeName(Opcode) << "\n";
+    for ( unsigned i = 0; i < ArgVec.size(); ++i )  {
+      dump << "        Arg#" << i << " "; ArgVec[i]->print(dump); dump << "\n";
+    }
+    dump << "        Value=";
+    C->print(dump);
+    dump << "\n";
     bca.numConstants++;
     bca.numValues++;
   }
 
   virtual void handleConstantValue( Constant * c ) {
+    dump << "      VALUE: ";
+    c->print(dump);
+    dump << "\n";
     bca.numConstants++;
     bca.numValues++;
   }
 
   virtual void handleConstantArray( const ArrayType* AT, 
-          std::vector<unsigned>& Elements ) {
+          std::vector<Constant*>& Elements,
+	  unsigned TypeSlot,
+	  Constant* ArrayVal ) {
+    dump << "      ARRAY: " << AT->getDescription() 
+         << " TypeSlot=" << TypeSlot << "\n";
+    for ( unsigned i = 0; i < Elements.size(); ++i ) {
+      dump << "        #" << i;
+      Elements[i]->print(dump);
+      dump << "\n";
+    }
+    dump << "        Value=";
+    ArrayVal->print(dump);
+    dump << "\n";
+
     bca.numConstants++;
     bca.numValues++;
   }
 
   virtual void handleConstantStruct(
         const StructType* ST,
-        std::vector<unsigned>& ElementSlots)
+        std::vector<Constant*>& Elements,
+	Constant* StructVal)
   {
+    dump << "      STRUC: " << ST->getDescription() << "\n";
+    for ( unsigned i = 0; i < Elements.size(); ++i ) {
+      dump << "        #" << i << " "; Elements[i]->print(dump); dump << "\n";
+    }
+    dump << "        Value=";
+    StructVal->print(dump);
+    dump << "\n";
     bca.numConstants++;
     bca.numValues++;
   }
 
-  virtual void handleConstantPointer( const PointerType* PT, unsigned Slot) {
+  virtual void handleConstantPointer( const PointerType* PT, 
+      unsigned Slot, GlobalValue* GV, Constant* PtrVal) {
+    dump << "       PNTR: " << PT->getDescription() 
+	 << " Slot=" << Slot << " GlobalValue=";
+    GV->print(dump);
+    dump << "\n        Value=";
+    PtrVal->print(dump);
+    dump << "\n";
     bca.numConstants++;
     bca.numValues++;
   }
 
   virtual void handleConstantString( const ConstantArray* CA ) {
+    dump << "      STRNG: ";
+    CA->print(dump); 
+    dump << "\n";
     bca.numConstants++;
     bca.numValues++;
   }
 
-  virtual void handleGlobalConstantsEnd() { }
+  virtual void handleGlobalConstantsEnd() { 
+    dump << "    } END BLOCK: GlobalConstants\n";
+    if ( bca.progressiveVerify ) {
+      try {
+	verifyModule(*M, ThrowExceptionAction);
+      } catch ( std::string& msg ) {
+	bca.VerifyInfo += "Verify@EndGlobalConstants: " + msg + "\n";
+      }
+    }
+  }
 
   virtual void handleAlignment(unsigned numBytes) {
     bca.numAlignment += numBytes;
@@ -278,20 +455,157 @@
   }
 };
 
+
+/// @brief Utility for printing a titled unsigned value with
+/// an aligned colon.
+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";
 }
 
-void llvm::BytecodeAnalyzer::AnalyzeBytecode(
-    const unsigned char *Buf, 
-    unsigned Length,
-    BytecodeAnalysis& bca,
-    const std::string &ModuleID
-)
+/// @brief Utility for printing a titled double value with an
+/// aligned colon
+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" ;
+}
+
+/// @brief Utility for printing a titled double value with a
+/// percentage and aligned colon.
+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";
+}
+
+/// @brief Utility for printing a titled string value with
+/// an aligned colon.
+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" : "");
+}
+
+}
+
+namespace llvm {
+
+/// This function prints the contents of rhe BytecodeAnalysis structure in
+/// a human legible form.
+/// @brief Print BytecodeAnalysis structure to an ostream
+void PrintBytecodeAnalysis(BytecodeAnalysis& bca, std::ostream& Out )
 {
-  bca.byteSize = Length;
-  AnalyzerHandler TheHandler(bca);
-  AbstractBytecodeParser TheParser(&TheHandler, true, true, true);
-  TheParser.ParseBytecode( Buf, Length, ModuleID );
-  TheParser.ParseAllFunctionBodies();
+  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, "Long Instructions", bca.longInstructions);
+  print(Out, "Instruction Size", bca.instructionSize);
+  print(Out, "Average Instruction Size", 
+    double(bca.instructionSize)/double(bca.numInstructions));
+  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 ) {
+    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<const Function*,BytecodeAnalysis::BytecodeFunctionInfo>::iterator I = 
+      bca.FunctionInfo.begin();
+    std::map<const Function*,BytecodeAnalysis::BytecodeFunctionInfo>::iterator E = 
+      bca.FunctionInfo.end();
+
+    while ( I != E ) {
+      Out << std::left << std::setw(0);
+      Out << "Function: " << I->second.name << "\n";
+      print(Out, "Type:", I->second.description);
+      print(Out, "Byte Size", I->second.byteSize);
+      print(Out, "Instructions", I->second.numInstructions);
+      print(Out, "Long Instructions", I->second.longInstructions);
+      print(Out, "Instruction Size", I->second.instructionSize);
+      print(Out, "Average Instruction Size", 
+        double(I->second.instructionSize)/double(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, "Number of VBR 32-bit Integers",   I->second.vbrCount32);
+      print(Out, "Number of VBR 64-bit Integers",   I->second.vbrCount64);
+      print(Out, "Number of VBR Compressed Bytes",  I->second.vbrCompBytes);
+      print(Out, "Number of VBR Expanded Bytes",    I->second.vbrExpdBytes);
+      print(Out, "VBR Savings", 
+        double(I->second.vbrExpdBytes)-double(I->second.vbrCompBytes),
+        double(I->second.byteSize));
+      ++I;
+    }
+  }
+
+  if ( bca.dumpBytecode )
+    Out << bca.BytecodeDump;
+
+  if ( bca.progressiveVerify )
+    Out << bca.VerifyInfo;
+}
+
+BytecodeHandler* createBytecodeAnalyzerHandler(BytecodeAnalysis& bca)
+{
+  return new AnalyzerHandler(bca);
+}
+
 }
 
 // vim: sw=2
