mirror of
https://github.com/intel/llvm.git
synced 2026-01-30 14:07:28 +08:00
Split the exception object out into its own stack.
llvm-svn: 64032
This commit is contained in:
@@ -1868,7 +1868,8 @@ void CGObjCMac::EmitTryOrSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
|
||||
// through finally.
|
||||
CodeGenFunction::ObjCEHEntry EHEntry(FinallyBlock, FinallySwitch, DestCode);
|
||||
CGF.ObjCEHStack.push_back(&EHEntry);
|
||||
|
||||
CGF.ObjCEHValueStack.push_back(0);
|
||||
|
||||
// Allocate memory for the exception data and rethrow pointer.
|
||||
llvm::Value *ExceptionData = CGF.CreateTempAlloca(ObjCTypes.ExceptionDataTy,
|
||||
"exceptiondata.ptr");
|
||||
@@ -1913,7 +1914,7 @@ void CGObjCMac::EmitTryOrSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
|
||||
llvm::Value *Caught = CGF.Builder.CreateCall(ObjCTypes.ExceptionExtractFn,
|
||||
ExceptionData,
|
||||
"caught");
|
||||
EHEntry.Exception = Caught;
|
||||
CGF.ObjCEHValueStack.back() = Caught;
|
||||
if (!isTry)
|
||||
{
|
||||
CGF.Builder.CreateStore(Caught, RethrowPtr);
|
||||
@@ -2032,7 +2033,8 @@ void CGObjCMac::EmitTryOrSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
|
||||
// this now, because the code in the @finally block is not in this
|
||||
// context.
|
||||
CGF.ObjCEHStack.pop_back();
|
||||
|
||||
CGF.ObjCEHValueStack.pop_back();
|
||||
|
||||
// Emit the @finally block.
|
||||
CGF.EmitBlock(FinallyBlock);
|
||||
llvm::Value* CallTryExit = CGF.Builder.CreateLoad(CallTryExitPtr, "tmp");
|
||||
@@ -2076,9 +2078,9 @@ void CGObjCMac::EmitThrowStmt(CodeGen::CodeGenFunction &CGF,
|
||||
ExceptionAsObject =
|
||||
CGF.Builder.CreateBitCast(Exception, ObjCTypes.ObjectPtrTy, "tmp");
|
||||
} else {
|
||||
assert((!CGF.ObjCEHStack.empty() && CGF.ObjCEHStack.back()->Exception) &&
|
||||
assert((!CGF.ObjCEHValueStack.empty() && CGF.ObjCEHValueStack.back()) &&
|
||||
"Unexpected rethrow outside @catch block.");
|
||||
ExceptionAsObject = CGF.ObjCEHStack.back()->Exception;
|
||||
ExceptionAsObject = CGF.ObjCEHValueStack.back();
|
||||
}
|
||||
|
||||
CGF.Builder.CreateCall(ObjCTypes.ExceptionThrowFn, ExceptionAsObject);
|
||||
|
||||
@@ -97,7 +97,7 @@ public:
|
||||
struct ObjCEHEntry {
|
||||
ObjCEHEntry(llvm::BasicBlock *fb, llvm::SwitchInst *fs, llvm::Value *dc)
|
||||
: FinallyBlock(fb), FinallySwitch(fs),
|
||||
DestCode(dc), Exception(0) {}
|
||||
DestCode(dc) {}
|
||||
|
||||
/// Entry point to the finally block.
|
||||
llvm::BasicBlock *FinallyBlock;
|
||||
@@ -109,12 +109,12 @@ public:
|
||||
/// Variable holding the code for the destination of a jump
|
||||
/// through the @finally block.
|
||||
llvm::Value *DestCode;
|
||||
|
||||
/// The exception object being handled, during IR generation for a
|
||||
/// @catch block.
|
||||
llvm::Value *Exception;
|
||||
};
|
||||
|
||||
/// ObjCEHValueStack - Stack of exception objects being handled,
|
||||
/// during IR generation for a @catch block.
|
||||
llvm::SmallVector<llvm::Value*, 8> ObjCEHValueStack;
|
||||
|
||||
typedef llvm::SmallVector<ObjCEHEntry*, 8> ObjCEHStackType;
|
||||
ObjCEHStackType ObjCEHStack;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user