diff --git a/llvm/lib/Bytecode/Reader/Reader.cpp b/llvm/lib/Bytecode/Reader/Reader.cpp
index 1b11f22..abe11c8 100644
--- a/llvm/lib/Bytecode/Reader/Reader.cpp
+++ b/llvm/lib/Bytecode/Reader/Reader.cpp
@@ -29,13 +29,6 @@
 
 using namespace llvm;
 
-/// A convenience macro for handling parsing errors.
-#define PARSE_ERROR(inserters) { \
-    std::ostringstream errormsg; \
-    errormsg << inserters; \
-    throw std::string(errormsg.str()); \
-  }
-
 /// @brief A class for maintaining the slot number definition
 /// as a placeholder for the actual definition.
 template<class SuperType>
@@ -55,6 +48,16 @@
 
 typedef PlaceholderDef<ConstantPlaceHolderHelper>  ConstPHolder;
 
+// Provide some details on error
+inline void BytecodeReader::error(std::string err) {
+  err +=  " (Vers=" ;
+  err += itostr(RevisionNum) ;
+  err += ", Pos=" ;
+  err += itostr(At-MemStart);
+  err += ")";
+  throw err;
+}
+
 //===----------------------------------------------------------------------===//
 // Bytecode Reading Methods
 //===----------------------------------------------------------------------===//
@@ -67,7 +70,7 @@
 /// Throw an error if we've read past the end of the current block
 inline void BytecodeReader::checkPastBlockEnd(const char * block_name) {
   if ( At > BlockEnd )
-    PARSE_ERROR("Attempt to read past the end of " << block_name << " block.");
+    error(std::string("Attempt to read past the end of ") + block_name + " block.");
 }
 
 /// Align the buffer position to a 32 bit boundary
@@ -77,13 +80,13 @@
   if ( At > Save ) 
     if (Handler) Handler->handleAlignment( At - Save );
   if (At > BlockEnd) 
-    throw std::string("Ran out of data while aligning!");
+    error("Ran out of data while aligning!");
 }
 
 /// Read a whole unsigned integer
 inline unsigned BytecodeReader::read_uint() {
   if (At+4 > BlockEnd) 
-    throw std::string("Ran out of data reading uint!");
+    error("Ran out of data reading uint!");
   At += 4;
   return At[-4] | (At[-3] << 8) | (At[-2] << 16) | (At[-1] << 24);
 }
@@ -96,7 +99,7 @@
   
   do {
     if (At == BlockEnd) 
-      throw std::string("Ran out of data reading vbr_uint!");
+      error("Ran out of data reading vbr_uint!");
     Result |= (unsigned)((*At++) & 0x7F) << Shift;
     Shift += 7;
   } while (At[-1] & 0x80);
@@ -112,7 +115,7 @@
   
   do {
     if (At == BlockEnd) 
-      throw std::string("Ran out of data reading vbr_uint64!");
+      error("Ran out of data reading vbr_uint64!");
     Result |= (uint64_t)((*At++) & 0x7F) << Shift;
     Shift += 7;
   } while (At[-1] & 0x80);
@@ -139,7 +142,7 @@
   const unsigned char *OldAt = At;
   At += Size;
   if (At > BlockEnd)             // Size invalid?
-    throw std::string("Ran out of data reading a string!");
+    error("Ran out of data reading a string!");
   return std::string((char*)OldAt, Size);
 }
 
@@ -148,7 +151,7 @@
   unsigned char *Start = (unsigned char *)Ptr;
   unsigned Amount = (unsigned char *)End - Start;
   if (At+Amount > BlockEnd) 
-    throw std::string("Ran out of data!");
+    error("Ran out of data!");
   std::copy(At, At+Amount, Start);
   At += Amount;
 }
@@ -159,7 +162,7 @@
   Size = read_uint();
   BlockStart = At;
   if ( At + Size > BlockEnd )
-    throw std::string("Attempt to size a block past end of memory");
+    error("Attempt to size a block past end of memory");
   BlockEnd = At + Size;
   if (Handler) Handler->handleBlock( Type, BlockStart, Size );
 }
@@ -225,7 +228,7 @@
 
   if (!CompactionTypes.empty()) {
     if (ID >= CompactionTypes.size())
-      throw std::string("Type ID out of range for compaction table!");
+      error("Type ID out of range for compaction table!");
     return CompactionTypes[ID];
   }
 
