For PR950:
[oota-llvm.git] / lib / ExecutionEngine / Interpreter / Execution.cpp
index 2ecd72eb3b94de7d04ff40f8704797f192b790fe..8c812f82d4da7cfb6d3d3e0a70de0945c0004f27 100644 (file)
@@ -1,12 +1,12 @@
 //===-- Execution.cpp - Implement code to simulate the program ------------===//
-// 
+//
 //                     The LLVM Compiler Infrastructure
 //
 // This file was developed by the LLVM research group and is distributed under
 // the University of Illinois Open Source License. See LICENSE.TXT for details.
-// 
+//
 //===----------------------------------------------------------------------===//
-// 
+//
 //  This file contains the actual instruction interpreter.
 //
 //===----------------------------------------------------------------------===//
 #include "llvm/Constants.h"
 #include "llvm/DerivedTypes.h"
 #include "llvm/Instructions.h"
-#include "llvm/IntrinsicLowering.h"
+#include "llvm/CodeGen/IntrinsicLowering.h"
 #include "llvm/Support/GetElementPtrTypeIterator.h"
-#include "Support/Statistic.h"
-#include "Support/Debug.h"
+#include "llvm/ADT/Statistic.h"
+#include "llvm/Support/Debug.h"
 #include <cmath>  // For fmod
 using namespace llvm;
 
