mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-31 07:43:37 +00:00
Add support for recording arguments passed through the ... of a varargs function
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@6040 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
a1a2097919
commit
cdf5178f83
@ -1038,14 +1038,14 @@ unsigned MethodInfo::getValueSlot(const Value *V) {
|
||||
//===----------------------------------------------------------------------===//
|
||||
// callMethod - Execute the specified function...
|
||||
//
|
||||
void Interpreter::callMethod(Function *M,
|
||||
void Interpreter::callMethod(Function *F,
|
||||
const std::vector<GenericValue> &ArgVals) {
|
||||
assert((ECStack.empty() || ECStack.back().Caller == 0 ||
|
||||
ECStack.back().Caller->getNumOperands()-1 == ArgVals.size()) &&
|
||||
"Incorrect number of arguments passed into function call!");
|
||||
if (M->isExternal()) {
|
||||
GenericValue Result = callExternalMethod(M, ArgVals);
|
||||
const Type *RetTy = M->getReturnType();
|
||||
if (F->isExternal()) {
|
||||
GenericValue Result = callExternalMethod(F, ArgVals);
|
||||
const Type *RetTy = F->getReturnType();
|
||||
|
||||
// Copy the result back into the result variable if we are not returning
|
||||
// void.
|
||||
@ -1057,7 +1057,7 @@ void Interpreter::callMethod(Function *M,
|
||||
SF.Caller = 0; // We returned from the call...
|
||||
} else if (!QuietMode) {
|
||||
// print it.
|
||||
CW << "Function " << M->getType() << " \"" << M->getName()
|
||||
CW << "Function " << F->getType() << " \"" << F->getName()
|
||||
<< "\" returned ";
|
||||
print(RetTy, Result);
|
||||
std::cout << "\n";
|
||||
@ -1074,12 +1074,12 @@ void Interpreter::callMethod(Function *M,
|
||||
// the function. Also calculate the number of values for each type slot
|
||||
// active.
|
||||
//
|
||||
MethodInfo *MethInfo = (MethodInfo*)M->getOrCreateAnnotation(MethodInfoAID);
|
||||
MethodInfo *MethInfo = (MethodInfo*)F->getOrCreateAnnotation(MethodInfoAID);
|
||||
ECStack.push_back(ExecutionContext()); // Make a new stack frame...
|
||||
|
||||
ExecutionContext &StackFrame = ECStack.back(); // Fill it in...
|
||||
StackFrame.CurMethod = M;
|
||||
StackFrame.CurBB = M->begin();
|
||||
StackFrame.CurMethod = F;
|
||||
StackFrame.CurBB = F->begin();
|
||||
StackFrame.CurInst = StackFrame.CurBB->begin();
|
||||
StackFrame.MethInfo = MethInfo;
|
||||
|
||||
@ -1097,11 +1097,17 @@ void Interpreter::callMethod(Function *M,
|
||||
|
||||
|
||||
// Run through the function arguments and initialize their values...
|
||||
assert(ArgVals.size() == M->asize() &&
|
||||
assert((ArgVals.size() == F->asize() ||
|
||||
(ArgVals.size() > F->asize() && F->getFunctionType()->isVarArg())) &&
|
||||
"Invalid number of values passed to function invocation!");
|
||||
|
||||
// Handle non-varargs arguments...
|
||||
unsigned i = 0;
|
||||
for (Function::aiterator AI = M->abegin(), E = M->aend(); AI != E; ++AI, ++i)
|
||||
for (Function::aiterator AI = F->abegin(), E = F->aend(); AI != E; ++AI, ++i)
|
||||
SetValue(AI, ArgVals[i], StackFrame);
|
||||
|
||||
// Handle varargs arguments...
|
||||
StackFrame.VarArgs.assign(ArgVals.begin()+i, ArgVals.end());
|
||||
}
|
||||
|
||||
// executeInstruction - Interpret a single instruction, increment the "PC", and
|
||||
|
@ -68,6 +68,7 @@ struct ExecutionContext {
|
||||
BasicBlock::iterator CurInst; // The next instruction to execute
|
||||
MethodInfo *MethInfo; // The MethInfo annotation for the function
|
||||
std::vector<ValuePlaneTy> Values;// ValuePlanes for each type
|
||||
std::vector<GenericValue> VarArgs; // Values passed through an ellipsis
|
||||
|
||||
BasicBlock *PrevBB; // The previous BB or null if in first BB
|
||||
CallInst *Caller; // Holds the call that called subframes.
|
||||
|
Loading…
x
Reference in New Issue
Block a user