@@ -238,7 +241,7 @@
     if (ID < FunctionTypes.size())
       return FunctionTypes[ID].get();
 
-    throw std::string("Illegal type reference!");
+    error("Illegal type reference!");
     return Type::VoidTy;
 }
 
@@ -246,18 +249,18 @@
 /// is both sanitized and not the "type type" of pre-1.3 bytecode.
 /// @see sanitizeTypeId
 inline const Type* BytecodeReader::getSanitizedType(unsigned& ID) {
-  bool isTypeType = sanitizeTypeId(ID);
-  assert(!isTypeType && "Invalid type id occurred");
+  if ( sanitizeTypeId(ID) )
+    error("Invalid type id encountered");
   return getType(ID);
 }
 
 /// This method just saves some coding. It uses read_typeid to read
-/// in a sanitized type id, asserts that its not the type type, and
+/// in a sanitized type id, errors that its not the type type, and
 /// then calls getType to return the type value.
 inline const Type* BytecodeReader::readSanitizedType() {
   unsigned ID;
-  bool isTypeType = read_typeid(ID);
-  assert(!isTypeType && "Invalid type id occurred");
+  if ( read_typeid(ID) )
+    error( "Invalid type id encountered");
   return getType(ID);
 }
 
@@ -273,7 +276,7 @@
         find(CompactionTypes.begin(), CompactionTypes.end(), Ty);
 
       if (I == CompactionTypes.end())
-        throw std::string("Couldn't find type specified in compaction table!");
+        error("Couldn't find type specified in compaction table!");
       return Type::FirstDerivedTyID + (&*I - &CompactionTypes[0]);
   }
 
@@ -287,7 +290,7 @@
   // Check the module level types now...
   I = find(ModuleTypes.begin(), ModuleTypes.end(), Ty);
   if (I == ModuleTypes.end())
-    throw std::string("Didn't find type in ModuleTypes.");
+    error("Didn't find type in ModuleTypes.");
   return Type::FirstDerivedTyID + (&*I - &ModuleTypes[0]);
 }
 
@@ -297,12 +300,13 @@
 const Type *BytecodeReader::getGlobalTableType(unsigned Slot) {
   if (Slot < Type::FirstDerivedTyID) {
     const Type *Ty = Type::getPrimitiveType((Type::TypeID)Slot);
-    assert(Ty && "Not a primitive type ID?");
+    if ( ! Ty )
+      error("Not a primitive type ID?");
     return Ty;
   }
   Slot -= Type::FirstDerivedTyID;
   if (Slot >= ModuleTypes.size())
-    throw std::string("Illegal compaction table type reference!");
+    error("Illegal compaction table type reference!");
   return ModuleTypes[Slot];
 }
 
@@ -314,7 +318,7 @@
   TypeListTy::iterator I = find(ModuleTypes.begin(),
                                       ModuleTypes.end(), Ty);
   if (I == ModuleTypes.end())
-    throw std::string("Didn't find type in ModuleTypes.");
+    error("Didn't find type in ModuleTypes.");
   return Type::FirstDerivedTyID + (&*I - &ModuleTypes[0]);
 }
 
@@ -389,10 +393,11 @@
 
   if (TyID >= ModuleValues.size() || ModuleValues[TyID] == 0 ||
       SlotNo >= ModuleValues[TyID]->size()) {
-    PARSE_ERROR("Corrupt compaction table entry!" 
-        << TyID << ", " << SlotNo << ": " << ModuleValues.size() << ", "
-        << (void*)ModuleValues[TyID] << ", "
-        << ModuleValues[TyID]->size() << "\n");
+    error("Corrupt compaction table entry!"
+        + utostr(TyID) + ", " + utostr(SlotNo) + ": " 
+	+ utostr(ModuleValues.size()) + ", "
+        + utohexstr(int((void*)ModuleValues[TyID])) + ", "
+        + utostr(ModuleValues[TyID]->size()) );
   }
   return ModuleValues[TyID]->getOperand(SlotNo);
 }
@@ -411,7 +416,7 @@
       // to infest bytecode files.
       return ConstantPointerRef::get(GV);
     else
-      throw std::string("Reference of a value is expected to be a constant!");
+      error("Reference of a value is expected to be a constant!");
 
   const Type *Ty = getType(TypeSlot);
   std::pair<const Type*, unsigned> Key(Ty, Slot);
