[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