diff --git a/llvm/lib/Bytecode/Reader/ConstantReader.cpp b/llvm/lib/Bytecode/Reader/ConstantReader.cpp
index 0ad38b4..80c6fc3 100644
--- a/llvm/lib/Bytecode/Reader/ConstantReader.cpp
+++ b/llvm/lib/Bytecode/Reader/ConstantReader.cpp
@@ -13,8 +13,8 @@
 #include "llvm/Constants.h"
 #include <algorithm>
 
-const Type *BytecodeParser::parseTypeConstant(const uchar *&Buf,
-					      const uchar *EndBuf) {
+const Type *BytecodeParser::parseTypeConstant(const unsigned char *&Buf,
+					      const unsigned char *EndBuf) {
   unsigned PrimType;
   if (read_vbr(Buf, EndBuf, PrimType)) return 0;
 
@@ -131,7 +131,8 @@
 // with a new resolved concrete type.
 //
 void debug_type_tables();
-bool BytecodeParser::parseTypeConstants(const uchar *&Buf, const uchar *EndBuf,
+bool BytecodeParser::parseTypeConstants(const unsigned char *&Buf,
+                                        const unsigned char *EndBuf,
 					TypeValuesListTy &Tab,
 					unsigned NumEntries) {
   assert(Tab.size() == 0 && "should not have read type constants in before!");
@@ -173,7 +174,8 @@
 }
 
 
-bool BytecodeParser::parseConstantValue(const uchar *&Buf, const uchar *EndBuf,
+bool BytecodeParser::parseConstantValue(const unsigned char *&Buf,
+                                        const unsigned char *EndBuf,
                                         const Type *Ty, Constant *&V) {
 
   // We must check for a ConstantExpr before switching by type because
@@ -379,12 +381,14 @@
   return false;
 }
 
-bool BytecodeParser::ParseGlobalTypes(const uchar *&Buf, const uchar *EndBuf) {
+bool BytecodeParser::ParseGlobalTypes(const unsigned char *&Buf,
+                                      const unsigned char *EndBuf) {
   ValueTable T;
   return ParseConstantPool(Buf, EndBuf, T, ModuleTypeValues);
 }
 
-bool BytecodeParser::ParseConstantPool(const uchar *&Buf, const uchar *EndBuf,
+bool BytecodeParser::ParseConstantPool(const unsigned char *&Buf,
+                                       const unsigned char *EndBuf,
 				       ValueTable &Tab, 
 				       TypeValuesListTy &TypeTab) {
   while (Buf < EndBuf) {
diff --git a/llvm/lib/Bytecode/Reader/InstructionReader.cpp b/llvm/lib/Bytecode/Reader/InstructionReader.cpp
index 2fc52ad..d652af7 100644
--- a/llvm/lib/Bytecode/Reader/InstructionReader.cpp
+++ b/llvm/lib/Bytecode/Reader/InstructionReader.cpp
@@ -17,7 +17,8 @@
 #include "llvm/iPHINode.h"
 #include "llvm/iOther.h"
 
-bool BytecodeParser::ParseRawInst(const uchar *&Buf, const uchar *EndBuf, 
+bool BytecodeParser::ParseRawInst(const unsigned char *&Buf,
+                                  const unsigned char *EndBuf, 
 				  RawInst &Result) {
   unsigned Op, Typ;
   if (read(Buf, EndBuf, Op)) return true;
@@ -113,7 +114,8 @@
 }
 
 
-bool BytecodeParser::ParseInstruction(const uchar *&Buf, const uchar *EndBuf,
+bool BytecodeParser::ParseInstruction(const unsigned char *&Buf,
+                                      const unsigned char *EndBuf,
 				      Instruction *&Res,
                                       BasicBlock *BB /*HACK*/) {
   RawInst Raw;
diff --git a/llvm/lib/Bytecode/Reader/Reader.cpp b/llvm/lib/Bytecode/Reader/Reader.cpp
index fd4fd6f..7c0e6d4 100644
--- a/llvm/lib/Bytecode/Reader/Reader.cpp
+++ b/llvm/lib/Bytecode/Reader/Reader.cpp
@@ -215,7 +215,8 @@
   return Error;
 }
 
-bool BytecodeParser::ParseBasicBlock(const uchar *&Buf, const uchar *EndBuf, 
+bool BytecodeParser::ParseBasicBlock(const unsigned char *&Buf,
+                                     const unsigned char *EndBuf, 
 				     BasicBlock *&BB) {
   BB = new BasicBlock();
 
@@ -237,7 +238,8 @@
   return false;
 }
 
-bool BytecodeParser::ParseSymbolTable(const uchar *&Buf, const uchar *EndBuf,
+bool BytecodeParser::ParseSymbolTable(const unsigned char *&Buf,
+                                      const unsigned char *EndBuf,
 				      SymbolTable *ST) {
   while (Buf < EndBuf) {
     // Symtab block header: [num entries][type id number]
@@ -294,7 +296,8 @@
 }
 
 
-bool BytecodeParser::ParseFunction(const uchar *&Buf, const uchar *EndBuf) {
+bool BytecodeParser::ParseFunction(const unsigned char *&Buf,
+                                   const unsigned char *EndBuf) {
   // Clear out the local values table...
   if (FunctionSignatureList.empty()) {
     Error = "Function found, but FunctionSignatureList empty!";
@@ -390,7 +393,8 @@
   return false;
 }
 
-bool BytecodeParser::ParseModuleGlobalInfo(const uchar *&Buf, const uchar *End){
+bool BytecodeParser::ParseModuleGlobalInfo(const unsigned char *&Buf,
+                                           const unsigned char *End){
   if (!FunctionSignatureList.empty()) {
     Error = "Two ModuleGlobalInfo packets found!";
     return true;  // Two ModuleGlobal blocks?
@@ -488,7 +492,8 @@
   return false;
 }
 
-bool BytecodeParser::ParseVersionInfo(const uchar *&Buf, const uchar *EndBuf) {
+bool BytecodeParser::ParseVersionInfo(const unsigned char *&Buf,
+                                      const unsigned char *EndBuf) {
   unsigned Version;
   if (read_vbr(Buf, EndBuf, Version)) return true;
 
@@ -538,7 +543,8 @@
   return false;
 }
 
-bool BytecodeParser::ParseModule(const uchar *Buf, const uchar *EndBuf) {
+bool BytecodeParser::ParseModule(const unsigned char *Buf,
+                                 const unsigned char *EndBuf) {
   unsigned Type, Size;
   if (readBlock(Buf, EndBuf, Type, Size)) return true;
   if (Type != BytecodeFormat::Module || Buf+Size != EndBuf) {
@@ -625,7 +631,8 @@
   return 0;
 }
 
-Module *BytecodeParser::ParseBytecode(const uchar *Buf, const uchar *EndBuf,
+Module *BytecodeParser::ParseBytecode(const unsigned char *Buf,
+                                      const unsigned char *EndBuf,
                                       const std::string &ModuleID) {
   unsigned Sig;
   // Read and check signature...
@@ -703,7 +710,7 @@
     munmap((char*)Buffer, Length);
   } else {                              // Read from stdin
     int BlockSize;
-    uchar Buffer[4096*4];
+    unsigned char Buffer[4096*4];
     std::vector<unsigned char> FileData;
 
     // Read in all of the data from stdin, we cannot mmap stdin...
@@ -719,9 +726,10 @@
 
 #define ALIGN_PTRS 0
 #if ALIGN_PTRS
-    uchar *Buf = (uchar*)mmap(0, FileData.size(), PROT_READ|PROT_WRITE, 
-			      MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
-    assert((Buf != (uchar*)-1) && "mmap returned error!");
+    unsigned char *Buf =
+      (unsigned char*)mmap(0, FileData.size(), PROT_READ|PROT_WRITE, 
+                           MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
+    assert((Buf != (unsigned char*)-1) && "mmap returned error!");
     memcpy(Buf, &FileData[0], FileData.size());
 #else
     unsigned char *Buf = &FileData[0];
diff --git a/llvm/lib/Bytecode/Reader/ReaderInternals.h b/llvm/lib/Bytecode/Reader/ReaderInternals.h
index a8528e4..6709bc2 100644
--- a/llvm/lib/Bytecode/Reader/ReaderInternals.h
+++ b/llvm/lib/Bytecode/Reader/ReaderInternals.h
@@ -24,8 +24,6 @@
 #define BCR_TRACE(n, X)
 #endif
 
-typedef unsigned char uchar;
-
 struct RawInst {       // The raw fields out of the bytecode stream...
   unsigned NumOperands;
   unsigned Opcode;
@@ -52,7 +50,7 @@
     freeTable(ModuleValues);
   }
 
-  Module *ParseBytecode(const uchar *Buf, const uchar *EndBuf,
+  Module *ParseBytecode(const unsigned char *Buf, const unsigned char *EndBuf,
                         const std::string &ModuleID);
 
   std::string getError() const { return Error; }
@@ -128,24 +126,29 @@
     }
   }
 
-  bool ParseModule          (const uchar * Buf, const uchar *End);
-  bool ParseVersionInfo     (const uchar *&Buf, const uchar *End);
-  bool ParseModuleGlobalInfo(const uchar *&Buf, const uchar *End);
-  bool ParseSymbolTable   (const uchar *&Buf, const uchar *End, SymbolTable *);
-  bool ParseFunction      (const uchar *&Buf, const uchar *End);
-  bool ParseBasicBlock    (const uchar *&Buf, const uchar *End, BasicBlock *&);
-  bool ParseInstruction   (const uchar *&Buf, const uchar *End, Instruction *&,
-                           BasicBlock *BB /*HACK*/);
-  bool ParseRawInst       (const uchar *&Buf, const uchar *End, RawInst &);
+  bool ParseModule        (const unsigned char * Buf, const unsigned char *End);
+  bool ParseVersionInfo   (const unsigned char *&Buf, const unsigned char *End);
+  bool ParseModuleGlobalInfo(const unsigned char *&Buf, const unsigned char *E);
+  bool ParseSymbolTable   (const unsigned char *&Buf, const unsigned char *End,
+                           SymbolTable *);
+  bool ParseFunction      (const unsigned char *&Buf, const unsigned char *End);
+  bool ParseBasicBlock    (const unsigned char *&Buf, const unsigned char *End,
+                           BasicBlock *&);
+  bool ParseInstruction   (const unsigned char *&Buf, const unsigned char *End,
+                           Instruction *&, BasicBlock *BB /*HACK*/);
+  bool ParseRawInst       (const unsigned char *&Buf, const unsigned char *End,
+                           RawInst &);
 
-  bool ParseGlobalTypes(const uchar *&Buf, const uchar *EndBuf);
-  bool ParseConstantPool(const uchar *&Buf, const uchar *EndBuf,
+  bool ParseGlobalTypes(const unsigned char *&Buf, const unsigned char *EndBuf);
+  bool ParseConstantPool(const unsigned char *&Buf, const unsigned char *EndBuf,
 			 ValueTable &Tab, TypeValuesListTy &TypeTab);
-  bool parseConstantValue(const uchar *&Buf, const uchar *End,
+  bool parseConstantValue(const unsigned char *&Buf, const unsigned char *End,
                           const Type *Ty, Constant *&V);
-  bool parseTypeConstants(const uchar *&Buf, const uchar *EndBuf,
+  bool parseTypeConstants(const unsigned char *&Buf,
+                          const unsigned char *EndBuf,
 			  TypeValuesListTy &Tab, unsigned NumEntries);
-  const Type *parseTypeConstant(const uchar *&Buf, const uchar *EndBuf);
+  const Type *parseTypeConstant(const unsigned char *&Buf,
+                                const unsigned char *EndBuf);
 
   Value      *getValue(const Type *Ty, unsigned num, bool Create = true);
   const Type *getType(unsigned ID);
@@ -212,7 +215,8 @@
   }
 }
 
-static inline bool readBlock(const uchar *&Buf, const uchar *EndBuf, 
+static inline bool readBlock(const unsigned char *&Buf,
+                             const unsigned char *EndBuf, 
 			     unsigned &Type, unsigned &Size) {
 #if DEBUG_OUTPUT
   bool Result = read(Buf, EndBuf, Type) || read(Buf, EndBuf, Size);
