mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-15 05:24:01 +00:00
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
This commit is contained in:
@ -43,8 +43,6 @@ static GenericValue getOperandValue(Value *V, ExecutionContext &SF) {
|
|||||||
return Result;
|
return Result;
|
||||||
} else {
|
} else {
|
||||||
unsigned TyP = V->getType()->getUniqueID(); // TypePlane for value
|
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)];
|
return SF.Values[TyP][getOperandSlot(V)];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -316,6 +314,13 @@ void Interpreter::executeRetInst(ReturnInst *I, ExecutionContext &SF) {
|
|||||||
SetValue(NewSF.Caller, Result, NewSF);
|
SetValue(NewSF.Caller, Result, NewSF);
|
||||||
|
|
||||||
NewSF.Caller = 0; // We returned from the call...
|
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) {
|
void Interpreter::executeCallInst(CallInst *I, ExecutionContext &SF) {
|
||||||
ECStack.back().Caller = I;
|
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) {
|
static void executePHINode(PHINode *I, ExecutionContext &SF) {
|
||||||
@ -599,10 +609,12 @@ void Interpreter::initializeExecutionEngine() {
|
|||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
// callMethod - Execute the specified method...
|
// 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()) {
|
if (M->isExternal()) {
|
||||||
// Handle builtin methods
|
callExternalMethod(M, ArgVals);
|
||||||
cout << "Error: Method '" << M->getName() << "' is external!\n";
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -625,19 +637,12 @@ void Interpreter::callMethod(Method *M, int CallingSF = -1) {
|
|||||||
|
|
||||||
StackFrame.PrevBB = 0; // No previous BB for PHI nodes...
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -78,14 +78,15 @@ public:
|
|||||||
void setBreakpoint(const string &Name);
|
void setBreakpoint(const string &Name);
|
||||||
void infoValue(const string &Name);
|
void infoValue(const string &Name);
|
||||||
void printValue(const string &Name);
|
void printValue(const string &Name);
|
||||||
void printValue(const Type *Ty, GenericValue V);
|
static void printValue(const Type *Ty, GenericValue V);
|
||||||
|
|
||||||
|
|
||||||
void list(); // Do the 'list' command
|
void list(); // Do the 'list' command
|
||||||
void printStackTrace(); // Do the 'backtrace' command
|
void printStackTrace(); // Do the 'backtrace' command
|
||||||
|
|
||||||
// Code execution methods...
|
// Code execution methods...
|
||||||
void callMethod(Method *Meth, int SF = -1);
|
void callMethod (Method *Meth, const vector<GenericValue> &ArgVals);
|
||||||
|
void callExternalMethod(Method *Meth, const vector<GenericValue> &ArgVals);
|
||||||
bool executeInstruction(); // Execute one instruction...
|
bool executeInstruction(); // Execute one instruction...
|
||||||
|
|
||||||
void stepInstruction(); // Do the 'step' command
|
void stepInstruction(); // Do the 'step' command
|
||||||
|
@ -144,7 +144,12 @@ bool Interpreter::callMethod(const string &Name) {
|
|||||||
if (PickedMeth == 0)
|
if (PickedMeth == 0)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
callMethod(PickedMeth->castMethodAsserting()); // Start executing it...
|
Method *M = PickedMeth->castMethodAsserting();
|
||||||
|
|
||||||
|
vector<GenericValue> Args;
|
||||||
|
// TODO, get args from user...
|
||||||
|
|
||||||
|
callMethod(M, Args); // Start executing it...
|
||||||
|
|
||||||
// Reset the current frame location to the top of stack
|
// Reset the current frame location to the top of stack
|
||||||
CurFrame = ECStack.size()-1;
|
CurFrame = ECStack.size()-1;
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
LEVEL = ../..
|
LEVEL = ../..
|
||||||
TOOLNAME = lli
|
TOOLNAME = lli
|
||||||
USEDLIBS = opt bcreader bcwriter vmcore asmwriter analysis support target
|
USEDLIBS = opt bcreader bcwriter vmcore asmwriter analysis support target
|
||||||
|
TOOLLINKOPTS = -ldl
|
||||||
|
|
||||||
include $(LEVEL)/Makefile.common
|
include $(LEVEL)/Makefile.common
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
LEVEL = ../..
|
LEVEL = ../..
|
||||||
TOOLNAME = lli
|
TOOLNAME = lli
|
||||||
USEDLIBS = opt bcreader bcwriter vmcore asmwriter analysis support target
|
USEDLIBS = opt bcreader bcwriter vmcore asmwriter analysis support target
|
||||||
|
TOOLLINKOPTS = -ldl
|
||||||
|
|
||||||
include $(LEVEL)/Makefile.common
|
include $(LEVEL)/Makefile.common
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user