[llvm-commits] CVS: llvm/lib/ExecutionEngine/Interpreter/Execution.cpp ExternalFunctions.cpp Interpreter.h

Brian Gaeke gaeke at cs.uiuc.edu
Thu Nov 13 00:07:03 PST 2003


Changes in directory llvm/lib/ExecutionEngine/Interpreter:

Execution.cpp updated: 1.114 -> 1.115
ExternalFunctions.cpp updated: 1.68 -> 1.69
Interpreter.h updated: 1.53 -> 1.54

---
Log message:

Change LLI's internal representation of va_list to a pointer to the next
argument to be returned by va_arg. This allows va_lists to be passed
between different LLVM procedures (though it is unlikely that an LLI
va_list would make sense to an external function, except by chance.)


---
Diffs of the changes:  (+15 -13)

Index: llvm/lib/ExecutionEngine/Interpreter/Execution.cpp
diff -u llvm/lib/ExecutionEngine/Interpreter/Execution.cpp:1.114 llvm/lib/ExecutionEngine/Interpreter/Execution.cpp:1.115
--- llvm/lib/ExecutionEngine/Interpreter/Execution.cpp:1.114	Tue Nov 11 16:41:33 2003
+++ llvm/lib/ExecutionEngine/Interpreter/Execution.cpp	Thu Nov 13 00:06:01 2003
@@ -812,13 +812,14 @@
 void Interpreter::visitVANextInst(VANextInst &I) {
   ExecutionContext &SF = ECStack.back();
 
-  // Get the incoming valist element.  LLI treats the valist as an integer.
+  // Get the incoming valist parameter.  LLI treats the valist as a pointer 
+  // to the next argument.
   GenericValue VAList = getOperandValue(I.getOperand(0), SF);
   
-  // Move to the next operand.
-  unsigned Argument = VAList.IntVal++;
-  assert(Argument < SF.VarArgs.size() &&
-         "Accessing past the last vararg argument!");
+  // Move the pointer to the next vararg.
+  GenericValue *ArgPtr = (GenericValue *) GVTOP (VAList);
+  ++ArgPtr;
+  VAList = PTOGV (ArgPtr);
   SetValue(&I, VAList, SF);
 }
 
@@ -828,12 +829,11 @@
 void Interpreter::visitVAArgInst(VAArgInst &I) {
   ExecutionContext &SF = ECStack.back();
 
-  // Get the incoming valist element.  LLI treats the valist as an integer.
+  // Get the incoming valist parameter.  LLI treats the valist as a pointer 
+  // to the next argument.
   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];
+  assert (GVTOP (VAList) != 0 && "VAList was null in vaarg instruction");
+  GenericValue Dest, Src = *(GenericValue *) GVTOP (VAList);
   const Type *Ty = I.getType();
   switch (Ty->getPrimitiveID()) {
     IMPLEMENT_VAARG(UByte);


Index: llvm/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp
diff -u llvm/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp:1.68 llvm/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp:1.69
--- llvm/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp:1.68	Tue Nov 11 16:41:33 2003
+++ llvm/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp	Thu Nov 13 00:06:01 2003
@@ -696,9 +696,7 @@
 // <va_list> llvm.va_start() - Implement the va_start operation...
 GenericValue llvm_va_start(FunctionType *F, const vector<GenericValue> &Args) {
   assert(Args.size() == 0);
-  GenericValue Val;
-  Val.UIntVal = 0;   // Start at the first '...' argument...
-  return Val;
+  return TheInterpreter->getFirstVarArg();
 }
 
 // void llvm.va_end(<va_list> *) - Implement the va_end operation...


Index: llvm/lib/ExecutionEngine/Interpreter/Interpreter.h
diff -u llvm/lib/ExecutionEngine/Interpreter/Interpreter.h:1.53 llvm/lib/ExecutionEngine/Interpreter/Interpreter.h:1.54
--- llvm/lib/ExecutionEngine/Interpreter/Interpreter.h:1.53	Tue Nov 11 16:41:33 2003
+++ llvm/lib/ExecutionEngine/Interpreter/Interpreter.h	Thu Nov 13 00:06:01 2003
@@ -146,6 +146,10 @@
     AtExitHandlers.push_back(F);
   }
 
+  GenericValue *getFirstVarArg () {
+    return &(ECStack[ECStack.size () - 2].VarArgs[0]);
+  }
+
   //FIXME: private:
 public:
   GenericValue executeGEPOperation(Value *Ptr, User::op_iterator I,





More information about the llvm-commits mailing list