diff options
author | Chris Lattner <sabre@nondot.org> | 2001-09-10 04:49:44 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2001-09-10 04:49:44 +0000 |
commit | 365a76e46e7b22ee2cd7881d0a7055fc20930fd5 (patch) | |
tree | f74298a68347e8aa88cd9dcc1080ede88e779b13 /lib/ExecutionEngine/Interpreter/Execution.cpp | |
parent | 49f2b9470ea17178fa378c0ee2a314eade0c5ad0 (diff) |
Genericize support for calling functions a bit
Add external method support
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@528 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/ExecutionEngine/Interpreter/Execution.cpp')
-rw-r--r-- | lib/ExecutionEngine/Interpreter/Execution.cpp | 41 |
1 files changed, 23 insertions, 18 deletions
diff --git a/lib/ExecutionEngine/Interpreter/Execution.cpp b/lib/ExecutionEngine/Interpreter/Execution.cpp index e9861581d5..0b0cf0a410 100644 --- a/lib/ExecutionEngine/Interpreter/Execution.cpp +++ b/lib/ExecutionEngine/Interpreter/Execution.cpp @@ -43,8 +43,6 @@ static GenericValue getOperandValue(Value *V, ExecutionContext &SF) { return Result; } else { unsigned TyP = V->getType()->getUniqueID(); // TypePlane for value - unsigned Slot = getOperandSlot(V); - void *ElementPtr = &SF.Values[TyP][getOperandSlot(V)]; return SF.Values[TyP][getOperandSlot(V)]; } } @@ -316,6 +314,13 @@ void Interpreter::executeRetInst(ReturnInst *I, ExecutionContext &SF) { SetValue(NewSF.Caller, Result, NewSF); NewSF.Caller = 0; // We returned from the call... + } else { + // This must be a function that is executing because of a user 'call' + // instruction. + cout << "Method " << M->getType() << " \"" << M->getName() + << "\" returned "; + printValue(RetTy, Result); + cout << endl; } } @@ -428,7 +433,12 @@ static void executeStoreInst(StoreInst *I, ExecutionContext &SF) { void Interpreter::executeCallInst(CallInst *I, ExecutionContext &SF) { ECStack.back().Caller = I; - callMethod(I->getCalledMethod(), ECStack.size()-1); + vector<GenericValue> ArgVals; + ArgVals.reserve(I->getNumOperands()-1); + for (unsigned i = 1; i < I->getNumOperands(); ++i) + ArgVals.push_back(getOperandValue(I->getOperand(i), SF)); + + callMethod(I->getCalledMethod(), ArgVals); } static void executePHINode(PHINode *I, ExecutionContext &SF) { @@ -599,10 +609,12 @@ void Interpreter::initializeExecutionEngine() { //===----------------------------------------------------------------------===// // callMethod - Execute the specified method... // -void Interpreter::callMethod(Method *M, int CallingSF = -1) { +void Interpreter::callMethod(Method *M, const 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()) { - // Handle builtin methods - cout << "Error: Method '" << M->getName() << "' is external!\n"; + callExternalMethod(M, ArgVals); return; } @@ -625,19 +637,12 @@ void Interpreter::callMethod(Method *M, int CallingSF = -1) { StackFrame.PrevBB = 0; // No previous BB for PHI nodes... - // Run through the method arguments and initialize their values... - if (CallingSF != -1) { - CallInst *Call = ECStack[CallingSF].Caller; - assert(Call && "Caller improperly initialized!"); - - unsigned i = 1; - for (Method::ArgumentListType::iterator MI = M->getArgumentList().begin(), - ME = M->getArgumentList().end(); MI != ME; ++MI, ++i) { - Value *V = Call->getOperand(i); - MethodArgument *MA = *MI; - SetValue(MA, getOperandValue(V, ECStack[CallingSF]), StackFrame); - } + // Run through the method arguments and initialize their values... + unsigned i = 0; + for (Method::ArgumentListType::iterator MI = M->getArgumentList().begin(), + ME = M->getArgumentList().end(); MI != ME; ++MI, ++i) { + SetValue(*MI, ArgVals[i], StackFrame); } } |