diff --git a/examples/ModuleMaker/ModuleMaker.cpp b/examples/ModuleMaker/ModuleMaker.cpp
index 30f63bb..0c9a618 100644
--- a/examples/ModuleMaker/ModuleMaker.cpp
+++ b/examples/ModuleMaker/ModuleMaker.cpp
@@ -53,7 +53,7 @@
   BB->getInstList().push_back(new ReturnInst(Add));
 
   // Output the bytecode file to stdout
-  WriteBytecodeToFile(M, llvm_cout);
+  WriteBytecodeToFile(M, cout);
 
   // Delete the module and all of its contents.
   delete M;
diff --git a/include/llvm/ADT/BitSetVector.h b/include/llvm/ADT/BitSetVector.h
index 67e3a52..5d1fc86 100644
--- a/include/llvm/ADT/BitSetVector.h
+++ b/include/llvm/ADT/BitSetVector.h
@@ -29,7 +29,6 @@
 #include <bitset>
 #include <vector>
 #include <functional>
-#include <ostream>
 
 namespace llvm {
 
@@ -174,11 +173,11 @@
   ///
   ///  Printing and debugging support
   ///
-  void print(llvm_ostream &O) const {
+  void print(OStream &O) const {
     if (O.stream()) print(*O.stream());
   }
   void print(std::ostream &O) const;
-  void dump() const { print(llvm_cerr); }
+  void dump() const { print(cerr); }
 
 public:
   //
@@ -235,6 +234,9 @@
       return (I.bitvec == bitvec &&
               I.currentWord == currentWord && I.currentBit == currentBit);
     }
+    bool operator!=(const iterator& I) {
+      return !(*this == I);
+    }
 
   protected:
     static iterator begin(BitSetVector& _bitvec) { return iterator(_bitvec); }
@@ -252,7 +254,7 @@
     O << "<" << (*I) << ">" << (I+1 == E? "\n" : ", ");
 }
 
-inline llvm_ostream& operator<< (llvm_ostream& O, const BitSetVector& bset) {
+inline OStream& operator<< (OStream& O, const BitSetVector& bset) {
   bset.print(O);
   return O;
 }
diff --git a/include/llvm/ADT/EquivalenceClasses.h b/include/llvm/ADT/EquivalenceClasses.h
index b915c2a..7d305cb 100644
--- a/include/llvm/ADT/EquivalenceClasses.h
+++ b/include/llvm/ADT/EquivalenceClasses.h
@@ -43,8 +43,8 @@
 ///    if (!I->isLeader()) continue;   // Ignore non-leader sets.
 ///    for (EquivalenceClasses<int>::member_iterator MI = EC.member_begin(I);
 ///         MI != EC.member_end(); ++MI)   // Loop over members in this set.
-///      llvm_cerr << *MI << " ";  // Print member.
-///    llvm_cerr << "\n";   // Finish set.
+///      cerr << *MI << " ";  // Print member.
+///    cerr << "\n";   // Finish set.
 ///  }
 ///
 /// This example prints:
diff --git a/include/llvm/Analysis/AliasSetTracker.h b/include/llvm/Analysis/AliasSetTracker.h
index c4273ac..5fcda16 100644
--- a/include/llvm/Analysis/AliasSetTracker.h
+++ b/include/llvm/Analysis/AliasSetTracker.h
@@ -156,7 +156,7 @@
   iterator end()   const { return iterator(); }
   bool empty() const { return PtrList == 0; }
 
-  void print(llvm_ostream &OS) const {
+  void print(OStream &OS) const {
     if (OS.stream()) print(*OS.stream());
   }
   void print(std::ostream &OS) const;
@@ -248,7 +248,7 @@
   bool aliasesCallSite(CallSite CS, AliasAnalysis &AA) const;
 };
 
-inline llvm_ostream& operator<<(llvm_ostream &OS, const AliasSet &AS) {
+inline OStream& operator<<(OStream &OS, const AliasSet &AS) {
   AS.print(OS);
   return OS;
 }
@@ -361,7 +361,7 @@
   iterator begin() { return AliasSets.begin(); }
   iterator end()   { return AliasSets.end(); }
 
-  void print(llvm_ostream &OS) const {
+  void print(OStream &OS) const {
     if (OS.stream()) print(*OS.stream());
   }
   void print(std::ostream &OS) const;
@@ -390,7 +390,7 @@
   AliasSet *findAliasSetForCallSite(CallSite CS);
 };
 
-inline llvm_ostream& operator<<(llvm_ostream &OS, const AliasSetTracker &AST) {
+inline OStream& operator<<(OStream &OS, const AliasSetTracker &AST) {
   AST.print(OS);
   return OS;
 }
diff --git a/include/llvm/Analysis/CallGraph.h b/include/llvm/Analysis/CallGraph.h
index f29aef3..1f737da 100644
--- a/include/llvm/Analysis/CallGraph.h
+++ b/include/llvm/Analysis/CallGraph.h
@@ -152,7 +152,7 @@
   ///
   void initialize(Module &M);
 
-  void print(llvm_ostream &o, const Module *M) const {
+  void print(OStream &o, const Module *M) const {
     if (o.stream()) print(*o.stream(), M);
   }
   virtual void print(std::ostream &o, const Module *M) const;
@@ -201,7 +201,7 @@
   /// dump - Print out this call graph node.
   ///
   void dump() const;
-  void print(llvm_ostream &OS) const {
+  void print(OStream &OS) const {
     if (OS.stream()) print(*OS.stream());
   }
   void print(std::ostream &OS) const;
diff --git a/include/llvm/Analysis/DataStructure/DSGraph.h b/include/llvm/Analysis/DataStructure/DSGraph.h
index 6185358..1063efa 100644
--- a/include/llvm/Analysis/DataStructure/DSGraph.h
+++ b/include/llvm/Analysis/DataStructure/DSGraph.h
@@ -378,12 +378,12 @@
 
   /// print - Print a dot graph to the specified ostream...
   ///
-  void print(llvm_ostream &O) const {
+  void print(OStream &O) const {
     if (O.stream()) print(*O.stream());
   }
   void print(std::ostream &O) const;
 
-  /// dump - call print(llvm_cerr), for use from the debugger...
+  /// dump - call print(cerr), for use from the debugger...
   ///
   void dump() const;
 
diff --git a/include/llvm/Analysis/DataStructure/DSNode.h b/include/llvm/Analysis/DataStructure/DSNode.h
index 5eb927b..abcca35 100644
--- a/include/llvm/Analysis/DataStructure/DSNode.h
+++ b/include/llvm/Analysis/DataStructure/DSNode.h
@@ -362,7 +362,7 @@
   ///
   void forwardNode(DSNode *To, unsigned Offset);
 
-  void print(llvm_ostream &O, const DSGraph *G) const {
+  void print(OStream &O, const DSGraph *G) const {
     if (O.stream()) print(*O.stream(), G);
   }
   void print(std::ostream &O, const DSGraph *G) const;
diff --git a/include/llvm/Analysis/LoopInfo.h b/include/llvm/Analysis/LoopInfo.h
index 2e6d247..238a0f6 100644
--- a/include/llvm/Analysis/LoopInfo.h
+++ b/include/llvm/Analysis/LoopInfo.h
@@ -217,7 +217,7 @@
   /// the mapping in the LoopInfo class.
   void removeBlockFromLoop(BasicBlock *BB);
 
-  void print(llvm_ostream &O, unsigned Depth = 0) const {
+  void print(OStream &O, unsigned Depth = 0) const {
     if (O.stream()) print(*O.stream(), Depth);
   }
   void print(std::ostream &O, unsigned Depth = 0) const;
@@ -283,7 +283,7 @@
   virtual bool runOnFunction(Function &F);
 
   virtual void releaseMemory();
-  void print(llvm_ostream &O, const Module* = 0) const {
+  void print(OStream &O, const Module* = 0) const {
     if (O.stream()) print(*O.stream());
   }
   void print(std::ostream &O, const Module* = 0) const;
diff --git a/include/llvm/Analysis/ScalarEvolution.h b/include/llvm/Analysis/ScalarEvolution.h
index f1497cd..4eb0bb3 100644
--- a/include/llvm/Analysis/ScalarEvolution.h
+++ b/include/llvm/Analysis/ScalarEvolution.h
@@ -97,7 +97,7 @@
     /// print - Print out the internal representation of this scalar to the
     /// specified stream.  This should really only be used for debugging
     /// purposes.
-    void print(llvm_ostream &OS) const {
+    void print(OStream &OS) const {
       if (OS.stream()) print(*OS.stream());
     }
     virtual void print(std::ostream &OS) const = 0;
@@ -107,7 +107,7 @@
     void dump() const;
   };
 
-  inline llvm_ostream &operator<<(llvm_ostream &OS, const SCEV &S) {
+  inline OStream &operator<<(OStream &OS, const SCEV &S) {
     S.print(OS);
     return OS;
   }
@@ -128,7 +128,7 @@
     virtual bool isLoopInvariant(const Loop *L) const;
     virtual const Type *getType() const;
     virtual bool hasComputableLoopEvolution(const Loop *L) const;
-    void print(llvm_ostream &OS) const {
+    void print(OStream &OS) const {
       if (OS.stream()) print(*OS.stream());
     }
     virtual void print(std::ostream &OS) const;
@@ -242,7 +242,7 @@
     virtual bool runOnFunction(Function &F);
     virtual void releaseMemory();
     virtual void getAnalysisUsage(AnalysisUsage &AU) const;
-    void print(llvm_ostream &OS, const Module* = 0) const {
+    void print(OStream &OS, const Module* = 0) const {
       if (OS.stream()) print(*OS.stream());
     }
     virtual void print(std::ostream &OS, const Module* = 0) const;
diff --git a/include/llvm/Analysis/Trace.h b/include/llvm/Analysis/Trace.h
index ad4f37c..b26101d 100644
--- a/include/llvm/Analysis/Trace.h
+++ b/include/llvm/Analysis/Trace.h
@@ -18,11 +18,11 @@
 #ifndef LLVM_ANALYSIS_TRACE_H
 #define LLVM_ANALYSIS_TRACE_H
 
+#include "llvm/Support/Streams.h"
 #include <vector>
 #include <cassert>
 
 namespace llvm {
-  class llvm_ostream;
   class BasicBlock;
   class Function;
   class Module;
@@ -106,7 +106,7 @@
 
   /// print - Write trace to output stream.
   ///
-  void print (llvm_ostream &O) const;
+  void print (OStream &O) const;
 
   /// dump - Debugger convenience method; writes trace to standard error
   /// output stream.
diff --git a/include/llvm/Assembly/PrintModulePass.h b/include/llvm/Assembly/PrintModulePass.h
index 770682d..cc9bca9 100644
--- a/include/llvm/Assembly/PrintModulePass.h
+++ b/include/llvm/Assembly/PrintModulePass.h
@@ -25,13 +25,12 @@
 namespace llvm {
 
 class PrintModulePass : public ModulePass {
-  llvm_ostream *Out;      // ostream to print on
+  OStream *Out;           // ostream to print on
   bool DeleteStream;      // Delete the ostream in our dtor?
 public:
-  PrintModulePass() : Out(&llvm_cerr), DeleteStream(false) {}
-  PrintModulePass(llvm_ostream *o, bool DS = false)
-    : Out(o), DeleteStream(DS) {
-  }
+  PrintModulePass() : Out(&cerr), DeleteStream(false) {}
+  PrintModulePass(OStream *o, bool DS = false)
+    : Out(o), DeleteStream(DS) {}
 
   ~PrintModulePass() {
     if (DeleteStream) delete Out;
@@ -49,14 +48,13 @@
 
 class PrintFunctionPass : public FunctionPass {
   std::string Banner;     // String to print before each function
-  llvm_ostream *Out;      // ostream to print on
+  OStream *Out;           // ostream to print on
   bool DeleteStream;      // Delete the ostream in our dtor?
 public:
-  PrintFunctionPass() : Banner(""), Out(&llvm_cerr), DeleteStream(false) {}
-  PrintFunctionPass(const std::string &B, llvm_ostream *o = &llvm_cout,
+  PrintFunctionPass() : Banner(""), Out(&cerr), DeleteStream(false) {}
+  PrintFunctionPass(const std::string &B, OStream *o = &cout,
                     bool DS = false)
-    : Banner(B), Out(o), DeleteStream(DS) {
-  }
+    : Banner(B), Out(o), DeleteStream(DS) {}
 
   inline ~PrintFunctionPass() {
     if (DeleteStream) delete Out;
diff --git a/include/llvm/Bytecode/WriteBytecodePass.h b/include/llvm/Bytecode/WriteBytecodePass.h
index a634812..c4e2c5d 100644
--- a/include/llvm/Bytecode/WriteBytecodePass.h
+++ b/include/llvm/Bytecode/WriteBytecodePass.h
@@ -17,19 +17,18 @@
 
 #include "llvm/Pass.h"
 #include "llvm/Bytecode/Writer.h"
+#include "llvm/Support/Streams.h"
 
 namespace llvm {
 
-class llvm_ostream;
-
 class WriteBytecodePass : public ModulePass {
-  llvm_ostream *Out;           // ostream to print on
+  OStream *Out;                 // ostream to print on
   bool DeleteStream;
   bool CompressFile;
 public:
   WriteBytecodePass()
-    : Out(&llvm_cout), DeleteStream(false), CompressFile(true) {}
-  WriteBytecodePass(llvm_ostream *o, bool DS = false, bool CF = true)
+    : Out(&cout), DeleteStream(false), CompressFile(true) {}
+  WriteBytecodePass(OStream *o, bool DS = false, bool CF = true)
     : Out(o), DeleteStream(DS), CompressFile(CF) {}
 
   inline ~WriteBytecodePass() {
diff --git a/include/llvm/Bytecode/Writer.h b/include/llvm/Bytecode/Writer.h
index 374e5df..c87cc92 100644
--- a/include/llvm/Bytecode/Writer.h
+++ b/include/llvm/Bytecode/Writer.h
@@ -15,13 +15,14 @@
 #ifndef LLVM_BYTECODE_WRITER_H
 #define LLVM_BYTECODE_WRITER_H
 
+#include "llvm/Support/Streams.h"
+
 namespace llvm {
-  class llvm_ostream;
   class Module;
   /// WriteBytecodeToFile - Write the specified module to the specified output
   /// stream.  If compress is set to true, try to use compression when writing
   /// out the file.  This can never fail if M is a well-formed module.
-  void WriteBytecodeToFile(const Module *M, llvm_ostream &Out,
+  void WriteBytecodeToFile(const Module *M, OStream &Out,
                            bool compress = true);
 } // End llvm namespace
 
diff --git a/include/llvm/CodeGen/LiveInterval.h b/include/llvm/CodeGen/LiveInterval.h
index 16fcd12..03a0f57 100644
--- a/include/llvm/CodeGen/LiveInterval.h
+++ b/include/llvm/CodeGen/LiveInterval.h
@@ -62,7 +62,7 @@
   };
 
   std::ostream& operator<<(std::ostream& os, const LiveRange &LR);
-  inline llvm_ostream& operator<<(llvm_ostream& os, const LiveRange &LR) {
+  inline OStream& operator<<(OStream& os, const LiveRange &LR) {
     if (os.stream()) *os.stream() << LR;
     return os;
   }
@@ -258,9 +258,9 @@
       return beginNumber() < other.beginNumber();
     }
 
-    void print(llvm_ostream OS, const MRegisterInfo *MRI = 0) const;
+    void print(OStream OS, const MRegisterInfo *MRI = 0) const;
     void print(std::ostream &OS, const MRegisterInfo *MRI = 0) const {
-      print(llvm_ostream(OS), MRI);
+      print(OStream(OS), MRI);
     }
     void dump() const;
 
@@ -271,7 +271,7 @@
     LiveInterval& operator=(const LiveInterval& rhs); // DO NOT IMPLEMENT
   };
 
-  inline llvm_ostream &operator<<(llvm_ostream &OS, const LiveInterval &LI) {
+  inline OStream &operator<<(OStream &OS, const LiveInterval &LI) {
     LI.print(OS);
     return OS;
   }
diff --git a/include/llvm/CodeGen/MachineBasicBlock.h b/include/llvm/CodeGen/MachineBasicBlock.h
index f714c73..c848b06 100644
--- a/include/llvm/CodeGen/MachineBasicBlock.h
+++ b/include/llvm/CodeGen/MachineBasicBlock.h
@@ -189,7 +189,7 @@
 
   // Debugging methods.
   void dump() const;
-  void print(llvm_ostream &OS) const {
+  void print(OStream &OS) const {
     if (OS.stream()) print(*OS.stream());
   }
   void print(std::ostream &OS) const;
@@ -226,7 +226,7 @@
 };
 
 std::ostream& operator<<(std::ostream &OS, const MachineBasicBlock &MBB);
-inline llvm_ostream& operator<<(llvm_ostream &OS, const MachineBasicBlock &MBB){
+inline OStream& operator<<(OStream &OS, const MachineBasicBlock &MBB){
   if (OS.stream()) *OS.stream() << MBB;
   return OS;
 }
diff --git a/include/llvm/CodeGen/MachineConstantPool.h b/include/llvm/CodeGen/MachineConstantPool.h
index 6bb2665..bc701f6 100644
--- a/include/llvm/CodeGen/MachineConstantPool.h
+++ b/include/llvm/CodeGen/MachineConstantPool.h
@@ -49,14 +49,14 @@
 
   /// print - Implement operator<<...
   ///
-  void print(llvm_ostream &O) const {
+  void print(OStream &O) const {
     if (O.stream()) print(*O.stream());
   }
   virtual void print(std::ostream &O) const = 0;
 };
 
-inline llvm_ostream &operator<<(llvm_ostream &OS,
-                                const MachineConstantPoolValue &V) {
+inline OStream &operator<<(OStream &OS,
+                           const MachineConstantPoolValue &V) {
   V.print(OS);
   return OS;
 }
@@ -143,7 +143,7 @@
   /// print - Used by the MachineFunction printer to print information about
   /// constant pool objects.  Implemented in MachineFunction.cpp
   ///
-  void print(llvm_ostream &OS) const {
+  void print(OStream &OS) const {
     if (OS.stream()) print(*OS.stream());
   }
   void print(std::ostream &OS) const;
diff --git a/include/llvm/CodeGen/MachineInstr.h b/include/llvm/CodeGen/MachineInstr.h
index 2185d84..daa3974 100644
--- a/include/llvm/CodeGen/MachineInstr.h
+++ b/include/llvm/CodeGen/MachineInstr.h
@@ -285,7 +285,7 @@
     IsDead = false;
   }
 
-  friend llvm_ostream& operator<<(llvm_ostream& os, const MachineOperand& mop) {
+  friend OStream& operator<<(OStream& os, const MachineOperand& mop) {
     if (os.stream()) *os.stream() << mop;
     return os;
   }
@@ -397,12 +397,12 @@
   //
   // Debugging support
   //
-  void print(llvm_ostream &OS, const TargetMachine *TM) const {
+  void print(OStream &OS, const TargetMachine *TM) const {
     if (OS.stream()) print(*OS.stream(), TM);
   }
   void print(std::ostream &OS, const TargetMachine *TM) const;
   void dump() const;
-  friend llvm_ostream& operator<<(llvm_ostream& os, const MachineInstr& minstr){
+  friend OStream& operator<<(OStream& os, const MachineInstr& minstr){
     if (os.stream()) *os.stream() << minstr;
     return os;
   }
diff --git a/include/llvm/CodeGen/SchedGraphCommon.h b/include/llvm/CodeGen/SchedGraphCommon.h
index b4cee96..7da2f73 100644
--- a/include/llvm/CodeGen/SchedGraphCommon.h
+++ b/include/llvm/CodeGen/SchedGraphCommon.h
@@ -70,7 +70,7 @@
   void dump(int indent=0) const;
 
   // Debugging support
-  void print(llvm_ostream &os) const {
+  void print(OStream &os) const {
     if (os.stream()) print(*os.stream());
   }
   virtual void print(std::ostream &os) const = 0;
@@ -96,8 +96,8 @@
 };
 
 // ostream << operator for SchedGraphNode class
-inline llvm_ostream &operator<<(llvm_ostream &os,
-                                const SchedGraphNodeCommon &node) {
+inline OStream &operator<<(OStream &os,
+                           const SchedGraphNodeCommon &node) {
   node.print(os);
   return os;
 }
@@ -188,7 +188,7 @@
 
 public:
   // Debugging support
-  void print(llvm_ostream &os) const {
+  void print(OStream &os) const {
     if (os.stream()) print(*os.stream());
   }
   void print(std::ostream &os) const;
@@ -200,7 +200,7 @@
 };
 
 // ostream << operator for SchedGraphNode class
-inline llvm_ostream &operator<<(llvm_ostream &os, const SchedGraphEdge &edge) {
+inline OStream &operator<<(OStream &os, const SchedGraphEdge &edge) {
   edge.print(os);
   return os;
 }
diff --git a/include/llvm/Module.h b/include/llvm/Module.h
index 4cb6d27..35b04b1 100644
--- a/include/llvm/Module.h
+++ b/include/llvm/Module.h
@@ -295,12 +295,12 @@
 /// @{
 public:
   /// Print the module to an output stream
-  void print(llvm_ostream &OS) const {
+  void print(OStream &OS) const {
     if (OS.stream()) print(*OS.stream(), 0);
   }
   void print(std::ostream &OS) const { print(OS, 0); }
   /// Print the module to an output stream with AssemblyAnnotationWriter.
-  void print(llvm_ostream &OS, AssemblyAnnotationWriter *AAW) const {
+  void print(OStream &OS, AssemblyAnnotationWriter *AAW) const {
     if (OS.stream()) print(*OS.stream(), AAW);
   }
   void print(std::ostream &OS, AssemblyAnnotationWriter *AAW) const;
diff --git a/include/llvm/Pass.h b/include/llvm/Pass.h
index 30f1df9..4a929f0 100644
--- a/include/llvm/Pass.h
+++ b/include/llvm/Pass.h
@@ -101,7 +101,7 @@
   /// provide the Module* in case the analysis doesn't need it it can just be
   /// ignored.
   ///
-  void print(llvm_ostream &O, const Module *M) const {
+  void print(OStream &O, const Module *M) const {
     if (O.stream()) print(*O.stream(), M);
   }
   virtual void print(std::ostream &O, const Module *M) const;
diff --git a/include/llvm/Support/Casting.h b/include/llvm/Support/Casting.h
index fff44f6..dc31839 100644
--- a/include/llvm/Support/Casting.h
+++ b/include/llvm/Support/Casting.h
@@ -245,13 +245,13 @@
 struct foo {
   void ext() const;
   /*  static bool classof(const bar *X) {
-    llvm_cerr << "Classof: " << X << "\n";
+    cerr << "Classof: " << X << "\n";
     return true;
     }*/
 };
 
 template <> inline bool isa_impl<foo,bar>(const bar &Val) {
-  llvm_cerr << "Classof: " << &Val << "\n";
+  cerr << "Classof: " << &Val << "\n";
   return true;
 }
 
diff --git a/include/llvm/Support/ConstantRange.h b/include/llvm/Support/ConstantRange.h
index 90a2990..6866ffe 100644
--- a/include/llvm/Support/ConstantRange.h
+++ b/include/llvm/Support/ConstantRange.h
@@ -141,7 +141,7 @@
 
   /// print - Print out the bounds to a stream...
   ///
-  void print(llvm_ostream &OS) const {
+  void print(OStream &OS) const {
     if (OS.stream()) print(*OS.stream());
   }
   void print(std::ostream &OS) const;
diff --git a/include/llvm/Support/Debug.h b/include/llvm/Support/Debug.h
index 9f0f161..09878b9 100644
--- a/include/llvm/Support/Debug.h
+++ b/include/llvm/Support/Debug.h
@@ -65,10 +65,10 @@
 /// places the std::c* I/O streams into one .cpp file and relieves the whole
 /// program from having to have hundreds of static c'tor/d'tors for them.
 /// 
-llvm_ostream getErrorOutputStream(const char *DebugType);
+OStream getErrorOutputStream(const char *DebugType);
 
 #ifdef NDEBUG
-#define DOUT llvm_ostream()
+#define DOUT NullStream
 #else
 #define DOUT getErrorOutputStream(DEBUG_TYPE)
 #endif
diff --git a/include/llvm/Support/GraphWriter.h b/include/llvm/Support/GraphWriter.h
index 8602e74..b9566b8 100644
--- a/include/llvm/Support/GraphWriter.h
+++ b/include/llvm/Support/GraphWriter.h
@@ -247,16 +247,16 @@
   std::string ErrMsg;
   sys::Path Filename = sys::Path::GetTemporaryDirectory(&ErrMsg);
   if (Filename.isEmpty()) {
-    llvm_cerr << "Error: " << ErrMsg << "\n";
+    cerr << "Error: " << ErrMsg << "\n";
     return Filename;
   }
   Filename.appendComponent(Name + ".dot");
   if (Filename.makeUnique(true,&ErrMsg)) {
-    llvm_cerr << "Error: " << ErrMsg << "\n";
+    cerr << "Error: " << ErrMsg << "\n";
     return sys::Path();
   }
 
-  llvm_cerr << "Writing '" << Filename << "'... ";
+  cerr << "Writing '" << Filename << "'... ";
   
   std::ofstream O(Filename.c_str());
 
@@ -275,12 +275,12 @@
 
     // Output the end of the graph
     W.writeFooter();
-    llvm_cerr << " done. \n";
+    cerr << " done. \n";
 
     O.close();
     
   } else {
-    llvm_cerr << "error opening file for writing!\n";
+    cerr << "error opening file for writing!\n";
     Filename.clear();
   }
   
diff --git a/include/llvm/Support/PassNameParser.h b/include/llvm/Support/PassNameParser.h
index fef63c3..83653aa 100644
--- a/include/llvm/Support/PassNameParser.h
+++ b/include/llvm/Support/PassNameParser.h
@@ -65,8 +65,8 @@
   virtual void passRegistered(const PassInfo *P) {
     if (ignorablePass(P) || !Opt) return;
     if (findOption(P->getPassArgument()) != getNumOptions()) {
-      llvm_cerr << "Two passes with the same argument (-"
-                << P->getPassArgument() << ") attempted to be registered!\n";
+      cerr << "Two passes with the same argument (-"
+           << P->getPassArgument() << ") attempted to be registered!\n";
       abort();
     }
     addLiteralOption(P->getPassArgument(), P, P->getPassName());
diff --git a/include/llvm/Support/Streams.h b/include/llvm/Support/Streams.h
index a422756..c4afc86 100644
--- a/include/llvm/Support/Streams.h
+++ b/include/llvm/Support/Streams.h
@@ -7,48 +7,64 @@
 //
 //===----------------------------------------------------------------------===//
 //
-// This file implements a wrapper for the std::cout and std::cerr I/O streams.
-// It prevents the need to include <iostream> to each file just to get I/O.
+// This file implements a wrapper for the STL I/O streams.  It prevents the need
+// to include <iostream> in a file just to get I/O.
 //
 //===----------------------------------------------------------------------===//
 
 #ifndef LLVM_SUPPORT_STREAMS_H
 #define LLVM_SUPPORT_STREAMS_H
 
-#include <ostream>              // Doesn't have static d'tors!!
+#include <sstream>
 
 namespace llvm {
 
-  /// llvm_ostream - Acts like an ostream. It's a wrapper for the std::cerr and
-  /// std::cout ostreams. However, it doesn't require #including <iostream> in
-  /// every file, which increases static c'tors & d'tors in the object code.
+  /// BaseStream - Acts like the STL streams. It's a wrapper for the std::cerr,
+  /// std::cout, std::cin, etc. streams. However, it doesn't require #including
+  /// <iostream> in every file (doing so increases static c'tors & d'tors in the
+  /// object code).
   /// 
-  class llvm_ostream {
-    std::ostream* Stream;
+  template <typename StreamTy>
+  class BaseStream {
+    StreamTy *Stream;
   public:
-    llvm_ostream() : Stream(0) {}
-    llvm_ostream(std::ostream &OStream) : Stream(&OStream) {}
+    BaseStream() : Stream(0) {}
+    BaseStream(StreamTy &S) : Stream(&S) {}
+    BaseStream(StreamTy *S) : Stream(S) {}
 
-    std::ostream* stream() const { return Stream; }
+    StreamTy *stream() const { return Stream; }
 
-    inline llvm_ostream &operator << (std::ostream& (*Func)(std::ostream&)) {
+    inline BaseStream &operator << (StreamTy &(*Func)(StreamTy&)) {
       if (Stream) *Stream << Func;
       return *this;
     }
-      
+
     template <typename Ty>
-    llvm_ostream &operator << (const Ty &Thing) {
+    BaseStream &operator << (const Ty &Thing) {
       if (Stream) *Stream << Thing;
       return *this;
     }
 
-    bool operator == (const std::ostream &OS) { return &OS == Stream; }
-    bool operator == (const llvm_ostream &OS) { return OS.Stream == Stream; }
+    template <typename Ty>
+    BaseStream &operator >> (const Ty &Thing) {
+      if (Stream) *Stream >> Thing;
+      return *this;
+    }
+
+    bool operator == (const StreamTy &S) { return &S == Stream; }
+    bool operator != (const StreamTy &S) { return !(*this == S); }
+    bool operator == (const BaseStream &S) { return S.Stream == Stream; }
+    bool operator != (const BaseStream &S) { return !(*this == S); }
   };
 
-  extern llvm_ostream llvm_null;
-  extern llvm_ostream llvm_cout;
-  extern llvm_ostream llvm_cerr;
+  typedef BaseStream<std::ostream> OStream;
+  typedef BaseStream<std::istream> IStream;
+  typedef BaseStream<std::stringstream> StringStream;
+
+  extern OStream NullStream;
+  extern OStream cout;
+  extern OStream cerr;
+  extern IStream cin;
 
 } // End llvm namespace
 
diff --git a/include/llvm/Type.h b/include/llvm/Type.h
index a69e751..4da8feb 100644
--- a/include/llvm/Type.h
+++ b/include/llvm/Type.h
@@ -136,7 +136,7 @@
   ///
   mutable std::vector<AbstractTypeUser *> AbstractTypeUsers;
 public:
-  void print(llvm_ostream &O) const {
+  void print(OStream &O) const {
     if (O.stream()) print(*O.stream());
   }
   void print(std::ostream &O) const;
diff --git a/include/llvm/Value.h b/include/llvm/Value.h
index 5dfe63f..e8df7cd 100644
--- a/include/llvm/Value.h
+++ b/include/llvm/Value.h
@@ -75,7 +75,7 @@
 
   /// print - Implement operator<< on Value...
   ///
-  void print(llvm_ostream &O) const {
+  void print(OStream &O) const {
     if (O.stream()) print(*O.stream());
   }
   virtual void print(std::ostream &O) const = 0;
diff --git a/lib/Analysis/AliasAnalysisCounter.cpp b/lib/Analysis/AliasAnalysisCounter.cpp
index d563c13..b2b6739 100644
--- a/lib/Analysis/AliasAnalysisCounter.cpp
+++ b/lib/Analysis/AliasAnalysisCounter.cpp
@@ -39,37 +39,33 @@
     }
 
     void printLine(const char *Desc, unsigned Val, unsigned Sum) {
-      llvm_cerr <<  "  " << Val << " " << Desc << " responses ("
-                << Val*100/Sum << "%)\n";
+      cerr <<  "  " << Val << " " << Desc << " responses ("
+           << Val*100/Sum << "%)\n";
     }
     ~AliasAnalysisCounter() {
       unsigned AASum = No+May+Must;
       unsigned MRSum = NoMR+JustRef+JustMod+MR;
       if (AASum + MRSum) { // Print a report if any counted queries occurred...
-        llvm_cerr
-          << "\n===== Alias Analysis Counter Report =====\n"
-          << "  Analysis counted: " << Name << "\n"
-          << "  " << AASum << " Total Alias Queries Performed\n";
+        cerr << "\n===== Alias Analysis Counter Report =====\n"
+             << "  Analysis counted: " << Name << "\n"
+             << "  " << AASum << " Total Alias Queries Performed\n";
         if (AASum) {
           printLine("no alias",     No, AASum);
           printLine("may alias",   May, AASum);
           printLine("must alias", Must, AASum);
-          llvm_cerr
-            << "  Alias Analysis Counter Summary: " << No*100/AASum << "%/"
-            << May*100/AASum << "%/" << Must*100/AASum<<"%\n\n";
+          cerr << "  Alias Analysis Counter Summary: " << No*100/AASum << "%/"
+               << May*100/AASum << "%/" << Must*100/AASum<<"%\n\n";
         }
 
-        llvm_cerr
-          << "  " << MRSum    << " Total Mod/Ref Queries Performed\n";
+        cerr << "  " << MRSum    << " Total Mod/Ref Queries Performed\n";
         if (MRSum) {
           printLine("no mod/ref",    NoMR, MRSum);
           printLine("ref",        JustRef, MRSum);
           printLine("mod",        JustMod, MRSum);
           printLine("mod/ref",         MR, MRSum);
-          llvm_cerr
-            << "  Mod/Ref Analysis Counter Summary: " << NoMR*100/MRSum<< "%/"
-            << JustRef*100/MRSum << "%/" << JustMod*100/MRSum << "%/"
-            << MR*100/MRSum <<"%\n\n";
+          cerr << "  Mod/Ref Analysis Counter Summary: " <<NoMR*100/MRSum<< "%/"
+               << JustRef*100/MRSum << "%/" << JustMod*100/MRSum << "%/"
+               << MR*100/MRSum <<"%\n\n";
         }
       }
     }
@@ -133,10 +129,10 @@
   }
 
   if (PrintAll || (PrintAllFailures && R == MayAlias)) {
-    llvm_cerr << AliasString << ":\t";
-    llvm_cerr << "[" << V1Size << "B] ";
+    cerr << AliasString << ":\t";
+    cerr << "[" << V1Size << "B] ";
     WriteAsOperand(std::cerr, V1, true, M) << ", ";
-    llvm_cerr << "[" << V2Size << "B] ";
+    cerr << "[" << V2Size << "B] ";
     WriteAsOperand(std::cerr, V2, true, M) << "\n";
   }
 
@@ -157,10 +153,10 @@
   }
 
   if (PrintAll || (PrintAllFailures && R == ModRef)) {
-    llvm_cerr << MRString << ":  Ptr: ";
-    llvm_cerr << "[" << Size << "B] ";
+    cerr << MRString << ":  Ptr: ";
+    cerr << "[" << Size << "B] ";
     WriteAsOperand(std::cerr, P, true, M);
-    llvm_cerr << "\t<->" << *CS.getInstruction();
+    cerr << "\t<->" << *CS.getInstruction();
   }
   return R;
 }
diff --git a/lib/Analysis/AliasAnalysisEvaluator.cpp b/lib/Analysis/AliasAnalysisEvaluator.cpp
index d64394a..31875f8 100644
--- a/lib/Analysis/AliasAnalysisEvaluator.cpp
+++ b/lib/Analysis/AliasAnalysisEvaluator.cpp
@@ -79,7 +79,7 @@
 static inline void PrintResults(const char *Msg, bool P, Value *V1, Value *V2,
                                 Module *M) {
   if (P) {
-    llvm_cerr << "  " << Msg << ":\t";
+    cerr << "  " << Msg << ":\t";
     WriteAsOperand(std::cerr, V1, true, M) << ", ";
     WriteAsOperand(std::cerr, V2, true, M) << "\n";
   }
@@ -89,9 +89,9 @@
 PrintModRefResults(const char *Msg, bool P, Instruction *I, Value *Ptr,
                    Module *M) {
   if (P) {
-    llvm_cerr << "  " << Msg << ":  Ptr: ";
+    cerr << "  " << Msg << ":  Ptr: ";
     WriteAsOperand(std::cerr, Ptr, true, M);
-    llvm_cerr << "\t<->" << *I;
+    cerr << "\t<->" << *I;
   }
 }
 
@@ -125,8 +125,8 @@
 
   if (PrintNoAlias || PrintMayAlias || PrintMustAlias ||
       PrintNoModRef || PrintMod || PrintRef || PrintModRef)
-    llvm_cerr << "Function: " << F.getName() << ": " << Pointers.size()
-              << " pointers, " << CallSites.size() << " call sites\n";
+    cerr << "Function: " << F.getName() << ": " << Pointers.size()
+         << " pointers, " << CallSites.size() << " call sites\n";
 
   // iterate over the worklist, and run the full (n^2)/2 disambiguations
   for (std::set<Value *>::iterator I1 = Pointers.begin(), E = Pointers.end();
@@ -151,7 +151,7 @@
         PrintResults("MustAlias", PrintMustAlias, *I1, *I2, F.getParent());
         ++MustAlias; break;
       default:
-        llvm_cerr << "Unknown alias query result!\n";
+        cerr << "Unknown alias query result!\n";
       }
     }
   }
@@ -181,7 +181,7 @@
         PrintModRefResults("  ModRef", PrintModRef, I, *V, F.getParent());
         ++ModRef; break;
       default:
-        llvm_cerr << "Unknown alias query result!\n";
+        cerr << "Unknown alias query result!\n";
       }
     }
   }
@@ -190,45 +190,45 @@
 }
 
 static void PrintPercent(unsigned Num, unsigned Sum) {
-  llvm_cerr << "(" << Num*100ULL/Sum << "."
+  cerr << "(" << Num*100ULL/Sum << "."
             << ((Num*1000ULL/Sum) % 10) << "%)\n";
 }
 
 bool AAEval::doFinalization(Module &M) {
   unsigned AliasSum = NoAlias + MayAlias + MustAlias;
-  llvm_cerr << "===== Alias Analysis Evaluator Report =====\n";
+  cerr << "===== Alias Analysis Evaluator Report =====\n";
   if (AliasSum == 0) {
-    llvm_cerr << "  Alias Analysis Evaluator Summary: No pointers!\n";
+    cerr << "  Alias Analysis Evaluator Summary: No pointers!\n";
   } else {
-    llvm_cerr << "  " << AliasSum << " Total Alias Queries Performed\n";
-    llvm_cerr << "  " << NoAlias << " no alias responses ";
+    cerr << "  " << AliasSum << " Total Alias Queries Performed\n";
+    cerr << "  " << NoAlias << " no alias responses ";
     PrintPercent(NoAlias, AliasSum);
-    llvm_cerr << "  " << MayAlias << " may alias responses ";
+    cerr << "  " << MayAlias << " may alias responses ";
     PrintPercent(MayAlias, AliasSum);
-    llvm_cerr << "  " << MustAlias << " must alias responses ";
+    cerr << "  " << MustAlias << " must alias responses ";
     PrintPercent(MustAlias, AliasSum);
-    llvm_cerr << "  Alias Analysis Evaluator Pointer Alias Summary: "
-              << NoAlias*100/AliasSum  << "%/" << MayAlias*100/AliasSum << "%/"
-              << MustAlias*100/AliasSum << "%\n";
+    cerr << "  Alias Analysis Evaluator Pointer Alias Summary: "
+         << NoAlias*100/AliasSum  << "%/" << MayAlias*100/AliasSum << "%/"
+         << MustAlias*100/AliasSum << "%\n";
   }
 
   // Display the summary for mod/ref analysis
   unsigned ModRefSum = NoModRef + Mod + Ref + ModRef;
   if (ModRefSum == 0) {
-    llvm_cerr << "  Alias Analysis Mod/Ref Evaluator Summary: no mod/ref!\n";
+    cerr << "  Alias Analysis Mod/Ref Evaluator Summary: no mod/ref!\n";
   } else {
-    llvm_cerr << "  " << ModRefSum << " Total ModRef Queries Performed\n";
-    llvm_cerr << "  " << NoModRef << " no mod/ref responses ";
+    cerr << "  " << ModRefSum << " Total ModRef Queries Performed\n";
+    cerr << "  " << NoModRef << " no mod/ref responses ";
     PrintPercent(NoModRef, ModRefSum);
-    llvm_cerr << "  " << Mod << " mod responses ";
+    cerr << "  " << Mod << " mod responses ";
     PrintPercent(Mod, ModRefSum);
-    llvm_cerr << "  " << Ref << " ref responses ";
+    cerr << "  " << Ref << " ref responses ";
     PrintPercent(Ref, ModRefSum);
-    llvm_cerr << "  " << ModRef << " mod & ref responses ";
+    cerr << "  " << ModRef << " mod & ref responses ";
     PrintPercent(ModRef, ModRefSum);
-    llvm_cerr << "  Alias Analysis Evaluator Mod/Ref Summary: "
-              << NoModRef*100/ModRefSum  << "%/" << Mod*100/ModRefSum << "%/"
-              << Ref*100/ModRefSum << "%/" << ModRef*100/ModRefSum << "%\n";
+    cerr << "  Alias Analysis Evaluator Mod/Ref Summary: "
+         << NoModRef*100/ModRefSum  << "%/" << Mod*100/ModRefSum << "%/"
+         << Ref*100/ModRefSum << "%/" << ModRef*100/ModRefSum << "%\n";
   }
 
   return false;
diff --git a/lib/Analysis/AliasSetTracker.cpp b/lib/Analysis/AliasSetTracker.cpp
index f07ff6f..9ab2b8a 100644
--- a/lib/Analysis/AliasSetTracker.cpp
+++ b/lib/Analysis/AliasSetTracker.cpp
@@ -543,8 +543,8 @@
   OS << "\n";
 }
 
-void AliasSet::dump() const { print (llvm_cerr); }
-void AliasSetTracker::dump() const { print(llvm_cerr); }
+void AliasSet::dump() const { print (cerr); }
+void AliasSetTracker::dump() const { print(cerr); }
 
 //===----------------------------------------------------------------------===//
 //                            AliasSetPrinter Pass
@@ -564,7 +564,7 @@
 
       for (inst_iterator I = inst_begin(F), E = inst_end(F); I != E; ++I)
         Tracker->add(&*I);
-      Tracker->print(llvm_cerr);
+      Tracker->print(cerr);
       delete Tracker;
       return false;
     }
diff --git a/lib/Analysis/BasicAliasAnalysis.cpp b/lib/Analysis/BasicAliasAnalysis.cpp
index 26bcb43..ce55b4d 100644
--- a/lib/Analysis/BasicAliasAnalysis.cpp
+++ b/lib/Analysis/BasicAliasAnalysis.cpp
@@ -745,8 +745,8 @@
     assert(Offset1<Offset2 && "There is at least one different constant here!");
 
     if ((uint64_t)(Offset2-Offset1) >= SizeMax) {
-      //llvm_cerr << "Determined that these two GEP's don't alias ["
-      //          << SizeMax << " bytes]: \n" << *GEP1 << *GEP2;
+      //cerr << "Determined that these two GEP's don't alias ["
+      //     << SizeMax << " bytes]: \n" << *GEP1 << *GEP2;
       return NoAlias;
     }
   }
diff --git a/lib/Analysis/CFGPrinter.cpp b/lib/Analysis/CFGPrinter.cpp
index bfc71c6..f16dca8 100644
--- a/lib/Analysis/CFGPrinter.cpp
+++ b/lib/Analysis/CFGPrinter.cpp
@@ -92,14 +92,14 @@
   struct CFGPrinter : public FunctionPass {
     virtual bool runOnFunction(Function &F) {
       std::string Filename = "cfg." + F.getName() + ".dot";
-      llvm_cerr << "Writing '" << Filename << "'...";
+      cerr << "Writing '" << Filename << "'...";
       std::ofstream File(Filename.c_str());
 
       if (File.good())
         WriteGraph(File, (const Function*)&F);
       else
-        llvm_cerr << "  error opening file for writing!";
-      llvm_cerr << "\n";
+        cerr << "  error opening file for writing!";
+      cerr << "\n";
       return false;
     }
 
diff --git a/lib/Analysis/ConstantRange.cpp b/lib/Analysis/ConstantRange.cpp
index 1f1a1b5..2c21586 100644
--- a/lib/Analysis/ConstantRange.cpp
+++ b/lib/Analysis/ConstantRange.cpp
@@ -370,5 +370,5 @@
 /// dump - Allow printing from a debugger easily...
 ///
 void ConstantRange::dump() const {
-  print(llvm_cerr);
+  print(cerr);
 }
diff --git a/lib/Analysis/DataStructure/BottomUpClosure.cpp b/lib/Analysis/DataStructure/BottomUpClosure.cpp
index f5ca5fd..e8592b1 100644
--- a/lib/Analysis/DataStructure/BottomUpClosure.cpp
+++ b/lib/Analysis/DataStructure/BottomUpClosure.cpp
@@ -501,7 +501,7 @@
     DSG->getNodeForValue(F->arg_begin()).mergeWith(N);
 
   } else {
-    llvm_cerr << "Unrecognized external function: " << F->getName() << "\n";
+    cerr << "Unrecognized external function: " << F->getName() << "\n";
     abort();
   }
 
@@ -588,21 +588,21 @@
         ++NumBUInlines;
       } else {
         if (!Printed)
-          llvm_cerr << "In Fns: " << Graph.getFunctionNames() << "\n";
-        llvm_cerr << "  calls " << CalledFuncs.size()
-                  << " fns from site: " << CS.getCallSite().getInstruction()
-                  << "  " << *CS.getCallSite().getInstruction();
-        llvm_cerr << "   Fns =";
+          cerr << "In Fns: " << Graph.getFunctionNames() << "\n";
+        cerr << "  calls " << CalledFuncs.size()
+             << " fns from site: " << CS.getCallSite().getInstruction()
+             << "  " << *CS.getCallSite().getInstruction();
+        cerr << "   Fns =";
         unsigned NumPrinted = 0;
 
         for (std::vector<Function*>::iterator I = CalledFuncs.begin(),
                E = CalledFuncs.end(); I != E; ++I) {
-          if (NumPrinted++ < 8) llvm_cerr << " " << (*I)->getName();
+          if (NumPrinted++ < 8) cerr << " " << (*I)->getName();
 
           // Add the call edges to the call graph.
           ActualCallees.insert(std::make_pair(TheCall, *I));
         }
-        llvm_cerr << "\n";
+        cerr << "\n";
 
         // See if we already computed a graph for this set of callees.
         std::sort(CalledFuncs.begin(), CalledFuncs.end());
@@ -645,7 +645,7 @@
           // Clean up the final graph!
           GI->removeDeadNodes(DSGraph::KeepUnreachableGlobals);
         } else {
-          llvm_cerr << "***\n*** RECYCLED GRAPH ***\n***\n";
+          cerr << "***\n*** RECYCLED GRAPH ***\n***\n";
         }
 
         GI = IndCallGraph.first;
@@ -685,7 +685,7 @@
          E = MainSM.global_end(); I != E; ++I)
     RC.getClonedNH(MainSM[*I]);
 
-  //Graph.writeGraphToFile(llvm_cerr, "bu_" + F.getName());
+  //Graph.writeGraphToFile(cerr, "bu_" + F.getName());
 }
 
 static const Function *getFnForValue(const Value *V) {
@@ -746,8 +746,8 @@
     return;
   }
 
-  llvm_cerr << *From;
-  llvm_cerr << *To;
+  cerr << *From;
+  cerr << *To;
   assert(0 && "Do not know how to copy this yet!");
   abort();
 }
diff --git a/lib/Analysis/DataStructure/CallTargets.cpp b/lib/Analysis/DataStructure/CallTargets.cpp
index 5ed4457..bae866f 100644
--- a/lib/Analysis/DataStructure/CallTargets.cpp
+++ b/lib/Analysis/DataStructure/CallTargets.cpp
@@ -17,15 +17,15 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include "llvm/Analysis/DataStructure/CallTargets.h"
 #include "llvm/Module.h"
 #include "llvm/Instructions.h"
 #include "llvm/Analysis/DataStructure/DataStructure.h"
 #include "llvm/Analysis/DataStructure/DSGraph.h"
-#include "llvm/Analysis/DataStructure/CallTargets.h"
 #include "llvm/ADT/Statistic.h"
 #include "llvm/Support/Streams.h"
-#include <ostream>
 #include "llvm/Constants.h"
+#include <ostream>
 using namespace llvm;
 
 namespace {
@@ -58,11 +58,11 @@
               } 
               if (N->isComplete() && !IndMap[cs].size()) {
                 ++CompleteEmpty;
-                llvm_cerr << "Call site empty: '"
-                << cs.getInstruction()->getName() 
-                          << "' In '"
-                << cs.getInstruction()->getParent()->getParent()->getName()
-                          << "'\n";
+                cerr << "Call site empty: '"
+                     << cs.getInstruction()->getName() 
+                     << "' In '"
+                     << cs.getInstruction()->getParent()->getParent()->getName()
+                     << "'\n";
               }
             } else {
               ++DirCall;
diff --git a/lib/Analysis/DataStructure/DataStructure.cpp b/lib/Analysis/DataStructure/DataStructure.cpp
index 80237c4..c81fd6a 100644
--- a/lib/Analysis/DataStructure/DataStructure.cpp
+++ b/lib/Analysis/DataStructure/DataStructure.cpp
@@ -25,7 +25,6 @@
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/ADT/SCCIterator.h"
 #include "llvm/ADT/Statistic.h"
-#include "llvm/Support/Streams.h"
 #include "llvm/Support/Timer.h"
 #include <iostream>
 #include <algorithm>
@@ -1263,7 +1262,7 @@
 }
 
 // dump - Allow inspection of graph in a debugger.
-void DSGraph::dump() const { print(llvm_cerr); }
+void DSGraph::dump() const { print(cerr); }
 
 
 /// remapLinks - Change all of the Links in the current node according to the
diff --git a/lib/Analysis/DataStructure/DataStructureStats.cpp b/lib/Analysis/DataStructure/DataStructureStats.cpp
index f7fbe3b..1357a33 100644
--- a/lib/Analysis/DataStructure/DataStructureStats.cpp
+++ b/lib/Analysis/DataStructure/DataStructureStats.cpp
@@ -92,18 +92,18 @@
         totalNumCallees  += Callees.size();
         ++numIndirectCalls;
       } else
-        llvm_cerr << "WARNING: No callee in Function '" << F.getName()
-                  << "' at call: \n"
-                  << *I->getCallSite().getInstruction();
+        cerr << "WARNING: No callee in Function '" << F.getName()
+             << "' at call: \n"
+             << *I->getCallSite().getInstruction();
     }
 
   TotalNumCallees  += totalNumCallees;
   NumIndirectCalls += numIndirectCalls;
 
   if (numIndirectCalls)
-    llvm_cout << "  In function " << F.getName() << ":  "
-              << (totalNumCallees / (double) numIndirectCalls)
-              << " average callees per indirect call\n";
+    cout << "  In function " << F.getName() << ":  "
+         << (totalNumCallees / (double) numIndirectCalls)
+         << " average callees per indirect call\n";
 }
 
 DSNode *DSGraphStats::getNodeForValue(Value *V) {
diff --git a/lib/Analysis/DataStructure/EquivClassGraphs.cpp b/lib/Analysis/DataStructure/EquivClassGraphs.cpp
index 49c93ff..2813b94 100644
--- a/lib/Analysis/DataStructure/EquivClassGraphs.cpp
+++ b/lib/Analysis/DataStructure/EquivClassGraphs.cpp
@@ -90,7 +90,7 @@
   if (MainFunc && !MainFunc->isExternal()) {
     processSCC(getOrCreateGraph(*MainFunc), Stack, NextID, ValMap);
   } else {
-    llvm_cerr << "Fold Graphs: No 'main' function found!\n";
+    cerr << "Fold Graphs: No 'main' function found!\n";
   }
 
   for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
diff --git a/lib/Analysis/DataStructure/GraphChecker.cpp b/lib/Analysis/DataStructure/GraphChecker.cpp
index cef3efe..8e4d3fc 100644
--- a/lib/Analysis/DataStructure/GraphChecker.cpp
+++ b/lib/Analysis/DataStructure/GraphChecker.cpp
@@ -84,8 +84,8 @@
 DSGC::DSGC() {
   if (!AbortIfAnyCollapsed && AbortIfCollapsed.empty() &&
       CheckFlags.empty() && AbortIfMerged.empty()) {
-    llvm_cerr << "The -datastructure-gc is useless if you don't specify any"
-                 " -dsgc-* options.  See the -help-hidden output for a list.\n";
+    cerr << "The -datastructure-gc is useless if you don't specify any"
+         << " -dsgc-* options.  See the -help-hidden output for a list.\n";
     abort();
   }
 }
@@ -123,8 +123,8 @@
     for (DSGraph::node_const_iterator I = G.node_begin(), E = G.node_end();
          I != E; ++I)
       if (I->isNodeCompletelyFolded()) {
-        llvm_cerr << "Node is collapsed: ";
-        I->print(llvm_cerr, &G);
+        cerr << "Node is collapsed: ";
+        I->print(cerr, &G);
         abort();
       }
   }
@@ -142,8 +142,8 @@
            E = CheckFlags.end(); I != E; ++I) {
       std::string::size_type ColonPos = I->rfind(':');
       if (ColonPos == std::string::npos) {
-        llvm_cerr << "Error: '" << *I
-               << "' is an invalid value for the --dsgc-check-flags option!\n";
+        cerr << "Error: '" << *I
+             << "' is an invalid value for the --dsgc-check-flags option!\n";
         abort();
       }
 
@@ -158,7 +158,7 @@
         case 'M': Flags |= DSNode::Modified;    break;
         case 'R': Flags |= DSNode::Read;        break;
         case 'A': Flags |= DSNode::Array;       break;
-        default: llvm_cerr << "Invalid DSNode flag!\n"; abort();
+        default: cerr << "Invalid DSNode flag!\n"; abort();
         }
       CheckFlagsM[std::string(I->begin(), I->begin()+ColonPos)] = Flags;
     }
@@ -176,25 +176,25 @@
 
         // Verify it is not collapsed if it is not supposed to be...
         if (N->isNodeCompletelyFolded() && AbortIfCollapsedS.count(Name)) {
-          llvm_cerr << "Node for value '%" << Name << "' is collapsed: ";
-          N->print(llvm_cerr, &G);
+          cerr << "Node for value '%" << Name << "' is collapsed: ";
+          N->print(cerr, &G);
           abort();
         }
 
         if (CheckFlagsM.count(Name) && CheckFlagsM[Name] != N->getNodeFlags()) {
-          llvm_cerr << "Node flags are not as expected for node: " << Name 
-                    << " (" << CheckFlagsM[Name] << ":" <<N->getNodeFlags()
-                    << ")\n";
-          N->print(llvm_cerr, &G);
+          cerr << "Node flags are not as expected for node: " << Name 
+               << " (" << CheckFlagsM[Name] << ":" <<N->getNodeFlags()
+               << ")\n";
+          N->print(cerr, &G);
           abort();
         }
 
         // Verify that it is not merged if it is not supposed to be...
         if (AbortIfMergedS.count(Name)) {
           if (AbortIfMergedNodes.count(N)) {
-            llvm_cerr << "Nodes for values '%" << Name << "' and '%"
-                      << AbortIfMergedNodes[N] << "' is merged: ";
-            N->print(llvm_cerr, &G);
+            cerr << "Nodes for values '%" << Name << "' and '%"
+                 << AbortIfMergedNodes[N] << "' is merged: ";
+            N->print(cerr, &G);
             abort();
           }
           AbortIfMergedNodes[N] = Name;
diff --git a/lib/Analysis/DataStructure/Local.cpp b/lib/Analysis/DataStructure/Local.cpp
index 436218b..66ca33d 100644
--- a/lib/Analysis/DataStructure/Local.cpp
+++ b/lib/Analysis/DataStructure/Local.cpp
@@ -434,7 +434,7 @@
         // Variable index into a node.  We must merge all of the elements of the
         // sequential type here.
         if (isa<PointerType>(STy))
-          llvm_cerr << "Pointer indexing not handled yet!\n";
+          cerr << "Pointer indexing not handled yet!\n";
         else {
           const ArrayType *ATy = cast<ArrayType>(STy);
           unsigned ElSize = TD.getTypeSize(CurTy);
@@ -1061,7 +1061,7 @@
   if (DisableDirectCallOpt || !isa<Function>(Callee)) {
     CalleeNode = getValueDest(*Callee).getNode();
     if (CalleeNode == 0) {
-      llvm_cerr << "WARNING: Program is calling through a null pointer?\n"<< *I;
+      cerr << "WARNING: Program is calling through a null pointer?\n"<< *I;
       return;  // Calling a null pointer?
     }
   }
diff --git a/lib/Analysis/DataStructure/Printer.cpp b/lib/Analysis/DataStructure/Printer.cpp
index 2e86bda..21d75c0 100644
--- a/lib/Analysis/DataStructure/Printer.cpp
+++ b/lib/Analysis/DataStructure/Printer.cpp
@@ -37,7 +37,7 @@
   Statistic NumFoldedNodes ("dsa", "Number of folded nodes (in final graph)");
 }
 
-void DSNode::dump() const { print(llvm_cerr, 0); }
+void DSNode::dump() const { print(cerr, 0); }
 
 static std::string getCaption(const DSNode *N, const DSGraph *G) {
   std::stringstream OS;
diff --git a/lib/Analysis/DataStructure/Steensgaard.cpp b/lib/Analysis/DataStructure/Steensgaard.cpp
index 292dfff..5ff3c3f 100644
--- a/lib/Analysis/DataStructure/Steensgaard.cpp
+++ b/lib/Analysis/DataStructure/Steensgaard.cpp
@@ -53,7 +53,7 @@
     }
 
     // print - Implement the Pass::print method...
-    void print(llvm_ostream O, const Module *M) const {
+    void print(OStream O, const Module *M) const {
       if (O.stream()) print(*O.stream(), M);
     }
     void print(std::ostream &O, const Module *M) const {
diff --git a/lib/Analysis/IPA/Andersens.cpp b/lib/Analysis/IPA/Andersens.cpp
index 2887503..6946227 100644
--- a/lib/Analysis/IPA/Andersens.cpp
+++ b/lib/Analysis/IPA/Andersens.cpp
@@ -533,7 +533,7 @@
     case Instruction::BitCast:
       return getNodeForConstantPointer(CE->getOperand(0));
     default:
-      llvm_cerr << "Constant Expr not yet handled: " << *CE << "\n";
+      cerr << "Constant Expr not yet handled: " << *CE << "\n";
       assert(0);
     }
   } else {
@@ -560,7 +560,7 @@
     case Instruction::BitCast:
       return getNodeForConstantPointerTarget(CE->getOperand(0));
     default:
-      llvm_cerr << "Constant Expr not yet handled: " << *CE << "\n";
+      cerr << "Constant Expr not yet handled: " << *CE << "\n";
       assert(0);
     }
   } else {
@@ -786,7 +786,7 @@
     return;
   default:
     // Is this something we aren't handling yet?
-    llvm_cerr << "Unknown instruction: " << I;
+    cerr << "Unknown instruction: " << I;
     abort();
   }
 }
@@ -1104,13 +1104,13 @@
 
 void Andersens::PrintNode(Node *N) {
   if (N == &GraphNodes[UniversalSet]) {
-    llvm_cerr << "<universal>";
+    cerr << "<universal>";
     return;
   } else if (N == &GraphNodes[NullPtr]) {
-    llvm_cerr << "<nullptr>";
+    cerr << "<nullptr>";
     return;
   } else if (N == &GraphNodes[NullObject]) {
-    llvm_cerr << "<null>";
+    cerr << "<null>";
     return;
   }
 
@@ -1119,56 +1119,56 @@
   if (Function *F = dyn_cast<Function>(V)) {
     if (isa<PointerType>(F->getFunctionType()->getReturnType()) &&
         N == getReturnNode(F)) {
-      llvm_cerr << F->getName() << ":retval";
+      cerr << F->getName() << ":retval";
       return;
     } else if (F->getFunctionType()->isVarArg() && N == getVarargNode(F)) {
-      llvm_cerr << F->getName() << ":vararg";
+      cerr << F->getName() << ":vararg";
       return;
     }
   }
 
   if (Instruction *I = dyn_cast<Instruction>(V))
-    llvm_cerr << I->getParent()->getParent()->getName() << ":";
+    cerr << I->getParent()->getParent()->getName() << ":";
   else if (Argument *Arg = dyn_cast<Argument>(V))
-    llvm_cerr << Arg->getParent()->getName() << ":";
+    cerr << Arg->getParent()->getName() << ":";
 
   if (V->hasName())
-    llvm_cerr << V->getName();
+    cerr << V->getName();
   else
-    llvm_cerr << "(unnamed)";
+    cerr << "(unnamed)";
 
   if (isa<GlobalValue>(V) || isa<AllocationInst>(V))
     if (N == getObject(V))
-      llvm_cerr << "<mem>";
+      cerr << "<mem>";
 }
 
 void Andersens::PrintConstraints() {
-  llvm_cerr << "Constraints:\n";
+  cerr << "Constraints:\n";
   for (unsigned i = 0, e = Constraints.size(); i != e; ++i) {
-    llvm_cerr << "  #" << i << ":  ";
+    cerr << "  #" << i << ":  ";
     Constraint &C = Constraints[i];
     if (C.Type == Constraint::Store)
-      llvm_cerr << "*";
+      cerr << "*";
     PrintNode(C.Dest);
-    llvm_cerr << " = ";
+    cerr << " = ";
     if (C.Type == Constraint::Load)
-      llvm_cerr << "*";
+      cerr << "*";
     PrintNode(C.Src);
-    llvm_cerr << "\n";
+    cerr << "\n";
   }
 }
 
 void Andersens::PrintPointsToGraph() {
-  llvm_cerr << "Points-to graph:\n";
+  cerr << "Points-to graph:\n";
   for (unsigned i = 0, e = GraphNodes.size(); i != e; ++i) {
     Node *N = &GraphNodes[i];
-    llvm_cerr << "[" << (N->end() - N->begin()) << "] ";
+    cerr << "[" << (N->end() - N->begin()) << "] ";
     PrintNode(N);
-    llvm_cerr << "\t--> ";
+    cerr << "\t--> ";
     for (Node::iterator I = N->begin(), E = N->end(); I != E; ++I) {
-      if (I != N->begin()) llvm_cerr << ", ";
+      if (I != N->begin()) cerr << ", ";
       PrintNode(*I);
     }
-    llvm_cerr << "\n";
+    cerr << "\n";
   }
 }
diff --git a/lib/Analysis/IPA/CallGraph.cpp b/lib/Analysis/IPA/CallGraph.cpp
index 128e11e..6e8ca18 100644
--- a/lib/Analysis/IPA/CallGraph.cpp
+++ b/lib/Analysis/IPA/CallGraph.cpp
@@ -74,7 +74,7 @@
     AU.setPreservesAll();
   }
 
-  void print(llvm_ostream &o, const Module *M) const {
+  void print(OStream &o, const Module *M) const {
     if (o.stream()) print(*o.stream(), M);
   }
 
@@ -95,7 +95,7 @@
   /// dump - Print out this call graph.
   ///
   inline void dump() const {
-    print(llvm_cerr, Mod);
+    print(cerr, Mod);
   }
 
   CallGraphNode* getExternalCallingNode() const { return ExternalCallingNode; }
@@ -212,7 +212,7 @@
 }
 
 void CallGraph::dump() const {
-  print(llvm_cerr, 0);
+  print(cerr, 0);
 }
 
 //===----------------------------------------------------------------------===//
@@ -275,7 +275,7 @@
   OS << "\n";
 }
 
-void CallGraphNode::dump() const { print(llvm_cerr); }
+void CallGraphNode::dump() const { print(cerr); }
 
 void CallGraphNode::removeCallEdgeTo(CallGraphNode *Callee) {
   for (unsigned i = CalledFunctions.size(); ; --i) {
diff --git a/lib/Analysis/InstCount.cpp b/lib/Analysis/InstCount.cpp
index 38f0bba..04dfbf4 100644
--- a/lib/Analysis/InstCount.cpp
+++ b/lib/Analysis/InstCount.cpp
@@ -43,7 +43,7 @@
 #include "llvm/Instruction.def"
 
     void visitInstruction(Instruction &I) {
-      llvm_cerr << "Instruction Count does not know about " << I;
+      cerr << "Instruction Count does not know about " << I;
       abort();
     }
   public:
diff --git a/lib/Analysis/LoopInfo.cpp b/lib/Analysis/LoopInfo.cpp
index 1895760..b33e414 100644
--- a/lib/Analysis/LoopInfo.cpp
+++ b/lib/Analysis/LoopInfo.cpp
@@ -80,7 +80,7 @@
 }
 
 void Loop::dump() const {
-  print(llvm_cerr);
+  print(cerr);
 }
 
 
diff --git a/lib/Analysis/ProfileInfoLoader.cpp b/lib/Analysis/ProfileInfoLoader.cpp
index 3c19f5e..b1ed235 100644
--- a/lib/Analysis/ProfileInfoLoader.cpp
+++ b/lib/Analysis/ProfileInfoLoader.cpp
@@ -37,7 +37,7 @@
   // Read the number of entries...
   unsigned NumEntries;
   if (fread(&NumEntries, sizeof(unsigned), 1, F) != 1) {
-    llvm_cerr << ToolName << ": data packet truncated!\n";
+    cerr << ToolName << ": data packet truncated!\n";
     perror(0);
     exit(1);
   }
@@ -48,7 +48,7 @@
 
   // Read in the block of data...
   if (fread(&TempSpace[0], sizeof(unsigned)*NumEntries, 1, F) != 1) {
-    llvm_cerr << ToolName << ": data packet truncated!\n";
+    cerr << ToolName << ": data packet truncated!\n";
     perror(0);
     exit(1);
   }
@@ -75,7 +75,7 @@
                                      Module &TheModule) : M(TheModule) {
   FILE *F = fopen(Filename.c_str(), "r");
   if (F == 0) {
-    llvm_cerr << ToolName << ": Error opening '" << Filename << "': ";
+    cerr << ToolName << ": Error opening '" << Filename << "': ";
     perror(0);
     exit(1);
   }
@@ -93,7 +93,7 @@
     case ArgumentInfo: {
       unsigned ArgLength;
       if (fread(&ArgLength, sizeof(unsigned), 1, F) != 1) {
-        llvm_cerr << ToolName << ": arguments packet truncated!\n";
+        cerr << ToolName << ": arguments packet truncated!\n";
         perror(0);
         exit(1);
       }
@@ -104,7 +104,7 @@
 
       if (ArgLength)
         if (fread(&Chars[0], (ArgLength+3) & ~3, 1, F) != 1) {
-          llvm_cerr << ToolName << ": arguments packet truncated!\n";
+          cerr << ToolName << ": arguments packet truncated!\n";
           perror(0);
           exit(1);
         }
@@ -129,7 +129,7 @@
       break;
 
     default:
-      llvm_cerr << ToolName << ": Unknown packet type #" << PacketType << "!\n";
+      cerr << ToolName << ": Unknown packet type #" << PacketType << "!\n";
       exit(1);
     }
   }
@@ -156,7 +156,7 @@
           Counts.push_back(std::make_pair(BlockCounts[i].first->getParent(),
                                           BlockCounts[i].second));
     } else {
-      llvm_cerr << "Function counts are not available!\n";
+      cerr << "Function counts are not available!\n";
     }
     return;
   }
@@ -200,8 +200,8 @@
         if (SuccNum >= TI->getNumSuccessors()) {
           static bool Warned = false;
           if (!Warned) {
-            llvm_cerr << "WARNING: profile info doesn't seem to match"
-                      << " the program!\n";
+            cerr << "WARNING: profile info doesn't seem to match"
+                 << " the program!\n";
             Warned = true;
           }
         } else {
@@ -226,7 +226,7 @@
       }
 
     } else {
-      llvm_cerr << "Block counts are not available!\n";
+      cerr << "Block counts are not available!\n";
     }
     return;
   }
@@ -247,8 +247,8 @@
 void ProfileInfoLoader::getEdgeCounts(std::vector<std::pair<Edge,
                                                   unsigned> > &Counts) {
   if (EdgeCounts.empty()) {
-    llvm_cerr << "Edge counts not available, and no synthesis "
-              << "is implemented yet!\n";
+    cerr << "Edge counts not available, and no synthesis "
+         << "is implemented yet!\n";
     return;
   }
 
@@ -268,9 +268,8 @@
 //
 void ProfileInfoLoader::getBBTrace(std::vector<BasicBlock *> &Trace) {
   if (BBTrace.empty ()) {
-    llvm_cerr << "Basic block trace is not available!\n";
+    cerr << "Basic block trace is not available!\n";
     return;
   }
-  llvm_cerr << "Basic block trace loading is not implemented yet!\n";
+  cerr << "Basic block trace loading is not implemented yet!\n";
 }
-
diff --git a/lib/Analysis/ProfileInfoLoaderPass.cpp b/lib/Analysis/ProfileInfoLoaderPass.cpp
index 08a45c6..426bd18 100644
--- a/lib/Analysis/ProfileInfoLoaderPass.cpp
+++ b/lib/Analysis/ProfileInfoLoaderPass.cpp
@@ -76,8 +76,8 @@
     TerminatorInst *TI = BB->getTerminator();
     if (SuccNum >= TI->getNumSuccessors()) {
       if (!PrintedWarning) {
-        llvm_cerr << "WARNING: profile information is inconsistent with "
-                  << "the current program!\n";
+        cerr << "WARNING: profile information is inconsistent with "
+             << "the current program!\n";
         PrintedWarning = true;
       }
     } else {
diff --git a/lib/Analysis/ScalarEvolution.cpp b/lib/Analysis/ScalarEvolution.cpp
index ba903e0..9fc0c76 100644
--- a/lib/Analysis/ScalarEvolution.cpp
+++ b/lib/Analysis/ScalarEvolution.cpp
@@ -118,7 +118,7 @@
 //
 SCEV::~SCEV() {}
 void SCEV::dump() const {
-  print(llvm_cerr);
+  print(cerr);
 }
 
 /// getValueRange - Return the tightest constant bounds that this value is
@@ -1558,11 +1558,11 @@
     break;
   default:
 #if 0
-    llvm_cerr << "ComputeIterationCount ";
+    cerr << "ComputeIterationCount ";
     if (ExitCond->getOperand(0)->getType()->isUnsigned())
-      llvm_cerr << "[unsigned] ";
-    llvm_cerr << *LHS << "   "
-              << Instruction::getOpcodeName(Cond) << "   " << *RHS << "\n";
+      cerr << "[unsigned] ";
+    cerr << *LHS << "   "
+         << Instruction::getOpcodeName(Cond) << "   " << *RHS << "\n";
 #endif
     break;
   }
@@ -1678,9 +1678,9 @@
     if (!isa<ConstantBool>(Result)) break;  // Couldn't decide for sure
     if (cast<ConstantBool>(Result)->getValue() == false) {
 #if 0
-      llvm_cerr << "\n***\n*** Computed loop count " << *ItCst
-                << "\n*** From global " << *GV << "*** BB: " << *L->getHeader()
-                << "***\n";
+      cerr << "\n***\n*** Computed loop count " << *ItCst
+           << "\n*** From global " << *GV << "*** BB: " << *L->getHeader()
+           << "***\n";
 #endif
       ++NumArrayLenItCounts;
       return SCEVConstant::get(ItCst);   // Found terminating iteration!
@@ -2147,8 +2147,8 @@
     SCEVConstant *R2 = dyn_cast<SCEVConstant>(Roots.second);
     if (R1) {
 #if 0
-      llvm_cerr << "HFTZ: " << *V << " - sol#1: " << *R1
-                << "  sol#2: " << *R2 << "\n";
+      cerr << "HFTZ: " << *V << " - sol#1: " << *R1
+           << "  sol#2: " << *R2 << "\n";
 #endif
       // Pick the smallest positive root value.
       assert(R1->getType()->isUnsigned()&&"Didn't canonicalize to unsigned?");
@@ -2276,8 +2276,8 @@
     default: break;
     }
 
-    //llvm_cerr << "Computed Loop Trip Count as: " <<
-    //  *SCEV::getMinusSCEV(RHS, AddRec->getOperand(0)) << "\n";
+    //cerr << "Computed Loop Trip Count as: "
+    //     << *SCEV::getMinusSCEV(RHS, AddRec->getOperand(0)) << "\n";
     return SCEV::getMinusSCEV(RHS, AddRec->getOperand(0));
   }
 
@@ -2492,20 +2492,20 @@
   for (Loop::iterator I = L->begin(), E = L->end(); I != E; ++I)
     PrintLoopInfo(OS, SE, *I);
 
-  llvm_cerr << "Loop " << L->getHeader()->getName() << ": ";
+  cerr << "Loop " << L->getHeader()->getName() << ": ";
 
   std::vector<BasicBlock*> ExitBlocks;
   L->getExitBlocks(ExitBlocks);
   if (ExitBlocks.size() != 1)
-    llvm_cerr << "<multiple exits> ";
+    cerr << "<multiple exits> ";
 
   if (SE->hasLoopInvariantIterationCount(L)) {
-    llvm_cerr << *SE->getIterationCount(L) << " iterations! ";
+    cerr << *SE->getIterationCount(L) << " iterations! ";
   } else {
-    llvm_cerr << "Unpredictable iteration count. ";
+    cerr << "Unpredictable iteration count. ";
   }
 
-  llvm_cerr << "\n";
+  cerr << "\n";
 }
 
 void ScalarEvolution::print(std::ostream &OS, const Module* ) const {
diff --git a/lib/Analysis/ScalarEvolutionExpander.cpp b/lib/Analysis/ScalarEvolutionExpander.cpp
index 2698ace..9432cc2 100644
--- a/lib/Analysis/ScalarEvolutionExpander.cpp
+++ b/lib/Analysis/ScalarEvolutionExpander.cpp
@@ -13,9 +13,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "llvm/Analysis/LoopInfo.h"
 #include "llvm/Analysis/ScalarEvolutionExpander.h"
-
+#include "llvm/Analysis/LoopInfo.h"
 using namespace llvm;
 
 /// InsertCastOfTo - Insert a cast of V to the specified type, doing what
@@ -175,7 +174,7 @@
   SCEVHandle IH = SCEVUnknown::get(I);   // Get I as a "symbolic" SCEV.
 
   SCEVHandle V = S->evaluateAtIteration(IH);
-  //llvm_cerr << "Evaluated: " << *this << "\n     to: " << *V << "\n";
+  //cerr << "Evaluated: " << *this << "\n     to: " << *V << "\n";
 
   return expandInTy(V, Ty);
 }
diff --git a/lib/Analysis/Trace.cpp b/lib/Analysis/Trace.cpp
index d045755..a0aa955 100644
--- a/lib/Analysis/Trace.cpp
+++ b/lib/Analysis/Trace.cpp
@@ -25,14 +25,13 @@
   return getEntryBasicBlock()->getParent();
 }
 
-
 Module *Trace::getModule() const {
   return getFunction()->getParent();
 }
 
 /// print - Write trace to output stream.
 ///
-void Trace::print(llvm_ostream &O) const {
+void Trace::print(OStream &O) const {
   Function *F = getFunction ();
   O << "; Trace from function " << F->getName() << ", blocks:\n";
   for (const_iterator i = begin(), e = end(); i != e; ++i) {
@@ -48,5 +47,5 @@
 /// output stream.
 ///
 void Trace::dump() const {
-  print(llvm_cerr);
+  print(cerr);
 }
diff --git a/lib/AsmParser/llvmAsmParser.cpp.cvs b/lib/AsmParser/llvmAsmParser.cpp.cvs
index 84d6bad..6819903 100644
--- a/lib/AsmParser/llvmAsmParser.cpp.cvs
+++ b/lib/AsmParser/llvmAsmParser.cpp.cvs
@@ -1,7 +1,9 @@
-/* A Bison parser, made by GNU Bison 2.1.  */
+/* A Bison parser, made by GNU Bison 2.3.  */
 
-/* Skeleton parser for Yacc-like parsing with Bison,
-   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+/* Skeleton implementation for Bison's Yacc-like parsers in C
+
+   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
+   Free Software Foundation, Inc.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -18,13 +20,21 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor,
    Boston, MA 02110-1301, USA.  */
 
-/* As a special exception, when this file is copied by Bison into a
-   Bison output file, you may use that output file without restriction.
-   This special exception was added by the Free Software Foundation
-   in version 1.24 of Bison.  */
+/* As a special exception, you may create a larger work that contains
+   part or all of the Bison parser skeleton and distribute that work
+   under terms of your choice, so long as that work isn't itself a
+   parser generator using the skeleton or a modified version thereof
+   as a parser skeleton.  Alternatively, if you modify or redistribute
+   the parser skeleton itself, you may (at your option) remove this
+   special exception, which will cause the skeleton and the resulting
+   Bison output files to be licensed under the GNU General Public
+   License without this special exception.
 
-/* Written by Richard Stallman by simplifying the original so called
-   ``semantic'' parser.  */
+   This special exception was added by the Free Software Foundation in
+   version 2.2 of Bison.  */
+
+/* C LALR(1) parser skeleton written by Richard Stallman, by
+   simplifying the original so-called "semantic" parser.  */
 
 /* All symbols defined below should begin with yy or YY, to avoid
    infringing on user name space.  This should be done even for local
@@ -37,7 +47,7 @@
 #define YYBISON 1
 
 /* Bison version.  */
-#define YYBISON_VERSION "2.1"
+#define YYBISON_VERSION "2.3"
 
 /* Skeleton name.  */
 #define YYSKELETON_NAME "yacc.c"
@@ -356,7 +366,7 @@
 
 
 /* Copy the first part of user declarations.  */
-#line 14 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 14 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
 
 #include "ParserInternals.h"
 #include "llvm/CallingConv.h"
@@ -403,7 +413,7 @@
 //
 //#define DEBUG_UPREFS 1
 #ifdef DEBUG_UPREFS
-#define UR_OUT(X) llvm_cerr << X
+#define UR_OUT(X) cerr << X
 #else
 #define UR_OUT(X)
 #endif
@@ -1216,9 +1226,10 @@
 # define YYTOKEN_TABLE 0
 #endif
 
-#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
-#line 855 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
-typedef union YYSTYPE {
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+typedef union YYSTYPE
+#line 855 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
+{
   llvm::Module                           *ModuleVal;
   llvm::Function                         *FunctionVal;
   std::pair<llvm::PATypeHolder*, char*>  *ArgVal;
@@ -1259,9 +1270,10 @@
   llvm::Module::Endianness          Endianness;
   llvm::ICmpInst::Predicate         IPredicate;
   llvm::FCmpInst::Predicate         FPredicate;
-} YYSTYPE;
-/* Line 196 of yacc.c.  */
-#line 1265 "llvmAsmParser.tab.c"
+}
+/* Line 193 of yacc.c.  */
+#line 1276 "llvmAsmParser.tab.c"
+	YYSTYPE;
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
 # define YYSTYPE_IS_TRIVIAL 1
@@ -1272,23 +1284,56 @@
 /* Copy the second part of user declarations.  */
 
 
-/* Line 219 of yacc.c.  */
-#line 1277 "llvmAsmParser.tab.c"
+/* Line 216 of yacc.c.  */
+#line 1289 "llvmAsmParser.tab.c"
 
-#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
-# define YYSIZE_T __SIZE_TYPE__
+#ifdef short
+# undef short
 #endif
-#if ! defined (YYSIZE_T) && defined (size_t)
-# define YYSIZE_T size_t
+
+#ifdef YYTYPE_UINT8
+typedef YYTYPE_UINT8 yytype_uint8;
+#else
+typedef unsigned char yytype_uint8;
 #endif
-#if ! defined (YYSIZE_T) && (defined (__STDC__) || defined (__cplusplus))
-# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
-# define YYSIZE_T size_t
+
+#ifdef YYTYPE_INT8
+typedef YYTYPE_INT8 yytype_int8;
+#elif (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+typedef signed char yytype_int8;
+#else
+typedef short int yytype_int8;
 #endif
-#if ! defined (YYSIZE_T)
-# define YYSIZE_T unsigned int
+
+#ifdef YYTYPE_UINT16
+typedef YYTYPE_UINT16 yytype_uint16;
+#else
+typedef unsigned short int yytype_uint16;
 #endif
 
+#ifdef YYTYPE_INT16
+typedef YYTYPE_INT16 yytype_int16;
+#else
+typedef short int yytype_int16;
+#endif
+
+#ifndef YYSIZE_T
+# ifdef __SIZE_TYPE__
+#  define YYSIZE_T __SIZE_TYPE__
+# elif defined size_t
+#  define YYSIZE_T size_t
+# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+#  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYSIZE_T size_t
+# else
+#  define YYSIZE_T unsigned int
+# endif
+#endif
+
+#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
+
 #ifndef YY_
 # if YYENABLE_NLS
 #  if ENABLE_NLS
@@ -1301,7 +1346,32 @@
 # endif
 #endif
 
-#if ! defined (yyoverflow) || YYERROR_VERBOSE
+/* Suppress unused-variable warnings by "using" E.  */
+#if ! defined lint || defined __GNUC__
+# define YYUSE(e) ((void) (e))
+#else
+# define YYUSE(e) /* empty */
+#endif
+
+/* Identity function, used to suppress warnings about constant conditions.  */
+#ifndef lint
+# define YYID(n) (n)
+#else
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static int
+YYID (int i)
+#else
+static int
+YYID (i)
+    int i;
+#endif
+{
+  return i;
+}
+#endif
+
+#if ! defined yyoverflow || YYERROR_VERBOSE
 
 /* The parser invokes alloca or malloc; define the necessary symbols.  */
 
@@ -1309,64 +1379,76 @@
 #  if YYSTACK_USE_ALLOCA
 #   ifdef __GNUC__
 #    define YYSTACK_ALLOC __builtin_alloca
+#   elif defined __BUILTIN_VA_ARG_INCR
+#    include <alloca.h> /* INFRINGES ON USER NAME SPACE */
+#   elif defined _AIX
+#    define YYSTACK_ALLOC __alloca
+#   elif defined _MSC_VER
+#    include <malloc.h> /* INFRINGES ON USER NAME SPACE */
+#    define alloca _alloca
 #   else
 #    define YYSTACK_ALLOC alloca
-#    if defined (__STDC__) || defined (__cplusplus)
+#    if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 #     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
-#     define YYINCLUDED_STDLIB_H
+#     ifndef _STDLIB_H
+#      define _STDLIB_H 1
+#     endif
 #    endif
 #   endif
 #  endif
 # endif
 
 # ifdef YYSTACK_ALLOC
-   /* Pacify GCC's `empty if-body' warning. */
-#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
+   /* Pacify GCC's `empty if-body' warning.  */
+#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
 #  ifndef YYSTACK_ALLOC_MAXIMUM
     /* The OS might guarantee only one guard page at the bottom of the stack,
        and a page size can be as small as 4096 bytes.  So we cannot safely
        invoke alloca (N) if N exceeds 4096.  Use a slightly smaller number
        to allow for a few compiler-allocated temporary stack slots.  */
-#   define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2005 */
+#   define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
 #  endif
 # else
 #  define YYSTACK_ALLOC YYMALLOC
 #  define YYSTACK_FREE YYFREE
 #  ifndef YYSTACK_ALLOC_MAXIMUM
-#   define YYSTACK_ALLOC_MAXIMUM ((YYSIZE_T) -1)
+#   define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
 #  endif
-#  ifdef __cplusplus
-extern "C" {
+#  if (defined __cplusplus && ! defined _STDLIB_H \
+       && ! ((defined YYMALLOC || defined malloc) \
+	     && (defined YYFREE || defined free)))
+#   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+#   ifndef _STDLIB_H
+#    define _STDLIB_H 1
+#   endif
 #  endif
 #  ifndef YYMALLOC
 #   define YYMALLOC malloc
-#   if (! defined (malloc) && ! defined (YYINCLUDED_STDLIB_H) \
-	&& (defined (__STDC__) || defined (__cplusplus)))
+#   if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
 #   endif
 #  endif
 #  ifndef YYFREE
 #   define YYFREE free
-#   if (! defined (free) && ! defined (YYINCLUDED_STDLIB_H) \
-	&& (defined (__STDC__) || defined (__cplusplus)))
+#   if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 void free (void *); /* INFRINGES ON USER NAME SPACE */
 #   endif
 #  endif
-#  ifdef __cplusplus
-}
-#  endif
 # endif
-#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */
+#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
 
 
-#if (! defined (yyoverflow) \
-     && (! defined (__cplusplus) \
-	 || (defined (YYSTYPE_IS_TRIVIAL) && YYSTYPE_IS_TRIVIAL)))
+#if (! defined yyoverflow \
+     && (! defined __cplusplus \
+	 || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
 
 /* A type that is properly aligned for any stack member.  */
 union yyalloc
 {
-  short int yyss;
+  yytype_int16 yyss;
   YYSTYPE yyvs;
   };
 
@@ -1376,13 +1458,13 @@
 /* The size of an array large to enough to hold all stacks, each with
    N elements.  */
 # define YYSTACK_BYTES(N) \
-     ((N) * (sizeof (short int) + sizeof (YYSTYPE))			\
+     ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
       + YYSTACK_GAP_MAXIMUM)
 
 /* Copy COUNT objects from FROM to TO.  The source and destination do
    not overlap.  */
 # ifndef YYCOPY
-#  if defined (__GNUC__) && 1 < __GNUC__
+#  if defined __GNUC__ && 1 < __GNUC__
 #   define YYCOPY(To, From, Count) \
       __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
 #  else
@@ -1393,7 +1475,7 @@
 	  for (yyi = 0; yyi < (Count); yyi++)	\
 	    (To)[yyi] = (From)[yyi];		\
 	}					\
-      while (0)
+      while (YYID (0))
 #  endif
 # endif
 
@@ -1411,28 +1493,22 @@
 	yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
 	yyptr += yynewbytes / sizeof (*yyptr);				\
       }									\
-    while (0)
+    while (YYID (0))
 
 #endif
 
-#if defined (__STDC__) || defined (__cplusplus)
-   typedef signed char yysigned_char;
-#else
-   typedef short int yysigned_char;
-#endif
-
-/* YYFINAL -- State number of the termination state. */
+/* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  4
 /* YYLAST -- Last index in YYTABLE.  */
 #define YYLAST   1509
 
-/* YYNTOKENS -- Number of terminals. */
+/* YYNTOKENS -- Number of terminals.  */
 #define YYNTOKENS  159
-/* YYNNTS -- Number of nonterminals. */
+/* YYNNTS -- Number of nonterminals.  */
 #define YYNNTS  78
-/* YYNRULES -- Number of rules. */
+/* YYNRULES -- Number of rules.  */
 #define YYNRULES  297
-/* YYNRULES -- Number of states. */
+/* YYNRULES -- Number of states.  */
 #define YYNSTATES  578
 
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
@@ -1443,7 +1519,7 @@
   ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
 
 /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
-static const unsigned char yytranslate[] =
+static const yytype_uint8 yytranslate[] =
 {
        0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
@@ -1490,7 +1566,7 @@
 #if YYDEBUG
 /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
    YYRHS.  */
-static const unsigned short int yyprhs[] =
+static const yytype_uint16 yyprhs[] =
 {
        0,     0,     3,     5,     7,     9,    11,    13,    15,    17,
       19,    21,    23,    25,    27,    29,    31,    33,    35,    37,
@@ -1524,8 +1600,8 @@
      884,   888,   895,   899,   906,   909,   914,   921
 };
 
-/* YYRHS -- A `-1'-separated list of the rules' RHS. */
-static const short int yyrhs[] =
+/* YYRHS -- A `-1'-separated list of the rules' RHS.  */
+static const yytype_int16 yyrhs[] =
 {
      193,     0,    -1,     5,    -1,     6,    -1,     3,    -1,     4,
       -1,    78,    -1,    79,    -1,    80,    -1,    81,    -1,    82,
@@ -1623,7 +1699,7 @@
 };
 
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
-static const unsigned short int yyrline[] =
+static const yytype_uint16 yyrline[] =
 {
        0,   990,   990,   991,   999,  1000,  1010,  1010,  1010,  1010,
     1010,  1010,  1010,  1010,  1010,  1011,  1011,  1011,  1012,  1012,
@@ -1660,7 +1736,7 @@
 
 #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
-   First, the terminals, then, starting at YYNTOKENS, nonterminals. */
+   First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
 static const char *const yytname[] =
 {
   "$end", "error", "$undefined", "ESINT64VAL", "EUINT64VAL", "SINTVAL",
@@ -1708,7 +1784,7 @@
 # ifdef YYPRINT
 /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
    token YYLEX-NUM.  */
-static const unsigned short int yytoknum[] =
+static const yytype_uint16 yytoknum[] =
 {
        0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
      265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
@@ -1730,7 +1806,7 @@
 # endif
 
 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
-static const unsigned char yyr1[] =
+static const yytype_uint8 yyr1[] =
 {
        0,   159,   160,   160,   161,   161,   162,   162,   162,   162,
      162,   162,   162,   162,   162,   163,   163,   163,   164,   164,
@@ -1765,7 +1841,7 @@
 };
 
 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
-static const unsigned char yyr2[] =
+static const yytype_uint8 yyr2[] =
 {
        0,     2,     1,     1,     1,     1,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
@@ -1802,7 +1878,7 @@
 /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
    STATE-NUM when YYTABLE doesn't specify something else to do.  Zero
    means the default is an error.  */
-static const unsigned short int yydefact[] =
+static const yytype_uint16 yydefact[] =
 {
      191,     0,    86,   177,     1,   176,   224,    79,    80,    81,
       82,    83,    84,    85,     0,    87,   248,   173,   174,   248,
@@ -1864,8 +1940,8 @@
        0,     0,     0,   260,     0,     0,   259,   256
 };
 
-/* YYDEFGOTO[NTERM-NUM]. */
-static const short int yydefgoto[] =
+/* YYDEFGOTO[NTERM-NUM].  */
+static const yytype_int16 yydefgoto[] =
 {
       -1,    86,   299,   316,   317,   318,   319,   320,   253,   270,
      211,   212,   241,   213,    25,    15,    37,   497,   355,   436,
@@ -1880,7 +1956,7 @@
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
    STATE-NUM.  */
 #define YYPACT_NINF -517
-static const short int yypact[] =
+static const yytype_int16 yypact[] =
 {
     -517,    40,    69,   528,  -517,  -517,  -517,  -517,  -517,  -517,
     -517,  -517,  -517,  -517,    16,    90,    76,  -517,  -517,     5,
@@ -1943,7 +2019,7 @@
 };
 
 /* YYPGOTO[NTERM-NUM].  */
-static const short int yypgoto[] =
+static const yytype_int16 yypgoto[] =
 {
     -517,  -517,  -517,   286,   288,   291,   317,   320,   134,    80,
     -127,  -125,  -502,  -517,   340,   391,  -114,  -517,  -265,    14,
@@ -1960,7 +2036,7 @@
    number is the opposite.  If zero, do what YYDEFACT says.
    If YYTABLE_NINF, syntax error.  */
 #define YYTABLE_NINF -173
-static const short int yytable[] =
+static const yytype_int16 yytable[] =
 {
       89,   225,   106,   239,   228,   240,    26,   357,   414,   377,
      378,    94,   400,   416,   434,   123,    89,   242,   215,   119,
@@ -2115,7 +2191,7 @@
        0,    82,     0,     0,    83,     0,     0,    84,     0,    85
 };
 
-static const short int yycheck[] =
+static const yytype_int16 yycheck[] =
 {
       37,   125,    53,   130,   128,   130,     3,   272,    15,   293,
      294,    29,   154,    15,    34,   157,    53,   131,   112,    85,
@@ -2272,7 +2348,7 @@
 
 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
    symbol of state STATE-NUM.  */
-static const unsigned char yystos[] =
+static const yytype_uint8 yystos[] =
 {
        0,   193,   194,   195,     0,    25,    31,    41,    42,    43,
       44,    45,    46,    47,    62,   174,   212,   214,   216,   223,
@@ -2359,7 +2435,7 @@
       yychar = (Token);						\
       yylval = (Value);						\
       yytoken = YYTRANSLATE (yychar);				\
-      YYPOPSTACK;						\
+      YYPOPSTACK (1);						\
       goto yybackup;						\
     }								\
   else								\
@@ -2367,7 +2443,7 @@
       yyerror (YY_("syntax error: cannot back up")); \
       YYERROR;							\
     }								\
-while (0)
+while (YYID (0))
 
 
 #define YYTERROR	1
@@ -2382,7 +2458,7 @@
 #ifndef YYLLOC_DEFAULT
 # define YYLLOC_DEFAULT(Current, Rhs, N)				\
     do									\
-      if (N)								\
+      if (YYID (N))                                                    \
 	{								\
 	  (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;	\
 	  (Current).first_column = YYRHSLOC (Rhs, 1).first_column;	\
@@ -2396,7 +2472,7 @@
 	  (Current).first_column = (Current).last_column =		\
 	    YYRHSLOC (Rhs, 0).last_column;				\
 	}								\
-    while (0)
+    while (YYID (0))
 #endif
 
 
@@ -2408,8 +2484,8 @@
 # if YYLTYPE_IS_TRIVIAL
 #  define YY_LOCATION_PRINT(File, Loc)			\
      fprintf (File, "%d.%d-%d.%d",			\
-              (Loc).first_line, (Loc).first_column,	\
-              (Loc).last_line,  (Loc).last_column)
+	      (Loc).first_line, (Loc).first_column,	\
+	      (Loc).last_line,  (Loc).last_column)
 # else
 #  define YY_LOCATION_PRINT(File, Loc) ((void) 0)
 # endif
@@ -2436,36 +2512,96 @@
 do {						\
   if (yydebug)					\
     YYFPRINTF Args;				\
-} while (0)
+} while (YYID (0))
 
-# define YY_SYMBOL_PRINT(Title, Type, Value, Location)		\
-do {								\
-  if (yydebug)							\
-    {								\
-      YYFPRINTF (stderr, "%s ", Title);				\
-      yysymprint (stderr,					\
-                  Type, Value);	\
-      YYFPRINTF (stderr, "\n");					\
-    }								\
-} while (0)
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)			  \
+do {									  \
+  if (yydebug)								  \
+    {									  \
+      YYFPRINTF (stderr, "%s ", Title);					  \
+      yy_symbol_print (stderr,						  \
+		  Type, Value); \
+      YYFPRINTF (stderr, "\n");						  \
+    }									  \
+} while (YYID (0))
+
+
+/*--------------------------------.
+| Print this symbol on YYOUTPUT.  |
+`--------------------------------*/
+
+/*ARGSUSED*/
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
+#else
+static void
+yy_symbol_value_print (yyoutput, yytype, yyvaluep)
+    FILE *yyoutput;
+    int yytype;
+    YYSTYPE const * const yyvaluep;
+#endif
+{
+  if (!yyvaluep)
+    return;
+# ifdef YYPRINT
+  if (yytype < YYNTOKENS)
+    YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
+# else
+  YYUSE (yyoutput);
+# endif
+  switch (yytype)
+    {
+      default:
+	break;
+    }
+}
+
+
+/*--------------------------------.
+| Print this symbol on YYOUTPUT.  |
+`--------------------------------*/
+
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
+#else
+static void
+yy_symbol_print (yyoutput, yytype, yyvaluep)
+    FILE *yyoutput;
+    int yytype;
+    YYSTYPE const * const yyvaluep;
+#endif
+{
+  if (yytype < YYNTOKENS)
+    YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
+  else
+    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
+
+  yy_symbol_value_print (yyoutput, yytype, yyvaluep);
+  YYFPRINTF (yyoutput, ")");
+}
 
 /*------------------------------------------------------------------.
 | yy_stack_print -- Print the state stack from its BOTTOM up to its |
 | TOP (included).                                                   |
 `------------------------------------------------------------------*/
 
-#if defined (__STDC__) || defined (__cplusplus)
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 static void
-yy_stack_print (short int *bottom, short int *top)
+yy_stack_print (yytype_int16 *bottom, yytype_int16 *top)
 #else
 static void
 yy_stack_print (bottom, top)
-    short int *bottom;
-    short int *top;
+    yytype_int16 *bottom;
+    yytype_int16 *top;
 #endif
 {
   YYFPRINTF (stderr, "Stack now");
-  for (/* Nothing. */; bottom <= top; ++bottom)
+  for (; bottom <= top; ++bottom)
     YYFPRINTF (stderr, " %d", *bottom);
   YYFPRINTF (stderr, "\n");
 }
@@ -2474,37 +2610,45 @@
 do {								\
   if (yydebug)							\
     yy_stack_print ((Bottom), (Top));				\
-} while (0)
+} while (YYID (0))
 
 
 /*------------------------------------------------.
 | Report that the YYRULE is going to be reduced.  |
 `------------------------------------------------*/
 
-#if defined (__STDC__) || defined (__cplusplus)
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 static void
-yy_reduce_print (int yyrule)
+yy_reduce_print (YYSTYPE *yyvsp, int yyrule)
 #else
 static void
-yy_reduce_print (yyrule)
+yy_reduce_print (yyvsp, yyrule)
+    YYSTYPE *yyvsp;
     int yyrule;
 #endif
 {
+  int yynrhs = yyr2[yyrule];
   int yyi;
   unsigned long int yylno = yyrline[yyrule];
-  YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu), ",
-             yyrule - 1, yylno);
-  /* Print the symbols being reduced, and their result.  */
-  for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++)
-    YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]);
-  YYFPRINTF (stderr, "-> %s\n", yytname[yyr1[yyrule]]);
+  YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
+	     yyrule - 1, yylno);
+  /* The symbols being reduced.  */
+  for (yyi = 0; yyi < yynrhs; yyi++)
+    {
+      fprintf (stderr, "   $%d = ", yyi + 1);
+      yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
+		       &(yyvsp[(yyi + 1) - (yynrhs)])
+		       		       );
+      fprintf (stderr, "\n");
+    }
 }
 
 # define YY_REDUCE_PRINT(Rule)		\
 do {					\
   if (yydebug)				\
-    yy_reduce_print (Rule);		\
-} while (0)
+    yy_reduce_print (yyvsp, Rule); \
+} while (YYID (0))
 
 /* Nonzero means print parse trace.  It is left uninitialized so that
    multiple parsers can coexist.  */
@@ -2538,42 +2682,44 @@
 #if YYERROR_VERBOSE
 
 # ifndef yystrlen
-#  if defined (__GLIBC__) && defined (_STRING_H)
+#  if defined __GLIBC__ && defined _STRING_H
 #   define yystrlen strlen
 #  else
 /* Return the length of YYSTR.  */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 static YYSIZE_T
-#   if defined (__STDC__) || defined (__cplusplus)
 yystrlen (const char *yystr)
-#   else
+#else
+static YYSIZE_T
 yystrlen (yystr)
-     const char *yystr;
-#   endif
+    const char *yystr;
+#endif
 {
-  const char *yys = yystr;
-
-  while (*yys++ != '\0')
+  YYSIZE_T yylen;
+  for (yylen = 0; yystr[yylen]; yylen++)
     continue;
-
-  return yys - yystr - 1;
+  return yylen;
 }
 #  endif
 # endif
 
 # ifndef yystpcpy
-#  if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE)
+#  if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
 #   define yystpcpy stpcpy
 #  else
 /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
    YYDEST.  */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 static char *
-#   if defined (__STDC__) || defined (__cplusplus)
 yystpcpy (char *yydest, const char *yysrc)
-#   else
+#else
+static char *
 yystpcpy (yydest, yysrc)
-     char *yydest;
-     const char *yysrc;
-#   endif
+    char *yydest;
+    const char *yysrc;
+#endif
 {
   char *yyd = yydest;
   const char *yys = yysrc;
@@ -2599,7 +2745,7 @@
 {
   if (*yystr == '"')
     {
-      size_t yyn = 0;
+      YYSIZE_T yyn = 0;
       char const *yyp = yystr;
 
       for (;;)
@@ -2634,53 +2780,123 @@
 }
 # endif
 
-#endif /* YYERROR_VERBOSE */
+/* Copy into YYRESULT an error message about the unexpected token
+   YYCHAR while in state YYSTATE.  Return the number of bytes copied,
+   including the terminating null byte.  If YYRESULT is null, do not
+   copy anything; just return the number of bytes that would be
+   copied.  As a special case, return 0 if an ordinary "syntax error"
+   message will do.  Return YYSIZE_MAXIMUM if overflow occurs during
+   size calculation.  */
+static YYSIZE_T
+yysyntax_error (char *yyresult, int yystate, int yychar)
+{
+  int yyn = yypact[yystate];
 
+  if (! (YYPACT_NINF < yyn && yyn <= YYLAST))
+    return 0;
+  else
+    {
+      int yytype = YYTRANSLATE (yychar);
+      YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
+      YYSIZE_T yysize = yysize0;
+      YYSIZE_T yysize1;
+      int yysize_overflow = 0;
+      enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
+      char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
+      int yyx;
+
+# if 0
+      /* This is so xgettext sees the translatable formats that are
+	 constructed on the fly.  */
+      YY_("syntax error, unexpected %s");
+      YY_("syntax error, unexpected %s, expecting %s");
+      YY_("syntax error, unexpected %s, expecting %s or %s");
+      YY_("syntax error, unexpected %s, expecting %s or %s or %s");
+      YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
+# endif
+      char *yyfmt;
+      char const *yyf;
+      static char const yyunexpected[] = "syntax error, unexpected %s";
+      static char const yyexpecting[] = ", expecting %s";
+      static char const yyor[] = " or %s";
+      char yyformat[sizeof yyunexpected
+		    + sizeof yyexpecting - 1
+		    + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
+		       * (sizeof yyor - 1))];
+      char const *yyprefix = yyexpecting;
+
+      /* Start YYX at -YYN if negative to avoid negative indexes in
+	 YYCHECK.  */
+      int yyxbegin = yyn < 0 ? -yyn : 0;
+
+      /* Stay within bounds of both yycheck and yytname.  */
+      int yychecklim = YYLAST - yyn + 1;
+      int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
+      int yycount = 1;
+
+      yyarg[0] = yytname[yytype];
+      yyfmt = yystpcpy (yyformat, yyunexpected);
+
+      for (yyx = yyxbegin; yyx < yyxend; ++yyx)
+	if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+	  {
+	    if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
+	      {
+		yycount = 1;
+		yysize = yysize0;
+		yyformat[sizeof yyunexpected - 1] = '\0';
+		break;
+	      }
+	    yyarg[yycount++] = yytname[yyx];
+	    yysize1 = yysize + yytnamerr (0, yytname[yyx]);
+	    yysize_overflow |= (yysize1 < yysize);
+	    yysize = yysize1;
+	    yyfmt = yystpcpy (yyfmt, yyprefix);
+	    yyprefix = yyor;
+	  }
+
+      yyf = YY_(yyformat);
+      yysize1 = yysize + yystrlen (yyf);
+      yysize_overflow |= (yysize1 < yysize);
+      yysize = yysize1;
+
+      if (yysize_overflow)
+	return YYSIZE_MAXIMUM;
+
+      if (yyresult)
+	{
+	  /* Avoid sprintf, as that infringes on the user's name space.
+	     Don't have undefined behavior even if the translation
+	     produced a string with the wrong number of "%s"s.  */
+	  char *yyp = yyresult;
+	  int yyi = 0;
+	  while ((*yyp = *yyf) != '\0')
+	    {
+	      if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
+		{
+		  yyp += yytnamerr (yyp, yyarg[yyi++]);
+		  yyf += 2;
+		}
+	      else
+		{
+		  yyp++;
+		  yyf++;
+		}
+	    }
+	}
+      return yysize;
+    }
+}
+#endif /* YYERROR_VERBOSE */
 
 
-#if YYDEBUG
-/*--------------------------------.
-| Print this symbol on YYOUTPUT.  |
-`--------------------------------*/
-
-#if defined (__STDC__) || defined (__cplusplus)
-static void
-yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep)
-#else
-static void
-yysymprint (yyoutput, yytype, yyvaluep)
-    FILE *yyoutput;
-    int yytype;
-    YYSTYPE *yyvaluep;
-#endif
-{
-  /* Pacify ``unused variable'' warnings.  */
-  (void) yyvaluep;
-
-  if (yytype < YYNTOKENS)
-    YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
-  else
-    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
-
-
-# ifdef YYPRINT
-  if (yytype < YYNTOKENS)
-    YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
-# endif
-  switch (yytype)
-    {
-      default:
-        break;
-    }
-  YYFPRINTF (yyoutput, ")");
-}
-
-#endif /* ! YYDEBUG */
 /*-----------------------------------------------.
 | Release the memory associated to this symbol.  |
 `-----------------------------------------------*/
 
-#if defined (__STDC__) || defined (__cplusplus)
+/*ARGSUSED*/
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 static void
 yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
 #else
@@ -2691,8 +2907,7 @@
     YYSTYPE *yyvaluep;
 #endif
 {
-  /* Pacify ``unused variable'' warnings.  */
-  (void) yyvaluep;
+  YYUSE (yyvaluep);
 
   if (!yymsg)
     yymsg = "Deleting";
@@ -2702,7 +2917,7 @@
     {
 
       default:
-        break;
+	break;
     }
 }
 
@@ -2710,13 +2925,13 @@
 /* Prevent warnings from -Wmissing-prototypes.  */
 
 #ifdef YYPARSE_PARAM
-# if defined (__STDC__) || defined (__cplusplus)
+#if defined __STDC__ || defined __cplusplus
 int yyparse (void *YYPARSE_PARAM);
-# else
+#else
 int yyparse ();
-# endif
+#endif
 #else /* ! YYPARSE_PARAM */
-#if defined (__STDC__) || defined (__cplusplus)
+#if defined __STDC__ || defined __cplusplus
 int yyparse (void);
 #else
 int yyparse ();
@@ -2741,14 +2956,18 @@
 `----------*/
 
 #ifdef YYPARSE_PARAM
-# if defined (__STDC__) || defined (__cplusplus)
-int yyparse (void *YYPARSE_PARAM)
-# else
-int yyparse (YYPARSE_PARAM)
-  void *YYPARSE_PARAM;
-# endif
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+int
+yyparse (void *YYPARSE_PARAM)
+#else
+int
+yyparse (YYPARSE_PARAM)
+    void *YYPARSE_PARAM;
+#endif
 #else /* ! YYPARSE_PARAM */
-#if defined (__STDC__) || defined (__cplusplus)
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 int
 yyparse (void)
 #else
@@ -2766,6 +2985,12 @@
   int yyerrstatus;
   /* Look-ahead token as an internal (translated) token number.  */
   int yytoken = 0;
+#if YYERROR_VERBOSE
+  /* Buffer for error messages, and its allocated size.  */
+  char yymsgbuf[128];
+  char *yymsg = yymsgbuf;
+  YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
+#endif
 
   /* Three stacks and their tools:
      `yyss': related to states,
@@ -2776,9 +3001,9 @@
      to reallocate them elsewhere.  */
 
   /* The state stack.  */
-  short int yyssa[YYINITDEPTH];
-  short int *yyss = yyssa;
-  short int *yyssp;
+  yytype_int16 yyssa[YYINITDEPTH];
+  yytype_int16 *yyss = yyssa;
+  yytype_int16 *yyssp;
 
   /* The semantic value stack.  */
   YYSTYPE yyvsa[YYINITDEPTH];
@@ -2787,7 +3012,7 @@
 
 
 
-#define YYPOPSTACK   (yyvsp--, yyssp--)
+#define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N))
 
   YYSIZE_T yystacksize = YYINITDEPTH;
 
@@ -2796,9 +3021,9 @@
   YYSTYPE yyval;
 
 
-  /* When reducing, the number of symbols on the RHS of the reduced
-     rule.  */
-  int yylen;
+  /* The number of symbols on the RHS of the reduced rule.
+     Keep to zero when no symbol should be popped.  */
+  int yylen = 0;
 
   YYDPRINTF ((stderr, "Starting parse\n"));
 
@@ -2822,8 +3047,7 @@
 `------------------------------------------------------------*/
  yynewstate:
   /* In all cases, when you get here, the value and location stacks
-     have just been pushed. so pushing a state here evens the stacks.
-     */
+     have just been pushed.  So pushing a state here evens the stacks.  */
   yyssp++;
 
  yysetstate:
@@ -2836,11 +3060,11 @@
 
 #ifdef yyoverflow
       {
-	/* Give user a chance to reallocate the stack. Use copies of
+	/* Give user a chance to reallocate the stack.  Use copies of
 	   these so that the &'s don't force the real ones into
 	   memory.  */
 	YYSTYPE *yyvs1 = yyvs;
-	short int *yyss1 = yyss;
+	yytype_int16 *yyss1 = yyss;
 
 
 	/* Each stack pointer address is followed by the size of the
@@ -2868,7 +3092,7 @@
 	yystacksize = YYMAXDEPTH;
 
       {
-	short int *yyss1 = yyss;
+	yytype_int16 *yyss1 = yyss;
 	union yyalloc *yyptr =
 	  (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
 	if (! yyptr)
@@ -2903,12 +3127,10 @@
 `-----------*/
 yybackup:
 
-/* Do appropriate processing given the current state.  */
-/* Read a look-ahead token if we need one and don't already have one.  */
-/* yyresume: */
+  /* Do appropriate processing given the current state.  Read a
+     look-ahead token if we need one and don't already have one.  */
 
   /* First try to decide what to do without reference to look-ahead token.  */
-
   yyn = yypact[yystate];
   if (yyn == YYPACT_NINF)
     goto yydefault;
@@ -2950,22 +3172,21 @@
   if (yyn == YYFINAL)
     YYACCEPT;
 
-  /* Shift the look-ahead token.  */
-  YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
-
-  /* Discard the token being shifted unless it is eof.  */
-  if (yychar != YYEOF)
-    yychar = YYEMPTY;
-
-  *++yyvsp = yylval;
-
-
   /* Count tokens shifted since error; after three, turn off error
      status.  */
   if (yyerrstatus)
     yyerrstatus--;
 
+  /* Shift the look-ahead token.  */
+  YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
+
+  /* Discard the shifted token unless it is eof.  */
+  if (yychar != YYEOF)
+    yychar = YYEMPTY;
+
   yystate = yyn;
+  *++yyvsp = yylval;
+
   goto yynewstate;
 
 
@@ -3001,165 +3222,165 @@
   switch (yyn)
     {
         case 3:
-#line 991 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 991 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-  if ((yyvsp[0].UIntVal) > (uint32_t)INT32_MAX)     // Outside of my range!
+  if ((yyvsp[(1) - (1)].UIntVal) > (uint32_t)INT32_MAX)     // Outside of my range!
     GEN_ERROR("Value too large for type!");
-  (yyval.SIntVal) = (int32_t)(yyvsp[0].UIntVal);
+  (yyval.SIntVal) = (int32_t)(yyvsp[(1) - (1)].UIntVal);
   CHECK_FOR_ERROR
 ;}
     break;
 
   case 5:
-#line 1000 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1000 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-  if ((yyvsp[0].UInt64Val) > (uint64_t)INT64_MAX)     // Outside of my range!
+  if ((yyvsp[(1) - (1)].UInt64Val) > (uint64_t)INT64_MAX)     // Outside of my range!
     GEN_ERROR("Value too large for type!");
-  (yyval.SInt64Val) = (int64_t)(yyvsp[0].UInt64Val);
+  (yyval.SInt64Val) = (int64_t)(yyvsp[(1) - (1)].UInt64Val);
   CHECK_FOR_ERROR
 ;}
     break;
 
   case 39:
-#line 1017 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1017 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.IPredicate) = ICmpInst::ICMP_EQ; ;}
     break;
 
   case 40:
-#line 1017 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1017 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.IPredicate) = ICmpInst::ICMP_NE; ;}
     break;
 
   case 41:
-#line 1018 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1018 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.IPredicate) = ICmpInst::ICMP_SLT; ;}
     break;
 
   case 42:
-#line 1018 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1018 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.IPredicate) = ICmpInst::ICMP_SGT; ;}
     break;
 
   case 43:
-#line 1019 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1019 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.IPredicate) = ICmpInst::ICMP_SLE; ;}
     break;
 
   case 44:
-#line 1019 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1019 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.IPredicate) = ICmpInst::ICMP_SGE; ;}
     break;
 
   case 45:
-#line 1020 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1020 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.IPredicate) = ICmpInst::ICMP_ULT; ;}
     break;
 
   case 46:
-#line 1020 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1020 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.IPredicate) = ICmpInst::ICMP_UGT; ;}
     break;
 
   case 47:
-#line 1021 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1021 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.IPredicate) = ICmpInst::ICMP_ULE; ;}
     break;
 
   case 48:
-#line 1021 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1021 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.IPredicate) = ICmpInst::ICMP_UGE; ;}
     break;
 
   case 49:
-#line 1025 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1025 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.FPredicate) = FCmpInst::FCMP_OEQ; ;}
     break;
 
   case 50:
-#line 1025 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1025 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.FPredicate) = FCmpInst::FCMP_ONE; ;}
     break;
 
   case 51:
-#line 1026 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1026 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.FPredicate) = FCmpInst::FCMP_OLT; ;}
     break;
 
   case 52:
-#line 1026 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1026 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.FPredicate) = FCmpInst::FCMP_OGT; ;}
     break;
 
   case 53:
-#line 1027 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1027 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.FPredicate) = FCmpInst::FCMP_OLE; ;}
     break;
 
   case 54:
-#line 1027 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1027 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.FPredicate) = FCmpInst::FCMP_OGE; ;}
     break;
 
   case 55:
-#line 1028 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1028 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.FPredicate) = FCmpInst::FCMP_ORD; ;}
     break;
 
   case 56:
-#line 1028 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1028 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.FPredicate) = FCmpInst::FCMP_UNO; ;}
     break;
 
   case 57:
-#line 1029 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1029 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.FPredicate) = FCmpInst::FCMP_UEQ; ;}
     break;
 
   case 58:
-#line 1029 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1029 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.FPredicate) = FCmpInst::FCMP_UNE; ;}
     break;
 
   case 59:
-#line 1030 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1030 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.FPredicate) = FCmpInst::FCMP_ULT; ;}
     break;
 
   case 60:
-#line 1030 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1030 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.FPredicate) = FCmpInst::FCMP_UGT; ;}
     break;
 
   case 61:
-#line 1031 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1031 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.FPredicate) = FCmpInst::FCMP_ULE; ;}
     break;
 
   case 62:
-#line 1031 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1031 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.FPredicate) = FCmpInst::FCMP_UGE; ;}
     break;
 
   case 63:
-#line 1032 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1032 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.FPredicate) = FCmpInst::FCMP_TRUE; ;}
     break;
 
   case 64:
-#line 1033 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1033 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.FPredicate) = FCmpInst::FCMP_FALSE; ;}
     break;
 
   case 77:
-#line 1044 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1044 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.StrVal) = (yyvsp[-1].StrVal);
+    (yyval.StrVal) = (yyvsp[(1) - (2)].StrVal);
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 78:
-#line 1048 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1048 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
     (yyval.StrVal) = 0;
     CHECK_FOR_ERROR
@@ -3167,99 +3388,99 @@
     break;
 
   case 79:
-#line 1053 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1053 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.Linkage) = GlobalValue::InternalLinkage; ;}
     break;
 
   case 80:
-#line 1054 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1054 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.Linkage) = GlobalValue::LinkOnceLinkage; ;}
     break;
 
   case 81:
-#line 1055 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1055 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.Linkage) = GlobalValue::WeakLinkage; ;}
     break;
 
   case 82:
-#line 1056 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1056 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.Linkage) = GlobalValue::AppendingLinkage; ;}
     break;
 
   case 83:
-#line 1057 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1057 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.Linkage) = GlobalValue::DLLImportLinkage; ;}
     break;
 
   case 84:
-#line 1058 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1058 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.Linkage) = GlobalValue::DLLExportLinkage; ;}
     break;
 
   case 85:
-#line 1059 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1059 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.Linkage) = GlobalValue::ExternalWeakLinkage; ;}
     break;
 
   case 86:
-#line 1060 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1060 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.Linkage) = GlobalValue::ExternalLinkage; ;}
     break;
 
   case 87:
-#line 1062 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1062 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.UIntVal) = CallingConv::C; ;}
     break;
 
   case 88:
-#line 1063 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1063 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.UIntVal) = CallingConv::C; ;}
     break;
 
   case 89:
-#line 1064 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1064 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.UIntVal) = CallingConv::CSRet; ;}
     break;
 
   case 90:
-#line 1065 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1065 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.UIntVal) = CallingConv::Fast; ;}
     break;
 
   case 91:
-#line 1066 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1066 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.UIntVal) = CallingConv::Cold; ;}
     break;
 
   case 92:
-#line 1067 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1067 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.UIntVal) = CallingConv::X86_StdCall; ;}
     break;
 
   case 93:
-#line 1068 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1068 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.UIntVal) = CallingConv::X86_FastCall; ;}
     break;
 
   case 94:
-#line 1069 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1069 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-                   if ((unsigned)(yyvsp[0].UInt64Val) != (yyvsp[0].UInt64Val))
+                   if ((unsigned)(yyvsp[(2) - (2)].UInt64Val) != (yyvsp[(2) - (2)].UInt64Val))
                      GEN_ERROR("Calling conv too large!");
-                   (yyval.UIntVal) = (yyvsp[0].UInt64Val);
+                   (yyval.UIntVal) = (yyvsp[(2) - (2)].UInt64Val);
                   CHECK_FOR_ERROR
                  ;}
     break;
 
   case 95:
-#line 1078 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1078 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.UIntVal) = 0; ;}
     break;
 
   case 96:
-#line 1079 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1079 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-  (yyval.UIntVal) = (yyvsp[0].UInt64Val);
+  (yyval.UIntVal) = (yyvsp[(2) - (2)].UInt64Val);
   if ((yyval.UIntVal) != 0 && !isPowerOf2_32((yyval.UIntVal)))
     GEN_ERROR("Alignment must be a power of two!");
   CHECK_FOR_ERROR
@@ -3267,14 +3488,14 @@
     break;
 
   case 97:
-#line 1085 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1085 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.UIntVal) = 0; ;}
     break;
 
   case 98:
-#line 1086 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1086 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-  (yyval.UIntVal) = (yyvsp[0].UInt64Val);
+  (yyval.UIntVal) = (yyvsp[(3) - (3)].UInt64Val);
   if ((yyval.UIntVal) != 0 && !isPowerOf2_32((yyval.UIntVal)))
     GEN_ERROR("Alignment must be a power of two!");
   CHECK_FOR_ERROR
@@ -3282,77 +3503,77 @@
     break;
 
   case 99:
-#line 1094 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1094 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-  for (unsigned i = 0, e = strlen((yyvsp[0].StrVal)); i != e; ++i)
-    if ((yyvsp[0].StrVal)[i] == '"' || (yyvsp[0].StrVal)[i] == '\\')
+  for (unsigned i = 0, e = strlen((yyvsp[(2) - (2)].StrVal)); i != e; ++i)
+    if ((yyvsp[(2) - (2)].StrVal)[i] == '"' || (yyvsp[(2) - (2)].StrVal)[i] == '\\')
       GEN_ERROR("Invalid character in section name!");
-  (yyval.StrVal) = (yyvsp[0].StrVal);
+  (yyval.StrVal) = (yyvsp[(2) - (2)].StrVal);
   CHECK_FOR_ERROR
 ;}
     break;
 
   case 100:
-#line 1102 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1102 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.StrVal) = 0; ;}
     break;
 
   case 101:
-#line 1103 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.StrVal) = (yyvsp[0].StrVal); ;}
+#line 1103 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
+    { (yyval.StrVal) = (yyvsp[(1) - (1)].StrVal); ;}
     break;
 
   case 102:
-#line 1108 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1108 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {;}
     break;
 
   case 103:
-#line 1109 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1109 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {;}
     break;
 
   case 104:
-#line 1110 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1110 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    CurGV->setSection((yyvsp[0].StrVal));
-    free((yyvsp[0].StrVal));
+    CurGV->setSection((yyvsp[(1) - (1)].StrVal));
+    free((yyvsp[(1) - (1)].StrVal));
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 105:
-#line 1115 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1115 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    if ((yyvsp[0].UInt64Val) != 0 && !isPowerOf2_32((yyvsp[0].UInt64Val)))
+    if ((yyvsp[(2) - (2)].UInt64Val) != 0 && !isPowerOf2_32((yyvsp[(2) - (2)].UInt64Val)))
       GEN_ERROR("Alignment must be a power of two!");
-    CurGV->setAlignment((yyvsp[0].UInt64Val));
+    CurGV->setAlignment((yyvsp[(2) - (2)].UInt64Val));
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 107:
-#line 1129 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.TypeVal) = new PATypeHolder((yyvsp[0].PrimType)); ;}
+#line 1129 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
+    { (yyval.TypeVal) = new PATypeHolder((yyvsp[(1) - (1)].PrimType)); ;}
     break;
 
   case 109:
-#line 1130 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
-    { (yyval.TypeVal) = new PATypeHolder((yyvsp[0].PrimType)); ;}
+#line 1130 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
+    { (yyval.TypeVal) = new PATypeHolder((yyvsp[(1) - (1)].PrimType)); ;}
     break;
 
   case 110:
-#line 1132 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1132 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
     if (!UpRefs.empty())
-      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[0].TypeVal))->getDescription());
-    (yyval.TypeVal) = (yyvsp[0].TypeVal);
+      GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[(1) - (1)].TypeVal))->getDescription());
+    (yyval.TypeVal) = (yyvsp[(1) - (1)].TypeVal);
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 124:
-#line 1144 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1144 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
     (yyval.TypeVal) = new PATypeHolder(OpaqueType::get());
     CHECK_FOR_ERROR
@@ -3360,28 +3581,28 @@
     break;
 
   case 125:
-#line 1148 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1148 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.TypeVal) = new PATypeHolder((yyvsp[0].PrimType));
+    (yyval.TypeVal) = new PATypeHolder((yyvsp[(1) - (1)].PrimType));
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 126:
-#line 1152 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1152 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {            // Named types are also simple types...
-  const Type* tmp = getTypeVal((yyvsp[0].ValIDVal));
+  const Type* tmp = getTypeVal((yyvsp[(1) - (1)].ValIDVal));
   CHECK_FOR_ERROR
   (yyval.TypeVal) = new PATypeHolder(tmp);
 ;}
     break;
 
   case 127:
-#line 1160 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1160 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {                   // Type UpReference
-    if ((yyvsp[0].UInt64Val) > (uint64_t)~0U) GEN_ERROR("Value out of range!");
+    if ((yyvsp[(2) - (2)].UInt64Val) > (uint64_t)~0U) GEN_ERROR("Value out of range!");
     OpaqueType *OT = OpaqueType::get();        // Use temporary placeholder
-    UpRefs.push_back(UpRefRecord((unsigned)(yyvsp[0].UInt64Val), OT));  // Add to vector...
+    UpRefs.push_back(UpRefRecord((unsigned)(yyvsp[(2) - (2)].UInt64Val), OT));  // Add to vector...
     (yyval.TypeVal) = new PATypeHolder(OT);
     UR_OUT("New Upreference!\n");
     CHECK_FOR_ERROR
@@ -3389,63 +3610,63 @@
     break;
 
   case 128:
-#line 1168 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1168 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {           // Function derived type?
     std::vector<const Type*> Params;
-    for (std::list<llvm::PATypeHolder>::iterator I = (yyvsp[-1].TypeList)->begin(),
-           E = (yyvsp[-1].TypeList)->end(); I != E; ++I)
+    for (std::list<llvm::PATypeHolder>::iterator I = (yyvsp[(3) - (4)].TypeList)->begin(),
+           E = (yyvsp[(3) - (4)].TypeList)->end(); I != E; ++I)
       Params.push_back(*I);
     bool isVarArg = Params.size() && Params.back() == Type::VoidTy;
     if (isVarArg) Params.pop_back();
 
-    (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(FunctionType::get(*(yyvsp[-3].TypeVal),Params,isVarArg)));
-    delete (yyvsp[-1].TypeList);      // Delete the argument list
-    delete (yyvsp[-3].TypeVal);      // Delete the return type handle
+    (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(FunctionType::get(*(yyvsp[(1) - (4)].TypeVal),Params,isVarArg)));
+    delete (yyvsp[(3) - (4)].TypeList);      // Delete the argument list
+    delete (yyvsp[(1) - (4)].TypeVal);      // Delete the return type handle
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 129:
-#line 1181 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1181 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {          // Sized array type?
-    (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(ArrayType::get(*(yyvsp[-1].TypeVal), (unsigned)(yyvsp[-3].UInt64Val))));
-    delete (yyvsp[-1].TypeVal);
+    (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(ArrayType::get(*(yyvsp[(4) - (5)].TypeVal), (unsigned)(yyvsp[(2) - (5)].UInt64Val))));
+    delete (yyvsp[(4) - (5)].TypeVal);
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 130:
-#line 1186 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1186 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {          // Packed array type?
-     const llvm::Type* ElemTy = (yyvsp[-1].TypeVal)->get();
-     if ((unsigned)(yyvsp[-3].UInt64Val) != (yyvsp[-3].UInt64Val))
+     const llvm::Type* ElemTy = (yyvsp[(4) - (5)].TypeVal)->get();
+     if ((unsigned)(yyvsp[(2) - (5)].UInt64Val) != (yyvsp[(2) - (5)].UInt64Val))
         GEN_ERROR("Unsigned result not equal to signed result");
      if (!ElemTy->isPrimitiveType())
         GEN_ERROR("Elemental type of a PackedType must be primitive");
-     if (!isPowerOf2_32((yyvsp[-3].UInt64Val)))
+     if (!isPowerOf2_32((yyvsp[(2) - (5)].UInt64Val)))
        GEN_ERROR("Vector length should be a power of 2!");
-     (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(PackedType::get(*(yyvsp[-1].TypeVal), (unsigned)(yyvsp[-3].UInt64Val))));
-     delete (yyvsp[-1].TypeVal);
+     (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(PackedType::get(*(yyvsp[(4) - (5)].TypeVal), (unsigned)(yyvsp[(2) - (5)].UInt64Val))));
+     delete (yyvsp[(4) - (5)].TypeVal);
      CHECK_FOR_ERROR
   ;}
     break;
 
   case 131:
-#line 1198 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1198 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {                        // Structure type?
     std::vector<const Type*> Elements;
-    for (std::list<llvm::PATypeHolder>::iterator I = (yyvsp[-1].TypeList)->begin(),
-           E = (yyvsp[-1].TypeList)->end(); I != E; ++I)
+    for (std::list<llvm::PATypeHolder>::iterator I = (yyvsp[(2) - (3)].TypeList)->begin(),
+           E = (yyvsp[(2) - (3)].TypeList)->end(); I != E; ++I)
       Elements.push_back(*I);
 
     (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(StructType::get(Elements)));
-    delete (yyvsp[-1].TypeList);
+    delete (yyvsp[(2) - (3)].TypeList);
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 132:
-#line 1208 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1208 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {                                  // Empty structure type?
     (yyval.TypeVal) = new PATypeHolder(StructType::get(std::vector<const Type*>()));
     CHECK_FOR_ERROR
@@ -3453,43 +3674,43 @@
     break;
 
   case 133:
-#line 1212 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1212 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {                             // Pointer type?
-    if (*(yyvsp[-1].TypeVal) == Type::LabelTy)
+    if (*(yyvsp[(1) - (2)].TypeVal) == Type::LabelTy)
       GEN_ERROR("Cannot form a pointer to a basic block");
-    (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(PointerType::get(*(yyvsp[-1].TypeVal))));
-    delete (yyvsp[-1].TypeVal);
+    (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(PointerType::get(*(yyvsp[(1) - (2)].TypeVal))));
+    delete (yyvsp[(1) - (2)].TypeVal);
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 134:
-#line 1223 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1223 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
     (yyval.TypeList) = new std::list<PATypeHolder>();
-    (yyval.TypeList)->push_back(*(yyvsp[0].TypeVal)); delete (yyvsp[0].TypeVal);
+    (yyval.TypeList)->push_back(*(yyvsp[(1) - (1)].TypeVal)); delete (yyvsp[(1) - (1)].TypeVal);
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 135:
-#line 1228 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1228 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    ((yyval.TypeList)=(yyvsp[-2].TypeList))->push_back(*(yyvsp[0].TypeVal)); delete (yyvsp[0].TypeVal);
+    ((yyval.TypeList)=(yyvsp[(1) - (3)].TypeList))->push_back(*(yyvsp[(3) - (3)].TypeVal)); delete (yyvsp[(3) - (3)].TypeVal);
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 137:
-#line 1235 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1235 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    ((yyval.TypeList)=(yyvsp[-2].TypeList))->push_back(Type::VoidTy);
+    ((yyval.TypeList)=(yyvsp[(1) - (3)].TypeList))->push_back(Type::VoidTy);
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 138:
-#line 1239 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1239 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
     ((yyval.TypeList) = new std::list<PATypeHolder>())->push_back(Type::VoidTy);
     CHECK_FOR_ERROR
@@ -3497,7 +3718,7 @@
     break;
 
   case 139:
-#line 1243 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1243 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
     (yyval.TypeList) = new std::list<PATypeHolder>();
     CHECK_FOR_ERROR
@@ -3505,186 +3726,186 @@
     break;
 
   case 140:
-#line 1254 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1254 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { // Nonempty unsized arr
-    const ArrayType *ATy = dyn_cast<ArrayType>((yyvsp[-3].TypeVal)->get());
+    const ArrayType *ATy = dyn_cast<ArrayType>((yyvsp[(1) - (4)].TypeVal)->get());
     if (ATy == 0)
       GEN_ERROR("Cannot make array constant with type: '" + 
-                     (*(yyvsp[-3].TypeVal))->getDescription() + "'!");
+                     (*(yyvsp[(1) - (4)].TypeVal))->getDescription() + "'!");
     const Type *ETy = ATy->getElementType();
     int NumElements = ATy->getNumElements();
 
     // Verify that we have the correct size...
-    if (NumElements != -1 && NumElements != (int)(yyvsp[-1].ConstVector)->size())
+    if (NumElements != -1 && NumElements != (int)(yyvsp[(3) - (4)].ConstVector)->size())
       GEN_ERROR("Type mismatch: constant sized array initialized with " +
-                     utostr((yyvsp[-1].ConstVector)->size()) +  " arguments, but has size of " + 
+                     utostr((yyvsp[(3) - (4)].ConstVector)->size()) +  " arguments, but has size of " + 
                      itostr(NumElements) + "!");
 
     // Verify all elements are correct type!
-    for (unsigned i = 0; i < (yyvsp[-1].ConstVector)->size(); i++) {
-      if (ETy != (*(yyvsp[-1].ConstVector))[i]->getType())
+    for (unsigned i = 0; i < (yyvsp[(3) - (4)].ConstVector)->size(); i++) {
+      if (ETy != (*(yyvsp[(3) - (4)].ConstVector))[i]->getType())
         GEN_ERROR("Element #" + utostr(i) + " is not of type '" + 
                        ETy->getDescription() +"' as required!\nIt is of type '"+
-                       (*(yyvsp[-1].ConstVector))[i]->getType()->getDescription() + "'.");
+                       (*(yyvsp[(3) - (4)].ConstVector))[i]->getType()->getDescription() + "'.");
     }
 
-    (yyval.ConstVal) = ConstantArray::get(ATy, *(yyvsp[-1].ConstVector));
-    delete (yyvsp[-3].TypeVal); delete (yyvsp[-1].ConstVector);
+    (yyval.ConstVal) = ConstantArray::get(ATy, *(yyvsp[(3) - (4)].ConstVector));
+    delete (yyvsp[(1) - (4)].TypeVal); delete (yyvsp[(3) - (4)].ConstVector);
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 141:
-#line 1280 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1280 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    const ArrayType *ATy = dyn_cast<ArrayType>((yyvsp[-2].TypeVal)->get());
+    const ArrayType *ATy = dyn_cast<ArrayType>((yyvsp[(1) - (3)].TypeVal)->get());
     if (ATy == 0)
       GEN_ERROR("Cannot make array constant with type: '" + 
-                     (*(yyvsp[-2].TypeVal))->getDescription() + "'!");
+                     (*(yyvsp[(1) - (3)].TypeVal))->getDescription() + "'!");
 
     int NumElements = ATy->getNumElements();
     if (NumElements != -1 && NumElements != 0) 
       GEN_ERROR("Type mismatch: constant sized array initialized with 0"
                      " arguments, but has size of " + itostr(NumElements) +"!");
     (yyval.ConstVal) = ConstantArray::get(ATy, std::vector<Constant*>());
-    delete (yyvsp[-2].TypeVal);
+    delete (yyvsp[(1) - (3)].TypeVal);
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 142:
-#line 1294 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1294 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    const ArrayType *ATy = dyn_cast<ArrayType>((yyvsp[-2].TypeVal)->get());
+    const ArrayType *ATy = dyn_cast<ArrayType>((yyvsp[(1) - (3)].TypeVal)->get());
     if (ATy == 0)
       GEN_ERROR("Cannot make array constant with type: '" + 
-                     (*(yyvsp[-2].TypeVal))->getDescription() + "'!");
+                     (*(yyvsp[(1) - (3)].TypeVal))->getDescription() + "'!");
 
     int NumElements = ATy->getNumElements();
     const Type *ETy = ATy->getElementType();
-    char *EndStr = UnEscapeLexed((yyvsp[0].StrVal), true);
-    if (NumElements != -1 && NumElements != (EndStr-(yyvsp[0].StrVal)))
+    char *EndStr = UnEscapeLexed((yyvsp[(3) - (3)].StrVal), true);
+    if (NumElements != -1 && NumElements != (EndStr-(yyvsp[(3) - (3)].StrVal)))
       GEN_ERROR("Can't build string constant of size " + 
-                     itostr((int)(EndStr-(yyvsp[0].StrVal))) +
+                     itostr((int)(EndStr-(yyvsp[(3) - (3)].StrVal))) +
                      " when array has size " + itostr(NumElements) + "!");
     std::vector<Constant*> Vals;
     if (ETy == Type::SByteTy) {
-      for (signed char *C = (signed char *)(yyvsp[0].StrVal); C != (signed char *)EndStr; ++C)
+      for (signed char *C = (signed char *)(yyvsp[(3) - (3)].StrVal); C != (signed char *)EndStr; ++C)
         Vals.push_back(ConstantInt::get(ETy, *C));
     } else if (ETy == Type::UByteTy) {
-      for (unsigned char *C = (unsigned char *)(yyvsp[0].StrVal); 
+      for (unsigned char *C = (unsigned char *)(yyvsp[(3) - (3)].StrVal); 
            C != (unsigned char*)EndStr; ++C)
         Vals.push_back(ConstantInt::get(ETy, *C));
     } else {
-      free((yyvsp[0].StrVal));
+      free((yyvsp[(3) - (3)].StrVal));
       GEN_ERROR("Cannot build string arrays of non byte sized elements!");
     }
-    free((yyvsp[0].StrVal));
+    free((yyvsp[(3) - (3)].StrVal));
     (yyval.ConstVal) = ConstantArray::get(ATy, Vals);
-    delete (yyvsp[-2].TypeVal);
+    delete (yyvsp[(1) - (3)].TypeVal);
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 143:
-#line 1324 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1324 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { // Nonempty unsized arr
-    const PackedType *PTy = dyn_cast<PackedType>((yyvsp[-3].TypeVal)->get());
+    const PackedType *PTy = dyn_cast<PackedType>((yyvsp[(1) - (4)].TypeVal)->get());
     if (PTy == 0)
       GEN_ERROR("Cannot make packed constant with type: '" + 
-                     (*(yyvsp[-3].TypeVal))->getDescription() + "'!");
+                     (*(yyvsp[(1) - (4)].TypeVal))->getDescription() + "'!");
     const Type *ETy = PTy->getElementType();
     int NumElements = PTy->getNumElements();
 
     // Verify that we have the correct size...
-    if (NumElements != -1 && NumElements != (int)(yyvsp[-1].ConstVector)->size())
+    if (NumElements != -1 && NumElements != (int)(yyvsp[(3) - (4)].ConstVector)->size())
       GEN_ERROR("Type mismatch: constant sized packed initialized with " +
-                     utostr((yyvsp[-1].ConstVector)->size()) +  " arguments, but has size of " + 
+                     utostr((yyvsp[(3) - (4)].ConstVector)->size()) +  " arguments, but has size of " + 
                      itostr(NumElements) + "!");
 
     // Verify all elements are correct type!
-    for (unsigned i = 0; i < (yyvsp[-1].ConstVector)->size(); i++) {
-      if (ETy != (*(yyvsp[-1].ConstVector))[i]->getType())
+    for (unsigned i = 0; i < (yyvsp[(3) - (4)].ConstVector)->size(); i++) {
+      if (ETy != (*(yyvsp[(3) - (4)].ConstVector))[i]->getType())
         GEN_ERROR("Element #" + utostr(i) + " is not of type '" + 
            ETy->getDescription() +"' as required!\nIt is of type '"+
-           (*(yyvsp[-1].ConstVector))[i]->getType()->getDescription() + "'.");
+           (*(yyvsp[(3) - (4)].ConstVector))[i]->getType()->getDescription() + "'.");
     }
 
-    (yyval.ConstVal) = ConstantPacked::get(PTy, *(yyvsp[-1].ConstVector));
-    delete (yyvsp[-3].TypeVal); delete (yyvsp[-1].ConstVector);
+    (yyval.ConstVal) = ConstantPacked::get(PTy, *(yyvsp[(3) - (4)].ConstVector));
+    delete (yyvsp[(1) - (4)].TypeVal); delete (yyvsp[(3) - (4)].ConstVector);
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 144:
-#line 1350 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1350 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    const StructType *STy = dyn_cast<StructType>((yyvsp[-3].TypeVal)->get());
+    const StructType *STy = dyn_cast<StructType>((yyvsp[(1) - (4)].TypeVal)->get());
     if (STy == 0)
       GEN_ERROR("Cannot make struct constant with type: '" + 
-                     (*(yyvsp[-3].TypeVal))->getDescription() + "'!");
+                     (*(yyvsp[(1) - (4)].TypeVal))->getDescription() + "'!");
 
-    if ((yyvsp[-1].ConstVector)->size() != STy->getNumContainedTypes())
+    if ((yyvsp[(3) - (4)].ConstVector)->size() != STy->getNumContainedTypes())
       GEN_ERROR("Illegal number of initializers for structure type!");
 
     // Check to ensure that constants are compatible with the type initializer!
-    for (unsigned i = 0, e = (yyvsp[-1].ConstVector)->size(); i != e; ++i)
-      if ((*(yyvsp[-1].ConstVector))[i]->getType() != STy->getElementType(i))
+    for (unsigned i = 0, e = (yyvsp[(3) - (4)].ConstVector)->size(); i != e; ++i)
+      if ((*(yyvsp[(3) - (4)].ConstVector))[i]->getType() != STy->getElementType(i))
         GEN_ERROR("Expected type '" +
                        STy->getElementType(i)->getDescription() +
                        "' for element #" + utostr(i) +
                        " of structure initializer!");
 
-    (yyval.ConstVal) = ConstantStruct::get(STy, *(yyvsp[-1].ConstVector));
-    delete (yyvsp[-3].TypeVal); delete (yyvsp[-1].ConstVector);
+    (yyval.ConstVal) = ConstantStruct::get(STy, *(yyvsp[(3) - (4)].ConstVector));
+    delete (yyvsp[(1) - (4)].TypeVal); delete (yyvsp[(3) - (4)].ConstVector);
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 145:
-#line 1371 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1371 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    const StructType *STy = dyn_cast<StructType>((yyvsp[-2].TypeVal)->get());
+    const StructType *STy = dyn_cast<StructType>((yyvsp[(1) - (3)].TypeVal)->get());
     if (STy == 0)
       GEN_ERROR("Cannot make struct constant with type: '" + 
-                     (*(yyvsp[-2].TypeVal))->getDescription() + "'!");
+                     (*(yyvsp[(1) - (3)].TypeVal))->getDescription() + "'!");
 
     if (STy->getNumContainedTypes() != 0)
       GEN_ERROR("Illegal number of initializers for structure type!");
 
     (yyval.ConstVal) = ConstantStruct::get(STy, std::vector<Constant*>());
-    delete (yyvsp[-2].TypeVal);
+    delete (yyvsp[(1) - (3)].TypeVal);
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 146:
-#line 1384 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1384 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    const PointerType *PTy = dyn_cast<PointerType>((yyvsp[-1].TypeVal)->get());
+    const PointerType *PTy = dyn_cast<PointerType>((yyvsp[(1) - (2)].TypeVal)->get());
     if (PTy == 0)
       GEN_ERROR("Cannot make null pointer constant with type: '" + 
-                     (*(yyvsp[-1].TypeVal))->getDescription() + "'!");
+                     (*(yyvsp[(1) - (2)].TypeVal))->getDescription() + "'!");
 
     (yyval.ConstVal) = ConstantPointerNull::get(PTy);
-    delete (yyvsp[-1].TypeVal);
+    delete (yyvsp[(1) - (2)].TypeVal);
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 147:
-#line 1394 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1394 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.ConstVal) = UndefValue::get((yyvsp[-1].TypeVal)->get());
-    delete (yyvsp[-1].TypeVal);
+    (yyval.ConstVal) = UndefValue::get((yyvsp[(1) - (2)].TypeVal)->get());
+    delete (yyvsp[(1) - (2)].TypeVal);
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 148:
-#line 1399 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1399 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    const PointerType *Ty = dyn_cast<PointerType>((yyvsp[-1].TypeVal)->get());
+    const PointerType *Ty = dyn_cast<PointerType>((yyvsp[(1) - (2)].TypeVal)->get());
     if (Ty == 0)
       GEN_ERROR("Global const reference must be a pointer type!");
 
@@ -3698,7 +3919,7 @@
     Function *SavedCurFn = CurFun.CurrentFunction;
     CurFun.CurrentFunction = 0;
 
-    Value *V = getValNonImprovising(Ty, (yyvsp[0].ValIDVal));
+    Value *V = getValNonImprovising(Ty, (yyvsp[(2) - (2)].ValIDVal));
     CHECK_FOR_ERROR
 
     CurFun.CurrentFunction = SavedCurFn;
@@ -3713,14 +3934,14 @@
 
       // First check to see if the forward references value is already created!
       PerModuleInfo::GlobalRefsType::iterator I =
-        CurModule.GlobalRefs.find(std::make_pair(PT, (yyvsp[0].ValIDVal)));
+        CurModule.GlobalRefs.find(std::make_pair(PT, (yyvsp[(2) - (2)].ValIDVal)));
     
       if (I != CurModule.GlobalRefs.end()) {
         V = I->second;             // Placeholder already exists, use it...
-        (yyvsp[0].ValIDVal).destroy();
+        (yyvsp[(2) - (2)].ValIDVal).destroy();
       } else {
         std::string Name;
-        if ((yyvsp[0].ValIDVal).Type == ValID::NameVal) Name = (yyvsp[0].ValIDVal).Name;
+        if ((yyvsp[(2) - (2)].ValIDVal).Type == ValID::NameVal) Name = (yyvsp[(2) - (2)].ValIDVal).Name;
 
         // Create the forward referenced global.
         GlobalValue *GV;
@@ -3735,62 +3956,62 @@
         }
 
         // Keep track of the fact that we have a forward ref to recycle it
-        CurModule.GlobalRefs.insert(std::make_pair(std::make_pair(PT, (yyvsp[0].ValIDVal)), GV));
+        CurModule.GlobalRefs.insert(std::make_pair(std::make_pair(PT, (yyvsp[(2) - (2)].ValIDVal)), GV));
         V = GV;
       }
     }
 
     (yyval.ConstVal) = cast<GlobalValue>(V);
-    delete (yyvsp[-1].TypeVal);            // Free the type handle
+    delete (yyvsp[(1) - (2)].TypeVal);            // Free the type handle
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 149:
-#line 1460 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1460 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    if ((yyvsp[-1].TypeVal)->get() != (yyvsp[0].ConstVal)->getType())
+    if ((yyvsp[(1) - (2)].TypeVal)->get() != (yyvsp[(2) - (2)].ConstVal)->getType())
       GEN_ERROR("Mismatched types for constant expression!");
-    (yyval.ConstVal) = (yyvsp[0].ConstVal);
-    delete (yyvsp[-1].TypeVal);
+    (yyval.ConstVal) = (yyvsp[(2) - (2)].ConstVal);
+    delete (yyvsp[(1) - (2)].TypeVal);
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 150:
-#line 1467 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1467 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    const Type *Ty = (yyvsp[-1].TypeVal)->get();
+    const Type *Ty = (yyvsp[(1) - (2)].TypeVal)->get();
     if (isa<FunctionType>(Ty) || Ty == Type::LabelTy || isa<OpaqueType>(Ty))
       GEN_ERROR("Cannot create a null initialized value of this type!");
     (yyval.ConstVal) = Constant::getNullValue(Ty);
-    delete (yyvsp[-1].TypeVal);
+    delete (yyvsp[(1) - (2)].TypeVal);
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 151:
-#line 1475 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1475 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {      // integral constants
-    if (!ConstantInt::isValueValidForType((yyvsp[-1].PrimType), (yyvsp[0].SInt64Val)))
+    if (!ConstantInt::isValueValidForType((yyvsp[(1) - (2)].PrimType), (yyvsp[(2) - (2)].SInt64Val)))
       GEN_ERROR("Constant value doesn't fit in type!");
-    (yyval.ConstVal) = ConstantInt::get((yyvsp[-1].PrimType), (yyvsp[0].SInt64Val));
+    (yyval.ConstVal) = ConstantInt::get((yyvsp[(1) - (2)].PrimType), (yyvsp[(2) - (2)].SInt64Val));
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 152:
-#line 1481 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1481 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {            // integral constants
-    if (!ConstantInt::isValueValidForType((yyvsp[-1].PrimType), (yyvsp[0].UInt64Val)))
+    if (!ConstantInt::isValueValidForType((yyvsp[(1) - (2)].PrimType), (yyvsp[(2) - (2)].UInt64Val)))
       GEN_ERROR("Constant value doesn't fit in type!");
-    (yyval.ConstVal) = ConstantInt::get((yyvsp[-1].PrimType), (yyvsp[0].UInt64Val));
+    (yyval.ConstVal) = ConstantInt::get((yyvsp[(1) - (2)].PrimType), (yyvsp[(2) - (2)].UInt64Val));
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 153:
-#line 1487 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1487 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {                      // Boolean constants
     (yyval.ConstVal) = ConstantBool::getTrue();
     CHECK_FOR_ERROR
@@ -3798,7 +4019,7 @@
     break;
 
   case 154:
-#line 1491 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1491 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {                     // Boolean constants
     (yyval.ConstVal) = ConstantBool::getFalse();
     CHECK_FOR_ERROR
@@ -3806,235 +4027,235 @@
     break;
 
   case 155:
-#line 1495 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1495 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {                   // Float & Double constants
-    if (!ConstantFP::isValueValidForType((yyvsp[-1].PrimType), (yyvsp[0].FPVal)))
+    if (!ConstantFP::isValueValidForType((yyvsp[(1) - (2)].PrimType), (yyvsp[(2) - (2)].FPVal)))
       GEN_ERROR("Floating point constant invalid for type!!");
-    (yyval.ConstVal) = ConstantFP::get((yyvsp[-1].PrimType), (yyvsp[0].FPVal));
+    (yyval.ConstVal) = ConstantFP::get((yyvsp[(1) - (2)].PrimType), (yyvsp[(2) - (2)].FPVal));
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 156:
-#line 1503 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1503 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    Constant *Val = (yyvsp[-3].ConstVal);
-    const Type *Ty = (yyvsp[-1].TypeVal)->get();
+    Constant *Val = (yyvsp[(3) - (6)].ConstVal);
+    const Type *Ty = (yyvsp[(5) - (6)].TypeVal)->get();
     if (!Val->getType()->isFirstClassType())
       GEN_ERROR("cast constant expression from a non-primitive type: '" +
                      Val->getType()->getDescription() + "'!");
     if (!Ty->isFirstClassType())
       GEN_ERROR("cast constant expression to a non-primitive type: '" +
                 Ty->getDescription() + "'!");
-    (yyval.ConstVal) = ConstantExpr::getCast((yyvsp[-5].CastOpVal), (yyvsp[-3].ConstVal), (yyvsp[-1].TypeVal)->get());
-    delete (yyvsp[-1].TypeVal);
+    (yyval.ConstVal) = ConstantExpr::getCast((yyvsp[(1) - (6)].CastOpVal), (yyvsp[(3) - (6)].ConstVal), (yyvsp[(5) - (6)].TypeVal)->get());
+    delete (yyvsp[(5) - (6)].TypeVal);
   ;}
     break;
 
   case 157:
-#line 1515 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1515 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    if (!isa<PointerType>((yyvsp[-2].ConstVal)->getType()))
+    if (!isa<PointerType>((yyvsp[(3) - (5)].ConstVal)->getType()))
       GEN_ERROR("GetElementPtr requires a pointer operand!");
 
     const Type *IdxTy =
-      GetElementPtrInst::getIndexedType((yyvsp[-2].ConstVal)->getType(), *(yyvsp[-1].ValueList), true);
+      GetElementPtrInst::getIndexedType((yyvsp[(3) - (5)].ConstVal)->getType(), *(yyvsp[(4) - (5)].ValueList), true);
     if (!IdxTy)
       GEN_ERROR("Index list invalid for constant getelementptr!");
 
     std::vector<Constant*> IdxVec;
-    for (unsigned i = 0, e = (yyvsp[-1].ValueList)->size(); i != e; ++i)
-      if (Constant *C = dyn_cast<Constant>((*(yyvsp[-1].ValueList))[i]))
+    for (unsigned i = 0, e = (yyvsp[(4) - (5)].ValueList)->size(); i != e; ++i)
+      if (Constant *C = dyn_cast<Constant>((*(yyvsp[(4) - (5)].ValueList))[i]))
         IdxVec.push_back(C);
       else
         GEN_ERROR("Indices to constant getelementptr must be constants!");
 
-    delete (yyvsp[-1].ValueList);
+    delete (yyvsp[(4) - (5)].ValueList);
 
-    (yyval.ConstVal) = ConstantExpr::getGetElementPtr((yyvsp[-2].ConstVal), IdxVec);
+    (yyval.ConstVal) = ConstantExpr::getGetElementPtr((yyvsp[(3) - (5)].ConstVal), IdxVec);
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 158:
-#line 1536 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1536 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    if ((yyvsp[-5].ConstVal)->getType() != Type::BoolTy)
+    if ((yyvsp[(3) - (8)].ConstVal)->getType() != Type::BoolTy)
       GEN_ERROR("Select condition must be of boolean type!");
-    if ((yyvsp[-3].ConstVal)->getType() != (yyvsp[-1].ConstVal)->getType())
+    if ((yyvsp[(5) - (8)].ConstVal)->getType() != (yyvsp[(7) - (8)].ConstVal)->getType())
       GEN_ERROR("Select operand types must match!");
-    (yyval.ConstVal) = ConstantExpr::getSelect((yyvsp[-5].ConstVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal));
+    (yyval.ConstVal) = ConstantExpr::getSelect((yyvsp[(3) - (8)].ConstVal), (yyvsp[(5) - (8)].ConstVal), (yyvsp[(7) - (8)].ConstVal));
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 159:
-#line 1544 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1544 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    if ((yyvsp[-3].ConstVal)->getType() != (yyvsp[-1].ConstVal)->getType())
+    if ((yyvsp[(3) - (6)].ConstVal)->getType() != (yyvsp[(5) - (6)].ConstVal)->getType())
       GEN_ERROR("Binary operator types must match!");
     CHECK_FOR_ERROR;
-    (yyval.ConstVal) = ConstantExpr::get((yyvsp[-5].BinaryOpVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal));
+    (yyval.ConstVal) = ConstantExpr::get((yyvsp[(1) - (6)].BinaryOpVal), (yyvsp[(3) - (6)].ConstVal), (yyvsp[(5) - (6)].ConstVal));
   ;}
     break;
 
   case 160:
-#line 1550 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1550 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    if ((yyvsp[-3].ConstVal)->getType() != (yyvsp[-1].ConstVal)->getType())
+    if ((yyvsp[(3) - (6)].ConstVal)->getType() != (yyvsp[(5) - (6)].ConstVal)->getType())
       GEN_ERROR("Logical operator types must match!");
-    if (!(yyvsp[-3].ConstVal)->getType()->isIntegral()) {
-      if (!isa<PackedType>((yyvsp[-3].ConstVal)->getType()) || 
-          !cast<PackedType>((yyvsp[-3].ConstVal)->getType())->getElementType()->isIntegral())
+    if (!(yyvsp[(3) - (6)].ConstVal)->getType()->isIntegral()) {
+      if (!isa<PackedType>((yyvsp[(3) - (6)].ConstVal)->getType()) || 
+          !cast<PackedType>((yyvsp[(3) - (6)].ConstVal)->getType())->getElementType()->isIntegral())
         GEN_ERROR("Logical operator requires integral operands!");
     }
-    (yyval.ConstVal) = ConstantExpr::get((yyvsp[-5].BinaryOpVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal));
+    (yyval.ConstVal) = ConstantExpr::get((yyvsp[(1) - (6)].BinaryOpVal), (yyvsp[(3) - (6)].ConstVal), (yyvsp[(5) - (6)].ConstVal));
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 161:
-#line 1561 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1561 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    if ((yyvsp[-3].ConstVal)->getType() != (yyvsp[-1].ConstVal)->getType())
+    if ((yyvsp[(3) - (6)].ConstVal)->getType() != (yyvsp[(5) - (6)].ConstVal)->getType())
       GEN_ERROR("setcc operand types must match!");
-    (yyval.ConstVal) = ConstantExpr::get((yyvsp[-5].BinaryOpVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal));
+    (yyval.ConstVal) = ConstantExpr::get((yyvsp[(1) - (6)].BinaryOpVal), (yyvsp[(3) - (6)].ConstVal), (yyvsp[(5) - (6)].ConstVal));
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 162:
-#line 1567 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1567 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    if ((yyvsp[-3].ConstVal)->getType() != (yyvsp[-1].ConstVal)->getType())
+    if ((yyvsp[(4) - (7)].ConstVal)->getType() != (yyvsp[(6) - (7)].ConstVal)->getType())
       GEN_ERROR("icmp operand types must match!");
-    (yyval.ConstVal) = ConstantExpr::getICmp((yyvsp[-5].IPredicate), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal));
+    (yyval.ConstVal) = ConstantExpr::getICmp((yyvsp[(2) - (7)].IPredicate), (yyvsp[(4) - (7)].ConstVal), (yyvsp[(6) - (7)].ConstVal));
   ;}
     break;
 
   case 163:
-#line 1572 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1572 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    if ((yyvsp[-3].ConstVal)->getType() != (yyvsp[-1].ConstVal)->getType())
+    if ((yyvsp[(4) - (7)].ConstVal)->getType() != (yyvsp[(6) - (7)].ConstVal)->getType())
       GEN_ERROR("fcmp operand types must match!");
-    (yyval.ConstVal) = ConstantExpr::getFCmp((yyvsp[-5].FPredicate), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal));
+    (yyval.ConstVal) = ConstantExpr::getFCmp((yyvsp[(2) - (7)].FPredicate), (yyvsp[(4) - (7)].ConstVal), (yyvsp[(6) - (7)].ConstVal));
   ;}
     break;
 
   case 164:
-#line 1577 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1577 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    if ((yyvsp[-1].ConstVal)->getType() != Type::UByteTy)
+    if ((yyvsp[(5) - (6)].ConstVal)->getType() != Type::UByteTy)
       GEN_ERROR("Shift count for shift constant must be unsigned byte!");
-    if (!(yyvsp[-3].ConstVal)->getType()->isInteger())
+    if (!(yyvsp[(3) - (6)].ConstVal)->getType()->isInteger())
       GEN_ERROR("Shift constant expression requires integer operand!");
     CHECK_FOR_ERROR;
-    (yyval.ConstVal) = ConstantExpr::get((yyvsp[-5].OtherOpVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal));
+    (yyval.ConstVal) = ConstantExpr::get((yyvsp[(1) - (6)].OtherOpVal), (yyvsp[(3) - (6)].ConstVal), (yyvsp[(5) - (6)].ConstVal));
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 165:
-#line 1586 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1586 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    if (!ExtractElementInst::isValidOperands((yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)))
+    if (!ExtractElementInst::isValidOperands((yyvsp[(3) - (6)].ConstVal), (yyvsp[(5) - (6)].ConstVal)))
       GEN_ERROR("Invalid extractelement operands!");
-    (yyval.ConstVal) = ConstantExpr::getExtractElement((yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal));
+    (yyval.ConstVal) = ConstantExpr::getExtractElement((yyvsp[(3) - (6)].ConstVal), (yyvsp[(5) - (6)].ConstVal));
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 166:
-#line 1592 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1592 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    if (!InsertElementInst::isValidOperands((yyvsp[-5].ConstVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)))
+    if (!InsertElementInst::isValidOperands((yyvsp[(3) - (8)].ConstVal), (yyvsp[(5) - (8)].ConstVal), (yyvsp[(7) - (8)].ConstVal)))
       GEN_ERROR("Invalid insertelement operands!");
-    (yyval.ConstVal) = ConstantExpr::getInsertElement((yyvsp[-5].ConstVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal));
+    (yyval.ConstVal) = ConstantExpr::getInsertElement((yyvsp[(3) - (8)].ConstVal), (yyvsp[(5) - (8)].ConstVal), (yyvsp[(7) - (8)].ConstVal));
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 167:
-#line 1598 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1598 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    if (!ShuffleVectorInst::isValidOperands((yyvsp[-5].ConstVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)))
+    if (!ShuffleVectorInst::isValidOperands((yyvsp[(3) - (8)].ConstVal), (yyvsp[(5) - (8)].ConstVal), (yyvsp[(7) - (8)].ConstVal)))
       GEN_ERROR("Invalid shufflevector operands!");
-    (yyval.ConstVal) = ConstantExpr::getShuffleVector((yyvsp[-5].ConstVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal));
+    (yyval.ConstVal) = ConstantExpr::getShuffleVector((yyvsp[(3) - (8)].ConstVal), (yyvsp[(5) - (8)].ConstVal), (yyvsp[(7) - (8)].ConstVal));
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 168:
-#line 1607 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1607 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    ((yyval.ConstVector) = (yyvsp[-2].ConstVector))->push_back((yyvsp[0].ConstVal));
+    ((yyval.ConstVector) = (yyvsp[(1) - (3)].ConstVector))->push_back((yyvsp[(3) - (3)].ConstVal));
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 169:
-#line 1611 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1611 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
     (yyval.ConstVector) = new std::vector<Constant*>();
-    (yyval.ConstVector)->push_back((yyvsp[0].ConstVal));
+    (yyval.ConstVector)->push_back((yyvsp[(1) - (1)].ConstVal));
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 170:
-#line 1619 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1619 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.BoolVal) = false; ;}
     break;
 
   case 171:
-#line 1619 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1619 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.BoolVal) = true; ;}
     break;
 
   case 172:
-#line 1629 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1629 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-  (yyval.ModuleVal) = ParserResult = (yyvsp[0].ModuleVal);
+  (yyval.ModuleVal) = ParserResult = (yyvsp[(1) - (1)].ModuleVal);
   CurModule.ModuleDone();
   CHECK_FOR_ERROR;
 ;}
     break;
 
   case 173:
-#line 1637 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1637 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.ModuleVal) = (yyvsp[-1].ModuleVal);
+    (yyval.ModuleVal) = (yyvsp[(1) - (2)].ModuleVal);
     CurFun.FunctionDone();
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 174:
-#line 1642 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1642 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.ModuleVal) = (yyvsp[-1].ModuleVal);
+    (yyval.ModuleVal) = (yyvsp[(1) - (2)].ModuleVal);
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 175:
-#line 1646 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1646 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.ModuleVal) = (yyvsp[-3].ModuleVal);
+    (yyval.ModuleVal) = (yyvsp[(1) - (4)].ModuleVal);
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 176:
-#line 1650 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1650 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.ModuleVal) = (yyvsp[-1].ModuleVal);
+    (yyval.ModuleVal) = (yyvsp[(1) - (2)].ModuleVal);
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 177:
-#line 1654 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1654 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
     (yyval.ModuleVal) = CurModule.CurrentModule;
     // Emit an error if there are any unresolved types left.
@@ -4051,7 +4272,7 @@
     break;
 
   case 178:
-#line 1669 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1669 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
     // Eagerly resolve types.  This is not an optimization, this is a
     // requirement that is due to the fact that we could have this:
@@ -4062,62 +4283,62 @@
     // If types are not resolved eagerly, then the two types will not be
     // determined to be the same type!
     //
-    ResolveTypeTo((yyvsp[-2].StrVal), *(yyvsp[0].TypeVal));
+    ResolveTypeTo((yyvsp[(2) - (4)].StrVal), *(yyvsp[(4) - (4)].TypeVal));
 
-    if (!setTypeName(*(yyvsp[0].TypeVal), (yyvsp[-2].StrVal)) && !(yyvsp[-2].StrVal)) {
+    if (!setTypeName(*(yyvsp[(4) - (4)].TypeVal), (yyvsp[(2) - (4)].StrVal)) && !(yyvsp[(2) - (4)].StrVal)) {
       CHECK_FOR_ERROR
       // If this is a named type that is not a redefinition, add it to the slot
       // table.
-      CurModule.Types.push_back(*(yyvsp[0].TypeVal));
+      CurModule.Types.push_back(*(yyvsp[(4) - (4)].TypeVal));
     }
 
-    delete (yyvsp[0].TypeVal);
+    delete (yyvsp[(4) - (4)].TypeVal);
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 179:
-#line 1691 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1691 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {       // Function prototypes can be in const pool
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 180:
-#line 1694 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1694 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {  // Asm blocks can be in the const pool
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 181:
-#line 1697 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1697 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    if ((yyvsp[0].ConstVal) == 0) 
+    if ((yyvsp[(5) - (5)].ConstVal) == 0) 
       GEN_ERROR("Global value initializer is not a constant!");
-    CurGV = ParseGlobalVariable((yyvsp[-3].StrVal), (yyvsp[-2].Linkage), (yyvsp[-1].BoolVal), (yyvsp[0].ConstVal)->getType(), (yyvsp[0].ConstVal));
+    CurGV = ParseGlobalVariable((yyvsp[(2) - (5)].StrVal), (yyvsp[(3) - (5)].Linkage), (yyvsp[(4) - (5)].BoolVal), (yyvsp[(5) - (5)].ConstVal)->getType(), (yyvsp[(5) - (5)].ConstVal));
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 182:
-#line 1702 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1702 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
     CurGV = 0;
   ;}
     break;
 
   case 183:
-#line 1705 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1705 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    CurGV = ParseGlobalVariable((yyvsp[-3].StrVal), GlobalValue::ExternalLinkage, (yyvsp[-1].BoolVal), *(yyvsp[0].TypeVal), 0);
+    CurGV = ParseGlobalVariable((yyvsp[(2) - (5)].StrVal), GlobalValue::ExternalLinkage, (yyvsp[(4) - (5)].BoolVal), *(yyvsp[(5) - (5)].TypeVal), 0);
     CHECK_FOR_ERROR
-    delete (yyvsp[0].TypeVal);
+    delete (yyvsp[(5) - (5)].TypeVal);
   ;}
     break;
 
   case 184:
-#line 1709 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1709 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
     CurGV = 0;
     CHECK_FOR_ERROR
@@ -4125,16 +4346,16 @@
     break;
 
   case 185:
-#line 1713 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1713 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    CurGV = ParseGlobalVariable((yyvsp[-3].StrVal), GlobalValue::DLLImportLinkage, (yyvsp[-1].BoolVal), *(yyvsp[0].TypeVal), 0);
+    CurGV = ParseGlobalVariable((yyvsp[(2) - (5)].StrVal), GlobalValue::DLLImportLinkage, (yyvsp[(4) - (5)].BoolVal), *(yyvsp[(5) - (5)].TypeVal), 0);
     CHECK_FOR_ERROR
-    delete (yyvsp[0].TypeVal);
+    delete (yyvsp[(5) - (5)].TypeVal);
   ;}
     break;
 
   case 186:
-#line 1717 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1717 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
     CurGV = 0;
     CHECK_FOR_ERROR
@@ -4142,17 +4363,17 @@
     break;
 
   case 187:
-#line 1721 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1721 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
     CurGV = 
-      ParseGlobalVariable((yyvsp[-3].StrVal), GlobalValue::ExternalWeakLinkage, (yyvsp[-1].BoolVal), *(yyvsp[0].TypeVal), 0);
+      ParseGlobalVariable((yyvsp[(2) - (5)].StrVal), GlobalValue::ExternalWeakLinkage, (yyvsp[(4) - (5)].BoolVal), *(yyvsp[(5) - (5)].TypeVal), 0);
     CHECK_FOR_ERROR
-    delete (yyvsp[0].TypeVal);
+    delete (yyvsp[(5) - (5)].TypeVal);
   ;}
     break;
 
   case 188:
-#line 1726 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1726 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
     CurGV = 0;
     CHECK_FOR_ERROR
@@ -4160,32 +4381,32 @@
     break;
 
   case 189:
-#line 1730 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1730 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { 
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 190:
-#line 1733 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1733 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 191:
-#line 1736 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1736 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { 
   ;}
     break;
 
   case 192:
-#line 1740 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1740 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
   const std::string &AsmSoFar = CurModule.CurrentModule->getModuleInlineAsm();
-  char *EndStr = UnEscapeLexed((yyvsp[0].StrVal), true);
-  std::string NewAsm((yyvsp[0].StrVal), EndStr);
-  free((yyvsp[0].StrVal));
+  char *EndStr = UnEscapeLexed((yyvsp[(1) - (1)].StrVal), true);
+  std::string NewAsm((yyvsp[(1) - (1)].StrVal), EndStr);
+  free((yyvsp[(1) - (1)].StrVal));
 
   if (AsmSoFar.empty())
     CurModule.CurrentModule->setModuleInlineAsm(NewAsm);
@@ -4196,124 +4417,124 @@
     break;
 
   case 193:
-#line 1753 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1753 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.Endianness) = Module::BigEndian; ;}
     break;
 
   case 194:
-#line 1754 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1754 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.Endianness) = Module::LittleEndian; ;}
     break;
 
   case 195:
-#line 1756 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1756 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    CurModule.CurrentModule->setEndianness((yyvsp[0].Endianness));
+    CurModule.CurrentModule->setEndianness((yyvsp[(3) - (3)].Endianness));
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 196:
-#line 1760 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1760 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    if ((yyvsp[0].UInt64Val) == 32)
+    if ((yyvsp[(3) - (3)].UInt64Val) == 32)
       CurModule.CurrentModule->setPointerSize(Module::Pointer32);
-    else if ((yyvsp[0].UInt64Val) == 64)
+    else if ((yyvsp[(3) - (3)].UInt64Val) == 64)
       CurModule.CurrentModule->setPointerSize(Module::Pointer64);
     else
-      GEN_ERROR("Invalid pointer size: '" + utostr((yyvsp[0].UInt64Val)) + "'!");
+      GEN_ERROR("Invalid pointer size: '" + utostr((yyvsp[(3) - (3)].UInt64Val)) + "'!");
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 197:
-#line 1769 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1769 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    CurModule.CurrentModule->setTargetTriple((yyvsp[0].StrVal));
-    free((yyvsp[0].StrVal));
+    CurModule.CurrentModule->setTargetTriple((yyvsp[(3) - (3)].StrVal));
+    free((yyvsp[(3) - (3)].StrVal));
   ;}
     break;
 
   case 198:
-#line 1773 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1773 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    CurModule.CurrentModule->setDataLayout((yyvsp[0].StrVal));
-    free((yyvsp[0].StrVal));
+    CurModule.CurrentModule->setDataLayout((yyvsp[(3) - (3)].StrVal));
+    free((yyvsp[(3) - (3)].StrVal));
   ;}
     break;
 
   case 200:
-#line 1780 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1780 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-          CurModule.CurrentModule->addLibrary((yyvsp[0].StrVal));
-          free((yyvsp[0].StrVal));
+          CurModule.CurrentModule->addLibrary((yyvsp[(3) - (3)].StrVal));
+          free((yyvsp[(3) - (3)].StrVal));
           CHECK_FOR_ERROR
         ;}
     break;
 
   case 201:
-#line 1785 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1785 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-          CurModule.CurrentModule->addLibrary((yyvsp[0].StrVal));
-          free((yyvsp[0].StrVal));
+          CurModule.CurrentModule->addLibrary((yyvsp[(1) - (1)].StrVal));
+          free((yyvsp[(1) - (1)].StrVal));
           CHECK_FOR_ERROR
         ;}
     break;
 
   case 202:
-#line 1790 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1790 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
           CHECK_FOR_ERROR
         ;}
     break;
 
   case 206:
-#line 1800 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1800 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.StrVal) = 0; ;}
     break;
 
   case 207:
-#line 1802 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1802 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-  if (*(yyvsp[-1].TypeVal) == Type::VoidTy)
+  if (*(yyvsp[(1) - (2)].TypeVal) == Type::VoidTy)
     GEN_ERROR("void typed arguments are invalid!");
-  (yyval.ArgVal) = new std::pair<PATypeHolder*, char*>((yyvsp[-1].TypeVal), (yyvsp[0].StrVal));
+  (yyval.ArgVal) = new std::pair<PATypeHolder*, char*>((yyvsp[(1) - (2)].TypeVal), (yyvsp[(2) - (2)].StrVal));
   CHECK_FOR_ERROR
 ;}
     break;
 
   case 208:
-#line 1809 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1809 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.ArgList) = (yyvsp[-2].ArgList);
-    (yyvsp[-2].ArgList)->push_back(*(yyvsp[0].ArgVal));
-    delete (yyvsp[0].ArgVal);
+    (yyval.ArgList) = (yyvsp[(1) - (3)].ArgList);
+    (yyvsp[(1) - (3)].ArgList)->push_back(*(yyvsp[(3) - (3)].ArgVal));
+    delete (yyvsp[(3) - (3)].ArgVal);
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 209:
-#line 1815 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1815 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
     (yyval.ArgList) = new std::vector<std::pair<PATypeHolder*,char*> >();
-    (yyval.ArgList)->push_back(*(yyvsp[0].ArgVal));
-    delete (yyvsp[0].ArgVal);
+    (yyval.ArgList)->push_back(*(yyvsp[(1) - (1)].ArgVal));
+    delete (yyvsp[(1) - (1)].ArgVal);
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 210:
-#line 1822 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1822 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.ArgList) = (yyvsp[0].ArgList);
+    (yyval.ArgList) = (yyvsp[(1) - (1)].ArgList);
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 211:
-#line 1826 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1826 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.ArgList) = (yyvsp[-2].ArgList);
+    (yyval.ArgList) = (yyvsp[(1) - (3)].ArgList);
     (yyval.ArgList)->push_back(std::pair<PATypeHolder*,
                             char*>(new PATypeHolder(Type::VoidTy), 0));
     CHECK_FOR_ERROR
@@ -4321,7 +4542,7 @@
     break;
 
   case 212:
-#line 1832 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1832 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
     (yyval.ArgList) = new std::vector<std::pair<PATypeHolder*,char*> >();
     (yyval.ArgList)->push_back(std::make_pair(new PATypeHolder(Type::VoidTy), (char*)0));
@@ -4330,7 +4551,7 @@
     break;
 
   case 213:
-#line 1837 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1837 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
     (yyval.ArgList) = 0;
     CHECK_FOR_ERROR
@@ -4338,28 +4559,28 @@
     break;
 
   case 214:
-#line 1843 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1843 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-  UnEscapeLexed((yyvsp[-5].StrVal));
-  std::string FunctionName((yyvsp[-5].StrVal));
-  free((yyvsp[-5].StrVal));  // Free strdup'd memory!
+  UnEscapeLexed((yyvsp[(3) - (8)].StrVal));
+  std::string FunctionName((yyvsp[(3) - (8)].StrVal));
+  free((yyvsp[(3) - (8)].StrVal));  // Free strdup'd memory!
   
-  if (!(*(yyvsp[-6].TypeVal))->isFirstClassType() && *(yyvsp[-6].TypeVal) != Type::VoidTy)
+  if (!(*(yyvsp[(2) - (8)].TypeVal))->isFirstClassType() && *(yyvsp[(2) - (8)].TypeVal) != Type::VoidTy)
     GEN_ERROR("LLVM functions cannot return aggregate types!");
 
   std::vector<const Type*> ParamTypeList;
-  if ((yyvsp[-3].ArgList)) {   // If there are arguments...
-    for (std::vector<std::pair<PATypeHolder*,char*> >::iterator I = (yyvsp[-3].ArgList)->begin();
-         I != (yyvsp[-3].ArgList)->end(); ++I)
+  if ((yyvsp[(5) - (8)].ArgList)) {   // If there are arguments...
+    for (std::vector<std::pair<PATypeHolder*,char*> >::iterator I = (yyvsp[(5) - (8)].ArgList)->begin();
+         I != (yyvsp[(5) - (8)].ArgList)->end(); ++I)
       ParamTypeList.push_back(I->first->get());
   }
 
   bool isVarArg = ParamTypeList.size() && ParamTypeList.back() == Type::VoidTy;
   if (isVarArg) ParamTypeList.pop_back();
 
-  const FunctionType *FT = FunctionType::get(*(yyvsp[-6].TypeVal), ParamTypeList, isVarArg);
+  const FunctionType *FT = FunctionType::get(*(yyvsp[(2) - (8)].TypeVal), ParamTypeList, isVarArg);
   const PointerType *PFT = PointerType::get(FT);
-  delete (yyvsp[-6].TypeVal);
+  delete (yyvsp[(2) - (8)].TypeVal);
 
   ValID ID;
   if (!FunctionName.empty()) {
@@ -4403,24 +4624,24 @@
     // another function.
     Fn->setLinkage(CurFun.Linkage);
   }
-  Fn->setCallingConv((yyvsp[-7].UIntVal));
-  Fn->setAlignment((yyvsp[0].UIntVal));
-  if ((yyvsp[-1].StrVal)) {
-    Fn->setSection((yyvsp[-1].StrVal));
-    free((yyvsp[-1].StrVal));
+  Fn->setCallingConv((yyvsp[(1) - (8)].UIntVal));
+  Fn->setAlignment((yyvsp[(8) - (8)].UIntVal));
+  if ((yyvsp[(7) - (8)].StrVal)) {
+    Fn->setSection((yyvsp[(7) - (8)].StrVal));
+    free((yyvsp[(7) - (8)].StrVal));
   }
 
   // Add all of the arguments we parsed to the function...
-  if ((yyvsp[-3].ArgList)) {                     // Is null if empty...
+  if ((yyvsp[(5) - (8)].ArgList)) {                     // Is null if empty...
     if (isVarArg) {  // Nuke the last entry
-      assert((yyvsp[-3].ArgList)->back().first->get() == Type::VoidTy && (yyvsp[-3].ArgList)->back().second == 0&&
+      assert((yyvsp[(5) - (8)].ArgList)->back().first->get() == Type::VoidTy && (yyvsp[(5) - (8)].ArgList)->back().second == 0&&
              "Not a varargs marker!");
-      delete (yyvsp[-3].ArgList)->back().first;
-      (yyvsp[-3].ArgList)->pop_back();  // Delete the last entry
+      delete (yyvsp[(5) - (8)].ArgList)->back().first;
+      (yyvsp[(5) - (8)].ArgList)->pop_back();  // Delete the last entry
     }
     Function::arg_iterator ArgIt = Fn->arg_begin();
-    for (std::vector<std::pair<PATypeHolder*,char*> >::iterator I = (yyvsp[-3].ArgList)->begin();
-         I != (yyvsp[-3].ArgList)->end(); ++I, ++ArgIt) {
+    for (std::vector<std::pair<PATypeHolder*,char*> >::iterator I = (yyvsp[(5) - (8)].ArgList)->begin();
+         I != (yyvsp[(5) - (8)].ArgList)->end(); ++I, ++ArgIt) {
       delete I->first;                          // Delete the typeholder...
 
       setValueName(ArgIt, I->second);           // Insert arg into symtab...
@@ -4428,48 +4649,48 @@
       InsertValue(ArgIt);
     }
 
-    delete (yyvsp[-3].ArgList);                     // We're now done with the argument list
+    delete (yyvsp[(5) - (8)].ArgList);                     // We're now done with the argument list
   }
   CHECK_FOR_ERROR
 ;}
     break;
 
   case 217:
-#line 1939 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1939 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
   (yyval.FunctionVal) = CurFun.CurrentFunction;
 
   // Make sure that we keep track of the linkage type even if there was a
   // previous "declare".
-  (yyval.FunctionVal)->setLinkage((yyvsp[-2].Linkage));
+  (yyval.FunctionVal)->setLinkage((yyvsp[(1) - (3)].Linkage));
 ;}
     break;
 
   case 220:
-#line 1949 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1949 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-  (yyval.FunctionVal) = (yyvsp[-1].FunctionVal);
+  (yyval.FunctionVal) = (yyvsp[(1) - (2)].FunctionVal);
   CHECK_FOR_ERROR
 ;}
     break;
 
   case 222:
-#line 1955 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1955 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { CurFun.Linkage = GlobalValue::DLLImportLinkage; ;}
     break;
 
   case 223:
-#line 1956 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1956 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { CurFun.Linkage = GlobalValue::ExternalWeakLinkage; ;}
     break;
 
   case 224:
-#line 1958 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1958 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { CurFun.isDeclare = true; ;}
     break;
 
   case 225:
-#line 1958 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1958 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
     (yyval.FunctionVal) = CurFun.CurrentFunction;
     CurFun.FunctionDone();
@@ -4478,7 +4699,7 @@
     break;
 
   case 226:
-#line 1968 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1968 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
     (yyval.BoolVal) = false;
     CHECK_FOR_ERROR
@@ -4486,7 +4707,7 @@
     break;
 
   case 227:
-#line 1972 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1972 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
     (yyval.BoolVal) = true;
     CHECK_FOR_ERROR
@@ -4494,31 +4715,31 @@
     break;
 
   case 228:
-#line 1977 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1977 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {    // A reference to a direct constant
-    (yyval.ValIDVal) = ValID::create((yyvsp[0].SInt64Val));
+    (yyval.ValIDVal) = ValID::create((yyvsp[(1) - (1)].SInt64Val));
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 229:
-#line 1981 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1981 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.ValIDVal) = ValID::create((yyvsp[0].UInt64Val));
+    (yyval.ValIDVal) = ValID::create((yyvsp[(1) - (1)].UInt64Val));
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 230:
-#line 1985 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1985 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {                     // Perhaps it's an FP constant?
-    (yyval.ValIDVal) = ValID::create((yyvsp[0].FPVal));
+    (yyval.ValIDVal) = ValID::create((yyvsp[(1) - (1)].FPVal));
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 231:
-#line 1989 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1989 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
     (yyval.ValIDVal) = ValID::create(ConstantBool::getTrue());
     CHECK_FOR_ERROR
@@ -4526,7 +4747,7 @@
     break;
 
   case 232:
-#line 1993 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1993 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
     (yyval.ValIDVal) = ValID::create(ConstantBool::getFalse());
     CHECK_FOR_ERROR
@@ -4534,7 +4755,7 @@
     break;
 
   case 233:
-#line 1997 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 1997 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
     (yyval.ValIDVal) = ValID::createNull();
     CHECK_FOR_ERROR
@@ -4542,7 +4763,7 @@
     break;
 
   case 234:
-#line 2001 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2001 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
     (yyval.ValIDVal) = ValID::createUndef();
     CHECK_FOR_ERROR
@@ -4550,7 +4771,7 @@
     break;
 
   case 235:
-#line 2005 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2005 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {     // A vector zero constant.
     (yyval.ValIDVal) = ValID::createZeroInit();
     CHECK_FOR_ERROR
@@ -4558,10 +4779,10 @@
     break;
 
   case 236:
-#line 2009 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2009 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { // Nonempty unsized packed vector
-    const Type *ETy = (*(yyvsp[-1].ConstVector))[0]->getType();
-    int NumElements = (yyvsp[-1].ConstVector)->size(); 
+    const Type *ETy = (*(yyvsp[(2) - (3)].ConstVector))[0]->getType();
+    int NumElements = (yyvsp[(2) - (3)].ConstVector)->size(); 
     
     PackedType* pt = PackedType::get(ETy, NumElements);
     PATypeHolder* PTy = new PATypeHolder(
@@ -4573,110 +4794,110 @@
                                          );
     
     // Verify all elements are correct type!
-    for (unsigned i = 0; i < (yyvsp[-1].ConstVector)->size(); i++) {
-      if (ETy != (*(yyvsp[-1].ConstVector))[i]->getType())
+    for (unsigned i = 0; i < (yyvsp[(2) - (3)].ConstVector)->size(); i++) {
+      if (ETy != (*(yyvsp[(2) - (3)].ConstVector))[i]->getType())
         GEN_ERROR("Element #" + utostr(i) + " is not of type '" + 
                      ETy->getDescription() +"' as required!\nIt is of type '" +
-                     (*(yyvsp[-1].ConstVector))[i]->getType()->getDescription() + "'.");
+                     (*(yyvsp[(2) - (3)].ConstVector))[i]->getType()->getDescription() + "'.");
     }
 
-    (yyval.ValIDVal) = ValID::create(ConstantPacked::get(pt, *(yyvsp[-1].ConstVector)));
-    delete PTy; delete (yyvsp[-1].ConstVector);
+    (yyval.ValIDVal) = ValID::create(ConstantPacked::get(pt, *(yyvsp[(2) - (3)].ConstVector)));
+    delete PTy; delete (yyvsp[(2) - (3)].ConstVector);
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 237:
-#line 2034 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2034 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.ValIDVal) = ValID::create((yyvsp[0].ConstVal));
+    (yyval.ValIDVal) = ValID::create((yyvsp[(1) - (1)].ConstVal));
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 238:
-#line 2038 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2038 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    char *End = UnEscapeLexed((yyvsp[-2].StrVal), true);
-    std::string AsmStr = std::string((yyvsp[-2].StrVal), End);
-    End = UnEscapeLexed((yyvsp[0].StrVal), true);
-    std::string Constraints = std::string((yyvsp[0].StrVal), End);
-    (yyval.ValIDVal) = ValID::createInlineAsm(AsmStr, Constraints, (yyvsp[-3].BoolVal));
-    free((yyvsp[-2].StrVal));
-    free((yyvsp[0].StrVal));
+    char *End = UnEscapeLexed((yyvsp[(3) - (5)].StrVal), true);
+    std::string AsmStr = std::string((yyvsp[(3) - (5)].StrVal), End);
+    End = UnEscapeLexed((yyvsp[(5) - (5)].StrVal), true);
+    std::string Constraints = std::string((yyvsp[(5) - (5)].StrVal), End);
+    (yyval.ValIDVal) = ValID::createInlineAsm(AsmStr, Constraints, (yyvsp[(2) - (5)].BoolVal));
+    free((yyvsp[(3) - (5)].StrVal));
+    free((yyvsp[(5) - (5)].StrVal));
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 239:
-#line 2052 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2052 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {  // Is it an integer reference...?
-    (yyval.ValIDVal) = ValID::create((yyvsp[0].SIntVal));
+    (yyval.ValIDVal) = ValID::create((yyvsp[(1) - (1)].SIntVal));
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 240:
-#line 2056 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2056 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {                   // Is it a named reference...?
-    (yyval.ValIDVal) = ValID::create((yyvsp[0].StrVal));
+    (yyval.ValIDVal) = ValID::create((yyvsp[(1) - (1)].StrVal));
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 243:
-#line 2068 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2068 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.ValueVal) = getVal(*(yyvsp[-1].TypeVal), (yyvsp[0].ValIDVal)); delete (yyvsp[-1].TypeVal);
+    (yyval.ValueVal) = getVal(*(yyvsp[(1) - (2)].TypeVal), (yyvsp[(2) - (2)].ValIDVal)); delete (yyvsp[(1) - (2)].TypeVal);
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 244:
-#line 2073 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2073 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.FunctionVal) = (yyvsp[-1].FunctionVal);
+    (yyval.FunctionVal) = (yyvsp[(1) - (2)].FunctionVal);
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 245:
-#line 2077 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2077 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { // Do not allow functions with 0 basic blocks   
-    (yyval.FunctionVal) = (yyvsp[-1].FunctionVal);
+    (yyval.FunctionVal) = (yyvsp[(1) - (2)].FunctionVal);
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 246:
-#line 2086 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2086 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    setValueName((yyvsp[0].TermInstVal), (yyvsp[-1].StrVal));
+    setValueName((yyvsp[(3) - (3)].TermInstVal), (yyvsp[(2) - (3)].StrVal));
     CHECK_FOR_ERROR
-    InsertValue((yyvsp[0].TermInstVal));
+    InsertValue((yyvsp[(3) - (3)].TermInstVal));
 
-    (yyvsp[-2].BasicBlockVal)->getInstList().push_back((yyvsp[0].TermInstVal));
-    InsertValue((yyvsp[-2].BasicBlockVal));
-    (yyval.BasicBlockVal) = (yyvsp[-2].BasicBlockVal);
+    (yyvsp[(1) - (3)].BasicBlockVal)->getInstList().push_back((yyvsp[(3) - (3)].TermInstVal));
+    InsertValue((yyvsp[(1) - (3)].BasicBlockVal));
+    (yyval.BasicBlockVal) = (yyvsp[(1) - (3)].BasicBlockVal);
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 247:
-#line 2097 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2097 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    if (CastInst *CI1 = dyn_cast<CastInst>((yyvsp[0].InstVal)))
+    if (CastInst *CI1 = dyn_cast<CastInst>((yyvsp[(2) - (2)].InstVal)))
       if (CastInst *CI2 = dyn_cast<CastInst>(CI1->getOperand(0)))
         if (CI2->getParent() == 0)
-          (yyvsp[-1].BasicBlockVal)->getInstList().push_back(CI2);
-    (yyvsp[-1].BasicBlockVal)->getInstList().push_back((yyvsp[0].InstVal));
-    (yyval.BasicBlockVal) = (yyvsp[-1].BasicBlockVal);
+          (yyvsp[(1) - (2)].BasicBlockVal)->getInstList().push_back(CI2);
+    (yyvsp[(1) - (2)].BasicBlockVal)->getInstList().push_back((yyvsp[(2) - (2)].InstVal));
+    (yyval.BasicBlockVal) = (yyvsp[(1) - (2)].BasicBlockVal);
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 248:
-#line 2106 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2106 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
     (yyval.BasicBlockVal) = getBBVal(ValID::create((int)CurFun.NextBBNum++), true);
     CHECK_FOR_ERROR
@@ -4692,9 +4913,9 @@
     break;
 
   case 249:
-#line 2118 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2118 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.BasicBlockVal) = getBBVal(ValID::create((yyvsp[0].StrVal)), true);
+    (yyval.BasicBlockVal) = getBBVal(ValID::create((yyvsp[(1) - (1)].StrVal)), true);
     CHECK_FOR_ERROR
 
     // Make sure to move the basic block to the correct location in the
@@ -4708,15 +4929,15 @@
     break;
 
   case 250:
-#line 2131 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2131 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {              // Return with a result...
-    (yyval.TermInstVal) = new ReturnInst((yyvsp[0].ValueVal));
+    (yyval.TermInstVal) = new ReturnInst((yyvsp[(2) - (2)].ValueVal));
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 251:
-#line 2135 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2135 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {                                       // Return with no result...
     (yyval.TermInstVal) = new ReturnInst();
     CHECK_FOR_ERROR
@@ -4724,56 +4945,56 @@
     break;
 
   case 252:
-#line 2139 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2139 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {                         // Unconditional Branch...
-    BasicBlock* tmpBB = getBBVal((yyvsp[0].ValIDVal));
+    BasicBlock* tmpBB = getBBVal((yyvsp[(3) - (3)].ValIDVal));
     CHECK_FOR_ERROR
     (yyval.TermInstVal) = new BranchInst(tmpBB);
   ;}
     break;
 
   case 253:
-#line 2144 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2144 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {  
-    BasicBlock* tmpBBA = getBBVal((yyvsp[-3].ValIDVal));
+    BasicBlock* tmpBBA = getBBVal((yyvsp[(6) - (9)].ValIDVal));
     CHECK_FOR_ERROR
-    BasicBlock* tmpBBB = getBBVal((yyvsp[0].ValIDVal));
+    BasicBlock* tmpBBB = getBBVal((yyvsp[(9) - (9)].ValIDVal));
     CHECK_FOR_ERROR
-    Value* tmpVal = getVal(Type::BoolTy, (yyvsp[-6].ValIDVal));
+    Value* tmpVal = getVal(Type::BoolTy, (yyvsp[(3) - (9)].ValIDVal));
     CHECK_FOR_ERROR
     (yyval.TermInstVal) = new BranchInst(tmpBBA, tmpBBB, tmpVal);
   ;}
     break;
 
   case 254:
-#line 2153 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2153 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    Value* tmpVal = getVal((yyvsp[-7].PrimType), (yyvsp[-6].ValIDVal));
+    Value* tmpVal = getVal((yyvsp[(2) - (9)].PrimType), (yyvsp[(3) - (9)].ValIDVal));
     CHECK_FOR_ERROR
-    BasicBlock* tmpBB = getBBVal((yyvsp[-3].ValIDVal));
+    BasicBlock* tmpBB = getBBVal((yyvsp[(6) - (9)].ValIDVal));
     CHECK_FOR_ERROR
-    SwitchInst *S = new SwitchInst(tmpVal, tmpBB, (yyvsp[-1].JumpTable)->size());
+    SwitchInst *S = new SwitchInst(tmpVal, tmpBB, (yyvsp[(8) - (9)].JumpTable)->size());
     (yyval.TermInstVal) = S;
 
-    std::vector<std::pair<Constant*,BasicBlock*> >::iterator I = (yyvsp[-1].JumpTable)->begin(),
-      E = (yyvsp[-1].JumpTable)->end();
+    std::vector<std::pair<Constant*,BasicBlock*> >::iterator I = (yyvsp[(8) - (9)].JumpTable)->begin(),
+      E = (yyvsp[(8) - (9)].JumpTable)->end();
     for (; I != E; ++I) {
       if (ConstantInt *CI = dyn_cast<ConstantInt>(I->first))
           S->addCase(CI, I->second);
       else
         GEN_ERROR("Switch case is constant, but not a simple integer!");
     }
-    delete (yyvsp[-1].JumpTable);
+    delete (yyvsp[(8) - (9)].JumpTable);
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 255:
-#line 2172 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2172 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    Value* tmpVal = getVal((yyvsp[-6].PrimType), (yyvsp[-5].ValIDVal));
+    Value* tmpVal = getVal((yyvsp[(2) - (8)].PrimType), (yyvsp[(3) - (8)].ValIDVal));
     CHECK_FOR_ERROR
-    BasicBlock* tmpBB = getBBVal((yyvsp[-2].ValIDVal));
+    BasicBlock* tmpBB = getBBVal((yyvsp[(6) - (8)].ValIDVal));
     CHECK_FOR_ERROR
     SwitchInst *S = new SwitchInst(tmpVal, tmpBB, 0);
     (yyval.TermInstVal) = S;
@@ -4782,17 +5003,17 @@
     break;
 
   case 256:
-#line 2182 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2182 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
     const PointerType *PFTy;
     const FunctionType *Ty;
 
-    if (!(PFTy = dyn_cast<PointerType>((yyvsp[-10].TypeVal)->get())) ||
+    if (!(PFTy = dyn_cast<PointerType>((yyvsp[(3) - (13)].TypeVal)->get())) ||
         !(Ty = dyn_cast<FunctionType>(PFTy->getElementType()))) {
       // Pull out the types of all of the arguments...
       std::vector<const Type*> ParamTypes;
-      if ((yyvsp[-7].ValueList)) {
-        for (std::vector<Value*>::iterator I = (yyvsp[-7].ValueList)->begin(), E = (yyvsp[-7].ValueList)->end();
+      if ((yyvsp[(6) - (13)].ValueList)) {
+        for (std::vector<Value*>::iterator I = (yyvsp[(6) - (13)].ValueList)->begin(), E = (yyvsp[(6) - (13)].ValueList)->end();
              I != E; ++I)
           ParamTypes.push_back((*I)->getType());
       }
@@ -4800,19 +5021,19 @@
       bool isVarArg = ParamTypes.size() && ParamTypes.back() == Type::VoidTy;
       if (isVarArg) ParamTypes.pop_back();
 
-      Ty = FunctionType::get((yyvsp[-10].TypeVal)->get(), ParamTypes, isVarArg);
+      Ty = FunctionType::get((yyvsp[(3) - (13)].TypeVal)->get(), ParamTypes, isVarArg);
       PFTy = PointerType::get(Ty);
     }
 
-    Value *V = getVal(PFTy, (yyvsp[-9].ValIDVal));   // Get the function we're calling...
+    Value *V = getVal(PFTy, (yyvsp[(4) - (13)].ValIDVal));   // Get the function we're calling...
     CHECK_FOR_ERROR
-    BasicBlock *Normal = getBBVal((yyvsp[-3].ValIDVal));
+    BasicBlock *Normal = getBBVal((yyvsp[(10) - (13)].ValIDVal));
     CHECK_FOR_ERROR
-    BasicBlock *Except = getBBVal((yyvsp[0].ValIDVal));
+    BasicBlock *Except = getBBVal((yyvsp[(13) - (13)].ValIDVal));
     CHECK_FOR_ERROR
 
     // Create the call node...
-    if (!(yyvsp[-7].ValueList)) {                                   // Has no arguments?
+    if (!(yyvsp[(6) - (13)].ValueList)) {                                   // Has no arguments?
       (yyval.TermInstVal) = new InvokeInst(V, Normal, Except, std::vector<Value*>());
     } else {                                     // Has arguments?
       // Loop through FunctionType's arguments and ensure they are specified
@@ -4820,7 +5041,7 @@
       //
       FunctionType::param_iterator I = Ty->param_begin();
       FunctionType::param_iterator E = Ty->param_end();
-      std::vector<Value*>::iterator ArgI = (yyvsp[-7].ValueList)->begin(), ArgE = (yyvsp[-7].ValueList)->end();
+      std::vector<Value*>::iterator ArgI = (yyvsp[(6) - (13)].ValueList)->begin(), ArgE = (yyvsp[(6) - (13)].ValueList)->end();
 
       for (; ArgI != ArgE && I != E; ++ArgI, ++I)
         if ((*ArgI)->getType() != *I)
@@ -4830,18 +5051,18 @@
       if (I != E || (ArgI != ArgE && !Ty->isVarArg()))
         GEN_ERROR("Invalid number of parameters detected!");
 
-      (yyval.TermInstVal) = new InvokeInst(V, Normal, Except, *(yyvsp[-7].ValueList));
+      (yyval.TermInstVal) = new InvokeInst(V, Normal, Except, *(yyvsp[(6) - (13)].ValueList));
     }
-    cast<InvokeInst>((yyval.TermInstVal))->setCallingConv((yyvsp[-11].UIntVal));
+    cast<InvokeInst>((yyval.TermInstVal))->setCallingConv((yyvsp[(2) - (13)].UIntVal));
   
-    delete (yyvsp[-10].TypeVal);
-    delete (yyvsp[-7].ValueList);
+    delete (yyvsp[(3) - (13)].TypeVal);
+    delete (yyvsp[(6) - (13)].ValueList);
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 257:
-#line 2237 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2237 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
     (yyval.TermInstVal) = new UnwindInst();
     CHECK_FOR_ERROR
@@ -4849,7 +5070,7 @@
     break;
 
   case 258:
-#line 2241 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2241 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
     (yyval.TermInstVal) = new UnreachableInst();
     CHECK_FOR_ERROR
@@ -4857,97 +5078,97 @@
     break;
 
   case 259:
-#line 2248 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2248 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.JumpTable) = (yyvsp[-5].JumpTable);
-    Constant *V = cast<Constant>(getValNonImprovising((yyvsp[-4].PrimType), (yyvsp[-3].ValIDVal)));
+    (yyval.JumpTable) = (yyvsp[(1) - (6)].JumpTable);
+    Constant *V = cast<Constant>(getValNonImprovising((yyvsp[(2) - (6)].PrimType), (yyvsp[(3) - (6)].ValIDVal)));
     CHECK_FOR_ERROR
     if (V == 0)
       GEN_ERROR("May only switch on a constant pool value!");
 
-    BasicBlock* tmpBB = getBBVal((yyvsp[0].ValIDVal));
+    BasicBlock* tmpBB = getBBVal((yyvsp[(6) - (6)].ValIDVal));
     CHECK_FOR_ERROR
     (yyval.JumpTable)->push_back(std::make_pair(V, tmpBB));
   ;}
     break;
 
   case 260:
-#line 2259 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2259 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
     (yyval.JumpTable) = new std::vector<std::pair<Constant*, BasicBlock*> >();
-    Constant *V = cast<Constant>(getValNonImprovising((yyvsp[-4].PrimType), (yyvsp[-3].ValIDVal)));
+    Constant *V = cast<Constant>(getValNonImprovising((yyvsp[(1) - (5)].PrimType), (yyvsp[(2) - (5)].ValIDVal)));
     CHECK_FOR_ERROR
 
     if (V == 0)
       GEN_ERROR("May only switch on a constant pool value!");
 
-    BasicBlock* tmpBB = getBBVal((yyvsp[0].ValIDVal));
+    BasicBlock* tmpBB = getBBVal((yyvsp[(5) - (5)].ValIDVal));
     CHECK_FOR_ERROR
     (yyval.JumpTable)->push_back(std::make_pair(V, tmpBB)); 
   ;}
     break;
 
   case 261:
-#line 2272 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2272 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
   // Is this definition named?? if so, assign the name...
-  setValueName((yyvsp[0].InstVal), (yyvsp[-1].StrVal));
+  setValueName((yyvsp[(2) - (2)].InstVal), (yyvsp[(1) - (2)].StrVal));
   CHECK_FOR_ERROR
-  InsertValue((yyvsp[0].InstVal));
-  (yyval.InstVal) = (yyvsp[0].InstVal);
+  InsertValue((yyvsp[(2) - (2)].InstVal));
+  (yyval.InstVal) = (yyvsp[(2) - (2)].InstVal);
   CHECK_FOR_ERROR
 ;}
     break;
 
   case 262:
-#line 2281 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2281 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {    // Used for PHI nodes
     (yyval.PHIList) = new std::list<std::pair<Value*, BasicBlock*> >();
-    Value* tmpVal = getVal(*(yyvsp[-5].TypeVal), (yyvsp[-3].ValIDVal));
+    Value* tmpVal = getVal(*(yyvsp[(1) - (6)].TypeVal), (yyvsp[(3) - (6)].ValIDVal));
     CHECK_FOR_ERROR
-    BasicBlock* tmpBB = getBBVal((yyvsp[-1].ValIDVal));
+    BasicBlock* tmpBB = getBBVal((yyvsp[(5) - (6)].ValIDVal));
     CHECK_FOR_ERROR
     (yyval.PHIList)->push_back(std::make_pair(tmpVal, tmpBB));
-    delete (yyvsp[-5].TypeVal);
+    delete (yyvsp[(1) - (6)].TypeVal);
   ;}
     break;
 
   case 263:
-#line 2290 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2290 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.PHIList) = (yyvsp[-6].PHIList);
-    Value* tmpVal = getVal((yyvsp[-6].PHIList)->front().first->getType(), (yyvsp[-3].ValIDVal));
+    (yyval.PHIList) = (yyvsp[(1) - (7)].PHIList);
+    Value* tmpVal = getVal((yyvsp[(1) - (7)].PHIList)->front().first->getType(), (yyvsp[(4) - (7)].ValIDVal));
     CHECK_FOR_ERROR
-    BasicBlock* tmpBB = getBBVal((yyvsp[-1].ValIDVal));
+    BasicBlock* tmpBB = getBBVal((yyvsp[(6) - (7)].ValIDVal));
     CHECK_FOR_ERROR
-    (yyvsp[-6].PHIList)->push_back(std::make_pair(tmpVal, tmpBB));
+    (yyvsp[(1) - (7)].PHIList)->push_back(std::make_pair(tmpVal, tmpBB));
   ;}
     break;
 
   case 264:
-#line 2300 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2300 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {    // Used for call statements, and memory insts...
     (yyval.ValueList) = new std::vector<Value*>();
-    (yyval.ValueList)->push_back((yyvsp[0].ValueVal));
+    (yyval.ValueList)->push_back((yyvsp[(1) - (1)].ValueVal));
   ;}
     break;
 
   case 265:
-#line 2304 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2304 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.ValueList) = (yyvsp[-2].ValueList);
-    (yyvsp[-2].ValueList)->push_back((yyvsp[0].ValueVal));
+    (yyval.ValueList) = (yyvsp[(1) - (3)].ValueList);
+    (yyvsp[(1) - (3)].ValueList)->push_back((yyvsp[(3) - (3)].ValueVal));
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 267:
-#line 2311 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2311 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { (yyval.ValueList) = 0; ;}
     break;
 
   case 268:
-#line 2313 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2313 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
     (yyval.BoolVal) = true;
     CHECK_FOR_ERROR
@@ -4955,7 +5176,7 @@
     break;
 
   case 269:
-#line 2317 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2317 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
     (yyval.BoolVal) = false;
     CHECK_FOR_ERROR
@@ -4963,106 +5184,106 @@
     break;
 
   case 270:
-#line 2322 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2322 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    if (!(*(yyvsp[-3].TypeVal))->isInteger() && !(*(yyvsp[-3].TypeVal))->isFloatingPoint() && 
-        !isa<PackedType>((*(yyvsp[-3].TypeVal)).get()))
+    if (!(*(yyvsp[(2) - (5)].TypeVal))->isInteger() && !(*(yyvsp[(2) - (5)].TypeVal))->isFloatingPoint() && 
+        !isa<PackedType>((*(yyvsp[(2) - (5)].TypeVal)).get()))
       GEN_ERROR(
         "Arithmetic operator requires integer, FP, or packed operands!");
-    if (isa<PackedType>((*(yyvsp[-3].TypeVal)).get()) && 
-        ((yyvsp[-4].BinaryOpVal) == Instruction::URem || 
-         (yyvsp[-4].BinaryOpVal) == Instruction::SRem ||
-         (yyvsp[-4].BinaryOpVal) == Instruction::FRem))
+    if (isa<PackedType>((*(yyvsp[(2) - (5)].TypeVal)).get()) && 
+        ((yyvsp[(1) - (5)].BinaryOpVal) == Instruction::URem || 
+         (yyvsp[(1) - (5)].BinaryOpVal) == Instruction::SRem ||
+         (yyvsp[(1) - (5)].BinaryOpVal) == Instruction::FRem))
       GEN_ERROR("U/S/FRem not supported on packed types!");
-    Value* val1 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[-2].ValIDVal)); 
+    Value* val1 = getVal(*(yyvsp[(2) - (5)].TypeVal), (yyvsp[(3) - (5)].ValIDVal)); 
     CHECK_FOR_ERROR
-    Value* val2 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[0].ValIDVal));
+    Value* val2 = getVal(*(yyvsp[(2) - (5)].TypeVal), (yyvsp[(5) - (5)].ValIDVal));
     CHECK_FOR_ERROR
-    (yyval.InstVal) = BinaryOperator::create((yyvsp[-4].BinaryOpVal), val1, val2);
+    (yyval.InstVal) = BinaryOperator::create((yyvsp[(1) - (5)].BinaryOpVal), val1, val2);
     if ((yyval.InstVal) == 0)
       GEN_ERROR("binary operator returned null!");
-    delete (yyvsp[-3].TypeVal);
+    delete (yyvsp[(2) - (5)].TypeVal);
   ;}
     break;
 
   case 271:
-#line 2341 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2341 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    if (!(*(yyvsp[-3].TypeVal))->isIntegral()) {
-      if (!isa<PackedType>((yyvsp[-3].TypeVal)->get()) ||
-          !cast<PackedType>((yyvsp[-3].TypeVal)->get())->getElementType()->isIntegral())
+    if (!(*(yyvsp[(2) - (5)].TypeVal))->isIntegral()) {
+      if (!isa<PackedType>((yyvsp[(2) - (5)].TypeVal)->get()) ||
+          !cast<PackedType>((yyvsp[(2) - (5)].TypeVal)->get())->getElementType()->isIntegral())
         GEN_ERROR("Logical operator requires integral operands!");
     }
-    Value* tmpVal1 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[-2].ValIDVal));
+    Value* tmpVal1 = getVal(*(yyvsp[(2) - (5)].TypeVal), (yyvsp[(3) - (5)].ValIDVal));
     CHECK_FOR_ERROR
-    Value* tmpVal2 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[0].ValIDVal));
+    Value* tmpVal2 = getVal(*(yyvsp[(2) - (5)].TypeVal), (yyvsp[(5) - (5)].ValIDVal));
     CHECK_FOR_ERROR
-    (yyval.InstVal) = BinaryOperator::create((yyvsp[-4].BinaryOpVal), tmpVal1, tmpVal2);
+    (yyval.InstVal) = BinaryOperator::create((yyvsp[(1) - (5)].BinaryOpVal), tmpVal1, tmpVal2);
     if ((yyval.InstVal) == 0)
       GEN_ERROR("binary operator returned null!");
-    delete (yyvsp[-3].TypeVal);
+    delete (yyvsp[(2) - (5)].TypeVal);
   ;}
     break;
 
   case 272:
-#line 2356 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2356 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    if(isa<PackedType>((*(yyvsp[-3].TypeVal)).get())) {
+    if(isa<PackedType>((*(yyvsp[(2) - (5)].TypeVal)).get())) {
       GEN_ERROR(
         "PackedTypes currently not supported in setcc instructions!");
     }
-    Value* tmpVal1 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[-2].ValIDVal));
+    Value* tmpVal1 = getVal(*(yyvsp[(2) - (5)].TypeVal), (yyvsp[(3) - (5)].ValIDVal));
     CHECK_FOR_ERROR
-    Value* tmpVal2 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[0].ValIDVal));
+    Value* tmpVal2 = getVal(*(yyvsp[(2) - (5)].TypeVal), (yyvsp[(5) - (5)].ValIDVal));
     CHECK_FOR_ERROR
-    (yyval.InstVal) = new SetCondInst((yyvsp[-4].BinaryOpVal), tmpVal1, tmpVal2);
+    (yyval.InstVal) = new SetCondInst((yyvsp[(1) - (5)].BinaryOpVal), tmpVal1, tmpVal2);
     if ((yyval.InstVal) == 0)
       GEN_ERROR("binary operator returned null!");
-    delete (yyvsp[-3].TypeVal);
+    delete (yyvsp[(2) - (5)].TypeVal);
   ;}
     break;
 
   case 273:
-#line 2370 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2370 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    if (isa<PackedType>((*(yyvsp[-3].TypeVal)).get()))
+    if (isa<PackedType>((*(yyvsp[(3) - (6)].TypeVal)).get()))
       GEN_ERROR("Packed types not supported by icmp instruction");
-    Value* tmpVal1 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[-2].ValIDVal));
+    Value* tmpVal1 = getVal(*(yyvsp[(3) - (6)].TypeVal), (yyvsp[(4) - (6)].ValIDVal));
     CHECK_FOR_ERROR
-    Value* tmpVal2 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[0].ValIDVal));
+    Value* tmpVal2 = getVal(*(yyvsp[(3) - (6)].TypeVal), (yyvsp[(6) - (6)].ValIDVal));
     CHECK_FOR_ERROR
-    (yyval.InstVal) = CmpInst::create((yyvsp[-5].OtherOpVal), (yyvsp[-4].IPredicate), tmpVal1, tmpVal2);
+    (yyval.InstVal) = CmpInst::create((yyvsp[(1) - (6)].OtherOpVal), (yyvsp[(2) - (6)].IPredicate), tmpVal1, tmpVal2);
     if ((yyval.InstVal) == 0)
       GEN_ERROR("icmp operator returned null!");
   ;}
     break;
 
   case 274:
-#line 2381 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2381 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    if (isa<PackedType>((*(yyvsp[-3].TypeVal)).get()))
+    if (isa<PackedType>((*(yyvsp[(3) - (6)].TypeVal)).get()))
       GEN_ERROR("Packed types not supported by fcmp instruction");
-    Value* tmpVal1 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[-2].ValIDVal));
+    Value* tmpVal1 = getVal(*(yyvsp[(3) - (6)].TypeVal), (yyvsp[(4) - (6)].ValIDVal));
     CHECK_FOR_ERROR
-    Value* tmpVal2 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[0].ValIDVal));
+    Value* tmpVal2 = getVal(*(yyvsp[(3) - (6)].TypeVal), (yyvsp[(6) - (6)].ValIDVal));
     CHECK_FOR_ERROR
-    (yyval.InstVal) = CmpInst::create((yyvsp[-5].OtherOpVal), (yyvsp[-4].FPredicate), tmpVal1, tmpVal2);
+    (yyval.InstVal) = CmpInst::create((yyvsp[(1) - (6)].OtherOpVal), (yyvsp[(2) - (6)].FPredicate), tmpVal1, tmpVal2);
     if ((yyval.InstVal) == 0)
       GEN_ERROR("fcmp operator returned null!");
   ;}
     break;
 
   case 275:
-#line 2392 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2392 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    llvm_cerr << "WARNING: Use of eliminated 'not' instruction:"
-              << " Replacing with 'xor'.\n";
+    cerr << "WARNING: Use of eliminated 'not' instruction:"
+         << " Replacing with 'xor'.\n";
 
-    Value *Ones = ConstantIntegral::getAllOnesValue((yyvsp[0].ValueVal)->getType());
+    Value *Ones = ConstantIntegral::getAllOnesValue((yyvsp[(2) - (2)].ValueVal)->getType());
     if (Ones == 0)
       GEN_ERROR("Expected integral type for not instruction!");
 
-    (yyval.InstVal) = BinaryOperator::create(Instruction::Xor, (yyvsp[0].ValueVal), Ones);
+    (yyval.InstVal) = BinaryOperator::create(Instruction::Xor, (yyvsp[(2) - (2)].ValueVal), Ones);
     if ((yyval.InstVal) == 0)
       GEN_ERROR("Could not create a xor instruction!");
     CHECK_FOR_ERROR
@@ -5070,115 +5291,115 @@
     break;
 
   case 276:
-#line 2405 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2405 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    if ((yyvsp[0].ValueVal)->getType() != Type::UByteTy)
+    if ((yyvsp[(4) - (4)].ValueVal)->getType() != Type::UByteTy)
       GEN_ERROR("Shift amount must be ubyte!");
-    if (!(yyvsp[-2].ValueVal)->getType()->isInteger())
+    if (!(yyvsp[(2) - (4)].ValueVal)->getType()->isInteger())
       GEN_ERROR("Shift constant expression requires integer operand!");
     CHECK_FOR_ERROR;
-    (yyval.InstVal) = new ShiftInst((yyvsp[-3].OtherOpVal), (yyvsp[-2].ValueVal), (yyvsp[0].ValueVal));
+    (yyval.InstVal) = new ShiftInst((yyvsp[(1) - (4)].OtherOpVal), (yyvsp[(2) - (4)].ValueVal), (yyvsp[(4) - (4)].ValueVal));
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 277:
-#line 2414 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2414 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    Value* Val = (yyvsp[-2].ValueVal);
-    const Type* Ty = (yyvsp[0].TypeVal)->get();
+    Value* Val = (yyvsp[(2) - (4)].ValueVal);
+    const Type* Ty = (yyvsp[(4) - (4)].TypeVal)->get();
     if (!Val->getType()->isFirstClassType())
       GEN_ERROR("cast from a non-primitive type: '" +
                 Val->getType()->getDescription() + "'!");
     if (!Ty->isFirstClassType())
       GEN_ERROR("cast to a non-primitive type: '" + Ty->getDescription() +"'!");
-    (yyval.InstVal) = CastInst::create((yyvsp[-3].CastOpVal), (yyvsp[-2].ValueVal), (yyvsp[0].TypeVal)->get());
-    delete (yyvsp[0].TypeVal);
+    (yyval.InstVal) = CastInst::create((yyvsp[(1) - (4)].CastOpVal), (yyvsp[(2) - (4)].ValueVal), (yyvsp[(4) - (4)].TypeVal)->get());
+    delete (yyvsp[(4) - (4)].TypeVal);
   ;}
     break;
 
   case 278:
-#line 2425 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2425 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    if ((yyvsp[-4].ValueVal)->getType() != Type::BoolTy)
+    if ((yyvsp[(2) - (6)].ValueVal)->getType() != Type::BoolTy)
       GEN_ERROR("select condition must be boolean!");
-    if ((yyvsp[-2].ValueVal)->getType() != (yyvsp[0].ValueVal)->getType())
+    if ((yyvsp[(4) - (6)].ValueVal)->getType() != (yyvsp[(6) - (6)].ValueVal)->getType())
       GEN_ERROR("select value types should match!");
-    (yyval.InstVal) = new SelectInst((yyvsp[-4].ValueVal), (yyvsp[-2].ValueVal), (yyvsp[0].ValueVal));
+    (yyval.InstVal) = new SelectInst((yyvsp[(2) - (6)].ValueVal), (yyvsp[(4) - (6)].ValueVal), (yyvsp[(6) - (6)].ValueVal));
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 279:
-#line 2433 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2433 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.InstVal) = new VAArgInst((yyvsp[-2].ValueVal), *(yyvsp[0].TypeVal));
-    delete (yyvsp[0].TypeVal);
+    (yyval.InstVal) = new VAArgInst((yyvsp[(2) - (4)].ValueVal), *(yyvsp[(4) - (4)].TypeVal));
+    delete (yyvsp[(4) - (4)].TypeVal);
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 280:
-#line 2438 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2438 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    if (!ExtractElementInst::isValidOperands((yyvsp[-2].ValueVal), (yyvsp[0].ValueVal)))
+    if (!ExtractElementInst::isValidOperands((yyvsp[(2) - (4)].ValueVal), (yyvsp[(4) - (4)].ValueVal)))
       GEN_ERROR("Invalid extractelement operands!");
-    (yyval.InstVal) = new ExtractElementInst((yyvsp[-2].ValueVal), (yyvsp[0].ValueVal));
+    (yyval.InstVal) = new ExtractElementInst((yyvsp[(2) - (4)].ValueVal), (yyvsp[(4) - (4)].ValueVal));
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 281:
-#line 2444 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2444 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    if (!InsertElementInst::isValidOperands((yyvsp[-4].ValueVal), (yyvsp[-2].ValueVal), (yyvsp[0].ValueVal)))
+    if (!InsertElementInst::isValidOperands((yyvsp[(2) - (6)].ValueVal), (yyvsp[(4) - (6)].ValueVal), (yyvsp[(6) - (6)].ValueVal)))
       GEN_ERROR("Invalid insertelement operands!");
-    (yyval.InstVal) = new InsertElementInst((yyvsp[-4].ValueVal), (yyvsp[-2].ValueVal), (yyvsp[0].ValueVal));
+    (yyval.InstVal) = new InsertElementInst((yyvsp[(2) - (6)].ValueVal), (yyvsp[(4) - (6)].ValueVal), (yyvsp[(6) - (6)].ValueVal));
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 282:
-#line 2450 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2450 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    if (!ShuffleVectorInst::isValidOperands((yyvsp[-4].ValueVal), (yyvsp[-2].ValueVal), (yyvsp[0].ValueVal)))
+    if (!ShuffleVectorInst::isValidOperands((yyvsp[(2) - (6)].ValueVal), (yyvsp[(4) - (6)].ValueVal), (yyvsp[(6) - (6)].ValueVal)))
       GEN_ERROR("Invalid shufflevector operands!");
-    (yyval.InstVal) = new ShuffleVectorInst((yyvsp[-4].ValueVal), (yyvsp[-2].ValueVal), (yyvsp[0].ValueVal));
+    (yyval.InstVal) = new ShuffleVectorInst((yyvsp[(2) - (6)].ValueVal), (yyvsp[(4) - (6)].ValueVal), (yyvsp[(6) - (6)].ValueVal));
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 283:
-#line 2456 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2456 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    const Type *Ty = (yyvsp[0].PHIList)->front().first->getType();
+    const Type *Ty = (yyvsp[(2) - (2)].PHIList)->front().first->getType();
     if (!Ty->isFirstClassType())
       GEN_ERROR("PHI node operands must be of first class type!");
     (yyval.InstVal) = new PHINode(Ty);
-    ((PHINode*)(yyval.InstVal))->reserveOperandSpace((yyvsp[0].PHIList)->size());
-    while ((yyvsp[0].PHIList)->begin() != (yyvsp[0].PHIList)->end()) {
-      if ((yyvsp[0].PHIList)->front().first->getType() != Ty) 
+    ((PHINode*)(yyval.InstVal))->reserveOperandSpace((yyvsp[(2) - (2)].PHIList)->size());
+    while ((yyvsp[(2) - (2)].PHIList)->begin() != (yyvsp[(2) - (2)].PHIList)->end()) {
+      if ((yyvsp[(2) - (2)].PHIList)->front().first->getType() != Ty) 
         GEN_ERROR("All elements of a PHI node must be of the same type!");
-      cast<PHINode>((yyval.InstVal))->addIncoming((yyvsp[0].PHIList)->front().first, (yyvsp[0].PHIList)->front().second);
-      (yyvsp[0].PHIList)->pop_front();
+      cast<PHINode>((yyval.InstVal))->addIncoming((yyvsp[(2) - (2)].PHIList)->front().first, (yyvsp[(2) - (2)].PHIList)->front().second);
+      (yyvsp[(2) - (2)].PHIList)->pop_front();
     }
-    delete (yyvsp[0].PHIList);  // Free the list...
+    delete (yyvsp[(2) - (2)].PHIList);  // Free the list...
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 284:
-#line 2471 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2471 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
     const PointerType *PFTy = 0;
     const FunctionType *Ty = 0;
 
-    if (!(PFTy = dyn_cast<PointerType>((yyvsp[-4].TypeVal)->get())) ||
+    if (!(PFTy = dyn_cast<PointerType>((yyvsp[(3) - (7)].TypeVal)->get())) ||
         !(Ty = dyn_cast<FunctionType>(PFTy->getElementType()))) {
       // Pull out the types of all of the arguments...
       std::vector<const Type*> ParamTypes;
-      if ((yyvsp[-1].ValueList)) {
-        for (std::vector<Value*>::iterator I = (yyvsp[-1].ValueList)->begin(), E = (yyvsp[-1].ValueList)->end();
+      if ((yyvsp[(6) - (7)].ValueList)) {
+        for (std::vector<Value*>::iterator I = (yyvsp[(6) - (7)].ValueList)->begin(), E = (yyvsp[(6) - (7)].ValueList)->end();
              I != E; ++I)
           ParamTypes.push_back((*I)->getType());
       }
@@ -5186,18 +5407,18 @@
       bool isVarArg = ParamTypes.size() && ParamTypes.back() == Type::VoidTy;
       if (isVarArg) ParamTypes.pop_back();
 
-      if (!(*(yyvsp[-4].TypeVal))->isFirstClassType() && *(yyvsp[-4].TypeVal) != Type::VoidTy)
+      if (!(*(yyvsp[(3) - (7)].TypeVal))->isFirstClassType() && *(yyvsp[(3) - (7)].TypeVal) != Type::VoidTy)
         GEN_ERROR("LLVM functions cannot return aggregate types!");
 
-      Ty = FunctionType::get((yyvsp[-4].TypeVal)->get(), ParamTypes, isVarArg);
+      Ty = FunctionType::get((yyvsp[(3) - (7)].TypeVal)->get(), ParamTypes, isVarArg);
       PFTy = PointerType::get(Ty);
     }
 
-    Value *V = getVal(PFTy, (yyvsp[-3].ValIDVal));   // Get the function we're calling...
+    Value *V = getVal(PFTy, (yyvsp[(4) - (7)].ValIDVal));   // Get the function we're calling...
     CHECK_FOR_ERROR
 
     // Create the call node...
-    if (!(yyvsp[-1].ValueList)) {                                   // Has no arguments?
+    if (!(yyvsp[(6) - (7)].ValueList)) {                                   // Has no arguments?
       // Make sure no arguments is a good thing!
       if (Ty->getNumParams() != 0)
         GEN_ERROR("No arguments passed to a function that "
@@ -5210,7 +5431,7 @@
       //
       FunctionType::param_iterator I = Ty->param_begin();
       FunctionType::param_iterator E = Ty->param_end();
-      std::vector<Value*>::iterator ArgI = (yyvsp[-1].ValueList)->begin(), ArgE = (yyvsp[-1].ValueList)->end();
+      std::vector<Value*>::iterator ArgI = (yyvsp[(6) - (7)].ValueList)->begin(), ArgE = (yyvsp[(6) - (7)].ValueList)->end();
 
       for (; ArgI != ArgE && I != E; ++ArgI, ++I)
         if ((*ArgI)->getType() != *I)
@@ -5220,34 +5441,34 @@
       if (I != E || (ArgI != ArgE && !Ty->isVarArg()))
         GEN_ERROR("Invalid number of parameters detected!");
 
-      (yyval.InstVal) = new CallInst(V, *(yyvsp[-1].ValueList));
+      (yyval.InstVal) = new CallInst(V, *(yyvsp[(6) - (7)].ValueList));
     }
-    cast<CallInst>((yyval.InstVal))->setTailCall((yyvsp[-6].BoolVal));
-    cast<CallInst>((yyval.InstVal))->setCallingConv((yyvsp[-5].UIntVal));
-    delete (yyvsp[-4].TypeVal);
-    delete (yyvsp[-1].ValueList);
+    cast<CallInst>((yyval.InstVal))->setTailCall((yyvsp[(1) - (7)].BoolVal));
+    cast<CallInst>((yyval.InstVal))->setCallingConv((yyvsp[(2) - (7)].UIntVal));
+    delete (yyvsp[(3) - (7)].TypeVal);
+    delete (yyvsp[(6) - (7)].ValueList);
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 285:
-#line 2530 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2530 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.InstVal) = (yyvsp[0].InstVal);
+    (yyval.InstVal) = (yyvsp[(1) - (1)].InstVal);
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 286:
-#line 2537 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2537 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { 
-    (yyval.ValueList) = (yyvsp[0].ValueList); 
+    (yyval.ValueList) = (yyvsp[(2) - (2)].ValueList); 
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 287:
-#line 2540 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2540 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     { 
     (yyval.ValueList) = new std::vector<Value*>(); 
     CHECK_FOR_ERROR
@@ -5255,7 +5476,7 @@
     break;
 
   case 288:
-#line 2545 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2545 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
     (yyval.BoolVal) = true;
     CHECK_FOR_ERROR
@@ -5263,7 +5484,7 @@
     break;
 
   case 289:
-#line 2549 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2549 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
     (yyval.BoolVal) = false;
     CHECK_FOR_ERROR
@@ -5271,117 +5492,115 @@
     break;
 
   case 290:
-#line 2556 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2556 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.InstVal) = new MallocInst(*(yyvsp[-1].TypeVal), 0, (yyvsp[0].UIntVal));
-    delete (yyvsp[-1].TypeVal);
+    (yyval.InstVal) = new MallocInst(*(yyvsp[(2) - (3)].TypeVal), 0, (yyvsp[(3) - (3)].UIntVal));
+    delete (yyvsp[(2) - (3)].TypeVal);
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 291:
-#line 2561 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2561 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    Value* tmpVal = getVal((yyvsp[-2].PrimType), (yyvsp[-1].ValIDVal));
+    Value* tmpVal = getVal((yyvsp[(4) - (6)].PrimType), (yyvsp[(5) - (6)].ValIDVal));
     CHECK_FOR_ERROR
-    (yyval.InstVal) = new MallocInst(*(yyvsp[-4].TypeVal), tmpVal, (yyvsp[0].UIntVal));
-    delete (yyvsp[-4].TypeVal);
+    (yyval.InstVal) = new MallocInst(*(yyvsp[(2) - (6)].TypeVal), tmpVal, (yyvsp[(6) - (6)].UIntVal));
+    delete (yyvsp[(2) - (6)].TypeVal);
   ;}
     break;
 
   case 292:
-#line 2567 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2567 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    (yyval.InstVal) = new AllocaInst(*(yyvsp[-1].TypeVal), 0, (yyvsp[0].UIntVal));
-    delete (yyvsp[-1].TypeVal);
+    (yyval.InstVal) = new AllocaInst(*(yyvsp[(2) - (3)].TypeVal), 0, (yyvsp[(3) - (3)].UIntVal));
+    delete (yyvsp[(2) - (3)].TypeVal);
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 293:
-#line 2572 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2572 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    Value* tmpVal = getVal((yyvsp[-2].PrimType), (yyvsp[-1].ValIDVal));
+    Value* tmpVal = getVal((yyvsp[(4) - (6)].PrimType), (yyvsp[(5) - (6)].ValIDVal));
     CHECK_FOR_ERROR
-    (yyval.InstVal) = new AllocaInst(*(yyvsp[-4].TypeVal), tmpVal, (yyvsp[0].UIntVal));
-    delete (yyvsp[-4].TypeVal);
+    (yyval.InstVal) = new AllocaInst(*(yyvsp[(2) - (6)].TypeVal), tmpVal, (yyvsp[(6) - (6)].UIntVal));
+    delete (yyvsp[(2) - (6)].TypeVal);
   ;}
     break;
 
   case 294:
-#line 2578 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2578 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    if (!isa<PointerType>((yyvsp[0].ValueVal)->getType()))
+    if (!isa<PointerType>((yyvsp[(2) - (2)].ValueVal)->getType()))
       GEN_ERROR("Trying to free nonpointer type " + 
-                     (yyvsp[0].ValueVal)->getType()->getDescription() + "!");
-    (yyval.InstVal) = new FreeInst((yyvsp[0].ValueVal));
+                     (yyvsp[(2) - (2)].ValueVal)->getType()->getDescription() + "!");
+    (yyval.InstVal) = new FreeInst((yyvsp[(2) - (2)].ValueVal));
     CHECK_FOR_ERROR
   ;}
     break;
 
   case 295:
-#line 2586 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2586 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    if (!isa<PointerType>((yyvsp[-1].TypeVal)->get()))
+    if (!isa<PointerType>((yyvsp[(3) - (4)].TypeVal)->get()))
       GEN_ERROR("Can't load from nonpointer type: " +
-                     (*(yyvsp[-1].TypeVal))->getDescription());
-    if (!cast<PointerType>((yyvsp[-1].TypeVal)->get())->getElementType()->isFirstClassType())
+                     (*(yyvsp[(3) - (4)].TypeVal))->getDescription());
+    if (!cast<PointerType>((yyvsp[(3) - (4)].TypeVal)->get())->getElementType()->isFirstClassType())
       GEN_ERROR("Can't load from pointer of non-first-class type: " +
-                     (*(yyvsp[-1].TypeVal))->getDescription());
-    Value* tmpVal = getVal(*(yyvsp[-1].TypeVal), (yyvsp[0].ValIDVal));
+                     (*(yyvsp[(3) - (4)].TypeVal))->getDescription());
+    Value* tmpVal = getVal(*(yyvsp[(3) - (4)].TypeVal), (yyvsp[(4) - (4)].ValIDVal));
     CHECK_FOR_ERROR
-    (yyval.InstVal) = new LoadInst(tmpVal, "", (yyvsp[-3].BoolVal));
-    delete (yyvsp[-1].TypeVal);
+    (yyval.InstVal) = new LoadInst(tmpVal, "", (yyvsp[(1) - (4)].BoolVal));
+    delete (yyvsp[(3) - (4)].TypeVal);
   ;}
     break;
 
   case 296:
-#line 2598 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2598 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    const PointerType *PT = dyn_cast<PointerType>((yyvsp[-1].TypeVal)->get());
+    const PointerType *PT = dyn_cast<PointerType>((yyvsp[(5) - (6)].TypeVal)->get());
     if (!PT)
       GEN_ERROR("Can't store to a nonpointer type: " +
-                     (*(yyvsp[-1].TypeVal))->getDescription());
+                     (*(yyvsp[(5) - (6)].TypeVal))->getDescription());
     const Type *ElTy = PT->getElementType();
-    if (ElTy != (yyvsp[-3].ValueVal)->getType())
-      GEN_ERROR("Can't store '" + (yyvsp[-3].ValueVal)->getType()->getDescription() +
+    if (ElTy != (yyvsp[(3) - (6)].ValueVal)->getType())
+      GEN_ERROR("Can't store '" + (yyvsp[(3) - (6)].ValueVal)->getType()->getDescription() +
                      "' into space of type '" + ElTy->getDescription() + "'!");
 
-    Value* tmpVal = getVal(*(yyvsp[-1].TypeVal), (yyvsp[0].ValIDVal));
+    Value* tmpVal = getVal(*(yyvsp[(5) - (6)].TypeVal), (yyvsp[(6) - (6)].ValIDVal));
     CHECK_FOR_ERROR
-    (yyval.InstVal) = new StoreInst((yyvsp[-3].ValueVal), tmpVal, (yyvsp[-5].BoolVal));
-    delete (yyvsp[-1].TypeVal);
+    (yyval.InstVal) = new StoreInst((yyvsp[(3) - (6)].ValueVal), tmpVal, (yyvsp[(1) - (6)].BoolVal));
+    delete (yyvsp[(5) - (6)].TypeVal);
   ;}
     break;
 
   case 297:
-#line 2613 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2613 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
     {
-    if (!isa<PointerType>((yyvsp[-2].TypeVal)->get()))
+    if (!isa<PointerType>((yyvsp[(2) - (4)].TypeVal)->get()))
       GEN_ERROR("getelementptr insn requires pointer operand!");
 
-    if (!GetElementPtrInst::getIndexedType(*(yyvsp[-2].TypeVal), *(yyvsp[0].ValueList), true))
+    if (!GetElementPtrInst::getIndexedType(*(yyvsp[(2) - (4)].TypeVal), *(yyvsp[(4) - (4)].ValueList), true))
       GEN_ERROR("Invalid getelementptr indices for type '" +
-                     (*(yyvsp[-2].TypeVal))->getDescription()+ "'!");
-    Value* tmpVal = getVal(*(yyvsp[-2].TypeVal), (yyvsp[-1].ValIDVal));
+                     (*(yyvsp[(2) - (4)].TypeVal))->getDescription()+ "'!");
+    Value* tmpVal = getVal(*(yyvsp[(2) - (4)].TypeVal), (yyvsp[(3) - (4)].ValIDVal));
     CHECK_FOR_ERROR
-    (yyval.InstVal) = new GetElementPtrInst(tmpVal, *(yyvsp[0].ValueList));
-    delete (yyvsp[-2].TypeVal); 
-    delete (yyvsp[0].ValueList);
+    (yyval.InstVal) = new GetElementPtrInst(tmpVal, *(yyvsp[(4) - (4)].ValueList));
+    delete (yyvsp[(2) - (4)].TypeVal); 
+    delete (yyvsp[(4) - (4)].ValueList);
   ;}
     break;
 
 
+/* Line 1267 of yacc.c.  */
+#line 5598 "llvmAsmParser.tab.c"
       default: break;
     }
+  YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
 
-/* Line 1126 of yacc.c.  */
-#line 5380 "llvmAsmParser.tab.c"
-
-  yyvsp -= yylen;
-  yyssp -= yylen;
-
-
+  YYPOPSTACK (yylen);
+  yylen = 0;
   YY_STACK_PRINT (yyss, yyssp);
 
   *++yyvsp = yyval;
@@ -5410,110 +5629,41 @@
   if (!yyerrstatus)
     {
       ++yynerrs;
-#if YYERROR_VERBOSE
-      yyn = yypact[yystate];
-
-      if (YYPACT_NINF < yyn && yyn < YYLAST)
-	{
-	  int yytype = YYTRANSLATE (yychar);
-	  YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
-	  YYSIZE_T yysize = yysize0;
-	  YYSIZE_T yysize1;
-	  int yysize_overflow = 0;
-	  char *yymsg = 0;
-#	  define YYERROR_VERBOSE_ARGS_MAXIMUM 5
-	  char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
-	  int yyx;
-
-#if 0
-	  /* This is so xgettext sees the translatable formats that are
-	     constructed on the fly.  */
-	  YY_("syntax error, unexpected %s");
-	  YY_("syntax error, unexpected %s, expecting %s");
-	  YY_("syntax error, unexpected %s, expecting %s or %s");
-	  YY_("syntax error, unexpected %s, expecting %s or %s or %s");
-	  YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
-#endif
-	  char *yyfmt;
-	  char const *yyf;
-	  static char const yyunexpected[] = "syntax error, unexpected %s";
-	  static char const yyexpecting[] = ", expecting %s";
-	  static char const yyor[] = " or %s";
-	  char yyformat[sizeof yyunexpected
-			+ sizeof yyexpecting - 1
-			+ ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
-			   * (sizeof yyor - 1))];
-	  char const *yyprefix = yyexpecting;
-
-	  /* Start YYX at -YYN if negative to avoid negative indexes in
-	     YYCHECK.  */
-	  int yyxbegin = yyn < 0 ? -yyn : 0;
-
-	  /* Stay within bounds of both yycheck and yytname.  */
-	  int yychecklim = YYLAST - yyn;
-	  int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
-	  int yycount = 1;
-
-	  yyarg[0] = yytname[yytype];
-	  yyfmt = yystpcpy (yyformat, yyunexpected);
-
-	  for (yyx = yyxbegin; yyx < yyxend; ++yyx)
-	    if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
-	      {
-		if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
-		  {
-		    yycount = 1;
-		    yysize = yysize0;
-		    yyformat[sizeof yyunexpected - 1] = '\0';
-		    break;
-		  }
-		yyarg[yycount++] = yytname[yyx];
-		yysize1 = yysize + yytnamerr (0, yytname[yyx]);
-		yysize_overflow |= yysize1 < yysize;
-		yysize = yysize1;
-		yyfmt = yystpcpy (yyfmt, yyprefix);
-		yyprefix = yyor;
-	      }
-
-	  yyf = YY_(yyformat);
-	  yysize1 = yysize + yystrlen (yyf);
-	  yysize_overflow |= yysize1 < yysize;
-	  yysize = yysize1;
-
-	  if (!yysize_overflow && yysize <= YYSTACK_ALLOC_MAXIMUM)
-	    yymsg = (char *) YYSTACK_ALLOC (yysize);
-	  if (yymsg)
-	    {
-	      /* Avoid sprintf, as that infringes on the user's name space.
-		 Don't have undefined behavior even if the translation
-		 produced a string with the wrong number of "%s"s.  */
-	      char *yyp = yymsg;
-	      int yyi = 0;
-	      while ((*yyp = *yyf))
-		{
-		  if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
-		    {
-		      yyp += yytnamerr (yyp, yyarg[yyi++]);
-		      yyf += 2;
-		    }
-		  else
-		    {
-		      yyp++;
-		      yyf++;
-		    }
-		}
-	      yyerror (yymsg);
+#if ! YYERROR_VERBOSE
+      yyerror (YY_("syntax error"));
+#else
+      {
+	YYSIZE_T yysize = yysyntax_error (0, yystate, yychar);
+	if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM)
+	  {
+	    YYSIZE_T yyalloc = 2 * yysize;
+	    if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM))
+	      yyalloc = YYSTACK_ALLOC_MAXIMUM;
+	    if (yymsg != yymsgbuf)
 	      YYSTACK_FREE (yymsg);
-	    }
-	  else
-	    {
-	      yyerror (YY_("syntax error"));
+	    yymsg = (char *) YYSTACK_ALLOC (yyalloc);
+	    if (yymsg)
+	      yymsg_alloc = yyalloc;
+	    else
+	      {
+		yymsg = yymsgbuf;
+		yymsg_alloc = sizeof yymsgbuf;
+	      }
+	  }
+
+	if (0 < yysize && yysize <= yymsg_alloc)
+	  {
+	    (void) yysyntax_error (yymsg, yystate, yychar);
+	    yyerror (yymsg);
+	  }
+	else
+	  {
+	    yyerror (YY_("syntax error"));
+	    if (yysize != 0)
 	      goto yyexhaustedlab;
-	    }
-	}
-      else
-#endif /* YYERROR_VERBOSE */
-	yyerror (YY_("syntax error"));
+	  }
+      }
+#endif
     }
 
 
@@ -5524,14 +5674,15 @@
 	 error, discard it.  */
 
       if (yychar <= YYEOF)
-        {
+	{
 	  /* Return failure if at end of input.  */
 	  if (yychar == YYEOF)
 	    YYABORT;
-        }
+	}
       else
 	{
-	  yydestruct ("Error: discarding", yytoken, &yylval);
+	  yydestruct ("Error: discarding",
+		      yytoken, &yylval);
 	  yychar = YYEMPTY;
 	}
     }
@@ -5549,11 +5700,14 @@
   /* Pacify compilers like GCC when the user code never invokes
      YYERROR and the label yyerrorlab therefore never appears in user
      code.  */
-  if (0)
+  if (/*CONSTCOND*/ 0)
      goto yyerrorlab;
 
-yyvsp -= yylen;
-  yyssp -= yylen;
+  /* Do not reclaim the symbols of the rule which action triggered
+     this YYERROR.  */
+  YYPOPSTACK (yylen);
+  yylen = 0;
+  YY_STACK_PRINT (yyss, yyssp);
   yystate = *yyssp;
   goto yyerrlab1;
 
@@ -5583,8 +5737,9 @@
 	YYABORT;
 
 
-      yydestruct ("Error: popping", yystos[yystate], yyvsp);
-      YYPOPSTACK;
+      yydestruct ("Error: popping",
+		  yystos[yystate], yyvsp);
+      YYPOPSTACK (1);
       yystate = *yyssp;
       YY_STACK_PRINT (yyss, yyssp);
     }
@@ -5595,7 +5750,7 @@
   *++yyvsp = yylval;
 
 
-  /* Shift the error token. */
+  /* Shift the error token.  */
   YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
 
   yystate = yyn;
@@ -5630,21 +5785,30 @@
   if (yychar != YYEOF && yychar != YYEMPTY)
      yydestruct ("Cleanup: discarding lookahead",
 		 yytoken, &yylval);
+  /* Do not reclaim the symbols of the rule which action triggered
+     this YYABORT or YYACCEPT.  */
+  YYPOPSTACK (yylen);
+  YY_STACK_PRINT (yyss, yyssp);
   while (yyssp != yyss)
     {
       yydestruct ("Cleanup: popping",
 		  yystos[*yyssp], yyvsp);
-      YYPOPSTACK;
+      YYPOPSTACK (1);
     }
 #ifndef yyoverflow
   if (yyss != yyssa)
     YYSTACK_FREE (yyss);
 #endif
-  return yyresult;
+#if YYERROR_VERBOSE
+  if (yymsg != yymsgbuf)
+    YYSTACK_FREE (yymsg);
+#endif
+  /* Make sure YYID is used.  */
+  return YYID (yyresult);
 }
 
 
-#line 2628 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
+#line 2628 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
 
 
 void llvm::GenerateError(const std::string &message, int LineNo) {
diff --git a/lib/AsmParser/llvmAsmParser.h.cvs b/lib/AsmParser/llvmAsmParser.h.cvs
index 4661132..5e53962 100644
--- a/lib/AsmParser/llvmAsmParser.h.cvs
+++ b/lib/AsmParser/llvmAsmParser.h.cvs
@@ -1,7 +1,9 @@
-/* A Bison parser, made by GNU Bison 2.1.  */
+/* A Bison parser, made by GNU Bison 2.3.  */
 
-/* Skeleton parser for Yacc-like parsing with Bison,
-   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+/* Skeleton interface for Bison's Yacc-like parsers in C
+
+   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
+   Free Software Foundation, Inc.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -18,10 +20,18 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor,
    Boston, MA 02110-1301, USA.  */
 
-/* As a special exception, when this file is copied by Bison into a
-   Bison output file, you may use that output file without restriction.
-   This special exception was added by the Free Software Foundation
-   in version 1.24 of Bison.  */
+/* As a special exception, you may create a larger work that contains
+   part or all of the Bison parser skeleton and distribute that work
+   under terms of your choice, so long as that work isn't itself a
+   parser generator using the skeleton or a modified version thereof
+   as a parser skeleton.  Alternatively, if you modify or redistribute
+   the parser skeleton itself, you may (at your option) remove this
+   special exception, which will cause the skeleton and the resulting
+   Bison output files to be licensed under the GNU General Public
+   License without this special exception.
+
+   This special exception was added by the Free Software Foundation in
+   version 2.2 of Bison.  */
 
 /* Tokens.  */
 #ifndef YYTOKENTYPE
@@ -320,9 +330,10 @@
 
 
 
-#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
-#line 855 "/proj/llvm/llvm-1/lib/AsmParser/llvmAsmParser.y"
-typedef union YYSTYPE {
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+typedef union YYSTYPE
+#line 855 "/Volumes/Gir/devel/llvm/llvm.src/lib/AsmParser/llvmAsmParser.y"
+{
   llvm::Module                           *ModuleVal;
   llvm::Function                         *FunctionVal;
   std::pair<llvm::PATypeHolder*, char*>  *ArgVal;
@@ -363,9 +374,10 @@
   llvm::Module::Endianness          Endianness;
   llvm::ICmpInst::Predicate         IPredicate;
   llvm::FCmpInst::Predicate         FPredicate;
-} YYSTYPE;
-/* Line 1447 of yacc.c.  */
-#line 369 "llvmAsmParser.tab.h"
+}
+/* Line 1529 of yacc.c.  */
+#line 380 "llvmAsmParser.tab.h"
+	YYSTYPE;
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
 # define YYSTYPE_IS_TRIVIAL 1
@@ -373,5 +385,3 @@
 
 extern YYSTYPE llvmAsmlval;
 
-
-
diff --git a/lib/AsmParser/llvmAsmParser.y b/lib/AsmParser/llvmAsmParser.y
index 31306c2..15524ba 100644
--- a/lib/AsmParser/llvmAsmParser.y
+++ b/lib/AsmParser/llvmAsmParser.y
@@ -57,7 +57,7 @@
 //
 //#define DEBUG_UPREFS 1
 #ifdef DEBUG_UPREFS
-#define UR_OUT(X) llvm_cerr << X
+#define UR_OUT(X) cerr << X
 #else
 #define UR_OUT(X)
 #endif
@@ -2390,8 +2390,8 @@
       GEN_ERROR("fcmp operator returned null!");
   }
   | NOT ResolvedVal {
-    llvm_cerr << "WARNING: Use of eliminated 'not' instruction:"
-              << " Replacing with 'xor'.\n";
+    cerr << "WARNING: Use of eliminated 'not' instruction:"
+         << " Replacing with 'xor'.\n";
 
     Value *Ones = ConstantIntegral::getAllOnesValue($2->getType());
     if (Ones == 0)
diff --git a/lib/AsmParser/llvmAsmParser.y.cvs b/lib/AsmParser/llvmAsmParser.y.cvs
index 31306c2..15524ba 100644
--- a/lib/AsmParser/llvmAsmParser.y.cvs
+++ b/lib/AsmParser/llvmAsmParser.y.cvs
@@ -57,7 +57,7 @@
 //
 //#define DEBUG_UPREFS 1
 #ifdef DEBUG_UPREFS
-#define UR_OUT(X) llvm_cerr << X
+#define UR_OUT(X) cerr << X
 #else
 #define UR_OUT(X)
 #endif
@@ -2390,8 +2390,8 @@
       GEN_ERROR("fcmp operator returned null!");
   }
   | NOT ResolvedVal {
-    llvm_cerr << "WARNING: Use of eliminated 'not' instruction:"
-              << " Replacing with 'xor'.\n";
+    cerr << "WARNING: Use of eliminated 'not' instruction:"
+         << " Replacing with 'xor'.\n";
 
     Value *Ones = ConstantIntegral::getAllOnesValue($2->getType());
     if (Ones == 0)
diff --git a/lib/Bytecode/Writer/SlotCalculator.cpp b/lib/Bytecode/Writer/SlotCalculator.cpp
index efb6c43..9e096ee 100644
--- a/lib/Bytecode/Writer/SlotCalculator.cpp
+++ b/lib/Bytecode/Writer/SlotCalculator.cpp
@@ -32,7 +32,7 @@
 
 #if 0
 #include "llvm/Support/Streams.h"
-#define SC_DEBUG(X) llvm_cerr << X
+#define SC_DEBUG(X) cerr << X
 #else
 #define SC_DEBUG(X)
 #endif
diff --git a/lib/Bytecode/Writer/Writer.cpp b/lib/Bytecode/Writer/Writer.cpp
index 37c6321..b69c1ad 100644
--- a/lib/Bytecode/Writer/Writer.cpp
+++ b/lib/Bytecode/Writer/Writer.cpp
@@ -276,8 +276,8 @@
     break;
 
   default:
-    llvm_cerr << __FILE__ << ":" << __LINE__ << ": Don't know how to serialize"
-              << " Type '" << T->getDescription() << "'\n";
+    cerr << __FILE__ << ":" << __LINE__ << ": Don't know how to serialize"
+         << " Type '" << T->getDescription() << "'\n";
     break;
   }
 }
@@ -387,8 +387,8 @@
   case Type::VoidTyID:
   case Type::LabelTyID:
   default:
-    llvm_cerr << __FILE__ << ":" << __LINE__ << ": Don't know how to serialize"
-              << " type '" << *CPV->getType() << "'\n";
+    cerr << __FILE__ << ":" << __LINE__ << ": Don't know how to serialize"
+         << " type '" << *CPV->getType() << "'\n";
     break;
   }
   return;
@@ -1239,13 +1239,13 @@
   }
 }
 
-void llvm::WriteBytecodeToFile(const Module *M, llvm_ostream &Out,
+void llvm::WriteBytecodeToFile(const Module *M, OStream &Out,
                                bool compress) {
   assert(M && "You can't write a null module!!");
 
   // Make sure that std::cout is put into binary mode for systems
   // that care.
-  if (Out == llvm_cout)
+  if (Out == cout)
     sys::Program::ChangeStdoutToBinary();
 
   // Create a vector of unsigned char for the bytecode output. We
diff --git a/lib/CodeGen/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter.cpp
index 1b25b01..4caa2c1 100644
--- a/lib/CodeGen/AsmPrinter.cpp
+++ b/lib/CodeGen/AsmPrinter.cpp
@@ -25,7 +25,6 @@
 #include "llvm/Target/TargetData.h"
 #include "llvm/Target/TargetLowering.h"
 #include "llvm/Target/TargetMachine.h"
-#include <ostream>
 #include <cerrno>
 using namespace llvm;
 
@@ -668,8 +667,8 @@
     if (LastMI != MI) { ++Counter; LastMI = MI; }
     O << Counter;
   } else {
-    llvm_cerr << "Unknown special formatter '" << Code
-              << "' for machine instr: " << *MI;
+    cerr << "Unknown special formatter '" << Code
+         << "' for machine instr: " << *MI;
     exit(1);
   }    
 }
@@ -737,8 +736,8 @@
       case '(':             // $( -> same as GCC's { character.
         ++LastEmitted;      // Consume '(' character.
         if (CurVariant != -1) {
-          llvm_cerr << "Nested variants found in inline asm string: '"
-                    << AsmStr << "'\n";
+          cerr << "Nested variants found in inline asm string: '"
+               << AsmStr << "'\n";
           exit(1);
         }
         CurVariant = 0;     // We're in the first variant now.
@@ -746,8 +745,8 @@
       case '|':
         ++LastEmitted;  // consume '|' character.
         if (CurVariant == -1) {
-          llvm_cerr << "Found '|' character outside of variant in inline asm "
-                    << "string: '" << AsmStr << "'\n";
+          cerr << "Found '|' character outside of variant in inline asm "
+               << "string: '" << AsmStr << "'\n";
           exit(1);
         }
         ++CurVariant;   // We're in the next variant.
@@ -755,8 +754,8 @@
       case ')':         // $) -> same as GCC's } char.
         ++LastEmitted;  // consume ')' character.
         if (CurVariant == -1) {
-          llvm_cerr << "Found '}' character outside of variant in inline asm "
-                    << "string: '" << AsmStr << "'\n";
+          cerr << "Found '}' character outside of variant in inline asm "
+               << "string: '" << AsmStr << "'\n";
           exit(1);
         }
         CurVariant = -1;
@@ -774,8 +773,8 @@
       char *IDEnd;
       long Val = strtol(IDStart, &IDEnd, 10); // We only accept numbers for IDs.
       if (!isdigit(*IDStart) || (Val == 0 && errno == EINVAL)) {
-        llvm_cerr << "Bad $ operand number in inline asm string: '" 
-                  << AsmStr << "'\n";
+        cerr << "Bad $ operand number in inline asm string: '" 
+             << AsmStr << "'\n";
         exit(1);
       }
       LastEmitted = IDEnd;
@@ -788,8 +787,8 @@
         if (*LastEmitted == ':') {
           ++LastEmitted;    // Consume ':' character.
           if (*LastEmitted == 0) {
-            llvm_cerr << "Bad ${:} expression in inline asm string: '" 
-                      << AsmStr << "'\n";
+            cerr << "Bad ${:} expression in inline asm string: '" 
+                 << AsmStr << "'\n";
             exit(1);
           }
           
@@ -798,16 +797,16 @@
         }
         
         if (*LastEmitted != '}') {
-          llvm_cerr << "Bad ${} expression in inline asm string: '" 
-                    << AsmStr << "'\n";
+          cerr << "Bad ${} expression in inline asm string: '" 
+               << AsmStr << "'\n";
           exit(1);
         }
         ++LastEmitted;    // Consume '}' character.
       }
       
       if ((unsigned)Val >= NumOperands-1) {
-        llvm_cerr << "Invalid $ operand number in inline asm string: '" 
-                  << AsmStr << "'\n";
+        cerr << "Invalid $ operand number in inline asm string: '" 
+             << AsmStr << "'\n";
         exit(1);
       }
       
@@ -841,8 +840,8 @@
           }
         }
         if (Error) {
-          llvm_cerr << "Invalid operand found in inline asm: '"
-                    << AsmStr << "'\n";
+          cerr << "Invalid operand found in inline asm: '"
+               << AsmStr << "'\n";
           MI->dump();
           exit(1);
         }
diff --git a/lib/CodeGen/DwarfWriter.cpp b/lib/CodeGen/DwarfWriter.cpp
index ac6987b..8f62396 100644
--- a/lib/CodeGen/DwarfWriter.cpp
+++ b/lib/CodeGen/DwarfWriter.cpp
@@ -31,10 +31,8 @@
 #include "llvm/Target/TargetData.h"
 #include "llvm/Target/TargetMachine.h"
 #include "llvm/Target/TargetFrameInfo.h"
-
 #include <ostream>
 #include <string>
-
 using namespace llvm;
 using namespace llvm::dwarf;
 
@@ -139,7 +137,7 @@
   }
   
 #ifndef NDEBUG
-  void print(llvm_ostream &O) const {
+  void print(OStream &O) const {
     if (O.stream()) print(*O.stream());
   }
   void print(std::ostream &O) const {
@@ -247,7 +245,7 @@
   void Emit(const Dwarf &DW) const; 
       
 #ifndef NDEBUG
-  void print(llvm_ostream &O) {
+  void print(OStream &O) {
     if (O.stream()) print(*O.stream());
   }
   void print(std::ostream &O);
@@ -337,7 +335,7 @@
   void Profile(FoldingSetNodeID &ID) ;
       
 #ifndef NDEBUG
-  void print(llvm_ostream &O, unsigned IncIndent = 0) {
+  void print(OStream &O, unsigned IncIndent = 0) {
     if (O.stream()) print(*O.stream(), IncIndent);
   }
   void print(std::ostream &O, unsigned IncIndent = 0);
@@ -388,7 +386,7 @@
   virtual void Profile(FoldingSetNodeID &ID) = 0;
       
 #ifndef NDEBUG
-  void print(llvm_ostream &O) {
+  void print(OStream &O) {
     if (O.stream()) print(*O.stream());
   }
   virtual void print(std::ostream &O) = 0;
@@ -2861,14 +2859,14 @@
       << "\n";
   }
 }
-void DIEAbbrev::dump() { print(llvm_cerr); }
+void DIEAbbrev::dump() { print(cerr); }
 #endif
 
 //===----------------------------------------------------------------------===//
 
 #ifndef NDEBUG
 void DIEValue::dump() {
-  print(llvm_cerr);
+  print(cerr);
 }
 #endif
 
@@ -3079,7 +3077,7 @@
 }
 
 void DIE::dump() {
-  print(llvm_cerr);
+  print(cerr);
 }
 #endif
 
diff --git a/lib/CodeGen/ELFWriter.cpp b/lib/CodeGen/ELFWriter.cpp
index 702102f..ee9cecd 100644
--- a/lib/CodeGen/ELFWriter.cpp
+++ b/lib/CodeGen/ELFWriter.cpp
@@ -39,7 +39,6 @@
 #include "llvm/Target/TargetMachine.h"
 #include "llvm/Support/Mangler.h"
 #include "llvm/Support/Streams.h"
-#include <ostream>
 using namespace llvm;
 
 //===----------------------------------------------------------------------===//
@@ -104,9 +103,9 @@
                       ELFWriter::ELFSection::SHF_EXECINSTR |
                       ELFWriter::ELFSection::SHF_ALLOC);
   OutBuffer = &ES->SectionData;
-  llvm_cerr << "FIXME: This code needs to be updated for changes in the"
-            << " CodeEmitter interfaces.  In particular, this should set "
-            << "BufferBegin/BufferEnd/CurBufferPtr, not deal with OutBuffer!";
+  cerr << "FIXME: This code needs to be updated for changes in the"
+       << " CodeEmitter interfaces.  In particular, this should set "
+       << "BufferBegin/BufferEnd/CurBufferPtr, not deal with OutBuffer!";
   abort();
 
   // Upgrade the section alignment if required.
diff --git a/lib/CodeGen/IntrinsicLowering.cpp b/lib/CodeGen/IntrinsicLowering.cpp
index d70a277..753f459 100644
--- a/lib/CodeGen/IntrinsicLowering.cpp
+++ b/lib/CodeGen/IntrinsicLowering.cpp
@@ -274,12 +274,12 @@
 
   switch (Callee->getIntrinsicID()) {
   case Intrinsic::not_intrinsic:
-    llvm_cerr << "Cannot lower a call to a non-intrinsic function '"
-              << Callee->getName() << "'!\n";
+    cerr << "Cannot lower a call to a non-intrinsic function '"
+         << Callee->getName() << "'!\n";
     abort();
   default:
-    llvm_cerr << "Error: Code generator does not support intrinsic function '"
-              << Callee->getName() << "'!\n";
+    cerr << "Error: Code generator does not support intrinsic function '"
+         << Callee->getName() << "'!\n";
     abort();
 
     // The setjmp/longjmp intrinsics should only exist in the code if it was
@@ -356,9 +356,9 @@
   case Intrinsic::stackrestore: {
     static bool Warned = false;
     if (!Warned)
-      llvm_cerr << "WARNING: this target does not support the llvm.stack"
-                << (Callee->getIntrinsicID() == Intrinsic::stacksave ?
-                    "save" : "restore") << " intrinsic.\n";
+      cerr << "WARNING: this target does not support the llvm.stack"
+           << (Callee->getIntrinsicID() == Intrinsic::stacksave ?
+               "save" : "restore") << " intrinsic.\n";
     Warned = true;
     if (Callee->getIntrinsicID() == Intrinsic::stacksave)
       CI->replaceAllUsesWith(Constant::getNullValue(CI->getType()));
@@ -367,9 +367,9 @@
     
   case Intrinsic::returnaddress:
   case Intrinsic::frameaddress:
-    llvm_cerr << "WARNING: this target does not support the llvm."
-              << (Callee->getIntrinsicID() == Intrinsic::returnaddress ?
-                  "return" : "frame") << "address intrinsic.\n";
+    cerr << "WARNING: this target does not support the llvm."
+         << (Callee->getIntrinsicID() == Intrinsic::returnaddress ?
+             "return" : "frame") << "address intrinsic.\n";
     CI->replaceAllUsesWith(ConstantPointerNull::get(
                                             cast<PointerType>(CI->getType())));
     break;
@@ -380,8 +380,8 @@
   case Intrinsic::pcmarker:
     break;    // Simply strip out pcmarker on unsupported architectures
   case Intrinsic::readcyclecounter: {
-    llvm_cerr << "WARNING: this target does not support the llvm.readcyclecoun"
-              << "ter intrinsic.  It is being lowered to a constant 0\n";
+    cerr << "WARNING: this target does not support the llvm.readcyclecoun"
+         << "ter intrinsic.  It is being lowered to a constant 0\n";
     CI->replaceAllUsesWith(ConstantInt::get(Type::ULongTy, 0));
     break;
   }
diff --git a/lib/CodeGen/LiveInterval.cpp b/lib/CodeGen/LiveInterval.cpp
index d178a6f..e2a3bba 100644
--- a/lib/CodeGen/LiveInterval.cpp
+++ b/lib/CodeGen/LiveInterval.cpp
@@ -23,7 +23,6 @@
 #include "llvm/Support/Streams.h"
 #include "llvm/Target/MRegisterInfo.h"
 #include <algorithm>
-#include <iostream>
 #include <map>
 using namespace llvm;
 
@@ -472,10 +471,10 @@
 }
 
 void LiveRange::dump() const {
-  llvm_cerr << *this << "\n";
+  cerr << *this << "\n";
 }
 
-void LiveInterval::print(llvm_ostream OS, const MRegisterInfo *MRI) const {
+void LiveInterval::print(OStream OS, const MRegisterInfo *MRI) const {
   if (MRI && MRegisterInfo::isPhysicalRegister(reg))
     OS << MRI->getName(reg);
   else
@@ -508,5 +507,5 @@
 }
 
 void LiveInterval::dump() const {
-  llvm_cerr << *this << "\n";
+  cerr << *this << "\n";
 }
diff --git a/lib/CodeGen/LiveIntervalAnalysis.cpp b/lib/CodeGen/LiveIntervalAnalysis.cpp
index eeabbd1..2175d35 100644
--- a/lib/CodeGen/LiveIntervalAnalysis.cpp
+++ b/lib/CodeGen/LiveIntervalAnalysis.cpp
@@ -419,9 +419,9 @@
 
 void LiveIntervals::printRegName(unsigned reg) const {
   if (MRegisterInfo::isPhysicalRegister(reg))
-    llvm_cerr << mri_->getName(reg);
+    cerr << mri_->getName(reg);
   else
-    llvm_cerr << "%reg" << reg;
+    cerr << "%reg" << reg;
 }
 
 /// isReDefinedByTwoAddr - Returns true if the Reg re-definition is due to
diff --git a/lib/CodeGen/MachineInstr.cpp b/lib/CodeGen/MachineInstr.cpp
index 04bd265..716b40f 100644
--- a/lib/CodeGen/MachineInstr.cpp
+++ b/lib/CodeGen/MachineInstr.cpp
@@ -18,7 +18,6 @@
 #include "llvm/Target/MRegisterInfo.h"
 #include "llvm/Support/LeakDetector.h"
 #include "llvm/Support/Streams.h"
-#include <iostream>
 using namespace llvm;
 
 /// MachineInstr ctor - This constructor creates a dummy MachineInstr with
@@ -201,7 +200,7 @@
 }
 
 void MachineInstr::dump() const {
-  llvm_cerr << "  " << *this;
+  cerr << "  " << *this;
 }
 
 static inline void OutputReg(std::ostream &os, unsigned RegNo,
diff --git a/lib/CodeGen/VirtRegMap.cpp b/lib/CodeGen/VirtRegMap.cpp
index 186072c..79d3b64 100644
--- a/lib/CodeGen/VirtRegMap.cpp
+++ b/lib/CodeGen/VirtRegMap.cpp
@@ -112,11 +112,11 @@
 }
 
 void VirtRegMap::print(std::ostream &OS) const {
-  llvm_ostream LOS(OS);
+  OStream LOS(OS);
   print(LOS);
 }
 
-void VirtRegMap::print(llvm_ostream &OS) const {
+void VirtRegMap::print(OStream &OS) const {
   const MRegisterInfo* MRI = MF.getTarget().getRegisterInfo();
 
   OS << "********** REGISTER MAP **********\n";
@@ -135,7 +135,7 @@
 }
 
 void VirtRegMap::dump() const {
-  llvm_ostream OS = DOUT;
+  OStream OS = DOUT;
   print(OS);
 }
 
diff --git a/lib/CodeGen/VirtRegMap.h b/lib/CodeGen/VirtRegMap.h
index c3fe951..342d800 100644
--- a/lib/CodeGen/VirtRegMap.h
+++ b/lib/CodeGen/VirtRegMap.h
@@ -19,12 +19,12 @@
 
 #include "llvm/Target/MRegisterInfo.h"
 #include "llvm/ADT/DenseMap.h"
+#include "llvm/Support/Streams.h"
 #include <map>
 
 namespace llvm {
   class MachineInstr;
   class TargetInstrInfo;
-  class llvm_ostream;
 
   class VirtRegMap {
   public:
@@ -145,7 +145,7 @@
     }
 
     void print(std::ostream &OS) const;
-    void print(llvm_ostream &OS) const;
+    void print(OStream &OS) const;
     void dump() const;
   };
 
diff --git a/lib/ExecutionEngine/ExecutionEngine.cpp b/lib/ExecutionEngine/ExecutionEngine.cpp
index ff312f0..8aaf0ed 100644
--- a/lib/ExecutionEngine/ExecutionEngine.cpp
+++ b/lib/ExecutionEngine/ExecutionEngine.cpp
@@ -402,7 +402,7 @@
     default:
       break;
     }
-    llvm_cerr << "ConstantExpr not handled as global var init: " << *CE << "\n";
+    cerr << "ConstantExpr not handled as global var init: " << *CE << "\n";
     abort();
   }
 
@@ -432,7 +432,7 @@
       assert(0 && "Unknown constant pointer type!");
     break;
   default:
-    llvm_cerr << "ERROR: Constant unimp for type: " << *C->getType() << "\n";
+    cerr << "ERROR: Constant unimp for type: " << *C->getType() << "\n";
     abort();
   }
   return Result;
@@ -477,7 +477,7 @@
       Ptr->Untyped[7] = (unsigned char)(Val.ULongVal >> 56);
       break;
     default:
-      llvm_cerr << "Cannot store value of type " << *Ty << "!\n";
+      cerr << "Cannot store value of type " << *Ty << "!\n";
     }
   } else {
     switch (Ty->getTypeID()) {
@@ -511,7 +511,7 @@
       Ptr->Untyped[0] = (unsigned char)(Val.ULongVal >> 56);
       break;
     default:
-      llvm_cerr << "Cannot store value of type " << *Ty << "!\n";
+      cerr << "Cannot store value of type " << *Ty << "!\n";
     }
   }
 }
@@ -552,7 +552,7 @@
                                              ((uint64_t)Ptr->Untyped[7] << 56);
                             break;
     default:
-      llvm_cerr << "Cannot load value of type " << *Ty << "!\n";
+      cerr << "Cannot load value of type " << *Ty << "!\n";
       abort();
     }
   } else {
@@ -586,7 +586,7 @@
                                              ((uint64_t)Ptr->Untyped[0] << 56);
                             break;
     default:
-      llvm_cerr << "Cannot load value of type " << *Ty << "!\n";
+      cerr << "Cannot load value of type " << *Ty << "!\n";
       abort();
     }
   }
@@ -634,7 +634,7 @@
   }
 
   default:
-    llvm_cerr << "Bad Type: " << *Init->getType() << "\n";
+    cerr << "Bad Type: " << *Init->getType() << "\n";
     assert(0 && "Unknown constant type to initialize memory with!");
   }
 }
@@ -718,8 +718,8 @@
             sys::DynamicLibrary::SearchForAddressOfSymbol(I->getName().c_str()))
           addGlobalMapping(I, SymAddr);
         else {
-          llvm_cerr << "Could not resolve external global address: "
-                    << I->getName() << "\n";
+          cerr << "Could not resolve external global address: "
+               << I->getName() << "\n";
           abort();
         }
       }
diff --git a/lib/ExecutionEngine/Interpreter/Execution.cpp b/lib/ExecutionEngine/Interpreter/Execution.cpp
index 964435d..f7400e9 100644
--- a/lib/ExecutionEngine/Interpreter/Execution.cpp
+++ b/lib/ExecutionEngine/Interpreter/Execution.cpp
@@ -188,7 +188,7 @@
                              getOperandValue(CE->getOperand(1), SF),
                              getOperandValue(CE->getOperand(2), SF));
   default:
-    llvm_cerr << "Unhandled ConstantExpr: " << *CE << "\n";
+    cerr << "Unhandled ConstantExpr: " << *CE << "\n";
     abort();
     return GenericValue();
   }
@@ -236,7 +236,7 @@
     IMPLEMENT_BINARY_OPERATOR(+, Float);
     IMPLEMENT_BINARY_OPERATOR(+, Double);
   default:
-    llvm_cerr << "Unhandled type for Add instruction: " << *Ty << "\n";
+    cerr << "Unhandled type for Add instruction: " << *Ty << "\n";
     abort();
   }
   return Dest;
@@ -257,7 +257,7 @@
     IMPLEMENT_BINARY_OPERATOR(-, Float);
     IMPLEMENT_BINARY_OPERATOR(-, Double);
   default:
-    llvm_cerr << "Unhandled type for Sub instruction: " << *Ty << "\n";
+    cerr << "Unhandled type for Sub instruction: " << *Ty << "\n";
     abort();
   }
   return Dest;
@@ -278,7 +278,7 @@
     IMPLEMENT_BINARY_OPERATOR(*, Float);
     IMPLEMENT_BINARY_OPERATOR(*, Double);
   default:
-    llvm_cerr << "Unhandled type for Mul instruction: " << *Ty << "\n";
+    cerr << "Unhandled type for Mul instruction: " << *Ty << "\n";
     abort();
   }
   return Dest;
@@ -296,7 +296,7 @@
     IMPLEMENT_SIGNLESS_BINOP(/, UInt,   Int);
     IMPLEMENT_SIGNLESS_BINOP(/, ULong,  Long);
   default:
-    llvm_cerr << "Unhandled type for UDiv instruction: " << *Ty << "\n";
+    cerr << "Unhandled type for UDiv instruction: " << *Ty << "\n";
     abort();
   }
   return Dest;
@@ -311,7 +311,7 @@
     IMPLEMENT_SIGNLESS_BINOP(/, Int,   UInt);
     IMPLEMENT_SIGNLESS_BINOP(/, Long,  ULong);
   default:
-    llvm_cerr << "Unhandled type for SDiv instruction: " << *Ty << "\n";
+    cerr << "Unhandled type for SDiv instruction: " << *Ty << "\n";
     abort();
   }
   return Dest;
@@ -324,7 +324,7 @@
     IMPLEMENT_BINARY_OPERATOR(/, Float);
     IMPLEMENT_BINARY_OPERATOR(/, Double);
   default:
-    llvm_cerr << "Unhandled type for Div instruction: " << *Ty << "\n";
+    cerr << "Unhandled type for Div instruction: " << *Ty << "\n";
     abort();
   }
   return Dest;
@@ -339,7 +339,7 @@
     IMPLEMENT_SIGNLESS_BINOP(%, UInt,   Int);
     IMPLEMENT_SIGNLESS_BINOP(%, ULong,  Long);
   default:
-    llvm_cerr << "Unhandled type for URem instruction: " << *Ty << "\n";
+    cerr << "Unhandled type for URem instruction: " << *Ty << "\n";
     abort();
   }
   return Dest;
@@ -354,7 +354,7 @@
     IMPLEMENT_SIGNLESS_BINOP(%, Int,   UInt);
     IMPLEMENT_SIGNLESS_BINOP(%, Long,  ULong);
   default:
-    llvm_cerr << "Unhandled type for Rem instruction: " << *Ty << "\n";
+    cerr << "Unhandled type for Rem instruction: " << *Ty << "\n";
     abort();
   }
   return Dest;
@@ -371,7 +371,7 @@
     Dest.DoubleVal = fmod(Src1.DoubleVal, Src2.DoubleVal);
     break;
   default:
-    llvm_cerr << "Unhandled type for Rem instruction: " << *Ty << "\n";
+    cerr << "Unhandled type for Rem instruction: " << *Ty << "\n";
     abort();
   }
   return Dest;
@@ -391,7 +391,7 @@
     IMPLEMENT_BINARY_OPERATOR(&, ULong);
     IMPLEMENT_BINARY_OPERATOR(&, Long);
   default:
-    llvm_cerr << "Unhandled type for And instruction: " << *Ty << "\n";
+    cerr << "Unhandled type for And instruction: " << *Ty << "\n";
     abort();
   }
   return Dest;
@@ -411,7 +411,7 @@
     IMPLEMENT_BINARY_OPERATOR(|, ULong);
     IMPLEMENT_BINARY_OPERATOR(|, Long);
   default:
-    llvm_cerr << "Unhandled type for Or instruction: " << *Ty << "\n";
+    cerr << "Unhandled type for Or instruction: " << *Ty << "\n";
     abort();
   }
   return Dest;
@@ -431,7 +431,7 @@
     IMPLEMENT_BINARY_OPERATOR(^, ULong);
     IMPLEMENT_BINARY_OPERATOR(^, Long);
   default:
-    llvm_cerr << "Unhandled type for Xor instruction: " << *Ty << "\n";
+    cerr << "Unhandled type for Xor instruction: " << *Ty << "\n";
     abort();
   }
   return Dest;
@@ -465,7 +465,7 @@
     IMPLEMENT_SETCC(==, Double);
     IMPLEMENT_POINTERSETCC(==);
   default:
-    llvm_cerr << "Unhandled type for SetEQ instruction: " << *Ty << "\n";
+    cerr << "Unhandled type for SetEQ instruction: " << *Ty << "\n";
     abort();
   }
   return Dest;
@@ -488,7 +488,7 @@
     IMPLEMENT_POINTERSETCC(!=);
 
   default:
-    llvm_cerr << "Unhandled type for SetNE instruction: " << *Ty << "\n";
+    cerr << "Unhandled type for SetNE instruction: " << *Ty << "\n";
     abort();
   }
   return Dest;
@@ -510,7 +510,7 @@
     IMPLEMENT_SETCC(<=, Double);
     IMPLEMENT_POINTERSETCC(<=);
   default:
-    llvm_cerr << "Unhandled type for SetLE instruction: " << *Ty << "\n";
+    cerr << "Unhandled type for SetLE instruction: " << *Ty << "\n";
     abort();
   }
   return Dest;
@@ -532,7 +532,7 @@
     IMPLEMENT_SETCC(>=, Double);
     IMPLEMENT_POINTERSETCC(>=);
   default:
-    llvm_cerr << "Unhandled type for SetGE instruction: " << *Ty << "\n";
+    cerr << "Unhandled type for SetGE instruction: " << *Ty << "\n";
     abort();
   }
   return Dest;
@@ -554,7 +554,7 @@
     IMPLEMENT_SETCC(<, Double);
     IMPLEMENT_POINTERSETCC(<);
   default:
-    llvm_cerr << "Unhandled type for SetLT instruction: " << *Ty << "\n";
+    cerr << "Unhandled type for SetLT instruction: " << *Ty << "\n";
     abort();
   }
   return Dest;
@@ -576,7 +576,7 @@
     IMPLEMENT_SETCC(>, Double);
     IMPLEMENT_POINTERSETCC(>);
   default:
-    llvm_cerr << "Unhandled type for SetGT instruction: " << *Ty << "\n";
+    cerr << "Unhandled type for SetGT instruction: " << *Ty << "\n";
     abort();
   }
   return Dest;
@@ -609,7 +609,7 @@
   case Instruction::SetLT: R = executeSetLTInst(Src1, Src2, Ty); break;
   case Instruction::SetGT: R = executeSetGTInst(Src1, Src2, Ty); break;
   default:
-    llvm_cerr << "Don't know how to handle this binary operator!\n-->" << I;
+    cerr << "Don't know how to handle this binary operator!\n-->" << I;
     abort();
   }
 
@@ -710,7 +710,7 @@
 }
 
 void Interpreter::visitUnreachableInst(UnreachableInst &I) {
-  llvm_cerr << "ERROR: Program executed an 'unreachable' instruction!\n";
+  cerr << "ERROR: Program executed an 'unreachable' instruction!\n";
   abort();
 }
 
@@ -978,7 +978,7 @@
     IMPLEMENT_SHIFT(<<, ULong);
     IMPLEMENT_SHIFT(<<, Long);
   default:
-    llvm_cerr << "Unhandled type for Shl instruction: " << *Ty << "\n";
+    cerr << "Unhandled type for Shl instruction: " << *Ty << "\n";
   }
   return Dest;
 }
@@ -992,7 +992,7 @@
     IMPLEMENT_SIGNLESS_SHIFT(>>, UInt,   Int);
     IMPLEMENT_SIGNLESS_SHIFT(>>, ULong,  Long);
   default:
-    llvm_cerr << "Unhandled type for LShr instruction: " << *Ty << "\n";
+    cerr << "Unhandled type for LShr instruction: " << *Ty << "\n";
     abort();
   }
   return Dest;
@@ -1007,7 +1007,7 @@
     IMPLEMENT_SIGNLESS_SHIFT(>>, Int,   UInt);
     IMPLEMENT_SIGNLESS_SHIFT(>>, Long,  ULong);
   default:
-    llvm_cerr << "Unhandled type for AShr instruction: " << *Ty << "\n";
+    cerr << "Unhandled type for AShr instruction: " << *Ty << "\n";
     abort();
   }
   return Dest;
@@ -1065,14 +1065,14 @@
       IMPLEMENT_CAST(DESTTY, DESTCTY, Float);   \
       IMPLEMENT_CAST(DESTTY, DESTCTY, Double)   \
     default:                                    \
-      llvm_cerr << "Unhandled cast: "           \
+      cerr << "Unhandled cast: "                \
         << *SrcTy << " to " << *DstTy << "\n";  \
       abort();                                  \
     }                                           \
     break
 
 #define IMPLEMENT_CAST_END                      \
-  default: llvm_cerr                            \
+  default: cerr                                 \
       << "Unhandled dest type for cast instruction: "  \
       << *DstTy << "\n";                        \
     abort();                                    \
@@ -1226,8 +1226,7 @@
       IMPLEMENT_CAST_END
       break;
     default:
-      llvm_cerr 
-        << "Invalid cast opcode for cast instruction: " << opcode << "\n";
+      cerr << "Invalid cast opcode for cast instruction: " << opcode << "\n";
       abort();
   }
   return Dest;
@@ -1266,7 +1265,7 @@
     IMPLEMENT_VAARG(Double);
     IMPLEMENT_VAARG(Bool);
   default:
-    llvm_cerr << "Unhandled dest type for vaarg instruction: " << *Ty << "\n";
+    cerr << "Unhandled dest type for vaarg instruction: " << *Ty << "\n";
     abort();
   }
 
diff --git a/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp b/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp
index 161873c..a1c4317 100644
--- a/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp
+++ b/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp
@@ -93,8 +93,8 @@
   std::map<const Function *, ExFunc>::iterator FI = Functions.find(F);
   ExFunc Fn = (FI == Functions.end()) ? lookupFunction(F) : FI->second;
   if (Fn == 0) {
-    llvm_cerr << "Tried to execute an unknown external function: "
-              << F->getType()->getDescription() << " " << F->getName() << "\n";
+    cerr << "Tried to execute an unknown external function: "
+         << F->getType()->getDescription() << " " << F->getName() << "\n";
     if (F->getName() == "__main")
       return GenericValue();
     abort();
@@ -114,19 +114,19 @@
 
 // void putchar(sbyte)
 GenericValue lle_Vb_putchar(FunctionType *M, const vector<GenericValue> &Args) {
-  llvm_cout << Args[0].SByteVal;
+  cout << Args[0].SByteVal;
   return GenericValue();
 }
 
 // int putchar(int)
 GenericValue lle_ii_putchar(FunctionType *M, const vector<GenericValue> &Args) {
-  llvm_cout << ((char)Args[0].IntVal) << std::flush;
+  cout << ((char)Args[0].IntVal) << std::flush;
   return Args[0];
 }
 
 // void putchar(ubyte)
 GenericValue lle_VB_putchar(FunctionType *M, const vector<GenericValue> &Args) {
-  llvm_cout << Args[0].SByteVal << std::flush;
+  cout << Args[0].SByteVal << std::flush;
   return Args[0];
 }
 
@@ -332,7 +332,7 @@
         sprintf(Buffer, FmtBuf, (void*)GVTOP(Args[ArgNo++])); break;
       case 's':
         sprintf(Buffer, FmtBuf, (char*)GVTOP(Args[ArgNo++])); break;
-      default:  llvm_cerr << "<unknown printf code '" << *FmtStr << "'!>";
+      default:  cerr << "<unknown printf code '" << *FmtStr << "'!>";
         ArgNo++; break;
       }
       strcpy(OutputBuffer, Buffer);
@@ -350,7 +350,7 @@
   NewArgs.push_back(PTOGV(Buffer));
   NewArgs.insert(NewArgs.end(), Args.begin(), Args.end());
   GenericValue GV = lle_X_sprintf(M, NewArgs);
-  llvm_cout << Buffer;
+  cout << Buffer;
   return GV;
 }
 
diff --git a/lib/Linker/LinkModules.cpp b/lib/Linker/LinkModules.cpp
index b09fd65..71239f7 100644
--- a/lib/Linker/LinkModules.cpp
+++ b/lib/Linker/LinkModules.cpp
@@ -25,7 +25,6 @@
 #include "llvm/Assembly/Writer.h"
 #include "llvm/Support/Streams.h"
 #include "llvm/System/Path.h"
-#include <sstream>
 using namespace llvm;
 
 // Error - Simple wrapper function to conditionally assign to E and return true.
@@ -251,11 +250,11 @@
 static void PrintMap(const std::map<const Value*, Value*> &M) {
   for (std::map<const Value*, Value*>::const_iterator I = M.begin(), E =M.end();
        I != E; ++I) {
-    llvm_cerr << " Fr: " << (void*)I->first << " ";
+    cerr << " Fr: " << (void*)I->first << " ";
     I->first->dump();
-    llvm_cerr << " To: " << (void*)I->second << " ";
+    cerr << " To: " << (void*)I->second << " ";
     I->second->dump();
-    llvm_cerr << "\n";
+    cerr << "\n";
   }
 }
 
@@ -313,10 +312,10 @@
   }
   
 
-  llvm_cerr << "LinkModules ValueMap: \n";
+  cerr << "LinkModules ValueMap: \n";
   PrintMap(ValueMap);
 
-  llvm_cerr << "Couldn't remap value: " << (void*)In << " " << *In << "\n";
+  cerr << "Couldn't remap value: " << (void*)In << " " << *In << "\n";
   assert(0 && "Couldn't remap value!");
   return 0;
 }
@@ -844,13 +843,13 @@
 
   if (Src->getEndianness() != Module::AnyEndianness &&
       Dest->getEndianness() != Src->getEndianness())
-    llvm_cerr << "WARNING: Linking two modules of different endianness!\n";
+    cerr << "WARNING: Linking two modules of different endianness!\n";
   if (Src->getPointerSize() != Module::AnyPointerSize &&
       Dest->getPointerSize() != Src->getPointerSize())
-    llvm_cerr << "WARNING: Linking two modules of different pointer size!\n";
+    cerr << "WARNING: Linking two modules of different pointer size!\n";
   if (!Src->getTargetTriple().empty() &&
       Dest->getTargetTriple() != Src->getTargetTriple())
-    llvm_cerr << "WARNING: Linking two modules of different target triples!\n";
+    cerr << "WARNING: Linking two modules of different target triples!\n";
 
   if (!Src->getModuleInlineAsm().empty()) {
     if (Dest->getModuleInlineAsm().empty())
diff --git a/lib/Linker/Linker.cpp b/lib/Linker/Linker.cpp
index bf33196..7190510 100644
--- a/lib/Linker/Linker.cpp
+++ b/lib/Linker/Linker.cpp
@@ -45,7 +45,7 @@
 Linker::error(const std::string& message) {
   Error = message;
   if (!(Flags&QuietErrors))
-    llvm_cerr << ProgramName << ": error: " << message << "\n";
+    cerr << ProgramName << ": error: " << message << "\n";
   return true;
 }
 
@@ -53,14 +53,14 @@
 Linker::warning(const std::string& message) {
   Error = message;
   if (!(Flags&QuietErrors))
-    llvm_cerr << ProgramName << ": warning: " << message << "\n";
+    cerr << ProgramName << ": warning: " << message << "\n";
   return false;
 }
 
 void
 Linker::verbose(const std::string& message) {
   if (Flags&Verbose)
-    llvm_cerr << "  " << message << "\n";
+    cerr << "  " << message << "\n";
 }
 
 void
diff --git a/lib/Support/Allocator.cpp b/lib/Support/Allocator.cpp
index 96f0743..632b5f7 100644
--- a/lib/Support/Allocator.cpp
+++ b/lib/Support/Allocator.cpp
@@ -102,6 +102,6 @@
   for (; R; R = R->getNext(), ++NumRegions)
     BytesUsed += R->getNumBytesAllocated();
 
-  llvm_cerr << "\nNumber of memory regions: " << NumRegions << "\n";
-  llvm_cerr << "Bytes allocated: " << BytesUsed << "\n";
+  cerr << "\nNumber of memory regions: " << NumRegions << "\n";
+  cerr << "Bytes allocated: " << BytesUsed << "\n";
 }
diff --git a/lib/Support/CommandLine.cpp b/lib/Support/CommandLine.cpp
index 3b75f47..920811a 100644
--- a/lib/Support/CommandLine.cpp
+++ b/lib/Support/CommandLine.cpp
@@ -84,8 +84,8 @@
 
 static void AddArgument(const char *ArgName, Option *Opt) {
   if (getOption(ArgName)) {
-    llvm_cerr << ProgramName << ": CommandLine Error: Argument '"
-              << ArgName << "' defined more than once!\n";
+    cerr << ProgramName << ": CommandLine Error: Argument '"
+         << ArgName << "' defined more than once!\n";
   } else {
     // Add argument to the argument map!
     (*Options)[ArgName] = Opt;
@@ -129,9 +129,9 @@
   case ValueOptional:
     break;
   default:
-    llvm_cerr << ProgramName
-              << ": Bad ValueMask flag! CommandLine usage error:"
-              << Handler->getValueExpectedFlag() << "\n";
+    cerr << ProgramName
+         << ": Bad ValueMask flag! CommandLine usage error:"
+         << Handler->getValueExpectedFlag() << "\n";
     abort();
     break;
   }
@@ -468,8 +468,8 @@
     }
 
     if (Handler == 0) {
-      llvm_cerr << ProgramName << ": Unknown command line argument '"
-                << argv[i] << "'.  Try: '" << argv[0] << " --help'\n";
+      cerr << ProgramName << ": Unknown command line argument '"
+           << argv[i] << "'.  Try: '" << argv[0] << " --help'\n";
       ErrorParsing = true;
       continue;
     }
@@ -505,18 +505,18 @@
 
   // Check and handle positional arguments now...
   if (NumPositionalRequired > PositionalVals.size()) {
-    llvm_cerr << ProgramName
-              << ": Not enough positional command line arguments specified!\n"
-              << "Must specify at least " << NumPositionalRequired
-              << " positional arguments: See: " << argv[0] << " --help\n";
+    cerr << ProgramName
+         << ": Not enough positional command line arguments specified!\n"
+         << "Must specify at least " << NumPositionalRequired
+         << " positional arguments: See: " << argv[0] << " --help\n";
     
     ErrorParsing = true;
   } else if (!HasUnlimitedPositionals
              && PositionalVals.size() > PositionalOpts.size()) {
-    llvm_cerr << ProgramName
-              << ": Too many positional arguments specified!\n"
-              << "Can specify at most " << PositionalOpts.size()
-              << " positional arguments: See: " << argv[0] << " --help\n";
+    cerr << ProgramName
+         << ": Too many positional arguments specified!\n"
+         << "Can specify at most " << PositionalOpts.size()
+         << " positional arguments: See: " << argv[0] << " --help\n";
     ErrorParsing = true;
 
   } else if (ConsumeAfterOpt == 0) {
@@ -617,11 +617,11 @@
 bool Option::error(std::string Message, const char *ArgName) {
   if (ArgName == 0) ArgName = ArgStr;
   if (ArgName[0] == 0)
-    llvm_cerr << HelpStr;  // Be nice for positional arguments
+    cerr << HelpStr;  // Be nice for positional arguments
   else
-    llvm_cerr << ProgramName << ": for the -" << ArgName;
+    cerr << ProgramName << ": for the -" << ArgName;
   
-  llvm_cerr << " option: " << Message << "\n";
+  cerr << " option: " << Message << "\n";
   return true;
 }
 
@@ -701,8 +701,8 @@
 // Print out the option for the alias.
 void alias::printOptionInfo(unsigned GlobalWidth) const {
   unsigned L = std::strlen(ArgStr);
-  llvm_cout << "  -" << ArgStr << std::string(GlobalWidth-L-6, ' ') << " - "
-            << HelpStr << "\n";
+  cout << "  -" << ArgStr << std::string(GlobalWidth-L-6, ' ') << " - "
+       << HelpStr << "\n";
 }
 
 
@@ -728,13 +728,13 @@
 //
 void basic_parser_impl::printOptionInfo(const Option &O,
                                         unsigned GlobalWidth) const {
-  llvm_cout << "  -" << O.ArgStr;
+  cout << "  -" << O.ArgStr;
 
   if (const char *ValName = getValueName())
-    llvm_cout << "=<" << getValueStr(O, ValName) << ">";
+    cout << "=<" << getValueStr(O, ValName) << ">";
 
-  llvm_cout << std::string(GlobalWidth-getOptionWidth(O), ' ') << " - "
-            << O.HelpStr << "\n";
+  cout << std::string(GlobalWidth-getOptionWidth(O), ' ') << " - "
+       << O.HelpStr << "\n";
 }
 
 
@@ -850,21 +850,21 @@
                                           unsigned GlobalWidth) const {
   if (O.hasArgStr()) {
     unsigned L = std::strlen(O.ArgStr);
-    llvm_cout << "  -" << O.ArgStr << std::string(GlobalWidth-L-6, ' ')
-              << " - " << O.HelpStr << "\n";
+    cout << "  -" << O.ArgStr << std::string(GlobalWidth-L-6, ' ')
+         << " - " << O.HelpStr << "\n";
 
     for (unsigned i = 0, e = getNumOptions(); i != e; ++i) {
       unsigned NumSpaces = GlobalWidth-strlen(getOption(i))-8;
-      llvm_cout << "    =" << getOption(i) << std::string(NumSpaces, ' ')
-                << " - " << getDescription(i) << "\n";
+      cout << "    =" << getOption(i) << std::string(NumSpaces, ' ')
+           << " - " << getDescription(i) << "\n";
     }
   } else {
     if (O.HelpStr[0])
-      llvm_cout << "  " << O.HelpStr << "\n";
+      cout << "  " << O.HelpStr << "\n";
     for (unsigned i = 0, e = getNumOptions(); i != e; ++i) {
       unsigned L = std::strlen(getOption(i));
-      llvm_cout << "    -" << getOption(i) << std::string(GlobalWidth-L-8, ' ')
-                << " - " << getDescription(i) << "\n";
+      cout << "    -" << getOption(i) << std::string(GlobalWidth-L-8, ' ')
+           << " - " << getDescription(i) << "\n";
     }
   }
 }
@@ -917,9 +917,9 @@
     }
 
     if (ProgramOverview)
-      llvm_cout << "OVERVIEW:" << ProgramOverview << "\n";
+      cout << "OVERVIEW:" << ProgramOverview << "\n";
 
-    llvm_cout << "USAGE: " << ProgramName << " [options]";
+    cout << "USAGE: " << ProgramName << " [options]";
 
     // Print out the positional options.
     std::vector<Option*> &PosOpts = *PositionalOptions;
@@ -929,28 +929,28 @@
 
     for (unsigned i = CAOpt != 0, e = PosOpts.size(); i != e; ++i) {
       if (PosOpts[i]->ArgStr[0])
-        llvm_cout << " --" << PosOpts[i]->ArgStr;
-      llvm_cout << " " << PosOpts[i]->HelpStr;
+        cout << " --" << PosOpts[i]->ArgStr;
+      cout << " " << PosOpts[i]->HelpStr;
     }
 
     // Print the consume after option info if it exists...
-    if (CAOpt) llvm_cout << " " << CAOpt->HelpStr;
+    if (CAOpt) cout << " " << CAOpt->HelpStr;
 
-    llvm_cout << "\n\n";
+    cout << "\n\n";
 
     // Compute the maximum argument length...
     MaxArgLen = 0;
     for (unsigned i = 0, e = Opts.size(); i != e; ++i)
       MaxArgLen = std::max(MaxArgLen, Opts[i].second->getOptionWidth());
 
-    llvm_cout << "OPTIONS:\n";
+    cout << "OPTIONS:\n";
     for (unsigned i = 0, e = Opts.size(); i != e; ++i)
       Opts[i].second->printOptionInfo(MaxArgLen);
 
     // Print any extra help the user has declared.
     for (std::vector<const char *>::iterator I = MoreHelp->begin(),
           E = MoreHelp->end(); I != E; ++I)
-      llvm_cout << *I;
+      cout << *I;
     MoreHelp->clear();
 
     // Halt the program since help information was printed
@@ -982,21 +982,21 @@
   void operator=(bool OptionWasSpecified) {
     if (OptionWasSpecified) {
       if (OverrideVersionPrinter == 0) {
-        llvm_cout << "Low Level Virtual Machine (http://llvm.org/):\n";
-        llvm_cout << "  " << PACKAGE_NAME << " version " << PACKAGE_VERSION;
+        cout << "Low Level Virtual Machine (http://llvm.org/):\n";
+        cout << "  " << PACKAGE_NAME << " version " << PACKAGE_VERSION;
 #ifdef LLVM_VERSION_INFO
-        llvm_cout << LLVM_VERSION_INFO;
+        cout << LLVM_VERSION_INFO;
 #endif
-        llvm_cout << "\n  ";
+        cout << "\n  ";
 #ifndef __OPTIMIZE__
-        llvm_cout << "DEBUG build";
+        cout << "DEBUG build";
 #else
-        llvm_cout << "Optimized build";
+        cout << "Optimized build";
 #endif
 #ifndef NDEBUG
-        llvm_cout << " with assertions";
+        cout << " with assertions";
 #endif
-        llvm_cout << ".\n";
+        cout << ".\n";
         Options->clear();  // Don't bother making option dtors remove from map.
         exit(1);
       } else {
diff --git a/lib/Support/ConstantRange.cpp b/lib/Support/ConstantRange.cpp
index 1f1a1b5..2c21586 100644
--- a/lib/Support/ConstantRange.cpp
+++ b/lib/Support/ConstantRange.cpp
@@ -370,5 +370,5 @@
 /// dump - Allow printing from a debugger easily...
 ///
 void ConstantRange::dump() const {
-  print(llvm_cerr);
+  print(cerr);
 }
diff --git a/lib/Support/Debug.cpp b/lib/Support/Debug.cpp
index 9cea94c..949e3d9 100644
--- a/lib/Support/Debug.cpp
+++ b/lib/Support/Debug.cpp
@@ -68,9 +68,9 @@
 // places the std::c* I/O streams into one .cpp file and relieves the whole
 // program from having to have hundreds of static c'tor/d'tors for them.
 // 
-llvm_ostream llvm::getErrorOutputStream(const char *DebugType) {
+OStream llvm::getErrorOutputStream(const char *DebugType) {
   if (DebugFlag && isCurrentDebugType(DebugType))
-    return llvm_cerr;
+    return cerr;
   else
-    return llvm_null;
+    return NullStream;
 }
diff --git a/lib/Support/GraphWriter.cpp b/lib/Support/GraphWriter.cpp
index 01da2e1..ecf2bfd 100644
--- a/lib/Support/GraphWriter.cpp
+++ b/lib/Support/GraphWriter.cpp
@@ -28,9 +28,9 @@
   args.push_back(Filename.c_str());
   args.push_back(0);
   
-  llvm_cerr << "Running 'Graphviz' program... " << std::flush;
+  cerr << "Running 'Graphviz' program... " << std::flush;
   if (sys::Program::ExecuteAndWait(Graphviz, &args[0],0,0,0,&ErrMsg)) {
-    llvm_cerr << "Error viewing graph: " << ErrMsg << "\n";
+    cerr << "Error viewing graph: " << ErrMsg << "\n";
   }
 #elif (HAVE_GV && HAVE_DOT)
   sys::Path PSFilename = Filename;
@@ -48,11 +48,11 @@
   args.push_back(PSFilename.c_str());
   args.push_back(0);
   
-  llvm_cerr << "Running 'dot' program... " << std::flush;
+  cerr << "Running 'dot' program... " << std::flush;
   if (sys::Program::ExecuteAndWait(dot, &args[0],0,0,0,&ErrMsg)) {
-    llvm_cerr << "Error viewing graph: '" << ErrMsg << "\n";
+    cerr << "Error viewing graph: '" << ErrMsg << "\n";
   } else {
-    llvm_cerr << " done. \n";
+    cerr << " done. \n";
 
     sys::Path gv(LLVM_PATH_GV);
     args.clear();
@@ -62,7 +62,7 @@
     
     ErrMsg.clear();
     if (sys::Program::ExecuteAndWait(gv, &args[0],0,0,0,&ErrMsg)) {
-      llvm_cerr << "Error viewing graph: " << ErrMsg << "\n";
+      cerr << "Error viewing graph: " << ErrMsg << "\n";
     }
   }
   PSFilename.eraseFromDisk();
@@ -73,9 +73,9 @@
   args.push_back(Filename.c_str());
   args.push_back(0);
   
-  llvm_cerr << "Running 'dotty' program... " << std::flush;
+  cerr << "Running 'dotty' program... " << std::flush;
   if (sys::Program::ExecuteAndWait(dotty, &args[0],0,0,0,&ErrMsg)) {
-    llvm_cerr << "Error viewing graph: " << ErrMsg << "\n";
+    cerr << "Error viewing graph: " << ErrMsg << "\n";
   } else {
 #ifdef __MINGW32__ // Dotty spawns another app and doesn't wait until it returns
     return;
diff --git a/lib/Support/PluginLoader.cpp b/lib/Support/PluginLoader.cpp
index abd5e7a..97b253e 100644
--- a/lib/Support/PluginLoader.cpp
+++ b/lib/Support/PluginLoader.cpp
@@ -26,8 +26,8 @@
 
   std::string Error;
   if (sys::DynamicLibrary::LoadLibraryPermanently(Filename.c_str(), &Error)) {
-    llvm_cerr << "Error opening '" << Filename << "': " << Error
-              << "\n  -load request ignored.\n";
+    cerr << "Error opening '" << Filename << "': " << Error
+         << "\n  -load request ignored.\n";
   } else {
     Plugins->push_back(Filename);
   }
diff --git a/lib/Support/SlowOperationInformer.cpp b/lib/Support/SlowOperationInformer.cpp
index 806e7a4..a7bdf12 100644
--- a/lib/Support/SlowOperationInformer.cpp
+++ b/lib/Support/SlowOperationInformer.cpp
@@ -28,8 +28,8 @@
   if (LastPrintAmount) {
     // If we have printed something, make _sure_ we print the 100% amount, and
     // also print a newline.
-    llvm_cout << std::string(LastPrintAmount, '\b') << "Progress "
-              << OperationName << ": 100%  \n";
+    cout << std::string(LastPrintAmount, '\b') << "Progress "
+         << OperationName << ": 100%  \n";
   }
 }
 
@@ -40,7 +40,7 @@
 bool SlowOperationInformer::progress(unsigned Amount) {
   int status = sys::AlarmStatus();
   if (status == -1) {
-    llvm_cout << "\n";
+    cout << "\n";
     LastPrintAmount = 0;
     return true;
   }
@@ -61,6 +61,6 @@
     OS << "%  ";
 
   LastPrintAmount = OS.str().size();
-  llvm_cout << ToPrint+OS.str() << std::flush;
+  cout << ToPrint+OS.str() << std::flush;
   return false;
 }
diff --git a/lib/Support/Streams.cpp b/lib/Support/Streams.cpp
index 9ca7590..02aec1f 100644
--- a/lib/Support/Streams.cpp
+++ b/lib/Support/Streams.cpp
@@ -16,6 +16,7 @@
 #include <iostream>
 using namespace llvm;
 
-llvm_ostream llvm::llvm_null;
-llvm_ostream llvm::llvm_cout(std::cout);
-llvm_ostream llvm::llvm_cerr(std::cerr);
+OStream llvm::NullStream;
+OStream llvm::cout(std::cout);
+OStream llvm::cerr(std::cerr);
+IStream llvm::cin(std::cin);
diff --git a/lib/Support/SystemUtils.cpp b/lib/Support/SystemUtils.cpp
index d4dbaee..1242511 100644
--- a/lib/Support/SystemUtils.cpp
+++ b/lib/Support/SystemUtils.cpp
@@ -23,10 +23,10 @@
                                         bool print_warning) {
   if (stream_to_check == &std::cout && sys::Process::StandardOutIsDisplayed()) {
     if (print_warning) {
-      llvm_cerr << "WARNING: You're attempting to print out a bytecode file.\n"
-                << "This is inadvisable as it may cause display problems. If\n"
-                << "you REALLY want to taste LLVM bytecode first-hand, you\n"
-                << "can force output with the `-f' option.\n\n";
+      cerr << "WARNING: You're attempting to print out a bytecode file.\n"
+           << "This is inadvisable as it may cause display problems. If\n"
+           << "you REALLY want to taste LLVM bytecode first-hand, you\n"
+           << "can force output with the `-f' option.\n\n";
     }
     return true;
   }
diff --git a/lib/Transforms/ExprTypeConvert.cpp b/lib/Transforms/ExprTypeConvert.cpp
index 39f21ea..1ce6eed 100644
--- a/lib/Transforms/ExprTypeConvert.cpp
+++ b/lib/Transforms/ExprTypeConvert.cpp
@@ -693,8 +693,8 @@
   I->setName("");
   Instruction *Res;     // Result of conversion
 
-  //llvm_cerr << endl << endl << "Type:\t" << Ty << "\nInst: " << I
-  //          << "BB Before: " << BB << endl;
+  //cerr << endl << endl << "Type:\t" << Ty << "\nInst: " << I
+  //     << "BB Before: " << BB << endl;
 
   // Prevent I from being removed...
   ValueHandle IHandle(VMC, I);
diff --git a/lib/Transforms/Hello/Hello.cpp b/lib/Transforms/Hello/Hello.cpp
index 8324cbb..0b0010d 100644
--- a/lib/Transforms/Hello/Hello.cpp
+++ b/lib/Transforms/Hello/Hello.cpp
@@ -30,7 +30,7 @@
       HelloCounter++;
       std::string fname = F.getName();
       EscapeString(fname);
-      llvm_cerr << "Hello: " << fname << "\n";
+      cerr << "Hello: " << fname << "\n";
       return false;
     }
   };
@@ -43,7 +43,7 @@
       HelloCounter++;
       std::string fname = F.getName();
       EscapeString(fname);
-      llvm_cerr << "Hello: " << fname << "\n";
+      cerr << "Hello: " << fname << "\n";
       return false;
     }
 
diff --git a/lib/Transforms/IPO/GlobalOpt.cpp b/lib/Transforms/IPO/GlobalOpt.cpp
index a0dc937..764205b 100644
--- a/lib/Transforms/IPO/GlobalOpt.cpp
+++ b/lib/Transforms/IPO/GlobalOpt.cpp
@@ -494,17 +494,17 @@
       // Will trap.
     } else if (StoreInst *SI = dyn_cast<StoreInst>(*UI)) {
       if (SI->getOperand(0) == V) {
-        //llvm_cerr << "NONTRAPPING USE: " << **UI;
+        //cerr << "NONTRAPPING USE: " << **UI;
         return false;  // Storing the value.
       }
     } else if (CallInst *CI = dyn_cast<CallInst>(*UI)) {
       if (CI->getOperand(0) != V) {
-        //llvm_cerr << "NONTRAPPING USE: " << **UI;
+        //cerr << "NONTRAPPING USE: " << **UI;
         return false;  // Not calling the ptr
       }
     } else if (InvokeInst *II = dyn_cast<InvokeInst>(*UI)) {
       if (II->getOperand(0) != V) {
-        //llvm_cerr << "NONTRAPPING USE: " << **UI;
+        //cerr << "NONTRAPPING USE: " << **UI;
         return false;  // Not calling the ptr
       }
     } else if (CastInst *CI = dyn_cast<CastInst>(*UI)) {
@@ -515,7 +515,7 @@
                isa<ConstantPointerNull>(UI->getOperand(1))) {
       // Ignore setcc X, null
     } else {
-      //llvm_cerr << "NONTRAPPING USE: " << **UI;
+      //cerr << "NONTRAPPING USE: " << **UI;
       return false;
     }
   return true;
@@ -533,7 +533,7 @@
       // Ignore stores to the global.
     } else {
       // We don't know or understand this user, bail out.
-      //llvm_cerr << "UNKNOWN USER OF GLOBAL!: " << **UI;
+      //cerr << "UNKNOWN USER OF GLOBAL!: " << **UI;
       return false;
     }
 
@@ -1206,25 +1206,25 @@
 
   if (!AnalyzeGlobal(GV, GS, PHIUsers)) {
 #if 0
-    llvm_cerr << "Global: " << *GV;
-    llvm_cerr << "  isLoaded = " << GS.isLoaded << "\n";
-    llvm_cerr << "  StoredType = ";
+    cerr << "Global: " << *GV;
+    cerr << "  isLoaded = " << GS.isLoaded << "\n";
+    cerr << "  StoredType = ";
     switch (GS.StoredType) {
-    case GlobalStatus::NotStored: llvm_cerr << "NEVER STORED\n"; break;
-    case GlobalStatus::isInitializerStored: llvm_cerr << "INIT STORED\n"; break;
-    case GlobalStatus::isStoredOnce: llvm_cerr << "STORED ONCE\n"; break;
-    case GlobalStatus::isStored: llvm_cerr << "stored\n"; break;
+    case GlobalStatus::NotStored: cerr << "NEVER STORED\n"; break;
+    case GlobalStatus::isInitializerStored: cerr << "INIT STORED\n"; break;
+    case GlobalStatus::isStoredOnce: cerr << "STORED ONCE\n"; break;
+    case GlobalStatus::isStored: cerr << "stored\n"; break;
     }
     if (GS.StoredType == GlobalStatus::isStoredOnce && GS.StoredOnceValue)
-      llvm_cerr << "  StoredOnceValue = " << *GS.StoredOnceValue << "\n";
+      cerr << "  StoredOnceValue = " << *GS.StoredOnceValue << "\n";
     if (GS.AccessingFunction && !GS.HasMultipleAccessingFunctions)
-      llvm_cerr << "  AccessingFunction = " << GS.AccessingFunction->getName()
+      cerr << "  AccessingFunction = " << GS.AccessingFunction->getName()
                 << "\n";
-    llvm_cerr << "  HasMultipleAccessingFunctions =  "
+    cerr << "  HasMultipleAccessingFunctions =  "
               << GS.HasMultipleAccessingFunctions << "\n";
-    llvm_cerr << "  HasNonInstructionUser = " << GS.HasNonInstructionUser<<"\n";
-    llvm_cerr << "  isNotSuitableForSRA = " << GS.isNotSuitableForSRA << "\n";
-    llvm_cerr << "\n";
+    cerr << "  HasNonInstructionUser = " << GS.HasNonInstructionUser<<"\n";
+    cerr << "  isNotSuitableForSRA = " << GS.isNotSuitableForSRA << "\n";
+    cerr << "\n";
 #endif
     
     // If this is a first class global and has only one accessing function
diff --git a/lib/Transforms/IPO/Internalize.cpp b/lib/Transforms/IPO/Internalize.cpp
index 3e7dcc6..f43a27f 100644
--- a/lib/Transforms/IPO/Internalize.cpp
+++ b/lib/Transforms/IPO/Internalize.cpp
@@ -74,8 +74,7 @@
   // Load the APIFile...
   std::ifstream In(Filename);
   if (!In.good()) {
-    llvm_cerr << "WARNING: Internalize couldn't load file '" << Filename
-              << "'!\n";
+    cerr << "WARNING: Internalize couldn't load file '" << Filename << "'!\n";
     return;   // Do not internalize anything...
   }
   while (In) {
diff --git a/lib/Transforms/Instrumentation/BlockProfiling.cpp b/lib/Transforms/Instrumentation/BlockProfiling.cpp
index af2928b..af438f9 100644
--- a/lib/Transforms/Instrumentation/BlockProfiling.cpp
+++ b/lib/Transforms/Instrumentation/BlockProfiling.cpp
@@ -47,8 +47,8 @@
 bool FunctionProfiler::runOnModule(Module &M) {
   Function *Main = M.getMainFunction();
   if (Main == 0) {
-    llvm_cerr << "WARNING: cannot insert function profiling into a module"
-              << " with no main function!\n";
+    cerr << "WARNING: cannot insert function profiling into a module"
+         << " with no main function!\n";
     return false;  // No main, no instrumentation!
   }
 
@@ -90,8 +90,8 @@
 bool BlockProfiler::runOnModule(Module &M) {
   Function *Main = M.getMainFunction();
   if (Main == 0) {
-    llvm_cerr << "WARNING: cannot insert block profiling into a module"
-              << " with no main function!\n";
+    cerr << "WARNING: cannot insert block profiling into a module"
+         << " with no main function!\n";
     return false;  // No main, no instrumentation!
   }
 
diff --git a/lib/Transforms/Instrumentation/EdgeProfiling.cpp b/lib/Transforms/Instrumentation/EdgeProfiling.cpp
index 40a8faa..36cf3e9 100644
--- a/lib/Transforms/Instrumentation/EdgeProfiling.cpp
+++ b/lib/Transforms/Instrumentation/EdgeProfiling.cpp
@@ -17,6 +17,7 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include "ProfilingUtils.h"
 #include "llvm/Constants.h"
 #include "llvm/DerivedTypes.h"
 #include "llvm/Module.h"
@@ -24,7 +25,6 @@
 #include "llvm/Support/Streams.h"
 #include "llvm/Transforms/Utils/BasicBlockUtils.h"
 #include "llvm/Transforms/Instrumentation.h"
-#include "ProfilingUtils.h"
 #include <set>
 using namespace llvm;
 
@@ -42,8 +42,8 @@
 bool EdgeProfiler::runOnModule(Module &M) {
   Function *Main = M.getMainFunction();
   if (Main == 0) {
-    llvm_cerr << "WARNING: cannot insert edge profiling into a module"
-              << " with no main function!\n";
+    cerr << "WARNING: cannot insert edge profiling into a module"
+         << " with no main function!\n";
     return false;  // No main, no instrumentation!
   }
 
diff --git a/lib/Transforms/Instrumentation/TraceBasicBlocks.cpp b/lib/Transforms/Instrumentation/TraceBasicBlocks.cpp
index 076fa81..10b3641 100644
--- a/lib/Transforms/Instrumentation/TraceBasicBlocks.cpp
+++ b/lib/Transforms/Instrumentation/TraceBasicBlocks.cpp
@@ -13,6 +13,7 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include "ProfilingUtils.h"
 #include "llvm/Constants.h"
 #include "llvm/DerivedTypes.h"
 #include "llvm/Module.h"
@@ -20,7 +21,6 @@
 #include "llvm/Transforms/Utils/BasicBlockUtils.h"
 #include "llvm/Transforms/Instrumentation.h"
 #include "llvm/Instructions.h"
-#include "ProfilingUtils.h"
 #include "llvm/Support/Debug.h"
 #include <set>
 using namespace llvm;
@@ -61,8 +61,8 @@
 bool TraceBasicBlocks::runOnModule(Module &M) {
   Function *Main = M.getMainFunction();
   if (Main == 0) {
-    llvm_cerr << "WARNING: cannot insert basic-block trace instrumentation"
-              << " into a module with no main function!\n";
+    cerr << "WARNING: cannot insert basic-block trace instrumentation"
+         << " into a module with no main function!\n";
     return false;  // No main, no instrumentation!
   }
 
diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp
index 5073bde..4c0bbf4 100644
--- a/lib/Transforms/Scalar/InstructionCombining.cpp
+++ b/lib/Transforms/Scalar/InstructionCombining.cpp
@@ -7018,8 +7018,8 @@
   // If we are removing arguments to the function, emit an obnoxious warning...
   if (FT->getNumParams() < NumActualArgs)
     if (!FT->isVarArg()) {
-      llvm_cerr << "WARNING: While resolving call to function '"
-                << Callee->getName() << "' arguments were dropped!\n";
+      cerr << "WARNING: While resolving call to function '"
+           << Callee->getName() << "' arguments were dropped!\n";
     } else {
       // Add all of the arguments in their promoted form to the arg list...
       for (unsigned i = FT->getNumParams(); i != NumActualArgs; ++i, ++AI) {
diff --git a/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/lib/Transforms/Scalar/LoopStrengthReduce.cpp
index a262cf7..66b595f 100644
--- a/lib/Transforms/Scalar/LoopStrengthReduce.cpp
+++ b/lib/Transforms/Scalar/LoopStrengthReduce.cpp
@@ -507,12 +507,12 @@
 }
 
 void BasedUser::dump() const {
-  llvm_cerr << " Base=" << *Base;
-  llvm_cerr << " Imm=" << *Imm;
+  cerr << " Base=" << *Base;
+  cerr << " Imm=" << *Imm;
   if (EmittedBase)
-    llvm_cerr << "  EB=" << *EmittedBase;
+    cerr << "  EB=" << *EmittedBase;
 
-  llvm_cerr << "   Inst: " << *Inst;
+  cerr << "   Inst: " << *Inst;
 }
 
 Value *BasedUser::InsertCodeForBaseAtPosition(const SCEVHandle &NewBase, 
diff --git a/lib/Transforms/Scalar/LowerPacked.cpp b/lib/Transforms/Scalar/LowerPacked.cpp
index f02c40f..25de5fb 100644
--- a/lib/Transforms/Scalar/LowerPacked.cpp
+++ b/lib/Transforms/Scalar/LowerPacked.cpp
@@ -73,8 +73,7 @@
    /// @param I the unhandled instruction
    void visitInstruction(Instruction &I) {
      if (isa<PackedType>(I.getType()))
-       llvm_cerr << "Unhandled Instruction with Packed ReturnType: "
-                 << I << '\n';
+       cerr << "Unhandled Instruction with Packed ReturnType: " << I << '\n';
    }
 private:
    /// @brief Retrieves lowered values for a packed value.
diff --git a/lib/Transforms/Scalar/SCCP.cpp b/lib/Transforms/Scalar/SCCP.cpp
index a5f7db8..5d928c1 100644
--- a/lib/Transforms/Scalar/SCCP.cpp
+++ b/lib/Transforms/Scalar/SCCP.cpp
@@ -350,7 +350,7 @@
 
   void visitInstruction(Instruction &I) {
     // If a new instruction is added to LLVM that we don't handle...
-    llvm_cerr << "SCCP: Don't know how to handle: " << I;
+    cerr << "SCCP: Don't know how to handle: " << I;
     markOverdefined(&I);   // Just in case
   }
 };
@@ -400,7 +400,7 @@
       Succs[0] = true;
     }
   } else {
-    llvm_cerr << "SCCP: Don't know how to handle: " << TI;
+    cerr << "SCCP: Don't know how to handle: " << TI;
     Succs.assign(TI.getNumSuccessors(), true);
   }
 }
@@ -459,7 +459,7 @@
     }
     return false;
   } else {
-    llvm_cerr << "Unknown terminator instruction: " << *TI;
+    cerr << "Unknown terminator instruction: " << *TI;
     abort();
   }
 }
diff --git a/lib/Transforms/Utils/CodeExtractor.cpp b/lib/Transforms/Utils/CodeExtractor.cpp
index 52d53d5..a63e4e0 100644
--- a/lib/Transforms/Utils/CodeExtractor.cpp
+++ b/lib/Transforms/Utils/CodeExtractor.cpp
@@ -699,10 +699,10 @@
           }
     }
 
-  //llvm_cerr << "NEW FUNCTION: " << *newFunction;
+  //cerr << "NEW FUNCTION: " << *newFunction;
   //  verifyFunction(*newFunction);
 
-  //  llvm_cerr << "OLD FUNCTION: " << *oldFunction;
+  //  cerr << "OLD FUNCTION: " << *oldFunction;
   //  verifyFunction(*oldFunction);
 
   DEBUG(if (verifyFunction(*newFunction)) abort());
diff --git a/lib/Transforms/Utils/LowerSwitch.cpp b/lib/Transforms/Utils/LowerSwitch.cpp
index 4ad12b9..2adfb3e 100644
--- a/lib/Transforms/Utils/LowerSwitch.cpp
+++ b/lib/Transforms/Utils/LowerSwitch.cpp
@@ -96,8 +96,7 @@
 
 // operator<< - Used for debugging purposes.
 //
-llvm_ostream& operator<<(llvm_ostream &O,
-                         const std::vector<LowerSwitch::Case> &C) {
+OStream& operator<<(OStream &O, const std::vector<LowerSwitch::Case> &C) {
   O << "[";
 
   for (std::vector<LowerSwitch::Case>::const_iterator B = C.begin(),
diff --git a/lib/VMCore/AsmWriter.cpp b/lib/VMCore/AsmWriter.cpp
index 30baed4..072fc51 100644
--- a/lib/VMCore/AsmWriter.cpp
+++ b/lib/VMCore/AsmWriter.cpp
@@ -829,7 +829,7 @@
     case GlobalValue::ExternalWeakLinkage: Out << "extern_weak "; break;
     case GlobalValue::ExternalLinkage:     break;
     case GlobalValue::GhostLinkage:
-      llvm_cerr << "GhostLinkage not allowed in AsmWriter!\n";
+      cerr << "GhostLinkage not allowed in AsmWriter!\n";
       abort();
     }
 
@@ -928,7 +928,7 @@
     case GlobalValue::ExternalWeakLinkage: Out << "extern_weak "; break;      
     case GlobalValue::ExternalLinkage: break;
     case GlobalValue::GhostLinkage:
-      llvm_cerr << "GhostLinkage not allowed in AsmWriter!\n";
+      cerr << "GhostLinkage not allowed in AsmWriter!\n";
       abort();
     }
 
@@ -1328,18 +1328,18 @@
 
 // Value::dump - allow easy printing of  Values from the debugger.
 // Located here because so much of the needed functionality is here.
-void Value::dump() const { print(std::cerr); llvm_cerr << '\n'; }
+void Value::dump() const { print(std::cerr); cerr << '\n'; }
 
 // Type::dump - allow easy printing of  Values from the debugger.
 // Located here because so much of the needed functionality is here.
-void Type::dump() const { print(std::cerr); llvm_cerr << '\n'; }
+void Type::dump() const { print(std::cerr); cerr << '\n'; }
 
 //===----------------------------------------------------------------------===//
 //                         SlotMachine Implementation
 //===----------------------------------------------------------------------===//
 
 #if 0
-#define SC_DEBUG(X) llvm_cerr << X
+#define SC_DEBUG(X) cerr << X
 #else
 #define SC_DEBUG(X)
 #endif
diff --git a/lib/VMCore/LeakDetector.cpp b/lib/VMCore/LeakDetector.cpp
index 4c9f125..68bf161 100644
--- a/lib/VMCore/LeakDetector.cpp
+++ b/lib/VMCore/LeakDetector.cpp
@@ -11,8 +11,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "llvm/Support/Compiler.h"
 #include "llvm/Support/LeakDetector.h"
+#include "llvm/Support/Compiler.h"
 #include "llvm/Support/Streams.h"
 #include "llvm/Value.h"
 #include <set>
@@ -21,12 +21,12 @@
 namespace {
   template <class T>
   struct VISIBILITY_HIDDEN PrinterTrait {
-    static void print(const T* P) { llvm_cerr << P; }
+    static void print(const T* P) { cerr << P; }
   };
 
   template<>
   struct VISIBILITY_HIDDEN PrinterTrait<Value> {
-    static void print(const Value* P) { llvm_cerr << *P; }
+    static void print(const Value* P) { cerr << *P; }
   };
 
   template <typename T>
@@ -59,15 +59,14 @@
       assert(Cache == 0 && "No value should be cached anymore!");
 
       if (!Ts.empty()) {
-        llvm_cerr
-            << "Leaked " << Name << " objects found: " << Message << ":\n";
+        cerr << "Leaked " << Name << " objects found: " << Message << ":\n";
         for (typename std::set<const T*>::iterator I = Ts.begin(),
                E = Ts.end(); I != E; ++I) {
-          llvm_cerr << "\t";
+          cerr << "\t";
           PrinterTrait<T>::print(*I);
-          llvm_cerr << "\n";
+          cerr << "\n";
         }
-        llvm_cerr << '\n';
+        cerr << '\n';
 
         return true;
       }
@@ -123,8 +122,8 @@
   // use non-short-circuit version so that both checks are performed
   if (getObjects().hasGarbage(Message) |
       getLLVMObjects().hasGarbage(Message))
-    llvm_cerr << "\nThis is probably because you removed an object, but didn't "
-              << "delete it.  Please check your code for memory leaks.\n";
+    cerr << "\nThis is probably because you removed an object, but didn't "
+         << "delete it.  Please check your code for memory leaks.\n";
 
   // Clear out results so we don't get duplicate warnings on
   // next call...
diff --git a/lib/VMCore/PassManager.cpp b/lib/VMCore/PassManager.cpp
index d01ef3e..7fdc62a 100644
--- a/lib/VMCore/PassManager.cpp
+++ b/lib/VMCore/PassManager.cpp
@@ -442,7 +442,7 @@
 bool FunctionPassManager_New::run(Function &F) {
   std::string errstr;
   if (MP->materializeFunction(&F, &errstr)) {
-    llvm_cerr << "Error reading bytecode file: " << errstr << "\n";
+    cerr << "Error reading bytecode file: " << errstr << "\n";
     abort();
   }
   return FPM->runOnFunction(F);
diff --git a/lib/VMCore/TypeSymbolTable.cpp b/lib/VMCore/TypeSymbolTable.cpp
index 7af7bea..cfd8cbf 100644
--- a/lib/VMCore/TypeSymbolTable.cpp
+++ b/lib/VMCore/TypeSymbolTable.cpp
@@ -66,7 +66,7 @@
 
 #if DEBUG_SYMBOL_TABLE
   dump();
-  llvm_cerr << " Removing Value: " << Result->getName() << "\n";
+  cerr << " Removing Value: " << Result->getName() << "\n";
 #endif
 
   tmap.erase(Entry);
@@ -75,7 +75,7 @@
   // list...
   if (Result->isAbstract()) {
 #if DEBUG_ABSTYPE
-    llvm_cerr << "Removing abstract type from symtab" << Result->getDescription()<<"\n";
+    cerr << "Removing abstract type from symtab" << Result->getDescription()<<"\n";
 #endif
     cast<DerivedType>(Result)->removeAbstractTypeUser(this);
   }
@@ -95,8 +95,8 @@
 
 #if DEBUG_SYMBOL_TABLE
   dump();
-  llvm_cerr << " Inserting type: " << UniqueName << ": "
-            << T->getDescription() << "\n";
+  cerr << " Inserting type: " << UniqueName << ": "
+       << T->getDescription() << "\n";
 #endif
 
   // Insert the tmap entry
@@ -106,7 +106,7 @@
   if (T->isAbstract()) {
     cast<DerivedType>(T)->addAbstractTypeUser(this);
 #if DEBUG_ABSTYPE
-    llvm_cerr << "Added abstract type to ST: " << T->getDescription() << "\n";
+    cerr << "Added abstract type to ST: " << T->getDescription() << "\n";
 #endif
   }
 }
@@ -152,14 +152,14 @@
   for (iterator I = begin(), E = end(); I != E; ++I) {
     if (I->second == (Type*)OldType) {  // FIXME when Types aren't const.
 #if DEBUG_ABSTYPE
-      llvm_cerr << "Removing type " << OldType->getDescription() << "\n";
+      cerr << "Removing type " << OldType->getDescription() << "\n";
 #endif
       OldType->removeAbstractTypeUser(this);
 
       I->second = (Type*)NewType;  // TODO FIXME when types aren't const
       if (NewType->isAbstract()) {
 #if DEBUG_ABSTYPE
-        llvm_cerr << "Added type " << NewType->getDescription() << "\n";
+        cerr << "Added type " << NewType->getDescription() << "\n";
 #endif
         cast<DerivedType>(NewType)->addAbstractTypeUser(this);
       }
@@ -179,13 +179,13 @@
 }
 
 static void DumpTypes(const std::pair<const std::string, const Type*>& T ) {
-  llvm_cerr << "  '" << T.first << "' = ";
+  cerr << "  '" << T.first << "' = ";
   T.second->dump();
-  llvm_cerr << "\n";
+  cerr << "\n";
 }
 
 void TypeSymbolTable::dump() const {
-  llvm_cerr << "TypeSymbolPlane: ";
+  cerr << "TypeSymbolPlane: ";
   for_each(tmap.begin(), tmap.end(), DumpTypes);
 }
 
diff --git a/lib/VMCore/Verifier.cpp b/lib/VMCore/Verifier.cpp
index 4e43a0c..cf812a8 100644
--- a/lib/VMCore/Verifier.cpp
+++ b/lib/VMCore/Verifier.cpp
@@ -60,7 +60,6 @@
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/Support/Compiler.h"
 #include <algorithm>
-#include <sstream>
 #include <cstdarg>
 using namespace llvm;
 
@@ -156,11 +155,11 @@
         switch (action) {
           case AbortProcessAction:
             msgs << "compilation aborted!\n";
-            llvm_cerr << msgs.str();
+            cerr << msgs.str();
             abort();
           case PrintMessageAction:
             msgs << "verification continues.\n";
-            llvm_cerr << msgs.str();
+            cerr << msgs.str();
             return false;
           case ReturnStatusAction:
             msgs << "compilation terminated.\n";
diff --git a/projects/Stacker/tools/stkrc/stkrc.cpp b/projects/Stacker/tools/stkrc/stkrc.cpp
index f468330..38ed78e 100644
--- a/projects/Stacker/tools/stkrc/stkrc.cpp
+++ b/projects/Stacker/tools/stkrc/stkrc.cpp
@@ -115,7 +115,7 @@
       }
 
       if (DumpAsm)
-        llvm_cerr << "Here's the assembly:" << M.get();
+        cerr << "Here's the assembly:" << M.get();
 
       if (OutputFilename != "") {   // Specified an output filename?
         if (OutputFilename != "-") {  // Not stdout?
@@ -163,15 +163,15 @@
         throw std::string("error opening ") + OutputFilename + "!";
       }
 
-      llvm_ostream L(*Out);
+      OStream L(*Out);
       WriteBytecodeToFile(M.get(), L);
     } catch (const ParseError &E) {
-      llvm_cerr << argv[0] << ": " << E.getMessage() << "\n";
+      cerr << argv[0] << ": " << E.getMessage() << "\n";
       return 1;
     }
   }
   catch (const std::string& msg ) {
-    llvm_cerr << argv[0] << ": " << msg << "\n";
+    cerr << argv[0] << ": " << msg << "\n";
     return 1;
   }
 
diff --git a/tools/bugpoint/OptimizerDriver.cpp b/tools/bugpoint/OptimizerDriver.cpp
index 0ec66ba..8a19739 100644
--- a/tools/bugpoint/OptimizerDriver.cpp
+++ b/tools/bugpoint/OptimizerDriver.cpp
@@ -56,7 +56,7 @@
   std::ofstream Out(Filename.c_str(), io_mode);
   if (!Out.good()) return true;
   try {
-    llvm_ostream L(Out);
+    OStream L(Out);
     WriteBytecodeToFile(M ? M : Program, L, /*compression=*/true);
   } catch (...) {
     return true;
@@ -74,15 +74,15 @@
   //
   std::string Filename = "bugpoint-" + ID + ".bc";
   if (writeProgramToFile(Filename)) {
-    llvm_cerr <<  "Error opening file '" << Filename << "' for writing!\n";
+    cerr <<  "Error opening file '" << Filename << "' for writing!\n";
     return;
   }
 
-  llvm_cout << "Emitted bytecode to '" << Filename << "'\n";
+  cout << "Emitted bytecode to '" << Filename << "'\n";
   if (NoFlyer || PassesToRun.empty()) return;
-  llvm_cout << "\n*** You can reproduce the problem with: ";
-  llvm_cout << "opt " << Filename << " ";
-  llvm_cout << getPassesString(PassesToRun) << "\n";
+  cout << "\n*** You can reproduce the problem with: ";
+  cout << "opt " << Filename << " ";
+  cout << getPassesString(PassesToRun) << "\n";
 }
 
 int BugDriver::runPassesAsChild(const std::vector<const PassInfo*> &Passes) {
@@ -91,7 +91,7 @@
                                std::ios::binary;
   std::ofstream OutFile(ChildOutput.c_str(), io_mode);
   if (!OutFile.good()) {
-    llvm_cerr << "Error opening bytecode file: " << ChildOutput << "\n";
+    cerr << "Error opening bytecode file: " << ChildOutput << "\n";
     return 1;
   }
 
@@ -103,14 +103,13 @@
     if (Passes[i]->getNormalCtor())
       PM.add(Passes[i]->getNormalCtor()());
     else
-      llvm_cerr << "Cannot create pass yet: " << Passes[i]->getPassName()
-                << "\n";
+      cerr << "Cannot create pass yet: " << Passes[i]->getPassName() << "\n";
   }
   // Check that the module is well formed on completion of optimization
   PM.add(createVerifierPass());
 
   // Write bytecode out to disk as the last step...
-  llvm_ostream L(OutFile);
+  OStream L(OutFile);
   PM.add(new WriteBytecodePass(&L));
 
   // Run all queued passes.
@@ -131,12 +130,12 @@
                           std::string &OutputFilename, bool DeleteOutput,
                           bool Quiet) const {
   // setup the output file name
-  llvm_cout << std::flush;
+  cout << std::flush;
   sys::Path uniqueFilename("bugpoint-output.bc");
   std::string ErrMsg;
   if (uniqueFilename.makeUnique(true, &ErrMsg)) {
-    llvm_cerr << getToolName() << ": Error making unique filename: " 
-              << ErrMsg << "\n";
+    cerr << getToolName() << ": Error making unique filename: " 
+         << ErrMsg << "\n";
     return(1);
   }
   OutputFilename = uniqueFilename.toString();
@@ -144,18 +143,18 @@
   // set up the input file name
   sys::Path inputFilename("bugpoint-input.bc");
   if (inputFilename.makeUnique(true, &ErrMsg)) {
-    llvm_cerr << getToolName() << ": Error making unique filename: " 
-              << ErrMsg << "\n";
+    cerr << getToolName() << ": Error making unique filename: " 
+         << ErrMsg << "\n";
     return(1);
   }
   std::ios::openmode io_mode = std::ios::out | std::ios::trunc |
                                std::ios::binary;
   std::ofstream InFile(inputFilename.c_str(), io_mode);
   if (!InFile.good()) {
-    llvm_cerr << "Error opening bytecode file: " << inputFilename << "\n";
+    cerr << "Error opening bytecode file: " << inputFilename << "\n";
     return(1);
   }
-  llvm_ostream L(InFile);
+  OStream L(InFile);
   WriteBytecodeToFile(Program,L,false);
   InFile.close();
 
@@ -207,17 +206,17 @@
 
   if (!Quiet) {
     if (result == 0)
-      llvm_cout << "Success!\n";
+      cout << "Success!\n";
     else if (result > 0)
-      llvm_cout << "Exited with error code '" << result << "'\n";
+      cout << "Exited with error code '" << result << "'\n";
     else if (result < 0) {
       if (result == -1)
-        llvm_cout << "Execute failed: " << ErrMsg << "\n";
+        cout << "Execute failed: " << ErrMsg << "\n";
       else
-        llvm_cout << "Crashed with signal #" << abs(result) << "\n";
+        cout << "Crashed with signal #" << abs(result) << "\n";
     }
     if (result & 0x01000000)
-      llvm_cout << "Dumped core\n";
+      cout << "Dumped core\n";
   }
 
   // Was the child successful?
@@ -235,8 +234,8 @@
   std::string BytecodeResult;
   if (runPasses(Passes, BytecodeResult, false/*delete*/, true/*quiet*/)) {
     if (AutoDebugCrashes) {
-      llvm_cerr << " Error running this sequence of passes"
-                << " on the input program!\n";
+      cerr << " Error running this sequence of passes"
+           << " on the input program!\n";
       delete OldProgram;
       EmitProgressBytecode("pass-error",  false);
       exit(debugOptimizerCrash());
@@ -250,8 +249,8 @@
 
   Module *Ret = ParseInputFile(BytecodeResult);
   if (Ret == 0) {
-    llvm_cerr << getToolName() << ": Error reading bytecode file '"
-              << BytecodeResult << "'!\n";
+    cerr << getToolName() << ": Error reading bytecode file '"
+         << BytecodeResult << "'!\n";
     exit(1);
   }
   sys::Path(BytecodeResult).eraseFromDisk();  // No longer need the file on disk
diff --git a/tools/gccas/gccas.cpp b/tools/gccas/gccas.cpp
index a898d4c..2d08f36 100644
--- a/tools/gccas/gccas.cpp
+++ b/tools/gccas/gccas.cpp
@@ -143,7 +143,7 @@
     ParseError Err;
     std::auto_ptr<Module> M(ParseAssemblyFile(InputFilename,&Err));
     if (M.get() == 0) {
-      llvm_cerr << argv[0] << ": " << Err.getMessage() << "\n"; 
+      cerr << argv[0] << ": " << Err.getMessage() << "\n"; 
       return 1;
     }
 
@@ -178,7 +178,7 @@
 
 
     if (!Out->good()) {
-      llvm_cerr << argv[0] << ": error opening " << OutputFilename << "!\n";
+      cerr << argv[0] << ": error opening " << OutputFilename << "!\n";
       return 1;
     }
 
@@ -197,7 +197,7 @@
     Passes.add(createVerifierPass());
 
     // Write bytecode to file...
-    llvm_ostream L(*Out);
+    OStream L(*Out);
     Passes.add(new WriteBytecodePass(&L,false,!NoCompress));
 
     // Run our queue of passes all at once now, efficiently.
@@ -206,9 +206,9 @@
     if (Out != &std::cout) delete Out;
     return 0;
   } catch (const std::string& msg) {
-    llvm_cerr << argv[0] << ": " << msg << "\n";
+    cerr << argv[0] << ": " << msg << "\n";
   } catch (...) {
-    llvm_cerr << argv[0] << ": Unexpected unknown exception occurred.\n";
+    cerr << argv[0] << ": Unexpected unknown exception occurred.\n";
   }
   return 1;
 }
diff --git a/tools/gccld/GenerateCode.cpp b/tools/gccld/GenerateCode.cpp
index c84c7d36..13bda75 100644
--- a/tools/gccld/GenerateCode.cpp
+++ b/tools/gccld/GenerateCode.cpp
@@ -123,10 +123,10 @@
 }
 
 static void dumpArgs(const char **args) {
-  llvm_cerr << *args++;
+  cerr << *args++;
   while (*args)
-    llvm_cerr << ' ' << *args++;
-  llvm_cerr << '\n' << std::flush;
+    cerr << ' ' << *args++;
+  cerr << '\n' << std::flush;
 }
 
 static inline void addPass(PassManager &PM, Pass *P) {
@@ -283,7 +283,7 @@
   Passes.add(createVerifierPass());
 
   // Add the pass that writes bytecode to the output file...
-  llvm_ostream L(*Out);
+  OStream L(*Out);
   addPass(Passes, new WriteBytecodePass(&L, false, !NoCompress));
 
   // Run our queue of passes all at once now, efficiently.
diff --git a/tools/gccld/gccld.cpp b/tools/gccld/gccld.cpp
index 46ffac1..77ab03c 100644
--- a/tools/gccld/gccld.cpp
+++ b/tools/gccld/gccld.cpp
@@ -127,7 +127,7 @@
 ///  Message  - The message to print to standard error.
 ///
 static int PrintAndReturn(const char *progname, const std::string &Message) {
-  llvm_cerr << progname << ": " << Message << "\n";
+  cerr << progname << ": " << Message << "\n";
   return 1;
 }
 
@@ -141,11 +141,11 @@
   std::string ErrMsg;  
   sys::Path llvmstub = FindExecutable("llvm-stub.exe", argv[0]);
   if (llvmstub.isEmpty()) {
-    llvm_cerr << "Could not find llvm-stub.exe executable!\n";
+    cerr << "Could not find llvm-stub.exe executable!\n";
     exit(1);
   }
   if (0 != sys::CopyFile(sys::Path(OutputFilename), llvmstub, &ErrMsg)) {
-    llvm_cerr << argv[0] << ": " << ErrMsg << "\n";
+    cerr << argv[0] << ": " << ErrMsg << "\n";
     exit(1);    
   }
 
@@ -326,18 +326,18 @@
         return PrintAndReturn(argv[0], "Failed to find gcc");
 
       // Generate an assembly language file for the bytecode.
-      if (Verbose) llvm_cout << "Generating Assembly Code\n";
+      if (Verbose) cout << "Generating Assembly Code\n";
       std::string ErrMsg;
       if (0 != GenerateAssembly(
           AssemblyFile.toString(), RealBytecodeOutput, llc, ErrMsg, Verbose)) {
-        llvm_cerr << argv[0] << ": " << ErrMsg << "\n";
+        cerr << argv[0] << ": " << ErrMsg << "\n";
         return 2;
       }
-      if (Verbose) llvm_cout << "Generating Native Code\n";
+      if (Verbose) cout << "Generating Native Code\n";
       if (0 != GenerateNative(OutputFilename, AssemblyFile.toString(),
                      LibPaths, Libraries, gcc, envp, LinkAsLibrary,
                      NoInternalize, RPath, SOName, ErrMsg, Verbose) ) {
-        llvm_cerr << argv[0] << ": " << ErrMsg << "\n";
+        cerr << argv[0] << ": " << ErrMsg << "\n";
         return 2;
       }
 
@@ -366,18 +366,18 @@
         return PrintAndReturn(argv[0], "Failed to find gcc");
 
       // Generate an assembly language file for the bytecode.
-      if (Verbose) llvm_cout << "Generating C Source Code\n";
+      if (Verbose) cout << "Generating C Source Code\n";
       std::string ErrMsg;
       if (0 != GenerateCFile(
           CFile.toString(), RealBytecodeOutput, llc, ErrMsg, Verbose)) {
-        llvm_cerr << argv[0] << ": " << ErrMsg << "\n";
+        cerr << argv[0] << ": " << ErrMsg << "\n";
         return 2;
       }
-      if (Verbose) llvm_cout << "Generating Native Code\n";
+      if (Verbose) cout << "Generating Native Code\n";
       if (0 != GenerateNative(OutputFilename, CFile.toString(),
                      LibPaths, Libraries, gcc, envp, LinkAsLibrary,
                      NoInternalize, RPath, SOName, ErrMsg, Verbose)) {
-        llvm_cerr << argv[0] << ": " << ErrMsg << "\n";
+        cerr << argv[0] << ": " << ErrMsg << "\n";
         return 2;
       }
 
@@ -394,11 +394,11 @@
       // Make the bytecode file readable and directly executable in LLEE
       std::string ErrMsg;
       if (sys::Path(RealBytecodeOutput).makeExecutableOnDisk(&ErrMsg)) {
-        llvm_cerr << argv[0] << ": " << ErrMsg << "\n";
+        cerr << argv[0] << ": " << ErrMsg << "\n";
         return 1;
       }
       if (sys::Path(RealBytecodeOutput).makeReadableOnDisk(&ErrMsg)) {
-        llvm_cerr << argv[0] << ": " << ErrMsg << "\n";
+        cerr << argv[0] << ": " << ErrMsg << "\n";
         return 1;
       }
     }
@@ -406,18 +406,18 @@
     // Make the output, whether native or script, executable as well...
     std::string ErrMsg;
     if (sys::Path(OutputFilename).makeExecutableOnDisk(&ErrMsg)) {
-      llvm_cerr << argv[0] << ": " << ErrMsg << "\n";
+      cerr << argv[0] << ": " << ErrMsg << "\n";
       return 1;
     }
   } catch (const char*msg) {
-    llvm_cerr << argv[0] << ": " << msg << "\n";
+    cerr << argv[0] << ": " << msg << "\n";
     exitCode = 1;
   } catch (const std::string& msg) {
-    llvm_cerr << argv[0] << ": " << msg << "\n";
+    cerr << argv[0] << ": " << msg << "\n";
     exitCode = 2;
   } catch (...) {
     // This really shouldn't happen, but just in case ....
-    llvm_cerr << argv[0] << ": An unexpected unknown exception occurred.\n";
+    cerr << argv[0] << ": An unexpected unknown exception occurred.\n";
     exitCode = 3;
   }
 
diff --git a/tools/llvm-as/llvm-as.cpp b/tools/llvm-as/llvm-as.cpp
index c1c0a0c..dd29bc1 100644
--- a/tools/llvm-as/llvm-as.cpp
+++ b/tools/llvm-as/llvm-as.cpp
@@ -62,29 +62,29 @@
     ParseError Err;
     std::auto_ptr<Module> M(ParseAssemblyFile(InputFilename,&Err));
     if (M.get() == 0) {
-      llvm_cerr << argv[0] << ": " << Err.getMessage() << "\n"; 
+      cerr << argv[0] << ": " << Err.getMessage() << "\n"; 
       return 1;
     }
 
     if (!DisableVerify) {
       std::string Err;
       if (verifyModule(*M.get(), ReturnStatusAction, &Err)) {
-        llvm_cerr << argv[0]
-                  << ": assembly parsed, but does not verify as correct!\n";
-        llvm_cerr << Err;
+        cerr << argv[0]
+             << ": assembly parsed, but does not verify as correct!\n";
+        cerr << Err;
         return 1;
       } 
     }
 
-    if (DumpAsm) llvm_cerr << "Here's the assembly:\n" << *M.get();
+    if (DumpAsm) cerr << "Here's the assembly:\n" << *M.get();
 
     if (OutputFilename != "") {   // Specified an output filename?
       if (OutputFilename != "-") {  // Not stdout?
         if (!Force && std::ifstream(OutputFilename.c_str())) {
           // If force is not specified, make sure not to overwrite a file!
-          llvm_cerr << argv[0] << ": error opening '" << OutputFilename
-                    << "': file exists!\n"
-                    << "Use -f command line argument to force output\n";
+          cerr << argv[0] << ": error opening '" << OutputFilename
+               << "': file exists!\n"
+               << "Use -f command line argument to force output\n";
           return 1;
         }
         Out = new std::ofstream(OutputFilename.c_str(), std::ios::out |
@@ -110,9 +110,9 @@
 
         if (!Force && std::ifstream(OutputFilename.c_str())) {
           // If force is not specified, make sure not to overwrite a file!
-          llvm_cerr << argv[0] << ": error opening '" << OutputFilename
-                    << "': file exists!\n"
-                    << "Use -f command line argument to force output\n";
+          cerr << argv[0] << ": error opening '" << OutputFilename
+               << "': file exists!\n"
+               << "Use -f command line argument to force output\n";
           return 1;
         }
 
@@ -125,19 +125,19 @@
     }
 
     if (!Out->good()) {
-      llvm_cerr << argv[0] << ": error opening " << OutputFilename << "!\n";
+      cerr << argv[0] << ": error opening " << OutputFilename << "!\n";
       return 1;
     }
 
     if (Force || !CheckBytecodeOutputToConsole(Out,true)) {
-      llvm_ostream L(*Out);
+      OStream L(*Out);
       WriteBytecodeToFile(M.get(), L, !NoCompress);
     }
   } catch (const std::string& msg) {
-    llvm_cerr << argv[0] << ": " << msg << "\n";
+    cerr << argv[0] << ": " << msg << "\n";
     exitCode = 1;
   } catch (...) {
-    llvm_cerr << argv[0] << ": Unexpected unknown exception occurred.\n";
+    cerr << argv[0] << ": Unexpected unknown exception occurred.\n";
     exitCode = 1;
   }
 
diff --git a/tools/llvm-dis/llvm-dis.cpp b/tools/llvm-dis/llvm-dis.cpp
index 8d9e9aa..d2022fd 100644
--- a/tools/llvm-dis/llvm-dis.cpp
+++ b/tools/llvm-dis/llvm-dis.cpp
@@ -50,11 +50,11 @@
 
     std::auto_ptr<Module> M(ParseBytecodeFile(InputFilename, &ErrorMessage));
     if (M.get() == 0) {
-      llvm_cerr << argv[0] << ": ";
+      cerr << argv[0] << ": ";
       if (ErrorMessage.size())
-        llvm_cerr << ErrorMessage << "\n";
+        cerr << ErrorMessage << "\n";
       else
-        llvm_cerr << "bytecode didn't read correctly.\n";
+        cerr << "bytecode didn't read correctly.\n";
       return 1;
     }
 
@@ -62,8 +62,8 @@
       if (OutputFilename != "-") { // Not stdout?
         if (!Force && std::ifstream(OutputFilename.c_str())) {
           // If force is not specified, make sure not to overwrite a file!
-          llvm_cerr << argv[0] << ": error opening '" << OutputFilename
-                    << "': file exists! Sending to standard output.\n";
+          cerr << argv[0] << ": error opening '" << OutputFilename
+               << "': file exists! Sending to standard output.\n";
         } else {
           Out = new std::ofstream(OutputFilename.c_str());
         }
@@ -83,8 +83,8 @@
 
         if (!Force && std::ifstream(OutputFilename.c_str())) {
           // If force is not specified, make sure not to overwrite a file!
-          llvm_cerr << argv[0] << ": error opening '" << OutputFilename
-                    << "': file exists! Sending to standard output.\n";
+          cerr << argv[0] << ": error opening '" << OutputFilename
+               << "': file exists! Sending to standard output.\n";
         } else {
           Out = new std::ofstream(OutputFilename.c_str());
 
@@ -96,14 +96,14 @@
     }
 
     if (!Out->good()) {
-      llvm_cerr << argv[0] << ": error opening " << OutputFilename
-                << ": sending to stdout instead!\n";
+      cerr << argv[0] << ": error opening " << OutputFilename
+           << ": sending to stdout instead!\n";
       Out = &std::cout;
     }
 
     // All that llvm-dis does is write the assembly to a file.
     PassManager Passes;
-    llvm_ostream L(*Out);
+    OStream L(*Out);
     Passes.add(new PrintModulePass(&L));
     Passes.run(*M.get());
 
@@ -113,9 +113,9 @@
     }
     return 0;
   } catch (const std::string& msg) {
-    llvm_cerr << argv[0] << ": " << msg << "\n";
+    cerr << argv[0] << ": " << msg << "\n";
   } catch (...) {
-    llvm_cerr << argv[0] << ": Unexpected unknown exception occurred.\n";
+    cerr << argv[0] << ": Unexpected unknown exception occurred.\n";
   }
 
   return 1;
diff --git a/tools/llvm-extract/llvm-extract.cpp b/tools/llvm-extract/llvm-extract.cpp
index a6edc72..882455f 100644
--- a/tools/llvm-extract/llvm-extract.cpp
+++ b/tools/llvm-extract/llvm-extract.cpp
@@ -55,15 +55,15 @@
 
     std::auto_ptr<Module> M(ParseBytecodeFile(InputFilename));
     if (M.get() == 0) {
-      llvm_cerr << argv[0] << ": bytecode didn't read correctly.\n";
+      cerr << argv[0] << ": bytecode didn't read correctly.\n";
       return 1;
     }
 
     // Figure out which function we should extract
     Function *F = M.get()->getNamedFunction(ExtractFunc);
     if (F == 0) {
-      llvm_cerr << argv[0] << ": program doesn't contain function named '"
-                << ExtractFunc << "'!\n";
+      cerr << argv[0] << ": program doesn't contain function named '"
+           << ExtractFunc << "'!\n";
       return 1;
     }
 
@@ -82,9 +82,9 @@
     if (OutputFilename != "-") {  // Not stdout?
       if (!Force && std::ifstream(OutputFilename.c_str())) {
         // If force is not specified, make sure not to overwrite a file!
-        llvm_cerr << argv[0] << ": error opening '" << OutputFilename
-                  << "': file exists!\n"
-                  << "Use -f command line argument to force output\n";
+        cerr << argv[0] << ": error opening '" << OutputFilename
+             << "': file exists!\n"
+             << "Use -f command line argument to force output\n";
         return 1;
       }
       std::ios::openmode io_mode = std::ios::out | std::ios::trunc |
@@ -95,7 +95,7 @@
       Out = &std::cout;
     }
 
-    llvm_ostream L(*Out);
+    OStream L(*Out);
     Passes.add(new WriteBytecodePass(&L));  // Write bytecode to file...
     Passes.run(*M.get());
 
@@ -103,9 +103,9 @@
       delete Out;
     return 0;
   } catch (const std::string& msg) {
-    llvm_cerr << argv[0] << ": " << msg << "\n";
+    cerr << argv[0] << ": " << msg << "\n";
   } catch (...) {
-    llvm_cerr << argv[0] << ": Unexpected unknown exception occurred.\n";
+    cerr << argv[0] << ": Unexpected unknown exception occurred.\n";
   }
   return 1;
 }
diff --git a/tools/llvm-ld/llvm-ld.cpp b/tools/llvm-ld/llvm-ld.cpp
index 20ea463..2e59906 100644
--- a/tools/llvm-ld/llvm-ld.cpp
+++ b/tools/llvm-ld/llvm-ld.cpp
@@ -109,7 +109,7 @@
 ///  Message  - The message to print to standard error.
 ///
 static int PrintAndReturn(const std::string &Message) {
-  llvm_cerr << progname << ": " << Message << "\n";
+  cerr << progname << ": " << Message << "\n";
   return 1;
 }
 
@@ -208,7 +208,7 @@
   sys::RemoveFileOnSignal(sys::Path(FileName));
 
   // Write it out
-  llvm_ostream L(Out);
+  OStream L(Out);
   WriteBytecodeToFile(M, L, !DisableCompression);
 
   // Close the bytecode file.
@@ -352,12 +352,12 @@
   std::string ErrMsg;  
   sys::Path llvmstub = FindExecutable("llvm-stub.exe", argv[0]);
   if (llvmstub.isEmpty()) {
-    llvm_cerr << "Could not find llvm-stub.exe executable!\n";
+    cerr << "Could not find llvm-stub.exe executable!\n";
     exit(1);
   }
 
   if (0 != sys::CopyFile(sys::Path(OutputFilename), llvmstub, &ErrMsg)) {
-    llvm_cerr << argv[0] << ": " << ErrMsg << "\n";
+    cerr << argv[0] << ": " << ErrMsg << "\n";
     exit(1);    
   }
 
@@ -520,14 +520,14 @@
               sys::Path target(RealBytecodeOutput);
               target.eraseFromDisk();
               if (tmp_output.renamePathOnDisk(target, &ErrMsg)) {
-                llvm_cerr << argv[0] << ": " << ErrMsg << "\n";
+                cerr << argv[0] << ": " << ErrMsg << "\n";
                 return 2;
               }
             } else
               return PrintAndReturn(
                 "Post-link optimization output is not bytecode");
           } else {
-            llvm_cerr << argv[0] << ": " << ErrMsg << "\n";
+            cerr << argv[0] << ": " << ErrMsg << "\n";
             return 2;
           }
         }
@@ -556,18 +556,18 @@
           return PrintAndReturn("Failed to find gcc");
 
         // Generate an assembly language file for the bytecode.
-        if (Verbose) llvm_cout << "Generating Assembly Code\n";
+        if (Verbose) cout << "Generating Assembly Code\n";
         std::string ErrMsg;
         if (0 != GenerateAssembly(AssemblyFile.toString(), RealBytecodeOutput,
             llc, ErrMsg)) {
-          llvm_cerr << argv[0] << ": " << ErrMsg << "\n";
+          cerr << argv[0] << ": " << ErrMsg << "\n";
           return 1;
         }
 
-        if (Verbose) llvm_cout << "Generating Native Code\n";
+        if (Verbose) cout << "Generating Native Code\n";
         if (0 != GenerateNative(OutputFilename, AssemblyFile.toString(),
             LinkItems,gcc,envp,ErrMsg)) {
-          llvm_cerr << argv[0] << ": " << ErrMsg << "\n";
+          cerr << argv[0] << ": " << ErrMsg << "\n";
           return 1;
         }
 
@@ -591,18 +591,18 @@
           return PrintAndReturn("Failed to find gcc");
 
         // Generate an assembly language file for the bytecode.
-        if (Verbose) llvm_cout << "Generating Assembly Code\n";
+        if (Verbose) cout << "Generating Assembly Code\n";
         std::string ErrMsg;
         if (0 != GenerateCFile(
             CFile.toString(), RealBytecodeOutput, llc, ErrMsg)) {
-          llvm_cerr << argv[0] << ": " << ErrMsg << "\n";
+          cerr << argv[0] << ": " << ErrMsg << "\n";
           return 1;
         }
 
-        if (Verbose) llvm_cout << "Generating Native Code\n";
+        if (Verbose) cout << "Generating Native Code\n";
         if (0 != GenerateNative(OutputFilename, CFile.toString(), LinkItems, 
             gcc, envp, ErrMsg)) {
-          llvm_cerr << argv[0] << ": " << ErrMsg << "\n";
+          cerr << argv[0] << ": " << ErrMsg << "\n";
           return 1;
         }
 
@@ -616,26 +616,26 @@
       // Make the script executable...
       std::string ErrMsg;
       if (sys::Path(OutputFilename).makeExecutableOnDisk(&ErrMsg)) {
-        llvm_cerr << argv[0] << ": " << ErrMsg << "\n";
+        cerr << argv[0] << ": " << ErrMsg << "\n";
         return 1;
       }
 
       // Make the bytecode file readable and directly executable in LLEE as well
       if (sys::Path(RealBytecodeOutput).makeExecutableOnDisk(&ErrMsg)) {
-        llvm_cerr << argv[0] << ": " << ErrMsg << "\n";
+        cerr << argv[0] << ": " << ErrMsg << "\n";
         return 1;
       }
       if (sys::Path(RealBytecodeOutput).makeReadableOnDisk(&ErrMsg)) {
-        llvm_cerr << argv[0] << ": " << ErrMsg << "\n";
+        cerr << argv[0] << ": " << ErrMsg << "\n";
         return 1;
       }
     }
 
     return 0;
   } catch (const std::string& msg) {
-    llvm_cerr << argv[0] << ": " << msg << "\n";
+    cerr << argv[0] << ": " << msg << "\n";
   } catch (...) {
-    llvm_cerr << argv[0] << ": Unexpected unknown exception occurred.\n";
+    cerr << argv[0] << ": Unexpected unknown exception occurred.\n";
   }
   return 1;
 }
diff --git a/tools/llvm-link/llvm-link.cpp b/tools/llvm-link/llvm-link.cpp
index 35fce1e..be556d1 100644
--- a/tools/llvm-link/llvm-link.cpp
+++ b/tools/llvm-link/llvm-link.cpp
@@ -52,24 +52,23 @@
 static inline std::auto_ptr<Module> LoadFile(const std::string &FN) {
   sys::Path Filename;
   if (!Filename.set(FN)) {
-    llvm_cerr << "Invalid file name: '" << FN << "'\n";
+    cerr << "Invalid file name: '" << FN << "'\n";
     return std::auto_ptr<Module>();
   }
 
   std::string ErrorMessage;
   if (Filename.exists()) {
-    if (Verbose) llvm_cerr << "Loading '" << Filename.c_str() << "'\n";
+    if (Verbose) cerr << "Loading '" << Filename.c_str() << "'\n";
     Module* Result = ParseBytecodeFile(Filename.toString(), &ErrorMessage);
     if (Result) return std::auto_ptr<Module>(Result);   // Load successful!
 
     if (Verbose) {
-      llvm_cerr << "Error opening bytecode file: '" << Filename.c_str() << "'";
-      if (ErrorMessage.size()) llvm_cerr << ": " << ErrorMessage;
-      llvm_cerr << "\n";
+      cerr << "Error opening bytecode file: '" << Filename.c_str() << "'";
+      if (ErrorMessage.size()) cerr << ": " << ErrorMessage;
+      cerr << "\n";
     }
   } else {
-    llvm_cerr << "Bytecode file: '" << Filename.c_str()
-              << "' does not exist.\n";
+    cerr << "Bytecode file: '" << Filename.c_str() << "' does not exist.\n";
   }
 
   return std::auto_ptr<Module>();
@@ -87,24 +86,23 @@
 
     std::auto_ptr<Module> Composite(LoadFile(InputFilenames[BaseArg]));
     if (Composite.get() == 0) {
-      llvm_cerr << argv[0] << ": error loading file '"
-                << InputFilenames[BaseArg] << "'\n";
+      cerr << argv[0] << ": error loading file '"
+           << InputFilenames[BaseArg] << "'\n";
       return 1;
     }
 
     for (unsigned i = BaseArg+1; i < InputFilenames.size(); ++i) {
       std::auto_ptr<Module> M(LoadFile(InputFilenames[i]));
       if (M.get() == 0) {
-        llvm_cerr << argv[0] << ": error loading file '"
-                  << InputFilenames[i] << "'\n";
+        cerr << argv[0] << ": error loading file '" <<InputFilenames[i]<< "'\n";
         return 1;
       }
 
-      if (Verbose) llvm_cerr << "Linking in '" << InputFilenames[i] << "'\n";
+      if (Verbose) cerr << "Linking in '" << InputFilenames[i] << "'\n";
 
       if (Linker::LinkModules(Composite.get(), M.get(), &ErrorMessage)) {
-        llvm_cerr << argv[0] << ": link error in '" << InputFilenames[i]
-                  << "': " << ErrorMessage << "\n";
+        cerr << argv[0] << ": link error in '" << InputFilenames[i]
+             << "': " << ErrorMessage << "\n";
         return 1;
       }
     }
@@ -112,23 +110,23 @@
     // TODO: Iterate over the -l list and link in any modules containing
     // global symbols that have not been resolved so far.
 
-    if (DumpAsm) llvm_cerr << "Here's the assembly:\n" << *Composite.get();
+    if (DumpAsm) cerr << "Here's the assembly:\n" << *Composite.get();
 
     // FIXME: cout is not binary!
     std::ostream *Out = &std::cout;  // Default to printing to stdout...
     if (OutputFilename != "-") {
       if (!Force && std::ifstream(OutputFilename.c_str())) {
         // If force is not specified, make sure not to overwrite a file!
-        llvm_cerr << argv[0] << ": error opening '" << OutputFilename
-                  << "': file exists!\n"
-                  << "Use -f command line argument to force output\n";
+        cerr << argv[0] << ": error opening '" << OutputFilename
+             << "': file exists!\n"
+             << "Use -f command line argument to force output\n";
         return 1;
       }
       std::ios::openmode io_mode = std::ios::out | std::ios::trunc |
                                    std::ios::binary;
       Out = new std::ofstream(OutputFilename.c_str(), io_mode);
       if (!Out->good()) {
-        llvm_cerr << argv[0] << ": error opening '" << OutputFilename << "'!\n";
+        cerr << argv[0] << ": error opening '" << OutputFilename << "'!\n";
         return 1;
       }
 
@@ -138,20 +136,20 @@
     }
 
     if (verifyModule(*Composite.get())) {
-      llvm_cerr << argv[0] << ": linked module is broken!\n";
+      cerr << argv[0] << ": linked module is broken!\n";
       return 1;
     }
 
-    if (Verbose) llvm_cerr << "Writing bytecode...\n";
-    llvm_ostream L(*Out);
+    if (Verbose) cerr << "Writing bytecode...\n";
+    OStream L(*Out);
     WriteBytecodeToFile(Composite.get(), L, !NoCompress);
 
     if (Out != &std::cout) delete Out;
     return 0;
   } catch (const std::string& msg) {
-    llvm_cerr << argv[0] << ": " << msg << "\n";
+    cerr << argv[0] << ": " << msg << "\n";
   } catch (...) {
-    llvm_cerr << argv[0] << ": Unexpected unknown exception occurred.\n";
+    cerr << argv[0] << ": Unexpected unknown exception occurred.\n";
   }
   return 1;
 }
diff --git a/tools/llvm-upgrade/llvm-upgrade.cpp b/tools/llvm-upgrade/llvm-upgrade.cpp
index d39aa92..65ee452 100644
--- a/tools/llvm-upgrade/llvm-upgrade.cpp
+++ b/tools/llvm-upgrade/llvm-upgrade.cpp
@@ -57,9 +57,9 @@
       if (OutputFilename != "-") {  // Not stdout?
         if (!Force && std::ifstream(OutputFilename.c_str())) {
           // If force is not specified, make sure not to overwrite a file!
-          llvm_cerr << argv[0] << ": error opening '" << OutputFilename
-                    << "': file exists!\n"
-                    << "Use -f command line argument to force output\n";
+          cerr << argv[0] << ": error opening '" << OutputFilename
+               << "': file exists!\n"
+               << "Use -f command line argument to force output\n";
           return 1;
         }
         Out = new std::ofstream(OutputFilename.c_str(), std::ios::out |
@@ -84,9 +84,9 @@
 
         if (!Force && std::ifstream(OutputFilename.c_str())) {
           // If force is not specified, make sure not to overwrite a file!
-          llvm_cerr << argv[0] << ": error opening '" << OutputFilename
-                    << "': file exists!\n"
-                    << "Use -f command line argument to force output\n";
+          cerr << argv[0] << ": error opening '" << OutputFilename
+               << "': file exists!\n"
+               << "Use -f command line argument to force output\n";
           return 1;
         }
 
@@ -106,22 +106,22 @@
     }
 
     if (!Out->good()) {
-      llvm_cerr << argv[0] << ": error opening " << OutputFilename << "!\n";
+      cerr << argv[0] << ": error opening " << OutputFilename << "!\n";
       return 1;
     }
 
     if (!In->good()) {
-      llvm_cerr << argv[0] << ": error opening " << InputFilename << "!\n";
+      cerr << argv[0] << ": error opening " << InputFilename << "!\n";
       return 1;
     }
 
     UpgradeAssembly(InputFilename, *In, *Out, Debug);
 
   } catch (const std::string& caught_message) {
-    llvm_cerr << argv[0] << ": " << caught_message << "\n";
+    cerr << argv[0] << ": " << caught_message << "\n";
     exitCode = 1;
   } catch (...) {
-    llvm_cerr << argv[0] << ": Unexpected unknown exception occurred.\n";
+    cerr << argv[0] << ": Unexpected unknown exception occurred.\n";
     exitCode = 1;
   }
 
diff --git a/tools/lto/lto.cpp b/tools/lto/lto.cpp
index 65fcef6..4308297 100644
--- a/tools/lto/lto.cpp
+++ b/tools/lto/lto.cpp
@@ -361,7 +361,7 @@
     std::string tempFileName(FinalOutputPath.c_str());
     tempFileName += "0.bc";
     std::ofstream Out(tempFileName.c_str(), io_mode);
-    llvm_ostream L(Out);
+    OStream L(Out);
     WriteBytecodeToFile(bigOne, L, true);
   }
 
@@ -378,17 +378,17 @@
   std::string ErrMsg;
   sys::Path TempDir = sys::Path::GetTemporaryDirectory(&ErrMsg);
   if (TempDir.isEmpty()) {
-    llvm_cerr << "lto: " << ErrMsg << "\n";
+    cerr << "lto: " << ErrMsg << "\n";
     return LTO_WRITE_FAILURE;
   }
   sys::Path tmpAsmFilePath(TempDir);
   if (!tmpAsmFilePath.appendComponent("lto")) {
-    llvm_cerr << "lto: " << ErrMsg << "\n";
+    cerr << "lto: " << ErrMsg << "\n";
     TempDir.eraseFromDisk(true);
     return LTO_WRITE_FAILURE;
   }
   if (tmpAsmFilePath.createTemporaryFileOnDisk(&ErrMsg)) {
-    llvm_cerr << "lto: " << ErrMsg << "\n";
+    cerr << "lto: " << ErrMsg << "\n";
     TempDir.eraseFromDisk(true);
     return LTO_WRITE_FAILURE;
   }
@@ -415,7 +415,7 @@
     std::string tempFileName(FinalOutputPath.c_str());
     tempFileName += "1.bc";
     std::ofstream Out(tempFileName.c_str(), io_mode);
-    llvm_ostream L(Out);
+    OStream L(Out);
     WriteBytecodeToFile(bigOne, L, true);
   }
 
@@ -445,7 +445,7 @@
   args.push_back(0);
 
   if (sys::Program::ExecuteAndWait(gcc, &args[0], 0, 0, 1, &ErrMsg)) {
-    llvm_cerr << "lto: " << ErrMsg << "\n";
+    cerr << "lto: " << ErrMsg << "\n";
     return LTO_ASM_FAILURE;
   }
 
diff --git a/tools/opt/opt.cpp b/tools/opt/opt.cpp
index 6afdc68..7d5dd21 100644
--- a/tools/opt/opt.cpp
+++ b/tools/opt/opt.cpp
@@ -87,9 +87,8 @@
 
   virtual bool runOnModule(Module &M) {
     if (!Quiet) {
-      llvm_cout << "Printing analysis '" << PassToPrint->getPassName() 
-                << "':\n";
-      getAnalysisID<Pass>(PassToPrint).print(llvm_cout, &M);
+      cout << "Printing analysis '" << PassToPrint->getPassName() << "':\n";
+      getAnalysisID<Pass>(PassToPrint).print(cout, &M);
     }
 
     // Get and print pass...
@@ -110,11 +109,11 @@
 
   virtual bool runOnFunction(Function &F) {
     if (!Quiet) {
-      llvm_cout << "Printing analysis '" << PassToPrint->getPassName()
-		<< "' for function '" << F.getName() << "':\n";
+      cout << "Printing analysis '" << PassToPrint->getPassName()
+           << "' for function '" << F.getName() << "':\n";
     }
     // Get and print pass...
-    getAnalysisID<Pass>(PassToPrint).print(llvm_cout, F.getParent());
+    getAnalysisID<Pass>(PassToPrint).print(cout, F.getParent());
     return false;
   }
 
@@ -132,13 +131,12 @@
 
   virtual bool runOnBasicBlock(BasicBlock &BB) {
     if (!Quiet) {
-      llvm_cout << "Printing Analysis info for BasicBlock '" << BB.getName()
-		<< "': Pass " << PassToPrint->getPassName() << ":\n";
+      cout << "Printing Analysis info for BasicBlock '" << BB.getName()
+           << "': Pass " << PassToPrint->getPassName() << ":\n";
     }
 
     // Get and print pass...
-    getAnalysisID<Pass>(PassToPrint).print(
-      llvm_cout, BB.getParent()->getParent());
+    getAnalysisID<Pass>(PassToPrint).print(cout, BB.getParent()->getParent());
     return false;
   }
 
@@ -172,11 +170,11 @@
     // Load the input module...
     std::auto_ptr<Module> M(ParseBytecodeFile(InputFilename, &ErrorMessage));
     if (M.get() == 0) {
-      llvm_cerr << argv[0] << ": ";
+      cerr << argv[0] << ": ";
       if (ErrorMessage.size())
-        llvm_cerr << ErrorMessage << "\n";
+        cerr << ErrorMessage << "\n";
       else
-        llvm_cerr << "bytecode didn't read correctly.\n";
+        cerr << "bytecode didn't read correctly.\n";
       return 1;
     }
 
@@ -186,9 +184,9 @@
     if (OutputFilename != "-") {
       if (!Force && std::ifstream(OutputFilename.c_str())) {
         // If force is not specified, make sure not to overwrite a file!
-        llvm_cerr << argv[0] << ": error opening '" << OutputFilename
-                  << "': file exists!\n"
-                  << "Use -f command line argument to force output\n";
+        cerr << argv[0] << ": error opening '" << OutputFilename
+             << "': file exists!\n"
+             << "Use -f command line argument to force output\n";
         return 1;
       }
       std::ios::openmode io_mode = std::ios::out | std::ios::trunc |
@@ -196,7 +194,7 @@
       Out = new std::ofstream(OutputFilename.c_str(), io_mode);
 
       if (!Out->good()) {
-        llvm_cerr << argv[0] << ": error opening " << OutputFilename << "!\n";
+        cerr << argv[0] << ": error opening " << OutputFilename << "!\n";
         return 1;
       }
 
@@ -227,8 +225,8 @@
       if (PassInf->getNormalCtor())
         P = PassInf->getNormalCtor()();
       else
-        llvm_cerr << argv[0] << ": cannot create pass: "
-                  << PassInf->getPassName() << "\n";
+        cerr << argv[0] << ": cannot create pass: "
+             << PassInf->getPassName() << "\n";
       if (P) {
         Passes.add(P);
         
@@ -243,7 +241,7 @@
       }
       
       if (PrintEachXForm)
-        Passes.add(new PrintModulePass(&llvm_cerr));
+        Passes.add(new PrintModulePass(&cerr));
     }
 
     // Check that the module is well formed on completion of optimization
@@ -251,7 +249,7 @@
       Passes.add(createVerifierPass());
 
     // Write bytecode out to disk or cout as the last step...
-    llvm_ostream L(*Out);
+    OStream L(*Out);
     if (!NoOutput && !AnalyzeOnly)
       Passes.add(new WriteBytecodePass(&L, false, !NoCompress));
 
@@ -261,9 +259,9 @@
     return 0;
 
   } catch (const std::string& msg) {
-    llvm_cerr << argv[0] << ": " << msg << "\n";
+    cerr << argv[0] << ": " << msg << "\n";
   } catch (...) {
-    llvm_cerr << argv[0] << ": Unexpected unknown exception occurred.\n";
+    cerr << argv[0] << ": Unexpected unknown exception occurred.\n";
   }
   return 1;
 }