@@ -34,39 +34,39 @@ namespace {
 //                     Value Manipulation code
 //===----------------------------------------------------------------------===//
 
-static GenericValue executeAddInst(GenericValue Src1, GenericValue Src2, 
-                                  const Type *Ty);
-static GenericValue executeSubInst(GenericValue Src1, GenericValue Src2, 
-                                  const Type *Ty);
-static GenericValue executeMulInst(GenericValue Src1, GenericValue Src2, 
-                                  const Type *Ty);
-static GenericValue executeRemInst(GenericValue Src1, GenericValue Src2, 
-                                  const Type *Ty);
-static GenericValue executeDivInst(GenericValue Src1, GenericValue Src2, 
-                                  const Type *Ty);
-static GenericValue executeAndInst(GenericValue Src1, GenericValue Src2, 
-                                  const Type *Ty);
-static GenericValue executeOrInst(GenericValue Src1, GenericValue Src2, 
-                                  const Type *Ty);
-static GenericValue executeXorInst(GenericValue Src1, GenericValue Src2, 
-                                  const Type *Ty);
-static GenericValue executeSetEQInst(GenericValue Src1, GenericValue Src2, 
-                                  const Type *Ty);
-static GenericValue executeSetNEInst(GenericValue Src1, GenericValue Src2, 
-                                  const Type *Ty);
-static GenericValue executeSetLTInst(GenericValue Src1, GenericValue Src2, 
-                                  const Type *Ty);
-static GenericValue executeSetGTInst(GenericValue Src1, GenericValue Src2, 
-                                  const Type *Ty);
-static GenericValue executeSetLEInst(GenericValue Src1, GenericValue Src2, 
-                                  const Type *Ty);
-static GenericValue executeSetGEInst(GenericValue Src1, GenericValue Src2, 
-                                  const Type *Ty);
-static GenericValue executeShlInst(GenericValue Src1, GenericValue Src2, 
-                                  const Type *Ty);
-static GenericValue executeShrInst(GenericValue Src1, GenericValue Src2, 
-                                  const Type *Ty);
-static GenericValue executeSelectInst(GenericValue Src1, GenericValue Src2, 
+static GenericValue executeAddInst(GenericValue Src1, GenericValue Src2,
+                                   const Type *Ty);
+static GenericValue executeSubInst(GenericValue Src1, GenericValue Src2,
+                                   const Type *Ty);
+static GenericValue executeMulInst(GenericValue Src1, GenericValue Src2,
+                                   const Type *Ty);
+static GenericValue executeRemInst(GenericValue Src1, GenericValue Src2,
+                                   const Type *Ty);
+static GenericValue executeDivInst(GenericValue Src1, GenericValue Src2,
+                                   const Type *Ty);
+static GenericValue executeAndInst(GenericValue Src1, GenericValue Src2,
+                                   const Type *Ty);
+static GenericValue executeOrInst(GenericValue Src1, GenericValue Src2,
+                                   const Type *Ty);
+static GenericValue executeXorInst(GenericValue Src1, GenericValue Src2,
+                                   const Type *Ty);
+static GenericValue executeSetEQInst(GenericValue Src1, GenericValue Src2,
+                                   const Type *Ty);
+static GenericValue executeSetNEInst(GenericValue Src1, GenericValue Src2,
+                                   const Type *Ty);
+static GenericValue executeSetLTInst(GenericValue Src1, GenericValue Src2,
+                                   const Type *Ty);
+static GenericValue executeSetGTInst(GenericValue Src1, GenericValue Src2,
+                                   const Type *Ty);
+static GenericValue executeSetLEInst(GenericValue Src1, GenericValue Src2,
+                                   const Type *Ty);
+static GenericValue executeSetGEInst(GenericValue Src1, GenericValue Src2,
+                                   const Type *Ty);
+static GenericValue executeShlInst(GenericValue Src1, GenericValue Src2,
+                                   const Type *Ty);
+static GenericValue executeShrInst(GenericValue Src1, GenericValue Src2,
+                                   const Type *Ty);
+static GenericValue executeSelectInst(GenericValue Src1, GenericValue Src2,
                                       GenericValue Src3);
 
 GenericValue Interpreter::getConstantExprValue (ConstantExpr *CE,
@@ -146,7 +146,7 @@ GenericValue Interpreter::getConstantExprValue (ConstantExpr *CE,
                              getOperandValue(CE->getOperand(1), SF),
                              getOperandValue(CE->getOperand(2), SF));
   default:
-    std::cerr << "Unhandled ConstantExpr: " << CE << "\n";
+    std::cerr << "Unhandled ConstantExpr: " << *CE << "\n";
     abort();
     return GenericValue();
   }
@@ -179,10 +179,10 @@ void Interpreter::initializeExecutionEngine() {
 #define IMPLEMENT_BINARY_OPERATOR(OP, TY) \
    case Type::TY##TyID: Dest.TY##Val = Src1.TY##Val OP Src2.TY##Val; break
 
-static GenericValue executeAddInst(GenericValue Src1, GenericValue Src2, 
-                                  const Type *Ty) {
+static GenericValue executeAddInst(GenericValue Src1, GenericValue Src2,
+                                   const Type *Ty) {
   GenericValue Dest;
-  switch (Ty->getPrimitiveID()) {
+  switch (Ty->getTypeID()) {
     IMPLEMENT_BINARY_OPERATOR(+, UByte);
     IMPLEMENT_BINARY_OPERATOR(+, SByte);
     IMPLEMENT_BINARY_OPERATOR(+, UShort);
@@ -200,10 +200,10 @@ static GenericValue executeAddInst(GenericValue Src1, GenericValue Src2,
   return Dest;
 }
 
-static GenericValue executeSubInst(GenericValue Src1, GenericValue Src2, 
-                                  const Type *Ty) {
+static GenericValue executeSubInst(GenericValue Src1, GenericValue Src2,
+                                   const Type *Ty) {
   GenericValue Dest;
-  switch (Ty->getPrimitiveID()) {
+  switch (Ty->getTypeID()) {
     IMPLEMENT_BINARY_OPERATOR(-, UByte);
     IMPLEMENT_BINARY_OPERATOR(-, SByte);
     IMPLEMENT_BINARY_OPERATOR(-, UShort);
@@ -221,10 +221,10 @@ static GenericValue executeSubInst(GenericValue Src1, GenericValue Src2,
   return Dest;
 }
 
-static GenericValue executeMulInst(GenericValue Src1, GenericValue Src2, 
-                                  const Type *Ty) {
+static GenericValue executeMulInst(GenericValue Src1, GenericValue Src2,
+                                   const Type *Ty) {
   GenericValue Dest;
-  switch (Ty->getPrimitiveID()) {
+  switch (Ty->getTypeID()) {
     IMPLEMENT_BINARY_OPERATOR(*, UByte);
     IMPLEMENT_BINARY_OPERATOR(*, SByte);
     IMPLEMENT_BINARY_OPERATOR(*, UShort);
@@ -236,16 +236,16 @@ static GenericValue executeMulInst(GenericValue Src1, GenericValue Src2,
     IMPLEMENT_BINARY_OPERATOR(*, Float);
     IMPLEMENT_BINARY_OPERATOR(*, Double);
   default:
-    std::cout << "Unhandled type for Mul instruction: " << Ty << "\n";
+    std::cout << "Unhandled type for Mul instruction: " << *Ty << "\n";
     abort();
   }
   return Dest;
 }
 
-static GenericValue executeDivInst(GenericValue Src1, GenericValue Src2, 
-                                  const Type *Ty) {
+static GenericValue executeDivInst(GenericValue Src1, GenericValue Src2,
+                                   const Type *Ty) {
   GenericValue Dest;
-  switch (Ty->getPrimitiveID()) {
+  switch (Ty->getTypeID()) {
     IMPLEMENT_BINARY_OPERATOR(/, UByte);
     IMPLEMENT_BINARY_OPERATOR(/, SByte);
     IMPLEMENT_BINARY_OPERATOR(/, UShort);
@@ -263,10 +263,10 @@ static GenericValue executeDivInst(GenericValue Src1, GenericValue Src2,
   return Dest;
 }
 
-static GenericValue executeRemInst(GenericValue Src1, GenericValue Src2, 
-                                  const Type *Ty) {
+static GenericValue executeRemInst(GenericValue Src1, GenericValue Src2,
+                                   const Type *Ty) {
   GenericValue Dest;
-  switch (Ty->getPrimitiveID()) {
+  switch (Ty->getTypeID()) {
     IMPLEMENT_BINARY_OPERATOR(%, UByte);
     IMPLEMENT_BINARY_OPERATOR(%, SByte);
     IMPLEMENT_BINARY_OPERATOR(%, UShort);
@@ -288,10 +288,10 @@ static GenericValue executeRemInst(GenericValue Src1, GenericValue Src2,
   return Dest;
 }
 
-static GenericValue executeAndInst(GenericValue Src1, GenericValue Src2, 
-                                  const Type *Ty) {
+static GenericValue executeAndInst(GenericValue Src1, GenericValue Src2,
+                                   const Type *Ty) {
   GenericValue Dest;
-  switch (Ty->getPrimitiveID()) {
+  switch (Ty->getTypeID()) {
     IMPLEMENT_BINARY_OPERATOR(&, Bool);
     IMPLEMENT_BINARY_OPERATOR(&, UByte);
     IMPLEMENT_BINARY_OPERATOR(&, SByte);
@@ -308,10 +308,10 @@ static GenericValue executeAndInst(GenericValue Src1, GenericValue Src2,
   return Dest;
 }
 
-static GenericValue executeOrInst(GenericValue Src1, GenericValue Src2, 
+static GenericValue executeOrInst(GenericValue Src1, GenericValue Src2,
                                   const Type *Ty) {
   GenericValue Dest;
-  switch (Ty->getPrimitiveID()) {
+  switch (Ty->getTypeID()) {
     IMPLEMENT_BINARY_OPERATOR(|, Bool);
     IMPLEMENT_BINARY_OPERATOR(|, UByte);
     IMPLEMENT_BINARY_OPERATOR(|, SByte);
@@ -328,10 +328,10 @@ static GenericValue executeOrInst(GenericValue Src1, GenericValue Src2,
   return Dest;
 }
 
-static GenericValue executeXorInst(GenericValue Src1, GenericValue Src2, 
+static GenericValue executeXorInst(GenericValue Src1, GenericValue Src2,
                                    const Type *Ty) {
   GenericValue Dest;
-  switch (Ty->getPrimitiveID()) {
+  switch (Ty->getTypeID()) {
     IMPLEMENT_BINARY_OPERATOR(^, Bool);
     IMPLEMENT_BINARY_OPERATOR(^, UByte);
     IMPLEMENT_BINARY_OPERATOR(^, SByte);
@@ -360,10 +360,10 @@ static GenericValue executeXorInst(GenericValue Src1, GenericValue Src2,
         Dest.BoolVal = (void*)(intptr_t)Src1.PointerVal OP \
                        (void*)(intptr_t)Src2.PointerVal; break
 
-static GenericValue executeSetEQInst(GenericValue Src1, GenericValue Src2, 
-                                    const Type *Ty) {
+static GenericValue executeSetEQInst(GenericValue Src1, GenericValue Src2,
+                                     const Type *Ty) {
   GenericValue Dest;
-  switch (Ty->getPrimitiveID()) {
+  switch (Ty->getTypeID()) {
     IMPLEMENT_SETCC(==, UByte);
     IMPLEMENT_SETCC(==, SByte);
     IMPLEMENT_SETCC(==, UShort);
@@ -382,10 +382,10 @@ static GenericValue executeSetEQInst(GenericValue Src1, GenericValue Src2,
   return Dest;
 }
 
-static GenericValue executeSetNEInst(GenericValue Src1, GenericValue Src2, 
-                                    const Type *Ty) {
+static GenericValue executeSetNEInst(GenericValue Src1, GenericValue Src2,
+                                     const Type *Ty) {
   GenericValue Dest;
-  switch (Ty->getPrimitiveID()) {
+  switch (Ty->getTypeID()) {
     IMPLEMENT_SETCC(!=, UByte);
     IMPLEMENT_SETCC(!=, SByte);
     IMPLEMENT_SETCC(!=, UShort);
@@ -405,10 +405,10 @@ static GenericValue executeSetNEInst(GenericValue Src1, GenericValue Src2,
   return Dest;
 }
 
-static GenericValue executeSetLEInst(GenericValue Src1, GenericValue Src2, 
-                                    const Type *Ty) {
+static GenericValue executeSetLEInst(GenericValue Src1, GenericValue Src2,
+                                     const Type *Ty) {
   GenericValue Dest;
-  switch (Ty->getPrimitiveID()) {
+  switch (Ty->getTypeID()) {
     IMPLEMENT_SETCC(<=, UByte);
     IMPLEMENT_SETCC(<=, SByte);
     IMPLEMENT_SETCC(<=, UShort);
@@ -421,16 +421,16 @@ static GenericValue executeSetLEInst(GenericValue Src1, GenericValue Src2,
     IMPLEMENT_SETCC(<=, Double);
     IMPLEMENT_POINTERSETCC(<=);
   default:
-    std::cout << "Unhandled type for SetLE instruction: " << Ty << "\n";
+    std::cout << "Unhandled type for SetLE instruction: " << *Ty << "\n";
     abort();
   }
   return Dest;
 }
 
-static GenericValue executeSetGEInst(GenericValue Src1, GenericValue Src2, 
-                                    const Type *Ty) {
+static GenericValue executeSetGEInst(GenericValue Src1, GenericValue Src2,
+                                     const Type *Ty) {
   GenericValue Dest;
-  switch (Ty->getPrimitiveID()) {
+  switch (Ty->getTypeID()) {
     IMPLEMENT_SETCC(>=, UByte);
     IMPLEMENT_SETCC(>=, SByte);
     IMPLEMENT_SETCC(>=, UShort);
@@ -449,10 +449,10 @@ static GenericValue executeSetGEInst(GenericValue Src1, GenericValue Src2,
   return Dest;
 }
 
-static GenericValue executeSetLTInst(GenericValue Src1, GenericValue Src2, 
-                                    const Type *Ty) {
+static GenericValue executeSetLTInst(GenericValue Src1, GenericValue Src2,
+                                     const Type *Ty) {
   GenericValue Dest;
-  switch (Ty->getPrimitiveID()) {
+  switch (Ty->getTypeID()) {
     IMPLEMENT_SETCC(<, UByte);
     IMPLEMENT_SETCC(<, SByte);
     IMPLEMENT_SETCC(<, UShort);
@@ -471,10 +471,10 @@ static GenericValue executeSetLTInst(GenericValue Src1, GenericValue Src2,
   return Dest;
 }
 
-static GenericValue executeSetGTInst(GenericValue Src1, GenericValue Src2, 
-                                    const Type *Ty) {
+static GenericValue executeSetGTInst(GenericValue Src1, GenericValue Src2,
+                                     const Type *Ty) {
   GenericValue Dest;
-  switch (Ty->getPrimitiveID()) {
+  switch (Ty->getTypeID()) {
     IMPLEMENT_SETCC(>, UByte);
     IMPLEMENT_SETCC(>, SByte);
     IMPLEMENT_SETCC(>, UShort);
@@ -523,7 +523,7 @@ void Interpreter::visitBinaryOperator(BinaryOperator &I) {
   SetValue(&I, R, SF);
 }
 
-static GenericValue executeSelectInst(GenericValue Src1, GenericValue Src2, 
+static GenericValue executeSelectInst(GenericValue Src1, GenericValue Src2,
                                       GenericValue Src3) {
   return Src1.BoolVal ? Src2 : Src3;
 }
@@ -553,7 +553,7 @@ void Interpreter::exitCalled(GenericValue GV) {
 
 /// Pop the last stack frame off of ECStack and then copy the result
 /// back into the result variable if we are not returning void. The
-/// result variable may be the ExitCode, or the Value of the calling
+/// result variable may be the ExitValue, or the Value of the calling
 /// CallInst if there was a previous stack frame. This method may
 /// invalidate any ECStack iterators you have. This method also takes
 /// care of switching to the normal destination BB, if we are returning
@@ -564,15 +564,15 @@ void Interpreter::popStackAndReturnValueToCaller (const Type *RetTy,
   // Pop the current stack frame.
   ECStack.pop_back();
 
-  if (ECStack.empty()) {  // Finished main.  Put result into exit code... 
-    if (RetTy && RetTy->isIntegral()) {          // Nonvoid return type?       
-      ExitCode = Result.IntVal;   // Capture the exit code of the program 
-    } else { 
-      ExitCode = 0; 
-    } 
-  } else { 
-    // If we have a previous stack frame, and we have a previous call, 
-    // fill in the return value... 
+  if (ECStack.empty()) {  // Finished main.  Put result into exit code...
+    if (RetTy && RetTy->isIntegral()) {          // Nonvoid return type?
+      ExitValue = Result;   // Capture the exit value of the program
+    } else {
+      memset(&ExitValue, 0, sizeof(ExitValue));
+    }
+  } else {
+    // If we have a previous stack frame, and we have a previous call,
+    // fill in the return value...
     ExecutionContext &CallingSF = ECStack.back();
     if (Instruction *I = CallingSF.Caller.getInstruction()) {
       if (CallingSF.Caller.getType() != Type::VoidTy)      // Save result...
@@ -616,6 +616,11 @@ void Interpreter::visitUnwindInst(UnwindInst &I) {
   SwitchToNewBasicBlock(cast<InvokeInst>(Inst)->getUnwindDest(), InvokingSF);
 }
 
+void Interpreter::visitUnreachableInst(UnreachableInst &I) {
+  std::cerr << "ERROR: Program executed an 'unreachable' instruction!\n";
+  abort();
+}
+
 void Interpreter::visitBranchInst(BranchInst &I) {
   ExecutionContext &SF = ECStack.back();
   BasicBlock *Dest;
@@ -624,7 +629,7 @@ void Interpreter::visitBranchInst(BranchInst &I) {
   if (!I.isUnconditional()) {
     Value *Cond = I.getCondition();
     if (getOperandValue(Cond, SF).BoolVal == 0) // If false cond...
-      Dest = I.getSuccessor(1);    
+      Dest = I.getSuccessor(1);
   }
   SwitchToNewBasicBlock(Dest, SF);
 }
@@ -642,7 +647,7 @@ void Interpreter::visitSwitchInst(SwitchInst &I) {
       Dest = cast<BasicBlock>(I.getOperand(i+1));
       break;
     }
-  
+
   if (!Dest) Dest = I.getDefaultDest();   // No cases matched: use default
   SwitchToNewBasicBlock(Dest, SF);
 }
@@ -672,16 +677,17 @@ void Interpreter::SwitchToNewBasicBlock(BasicBlock *Dest, ExecutionContext &SF){
     int i = PN->getBasicBlockIndex(PrevBB);
     assert(i != -1 && "PHINode doesn't contain entry for predecessor??");
     Value *IncomingValue = PN->getIncomingValue(i);
-    
+
     // Save the incoming value for this PHI node...
     ResultValues.push_back(getOperandValue(IncomingValue, SF));
   }
 
   // Now loop over all of the PHI nodes setting their values...
   SF.CurInst = SF.CurBB->begin();
-  for (unsigned i = 0; PHINode *PN = dyn_cast<PHINode>(SF.CurInst);
-       ++SF.CurInst, ++i)
+  for (unsigned i = 0; isa<PHINode>(SF.CurInst); ++SF.CurInst, ++i) {
+    PHINode *PN = cast<PHINode>(SF.CurInst);
     SetValue(PN, ResultValues[i], SF);
+  }
 }
 
 //===----------------------------------------------------------------------===//
@@ -697,7 +703,7 @@ void Interpreter::visitAllocationInst(AllocationInst &I) {
   unsigned NumElements = getOperandValue(I.getOperand(0), SF).UIntVal;
 
   // Allocate enough memory to hold the type...
-  void *Memory = malloc(NumElements * TD.getTypeSize(Ty));
+  void *Memory = malloc(NumElements * (size_t)TD.getTypeSize(Ty));
 
   GenericValue Result = PTOGV(Memory);
   assert(Result.PointerVal != 0 && "Null pointer returned by malloc!");
@@ -718,8 +724,8 @@ void Interpreter::visitFreeInst(FreeInst &I) {
 // getElementOffset - The workhorse for getelementptr.
 //
 GenericValue Interpreter::executeGEPOperation(Value *Ptr, gep_type_iterator I,
-                                             gep_type_iterator E,
-                                             ExecutionContext &SF) {
+                                              gep_type_iterator E,
+                                              ExecutionContext &SF) {
   assert(isa<PointerType>(Ptr->getType()) &&
          "Cannot getElementOffset of a nonpointer type!");
 
@@ -728,18 +734,18 @@ GenericValue Interpreter::executeGEPOperation(Value *Ptr, gep_type_iterator I,
   for (; I != E; ++I) {
     if (const StructType *STy = dyn_cast<StructType>(*I)) {
       const StructLayout *SLO = TD.getStructLayout(STy);
-      
-      const ConstantUInt *CPU = cast<ConstantUInt>(I.getOperand());
-      unsigned Index = CPU->getValue();
-      
-      Total += SLO->MemberOffsets[Index];
+
+      const ConstantInt *CPU = cast<ConstantInt>(I.getOperand());
+      unsigned Index = unsigned(CPU->getZExtValue());
+
+      Total += (PointerTy)SLO->MemberOffsets[Index];
     } else {
       const SequentialType *ST = cast<SequentialType>(*I);
       // Get the index number for the array... which must be long type...
       GenericValue IdxGV = getOperandValue(I.getOperand(), SF);
 
       uint64_t Idx;
-      switch (I.getOperand()->getType()->getPrimitiveID()) {
+      switch (I.getOperand()->getType()->getTypeID()) {
       default: assert(0 && "Illegal getelementptr index for sequential type!");
       case Type::SByteTyID:  Idx = IdxGV.SByteVal; break;
       case Type::ShortTyID:  Idx = IdxGV.ShortVal; break;
@@ -750,7 +756,7 @@ GenericValue Interpreter::executeGEPOperation(Value *Ptr, gep_type_iterator I,
       case Type::UIntTyID:   Idx = IdxGV.UIntVal; break;
       case Type::ULongTyID:  Idx = IdxGV.ULongVal; break;
       }
-      Total += TD.getTypeSize(ST->getElementType())*Idx;
+      Total += PointerTy(TD.getTypeSize(ST->getElementType())*Idx);
     }
   }
 
@@ -822,6 +828,7 @@ void Interpreter::visitCallSite(CallSite CS) {
         SF.CurInst = Prev;
         ++SF.CurInst;
       }
+      return;
     }
 
   SF.Caller = CS;
@@ -838,23 +845,23 @@ void Interpreter::visitCallSite(CallSite CS) {
     const Type *Ty = V->getType();
     if (Ty->isIntegral() && Ty->getPrimitiveSize() < 4) {
       if (Ty == Type::ShortTy)
-       ArgVals.back().IntVal = ArgVals.back().ShortVal;
+        ArgVals.back().IntVal = ArgVals.back().ShortVal;
       else if (Ty == Type::UShortTy)
-       ArgVals.back().UIntVal = ArgVals.back().UShortVal;
+        ArgVals.back().UIntVal = ArgVals.back().UShortVal;
       else if (Ty == Type::SByteTy)
-       ArgVals.back().IntVal = ArgVals.back().SByteVal;
+        ArgVals.back().IntVal = ArgVals.back().SByteVal;
       else if (Ty == Type::UByteTy)
-       ArgVals.back().UIntVal = ArgVals.back().UByteVal;
+        ArgVals.back().UIntVal = ArgVals.back().UByteVal;
       else if (Ty == Type::BoolTy)
-       ArgVals.back().UIntVal = ArgVals.back().BoolVal;
+        ArgVals.back().UIntVal = ArgVals.back().BoolVal;
       else
-       assert(0 && "Unknown type!");
+        assert(0 && "Unknown type!");
     }
   }
 
-  // To handle indirect calls, we must get the pointer value from the argument 
+  // To handle indirect calls, we must get the pointer value from the argument
   // and treat it as a function pointer.
-  GenericValue SRC = getOperandValue(SF.Caller.getCalledValue(), SF);  
+  GenericValue SRC = getOperandValue(SF.Caller.getCalledValue(), SF);
   callFunction((Function*)GVTOP(SRC), ArgVals);
 }
 
@@ -864,7 +871,7 @@ void Interpreter::visitCallSite(CallSite CS) {
 static GenericValue executeShlInst(GenericValue Src1, GenericValue Src2,
                                    const Type *Ty) {
   GenericValue Dest;
-  switch (Ty->getPrimitiveID()) {
+  switch (Ty->getTypeID()) {
     IMPLEMENT_SHIFT(<<, UByte);
     IMPLEMENT_SHIFT(<<, SByte);
     IMPLEMENT_SHIFT(<<, UShort);
@@ -882,7 +889,7 @@ static GenericValue executeShlInst(GenericValue Src1, GenericValue Src2,
 static GenericValue executeShrInst(GenericValue Src1, GenericValue Src2,
                                    const Type *Ty) {
   GenericValue Dest;
-  switch (Ty->getPrimitiveID()) {
+  switch (Ty->getTypeID()) {
     IMPLEMENT_SHIFT(>>, UByte);
     IMPLEMENT_SHIFT(>>, SByte);
     IMPLEMENT_SHIFT(>>, UShort);
@@ -923,7 +930,7 @@ void Interpreter::visitShr(ShiftInst &I) {
 
 #define IMPLEMENT_CAST_CASE_START(DESTTY, DESTCTY)    \
   case Type::DESTTY##TyID:                      \
-    switch (SrcTy->getPrimitiveID()) {          \
+    switch (SrcTy->getTypeID()) {          \
       IMPLEMENT_CAST(DESTTY, DESTCTY, Bool);    \
       IMPLEMENT_CAST(DESTTY, DESTCTY, UByte);   \
       IMPLEMENT_CAST(DESTTY, DESTCTY, SByte);   \
@@ -940,7 +947,7 @@ void Interpreter::visitShr(ShiftInst &I) {
       IMPLEMENT_CAST(DESTTY, DESTCTY, Double)
 
 #define IMPLEMENT_CAST_CASE_END()    \
-    default: std::cout << "Unhandled cast: " << SrcTy << " to " << Ty << "\n"; \
+    default: std::cout << "Unhandled cast: " << *SrcTy << " to " << *Ty << "\n"; \
       abort();                                  \
     }                                           \
     break
@@ -951,11 +958,11 @@ void Interpreter::visitShr(ShiftInst &I) {
    IMPLEMENT_CAST_CASE_END()
 
 GenericValue Interpreter::executeCastOperation(Value *SrcVal, const Type *Ty,
-                                              ExecutionContext &SF) {
+                                               ExecutionContext &SF) {
   const Type *SrcTy = SrcVal->getType();
   GenericValue Dest, Src = getOperandValue(SrcVal, SF);
 
-  switch (Ty->getPrimitiveID()) {
+  switch (Ty->getTypeID()) {
     IMPLEMENT_CAST_CASE(UByte  , (unsigned char));
     IMPLEMENT_CAST_CASE(SByte  , (  signed char));
     IMPLEMENT_CAST_CASE(UShort , (unsigned short));
@@ -981,18 +988,6 @@ void Interpreter::visitCastInst(CastInst &I) {
   SetValue(&I, executeCastOperation(I.getOperand(0), I.getType(), SF), SF);
 }
 
-void Interpreter::visitVANextInst(VANextInst &I) {
-  ExecutionContext &SF = ECStack.back();
-
-  // Get the incoming valist parameter.  LLI treats the valist as a
-  // (ec-stack-depth var-arg-index) pair.
-  GenericValue VAList = getOperandValue(I.getOperand(0), SF);
-  
-  // Move the pointer to the next vararg.
-  ++VAList.UIntPairVal.second;
-  SetValue(&I, VAList, SF);
-}
-
 #define IMPLEMENT_VAARG(TY) \
    case Type::TY##TyID: Dest.TY##Val = Src.TY##Val; break
 
@@ -1004,9 +999,9 @@ void Interpreter::visitVAArgInst(VAArgInst &I) {
   GenericValue VAList = getOperandValue(I.getOperand(0), SF);
   GenericValue Dest;
   GenericValue Src = ECStack[VAList.UIntPairVal.first]
-       .VarArgs[VAList.UIntPairVal.second];
+   .VarArgs[VAList.UIntPairVal.second];
   const Type *Ty = I.getType();
-  switch (Ty->getPrimitiveID()) {
+  switch (Ty->getTypeID()) {
     IMPLEMENT_VAARG(UByte);
     IMPLEMENT_VAARG(SByte);
     IMPLEMENT_VAARG(UShort);
@@ -1023,9 +1018,12 @@ void Interpreter::visitVAArgInst(VAArgInst &I) {
     std::cout << "Unhandled dest type for vaarg instruction: " << *Ty << "\n";
     abort();
   }
-  
+
   // Set the Value of this Instruction.
   SetValue(&I, Dest, SF);
+
+  // Move the pointer to the next vararg.
+  ++VAList.UIntPairVal.second;
 }
 
 //===----------------------------------------------------------------------===//
@@ -1037,9 +1035,9 @@ void Interpreter::visitVAArgInst(VAArgInst &I) {
 //
 void Interpreter::callFunction(Function *F,
                                const std::vector<GenericValue> &ArgVals) {
-  assert((ECStack.empty() || ECStack.back().Caller.getInstruction() == 0 || 
-         ECStack.back().Caller.arg_size() == ArgVals.size()) &&
-        "Incorrect number of arguments passed into function call!");
+  assert((ECStack.empty() || ECStack.back().Caller.getInstruction() == 0 ||
+          ECStack.back().Caller.arg_size() == ArgVals.size()) &&
+         "Incorrect number of arguments passed into function call!");
   // Make a new stack frame... and fill it in.
   ECStack.push_back(ExecutionContext());
   ExecutionContext &StackFrame = ECStack.back();
@@ -1058,13 +1056,13 @@ void Interpreter::callFunction(Function *F,
   StackFrame.CurInst   = StackFrame.CurBB->begin();
 
   // Run through the function arguments and initialize their values...
-  assert((ArgVals.size() == F->asize() ||
-         (ArgVals.size() > F->asize() && F->getFunctionType()->isVarArg())) &&
+  assert((ArgVals.size() == F->arg_size() ||
+         (ArgVals.size() > F->arg_size() && F->getFunctionType()->isVarArg()))&&
          "Invalid number of values passed to function invocation!");
 
   // Handle non-varargs arguments...
   unsigned i = 0;
-  for (Function::aiterator AI = F->abegin(), E = F->aend(); AI != E; ++AI, ++i)
+  for (Function::arg_iterator AI = F->arg_begin(), E = F->arg_end(); AI != E; ++AI, ++i)
     SetValue(AI, ArgVals[i], StackFrame);
 
   // Handle varargs arguments...
@@ -1076,7 +1074,7 @@ void Interpreter::run() {
     // Interpret a single instruction & increment the "PC".
     ExecutionContext &SF = ECStack.back();  // Current stack frame
     Instruction &I = *SF.CurInst++;         // Increment before execute
-    
+
     // Track the number of dynamic instructions executed.
     ++NumDynamicInsts;