@@ -534,7 +539,7 @@
     Oprnds.resize(NumOprnds);
 
     if (NumOprnds == 0)
-      throw std::string("Zero-argument instruction found; this is invalid.");
+      error("Zero-argument instruction found; this is invalid.");
 
     for (unsigned i = 0; i != NumOprnds; ++i)
       Oprnds[i] = read_vbr_uint();
@@ -560,7 +565,7 @@
   switch (Opcode) {
   default: 
     if (Result == 0) 
-      throw std::string("Illegal instruction read!");
+      error("Illegal instruction read!");
     break;
   case Instruction::VAArg:
     Result = new VAArgInst(getValue(iType, Oprnds[0]), 
@@ -581,7 +586,7 @@
     break;
   case Instruction::PHI: {
     if (Oprnds.size() == 0 || (Oprnds.size() & 1))
-      throw std::string("Invalid phi node encountered!");
+      error("Invalid phi node encountered!");
 
     PHINode *PN = new PHINode(InstTy);
     PN->op_reserve(Oprnds.size());
@@ -603,7 +608,7 @@
     else if (Oprnds.size() == 1)
       Result = new ReturnInst(getValue(iType, Oprnds[0]));
     else
-      throw std::string("Unrecognized instruction!");
+      error("Unrecognized instruction!");
     break;
 
   case Instruction::Br:
@@ -613,11 +618,11 @@
       Result = new BranchInst(getBasicBlock(Oprnds[0]), 
           getBasicBlock(Oprnds[1]), getValue(Type::BoolTyID , Oprnds[2]));
     else
-      throw std::string("Invalid number of operands for a 'br' instruction!");
+      error("Invalid number of operands for a 'br' instruction!");
     break;
   case Instruction::Switch: {
     if (Oprnds.size() & 1)
-      throw std::string("Switch statement with odd number of arguments!");
+      error("Switch statement with odd number of arguments!");
 
     SwitchInst *I = new SwitchInst(getValue(iType, Oprnds[0]),
                                    getBasicBlock(Oprnds[1]));
@@ -630,15 +635,15 @@
 
   case Instruction::Call: {
     if (Oprnds.size() == 0)
-      throw std::string("Invalid call instruction encountered!");
+      error("Invalid call instruction encountered!");
 
     Value *F = getValue(iType, Oprnds[0]);
 
     // Check to make sure we have a pointer to function type
     const PointerType *PTy = dyn_cast<PointerType>(F->getType());
-    if (PTy == 0) throw std::string("Call to non function pointer value!");
+    if (PTy == 0) error("Call to non function pointer value!");
     const FunctionType *FTy = dyn_cast<FunctionType>(PTy->getElementType());
-    if (FTy == 0) throw std::string("Call to non function pointer value!");
+    if (FTy == 0) error("Call to non function pointer value!");
 
     std::vector<Value *> Params;
     if (!FTy->isVarArg()) {
@@ -646,17 +651,17 @@
 
       for (unsigned i = 1, e = Oprnds.size(); i != e; ++i) {
         if (It == FTy->param_end())
-          throw std::string("Invalid call instruction!");
+          error("Invalid call instruction!");
         Params.push_back(getValue(getTypeSlot(*It++), Oprnds[i]));
       }
       if (It != FTy->param_end())
-        throw std::string("Invalid call instruction!");
+        error("Invalid call instruction!");
     } else {
       Oprnds.erase(Oprnds.begin(), Oprnds.begin()+1);
 
       unsigned FirstVariableOperand;
       if (Oprnds.size() < FTy->getNumParams())
-        throw std::string("Call instruction missing operands!");
+        error("Call instruction missing operands!");
 
       // Read all of the fixed arguments
       for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i)
@@ -665,7 +670,7 @@
       FirstVariableOperand = FTy->getNumParams();
 
       if ((Oprnds.size()-FirstVariableOperand) & 1) // Must be pairs of type/value
-        throw std::string("Invalid call instruction!");
+        error("Invalid call instruction!");
         
       for (unsigned i = FirstVariableOperand, e = Oprnds.size(); 
            i != e; i += 2)
@@ -677,16 +682,16 @@
   }
   case Instruction::Invoke: {
     if (Oprnds.size() < 3) 
-      throw std::string("Invalid invoke instruction!");
+      error("Invalid invoke instruction!");
     Value *F = getValue(iType, Oprnds[0]);
 
     // Check to make sure we have a pointer to function type
     const PointerType *PTy = dyn_cast<PointerType>(F->getType());
     if (PTy == 0) 
-      throw std::string("Invoke to non function pointer value!");
+      error("Invoke to non function pointer value!");
     const FunctionType *FTy = dyn_cast<FunctionType>(PTy->getElementType());
     if (FTy == 0) 
-      throw std::string("Invoke to non function pointer value!");
+      error("Invoke to non function pointer value!");
 
     std::vector<Value *> Params;
     BasicBlock *Normal, *Except;
@@ -698,11 +703,11 @@
       FunctionType::param_iterator It = FTy->param_begin();
       for (unsigned i = 3, e = Oprnds.size(); i != e; ++i) {
         if (It == FTy->param_end())
-          throw std::string("Invalid invoke instruction!");
+          error("Invalid invoke instruction!");
         Params.push_back(getValue(getTypeSlot(*It++), Oprnds[i]));
       }
       if (It != FTy->param_end())
-        throw std::string("Invalid invoke instruction!");
+        error("Invalid invoke instruction!");
     } else {
       Oprnds.erase(Oprnds.begin(), Oprnds.begin()+1);
 
@@ -715,7 +720,7 @@
                                   Oprnds[i]));
       
       if (Oprnds.size()-FirstVariableArgument & 1) // Must be type/value pairs
-        throw std::string("Invalid invoke instruction!");
+        error("Invalid invoke instruction!");
 
       for (unsigned i = FirstVariableArgument; i < Oprnds.size(); i += 2)
         Params.push_back(getValue(Oprnds[i], Oprnds[i+1]));
@@ -726,9 +731,9 @@
   }
   case Instruction::Malloc:
     if (Oprnds.size() > 2) 
-      throw std::string("Invalid malloc instruction!");
+      error("Invalid malloc instruction!");
     if (!isa<PointerType>(InstTy))
-      throw std::string("Invalid malloc instruction!");
+      error("Invalid malloc instruction!");
 
     Result = new MallocInst(cast<PointerType>(InstTy)->getElementType(),
                             Oprnds.size() ? getValue(Type::UIntTyID,
@@ -737,9 +742,9 @@
 
   case Instruction::Alloca:
     if (Oprnds.size() > 2) 
-      throw std::string("Invalid alloca instruction!");
+      error("Invalid alloca instruction!");
     if (!isa<PointerType>(InstTy))
-      throw std::string("Invalid alloca instruction!");
+      error("Invalid alloca instruction!");
 
     Result = new AllocaInst(cast<PointerType>(InstTy)->getElementType(),
                             Oprnds.size() ? getValue(Type::UIntTyID, 
@@ -747,12 +752,12 @@
     break;
   case Instruction::Free:
     if (!isa<PointerType>(InstTy))
-      throw std::string("Invalid free instruction!");
+      error("Invalid free instruction!");
     Result = new FreeInst(getValue(iType, Oprnds[0]));
     break;
   case Instruction::GetElementPtr: {
     if (Oprnds.size() == 0 || !isa<PointerType>(InstTy))
-      throw std::string("Invalid getelementptr instruction!");
+      error("Invalid getelementptr instruction!");
 
     std::vector<Value*> Idx;
 
@@ -760,7 +765,7 @@
     for (unsigned i = 1, e = Oprnds.size(); i != e; ++i) {
       const CompositeType *TopTy = dyn_cast_or_null<CompositeType>(NextTy);
       if (!TopTy) 
-	throw std::string("Invalid getelementptr instruction!"); 
+	error("Invalid getelementptr instruction!"); 
 
       unsigned ValIdx = Oprnds[i];
       unsigned IdxTy = 0;
@@ -801,14 +806,14 @@
   case 62:   // volatile load
   case Instruction::Load:
     if (Oprnds.size() != 1 || !isa<PointerType>(InstTy))
-      throw std::string("Invalid load instruction!");
+      error("Invalid load instruction!");
     Result = new LoadInst(getValue(iType, Oprnds[0]), "", Opcode == 62);
     break;
 
   case 63:   // volatile store 
   case Instruction::Store: {
     if (!isa<PointerType>(InstTy) || Oprnds.size() != 2)
-      throw std::string("Invalid store instruction!");
+      error("Invalid store instruction!");
 
     Value *Ptr = getValue(iType, Oprnds[1]);
     const Type *ValTy = cast<PointerType>(Ptr->getType())->getElementType();
@@ -818,7 +823,7 @@
   }
   case Instruction::Unwind:
     if (Oprnds.size() != 0) 
-      throw std::string("Invalid unwind instruction!");
+      error("Invalid unwind instruction!");
     Result = new UnwindInst();
     break;
   }  // end switch(Opcode) 
@@ -902,7 +907,7 @@
       ParseInstruction(Args, BB);
 
     if (!BB->getTerminator())
-      throw std::string("Non-terminated basic block found!");
+      error("Non-terminated basic block found!");
 
     if (Handler) Handler->handleBasicBlockEnd( BlockNo-1 );
   }
@@ -958,7 +963,7 @@
       if ( isTypeType ) {
 	const Type* T = getType(slot);
 	if ( T == 0 )
-	  PARSE_ERROR("Failed type look-up for name '" << Name << "'");
+	  error("Failed type look-up for name '" + Name + "'");
 	ST->insert(Name, T);
 	continue; // code below must be short circuited
       } else {
@@ -970,7 +975,7 @@
 	  V = getValue(Typ, slot, false); // Find mapping...
 	}
 	if (V == 0)
-	  PARSE_ERROR("Failed value look-up for name '" << Name << "'");
+	  error("Failed value look-up for name '" + Name + "'");
 	V->setName(Name, ST);
       }
     }
@@ -983,8 +988,8 @@
 void BytecodeReader::ParseCompactionTypes( unsigned NumEntries ) {
   for (unsigned i = 0; i != NumEntries; ++i) {
     unsigned TypeSlot = 0;
-    bool isTypeType = read_typeid(TypeSlot);
-    assert(!isTypeType && "Invalid type in compaction table: type type");
+    if ( read_typeid(TypeSlot) )
+      error("Invalid type in compaction table: type type");
     const Type *Typ = getGlobalTableType(TypeSlot);
     CompactionTypes.push_back(Typ);
     if (Handler) Handler->handleCompactionTableType( i, TypeSlot, Typ );
@@ -1028,7 +1033,7 @@
 	CompactionValues.resize(Ty+1);
 
       if (!CompactionValues[Ty].empty())
-	throw std::string("Compaction table plane contains multiple entries!");
+	error("Compaction table plane contains multiple entries!");
 
       if (Handler) Handler->handleCompactionTablePlane( Ty, NumEntries );
 
@@ -1049,8 +1054,8 @@
 // Parse a single type constant.
 const Type *BytecodeReader::ParseTypeConstant() {
   unsigned PrimType = 0;
-  bool isTypeType = read_typeid(PrimType);
-  assert(!isTypeType && "Invalid type (type type) in type constants!");
+  if ( read_typeid(PrimType) )
+    error("Invalid type (type type) in type constants!");
 
   const Type *Result = 0;
   if ((Result = Type::getPrimitiveType((Type::TypeID)PrimType)))
@@ -1081,12 +1086,13 @@
   case Type::StructTyID: {
     std::vector<const Type*> Elements;
     unsigned Typ = 0;
-    bool isTypeType = read_typeid(Typ);
-    assert(!isTypeType && "Invalid element type (type type) for structure!");
+    if ( read_typeid(Typ) )
+      error("Invalid element type (type type) for structure!");
+
     while (Typ) {         // List is terminated by void/0 typeid
       Elements.push_back(getType(Typ));
-      bool isTypeType = read_typeid(Typ);
-      assert(!isTypeType && "Invalid element type (type type) for structure!");
+      if ( read_typeid(Typ) )
+	error("Invalid element type (type type) for structure!");
     }
 
     Result = StructType::get(Elements);
@@ -1103,8 +1109,7 @@
   }
 
   default:
-    PARSE_ERROR("Don't know how to deserialize primitive type" 
-	<< PrimType << "\n");
+    error("Don't know how to deserialize primitive type " + utostr(PrimType));
     break;
   }
   if (Handler) Handler->handleType( Result );
@@ -1136,7 +1141,7 @@
     const Type* NewTy = ParseTypeConstant();
     const Type* OldTy = Tab[i].get();
     if (NewTy == 0) 
-      throw std::string("Couldn't parse type!");
+      error("Couldn't parse type!");
 
     // Don't directly push the new type on the Tab. Instead we want to replace 
     // the opaque type we previously inserted with the new concrete value. This
@@ -1171,8 +1176,8 @@
     for (unsigned i = 0; i != isExprNumArgs; ++i) {
       unsigned ArgValSlot = read_vbr_uint();
       unsigned ArgTypeSlot = 0;
-      bool isTypeType = read_typeid(ArgTypeSlot);
-      assert(!isTypeType && "Invalid argument type (type type) for constant value");
+      if ( read_typeid(ArgTypeSlot) )
+	error("Invalid argument type (type type) for constant value");
       
       // Get the arg value from its slot if it exists, otherwise a placeholder
       ArgVec.push_back(getConstantValue(ArgTypeSlot, ArgValSlot));
@@ -1195,7 +1200,7 @@
         for (unsigned i = 0; GTI != E; ++GTI, ++i)
           if (isa<StructType>(*GTI)) {
             if (IdxList[i]->getType() != Type::UByteTy)
-              throw std::string("Invalid index for getelementptr!");
+              error("Invalid index for getelementptr!");
             IdxList[i] = ConstantExpr::getCast(IdxList[i], Type::UIntTy);
           }
       }
@@ -1222,7 +1227,7 @@
   case Type::BoolTyID: {
     unsigned Val = read_vbr_uint();
     if (Val != 0 && Val != 1) 
-      throw std::string("Invalid boolean value read.");
+      error("Invalid boolean value read.");
     Constant* Result = ConstantBool::get(Val == 1);
     if (Handler) Handler->handleConstantValue(Result);
     return Result;
@@ -1233,7 +1238,7 @@
   case Type::UIntTyID: {
     unsigned Val = read_vbr_uint();
     if (!ConstantUInt::isValueValidForType(Ty, Val)) 
-      throw std::string("Invalid unsigned byte/short/int read.");
+      error("Invalid unsigned byte/short/int read.");
     Constant* Result =  ConstantUInt::get(Ty, Val);
     if (Handler) Handler->handleConstantValue(Result);
     return Result;
@@ -1251,7 +1256,7 @@
   case Type::LongTyID:
     int64_t Val = read_vbr_int64();
     if (!ConstantSInt::isValueValidForType(Ty, Val)) 
-      throw std::string("Invalid signed byte/short/int/long read.");
+      error("Invalid signed byte/short/int/long read.");
     Constant* Result = ConstantSInt::get(Ty, Val);
     if (Handler) Handler->handleConstantValue(Result);
     return Result;
@@ -1310,9 +1315,9 @@
     GlobalValue *GV;
     if (Val) {
       if (!(GV = dyn_cast<GlobalValue>(Val))) 
-        throw std::string("Value of ConstantPointerRef not in ValueTable!");
+        error("Value of ConstantPointerRef not in ValueTable!");
     } else {
-      throw std::string("Forward references are not allowed here.");
+      error("Forward references are not allowed here.");
     }
     
     Constant* Result = ConstantPointerRef::get(GV);
@@ -1321,10 +1326,11 @@
   }
 
   default:
-    PARSE_ERROR("Don't know how to deserialize constant value of type '"+
+    error("Don't know how to deserialize constant value of type '" +
                       Ty->getDescription());
     break;
   }
+  return 0;
 }
 
 /// Resolve references for constants. This function resolves the forward 
@@ -1346,16 +1352,16 @@
 void BytecodeReader::ParseStringConstants(unsigned NumEntries, ValueTable &Tab){
   for (; NumEntries; --NumEntries) {
     unsigned Typ = 0;
-    bool isTypeType = read_typeid(Typ);
-    assert(!isTypeType && "Invalid type (type type) for string constant");
+    if ( read_typeid(Typ) )
+      error("Invalid type (type type) for string constant");
     const Type *Ty = getType(Typ);
     if (!isa<ArrayType>(Ty))
-      throw std::string("String constant data invalid!");
+      error("String constant data invalid!");
     
     const ArrayType *ATy = cast<ArrayType>(Ty);
     if (ATy->getElementType() != Type::SByteTy &&
         ATy->getElementType() != Type::UByteTy)
-      throw std::string("String constant data invalid!");
+      error("String constant data invalid!");
     
     // Read character data.  The type tells us how long the string is.
     char Data[ATy->getNumElements()]; 
@@ -1442,7 +1448,7 @@
   case 3: Linkage = GlobalValue::InternalLinkage; break;
   case 4: Linkage = GlobalValue::LinkOnceLinkage; break;
   default:
-    throw std::string("Invalid linkage type for Function.");
+    error("Invalid linkage type for Function.");
     Linkage = GlobalValue::InternalLinkage;
     break;
   }
@@ -1501,7 +1507,7 @@
       }
 
       if (BlockNum) 
-        throw std::string("Already parsed basic blocks!");
+        error("Already parsed basic blocks!");
       BlockNum = ParseInstructionList(F);
       break;
     }
@@ -1513,7 +1519,7 @@
     default:
       At += Size;
       if (OldAt > At) 
-        throw std::string("Wrapped around reading bytecode.");
+        error("Wrapped around reading bytecode.");
       break;
     }
     BlockEnd = MyEnd;
@@ -1524,7 +1530,7 @@
 
   // Make sure there were no references to non-existant basic blocks.
   if (BlockNum != ParsedBasicBlocks.size())
-    throw std::string("Illegal basic block operand reference");
+    error("Illegal basic block operand reference");
 
   ParsedBasicBlocks.clear();
 
@@ -1580,7 +1586,7 @@
 /// ParseAllFunctionBodies to get handler events for the functions.
 void BytecodeReader::ParseFunctionLazily() {
   if (FunctionSignatureList.empty())
-    throw std::string("FunctionSignatureList empty!");
+    error("FunctionSignatureList empty!");
 
   Function *Func = FunctionSignatureList.back();
   FunctionSignatureList.pop_back();
@@ -1604,13 +1610,13 @@
 
   // Make sure we found it
   if ( Fi == LazyFunctionLoadMap.end() ) {
-    PARSE_ERROR("Unrecognized function of type " << Func->getType()->getDescription());
+    error("Unrecognized function of type " + Func->getType()->getDescription());
     return;
   }
 
   BlockStart = At = Fi->second.Buf;
   BlockEnd = Fi->second.EndBuf;
-  assert(Fi->first == Func);
+  assert(Fi->first == Func && "Found wrong function?");
 
   LazyFunctionLoadMap.erase(Fi);
 
@@ -1660,8 +1666,8 @@
     // VarType Fields: bit0 = isConstant, bit1 = hasInitializer, bit2,3,4 =
     // Linkage, bit4+ = slot#
     unsigned SlotNo = VarType >> 5;
-    bool isTypeType = sanitizeTypeId(SlotNo);
-    assert(!isTypeType && "Invalid type (type type) for global var!");
+    if ( sanitizeTypeId(SlotNo) )
+      error("Invalid type (type type) for global var!");
     unsigned LinkageID = (VarType >> 2) & 7;
     bool isConstant = VarType & 1;
     bool hasInitializer = VarType & 2;
@@ -1674,18 +1680,18 @@
     case 3: Linkage = GlobalValue::InternalLinkage;  break;
     case 4: Linkage = GlobalValue::LinkOnceLinkage;  break;
     default: 
-      PARSE_ERROR("Unknown linkage type: " << LinkageID);
+      error("Unknown linkage type: " + utostr(LinkageID));
       Linkage = GlobalValue::InternalLinkage;
       break;
     }
 
     const Type *Ty = getType(SlotNo);
     if ( !Ty ) {
-      PARSE_ERROR("Global has no type! SlotNo=" << SlotNo);
+      error("Global has no type! SlotNo=" + utostr(SlotNo));
     }
 
     if ( !isa<PointerType>(Ty)) {
-      PARSE_ERROR("Global not a pointer type! Ty= " << Ty->getDescription());
+      error("Global not a pointer type! Ty= " + Ty->getDescription());
     }
 
     const Type *ElTy = cast<PointerType>(Ty)->getElementType();
@@ -1710,14 +1716,15 @@
 
   // Read the function objects for all of the functions that are coming
   unsigned FnSignature = 0;
-  bool isTypeType = read_typeid(FnSignature);
-  assert(!isTypeType && "Invalid function type (type type) found");
+  if ( read_typeid(FnSignature) )
+    error("Invalid function type (type type) found");
+
   while (FnSignature != Type::VoidTyID) { // List is terminated by Void
     const Type *Ty = getType(FnSignature);
     if (!isa<PointerType>(Ty) ||
         !isa<FunctionType>(cast<PointerType>(Ty)->getElementType())) {
-      PARSE_ERROR( "Function not a pointer to function type! Ty = " +
-                        Ty->getDescription());
+      error("Function not a pointer to function type! Ty = " + 
+	    Ty->getDescription());
       // FIXME: what should Ty be if handler continues?
     }
 
@@ -1736,8 +1743,8 @@
     if (Handler) Handler->handleFunctionDeclaration(Func);
 
     // Get Next function signature
-    isTypeType = read_typeid(FnSignature);
-    assert(!isTypeType && "Invalid function type (type type) found");
+    if ( read_typeid(FnSignature) )
+      error("Invalid function type (type type) found");
   }
 
   if (hasInconsistentModuleGlobalInfo)
@@ -1806,7 +1813,7 @@
     break;
 
   default:
-    PARSE_ERROR("Unknown bytecode version number: " << RevisionNum);
+    error("Unknown bytecode version number: " + itostr(RevisionNum));
   }
 
   if (hasNoEndianness) Endianness  = Module::AnyEndianness;
@@ -1836,7 +1843,7 @@
 
     case BytecodeFormat::GlobalTypePlane:
       if ( SeenGlobalTypePlane )
-        throw std::string("Two GlobalTypePlane Blocks Encountered!");
+        error("Two GlobalTypePlane Blocks Encountered!");
 
       ParseGlobalTypes();
       SeenGlobalTypePlane = true;
@@ -1844,7 +1851,7 @@
 
     case BytecodeFormat::ModuleGlobalInfo: 
       if ( SeenModuleGlobalInfo )
-        throw std::string("Two ModuleGlobalInfo Blocks Encountered!");
+        error("Two ModuleGlobalInfo Blocks Encountered!");
       ParseModuleGlobalInfo();
       SeenModuleGlobalInfo = true;
       break;
@@ -1864,7 +1871,7 @@
     default:
       At += Size;
       if (OldAt > At) {
-        PARSE_ERROR("Unexpected Block of Type" << Type << "encountered!" );
+        error("Unexpected Block of Type #" + utostr(Type) + " encountered!" );
       }
       break;
     }
@@ -1886,18 +1893,17 @@
     unsigned TypeSlot = getTypeSlot(GVType->getElementType());
     if (Constant *CV = getConstantValue(TypeSlot, Slot)) {
       if (GV->hasInitializer()) 
-        throw std::string("Global *already* has an initializer?!");
+        error("Global *already* has an initializer?!");
       if (Handler) Handler->handleGlobalInitializer(GV,CV);
       GV->setInitializer(CV);
     } else
-      throw std::string("Cannot find initializer value.");
+      error("Cannot find initializer value.");
   }
 
   /// Make sure we pulled them all out. If we didn't then there's a declaration
   /// but a missing body. That's not allowed.
   if (!FunctionSignatureList.empty())
-    throw std::string(
-      "Function declared, but bytecode stream ended before definition");
+    error("Function declared, but bytecode stream ended before definition");
 }
 
 /// This function completely parses a bytecode buffer given by the \p Buf
