Implement vaarg instruction. This is not quite perfect: 2003-08-11-VaListArg
authorBrian Gaeke <gaeke@uiuc.edu>
Fri, 7 Nov 2003 21:20:47 +0000 (21:20 +0000)
committerBrian Gaeke <gaeke@uiuc.edu>
Fri, 7 Nov 2003 21:20:47 +0000 (21:20 +0000)
still causes a crash. But it's better than before.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@9794 91177308-0d34-0410-b5e6-96231b3b80d8

lib/ExecutionEngine/Interpreter/Execution.cpp
lib/ExecutionEngine/Interpreter/Interpreter.h

index 6a224b97fdd2260b2317217df101a988520511bd..b04f974911d6b0b5a6ef98125fa4cf2cee733145 100644 (file)
@@ -820,6 +820,41 @@ void Interpreter::visitVANextInst(VANextInst &I) {
   SetValue(&I, VAList, SF);
 }
 
+#define IMPLEMENT_VAARG(TY) \
+   case Type::TY##TyID: Dest.TY##Val = Src.TY##Val; break
+
+void Interpreter::visitVAArgInst(VAArgInst &I) {
+  ExecutionContext &SF = ECStack.back();
+
+  // Get the incoming valist element.  LLI treats the valist as an integer.
+  GenericValue VAList = getOperandValue(I.getOperand(0), SF);
+  unsigned Argument = VAList.IntVal;
+  assert(Argument < SF.VarArgs.size() &&
+         "Accessing past the last vararg argument!");
+  GenericValue Dest, Src = SF.VarArgs[Argument];
+  const Type *Ty = I.getType();
+  switch (Ty->getPrimitiveID()) {
+    IMPLEMENT_VAARG(UByte);
+    IMPLEMENT_VAARG(SByte);
+    IMPLEMENT_VAARG(UShort);
+    IMPLEMENT_VAARG(Short);
+    IMPLEMENT_VAARG(UInt);
+    IMPLEMENT_VAARG(Int);
+    IMPLEMENT_VAARG(ULong);
+    IMPLEMENT_VAARG(Long);
+    IMPLEMENT_VAARG(Pointer);
+    IMPLEMENT_VAARG(Float);
+    IMPLEMENT_VAARG(Double);
+    IMPLEMENT_VAARG(Bool);
+  default:
+    std::cout << "Unhandled dest type for vaarg instruction: " << *Ty << "\n";
+    abort();
+  }
+  
+  // Set the Value of this Instruction.
+  SetValue(&I, Dest, SF);
+}
+
 //===----------------------------------------------------------------------===//
 //                        Dispatch and Execution Code
 //===----------------------------------------------------------------------===//
index 04baf367747a65779ae7f8029ed8bae263fac8b4..00784adb7149efdc9f2c2bc3596a6858f3727f76 100644 (file)
@@ -130,6 +130,7 @@ public:
   void visitShl(ShiftInst &I);
   void visitShr(ShiftInst &I);
   void visitVANextInst(VANextInst &I);
+  void visitVAArgInst(VAArgInst &I);
   void visitInstruction(Instruction &I) {
     std::cerr << I;
     assert(0 && "Instruction not interpretable yet!");