From 29d6325ca31fed4960e4e1e03cb179409383c697 Mon Sep 17 00:00:00 2001 From: Brian Gaeke Date: Fri, 7 Nov 2003 19:26:23 +0000 Subject: [PATCH] Use CallSites for call sites, instead of CallInsts. A revolutionary concept. llvm-svn: 9784 --- lib/ExecutionEngine/Interpreter/Execution.cpp | 14 +++++++------- lib/ExecutionEngine/Interpreter/Interpreter.h | 5 +++-- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/lib/ExecutionEngine/Interpreter/Execution.cpp b/lib/ExecutionEngine/Interpreter/Execution.cpp index 4d1a3e66cec..739e57c8b3d 100644 --- a/lib/ExecutionEngine/Interpreter/Execution.cpp +++ b/lib/ExecutionEngine/Interpreter/Execution.cpp @@ -453,10 +453,10 @@ void Interpreter::popStackAndReturnValueToCaller (const Type *RetTy, // If we have a previous stack frame, and we have a previous call, // fill in the return value... ExecutionContext &CallingSF = ECStack.back(); - if (CallingSF.Caller) { - if (CallingSF.Caller->getType() != Type::VoidTy) // Save result... - SetValue(CallingSF.Caller, Result, CallingSF); - CallingSF.Caller = 0; // We returned from the call... + if (CallingSF.Caller.getInstruction()) { + if (CallingSF.Caller.getType() != Type::VoidTy) // Save result... + SetValue(CallingSF.Caller.getInstruction(), Result, CallingSF); + CallingSF.Caller = CallSite(); // We returned from the call... } } } @@ -639,7 +639,7 @@ void Interpreter::visitStoreInst(StoreInst &I) { void Interpreter::visitCallInst(CallInst &I) { ExecutionContext &SF = ECStack.back(); - SF.Caller = &I; + SF.Caller = CallSite(&I); std::vector ArgVals; ArgVals.reserve(I.getNumOperands()-1); for (unsigned i = 1; i < I.getNumOperands(); ++i) { @@ -804,8 +804,8 @@ void Interpreter::visitVANextInst(VANextInst &I) { // void Interpreter::callFunction(Function *F, const std::vector &ArgVals) { - assert((ECStack.empty() || ECStack.back().Caller == 0 || - ECStack.back().Caller->getNumOperands()-1 == ArgVals.size()) && + assert((ECStack.empty() || ECStack.back().Caller.getInstruction() == 0 || + ECStack.back().Caller.arg_size() == ArgVals.size()) && "Incorrect number of arguments passed into function call!"); // Make a new stack frame... and fill it in. ECStack.push_back(ExecutionContext()); diff --git a/lib/ExecutionEngine/Interpreter/Interpreter.h b/lib/ExecutionEngine/Interpreter/Interpreter.h index 08d910bb589..06e82572c19 100644 --- a/lib/ExecutionEngine/Interpreter/Interpreter.h +++ b/lib/ExecutionEngine/Interpreter/Interpreter.h @@ -18,6 +18,7 @@ #include "llvm/ExecutionEngine/ExecutionEngine.h" #include "llvm/ExecutionEngine/GenericValue.h" #include "llvm/Support/InstVisitor.h" +#include "llvm/Support/CallSite.h" #include "llvm/Target/TargetData.h" #include "Support/DataTypes.h" @@ -64,8 +65,8 @@ struct ExecutionContext { BasicBlock::iterator CurInst; // The next instruction to execute std::map Values; // LLVM values used in this invocation std::vector VarArgs; // Values passed through an ellipsis - CallInst *Caller; // Holds the call that called subframes. - // NULL if main func or debugger invoked fn + CallSite Caller; // Holds the call that called subframes. + // NULL if main func or debugger invoked fn AllocaHolderHandle Allocas; // Track memory allocated by alloca };