@@ -1919,7 +1925,7 @@
     // Read and check signature...
     unsigned Sig = read_uint();
     if (Sig != ('l' | ('l' << 8) | ('v' << 16) | ('m' << 24))) {
-      PARSE_ERROR("Invalid bytecode signature: " << Sig);
+      error("Invalid bytecode signature: " + utostr(Sig));
     }
 
 
@@ -1930,12 +1936,12 @@
     unsigned Type, Size;
     read_block(Type, Size);
     if ( Type != BytecodeFormat::Module ) {
-      PARSE_ERROR("Expected Module Block! At: " << unsigned(intptr_t(At))
-        << ", Type:" << Type << ", Size:" << Size);
+      error("Expected Module Block! Type:" + utostr(Type) + ", Size:" 
+	    + utostr(Size));
     }
     if ( At + Size != MemEnd ) {
-      PARSE_ERROR("Invalid Top Level Block Length! At: " 
-        << unsigned(intptr_t(At)) << ", Type:" << Type << ", Size:" << Size);
+      error("Invalid Top Level Block Length! Type:" + utostr(Type)
+	          + ", Size:" + utostr(Size));
     }
 
     // Parse the module contents
@@ -1943,7 +1949,7 @@
 
     // Check for missing functions
     if ( hasFunctions() )
-      throw std::string("Function expected, but bytecode stream ended!");
+      error("Function expected, but bytecode stream ended!");
 
     // Process all the function bodies now, if requested
     if ( processFunctions )
