mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-19 04:32:19 +00:00
popStackAndReturnValueToCaller() must advance instruction pointer to normal
destination, if returning from an invoke. Implement 'unwind' instruction. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@9792 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
351881793a
commit
dbde1ae7a0
@ -435,8 +435,10 @@ void Interpreter::exitCalled(GenericValue GV) {
|
|||||||
/// Pop the last stack frame off of ECStack and then copy the result
|
/// Pop the last stack frame off of ECStack and then copy the result
|
||||||
/// back into the result variable if we are not returning void. The
|
/// back into the result variable if we are not returning void. The
|
||||||
/// result variable may be the ExitCode, or the Value of the calling
|
/// result variable may be the ExitCode, or the Value of the calling
|
||||||
/// CallInst if there was a previous stack frame. This procedure may
|
/// CallInst if there was a previous stack frame. This method may
|
||||||
/// invalidate any ECStack iterators you have.
|
/// invalidate any ECStack iterators you have. This method also takes
|
||||||
|
/// care of switching to the normal destination BB, if we are returning
|
||||||
|
/// from an invoke.
|
||||||
///
|
///
|
||||||
void Interpreter::popStackAndReturnValueToCaller (const Type *RetTy,
|
void Interpreter::popStackAndReturnValueToCaller (const Type *RetTy,
|
||||||
GenericValue Result) {
|
GenericValue Result) {
|
||||||
@ -453,9 +455,11 @@ void Interpreter::popStackAndReturnValueToCaller (const Type *RetTy,
|
|||||||
// If we have a previous stack frame, and we have a previous call,
|
// If we have a previous stack frame, and we have a previous call,
|
||||||
// fill in the return value...
|
// fill in the return value...
|
||||||
ExecutionContext &CallingSF = ECStack.back();
|
ExecutionContext &CallingSF = ECStack.back();
|
||||||
if (CallingSF.Caller.getInstruction()) {
|
if (Instruction *I = CallingSF.Caller.getInstruction()) {
|
||||||
if (CallingSF.Caller.getType() != Type::VoidTy) // Save result...
|
if (CallingSF.Caller.getType() != Type::VoidTy) // Save result...
|
||||||
SetValue(CallingSF.Caller.getInstruction(), Result, CallingSF);
|
SetValue(I, Result, CallingSF);
|
||||||
|
if (InvokeInst *II = dyn_cast<InvokeInst> (I))
|
||||||
|
SwitchToNewBasicBlock (II->getNormalDest (), CallingSF);
|
||||||
CallingSF.Caller = CallSite(); // We returned from the call...
|
CallingSF.Caller = CallSite(); // We returned from the call...
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -476,7 +480,22 @@ void Interpreter::visitReturnInst(ReturnInst &I) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Interpreter::visitUnwindInst(UnwindInst &I) {
|
void Interpreter::visitUnwindInst(UnwindInst &I) {
|
||||||
abort ();
|
// Unwind stack
|
||||||
|
Instruction *Inst;
|
||||||
|
do {
|
||||||
|
ECStack.pop_back ();
|
||||||
|
if (ECStack.empty ())
|
||||||
|
abort ();
|
||||||
|
Inst = ECStack.back ().Caller.getInstruction ();
|
||||||
|
} while (!(Inst && isa<InvokeInst> (Inst)));
|
||||||
|
|
||||||
|
// Return from invoke
|
||||||
|
ExecutionContext &InvokingSF = ECStack.back ();
|
||||||
|
InvokingSF.Caller = CallSite ();
|
||||||
|
|
||||||
|
// Go to exceptional destination BB of invoke instruction
|
||||||
|
SwitchToNewBasicBlock (cast<InvokeInst> (Inst)->getExceptionalDest (),
|
||||||
|
InvokingSF);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Interpreter::visitBranchInst(BranchInst &I) {
|
void Interpreter::visitBranchInst(BranchInst &I) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user