diff options
author | Mike Stump <mrs@apple.com> | 2009-11-20 00:56:31 +0000 |
---|---|---|
committer | Mike Stump <mrs@apple.com> | 2009-11-20 00:56:31 +0000 |
commit | d1782cc478ae5dbe528e7211db68697cc6219696 (patch) | |
tree | 3da02920d50999e277dec436bd7b598f61da11ec /clang/lib/CodeGen/CGException.cpp | |
parent | 81a2851bcb286a975d030e63a126ffe554d84775 (diff) | |
download | bcm5719-llvm-d1782cc478ae5dbe528e7211db68697cc6219696.tar.gz bcm5719-llvm-d1782cc478ae5dbe528e7211db68697cc6219696.zip |
Add suport for throw;. WIP.
llvm-svn: 89424
Diffstat (limited to 'clang/lib/CodeGen/CGException.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGException.cpp | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/clang/lib/CodeGen/CGException.cpp b/clang/lib/CodeGen/CGException.cpp index 93f3eb9f7c5..3abc40775a8 100644 --- a/clang/lib/CodeGen/CGException.cpp +++ b/clang/lib/CodeGen/CGException.cpp @@ -35,16 +35,28 @@ static llvm::Constant *getThrowFn(CodeGenFunction &CGF) { std::vector<const llvm::Type*> Args(3, Int8PtrTy); const llvm::FunctionType *FTy = - llvm::FunctionType::get(llvm::Type::getVoidTy(CGF.getLLVMContext()), - Args, false); + llvm::FunctionType::get(llvm::Type::getVoidTy(CGF.getLLVMContext()), + Args, false); return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_throw"); } +static llvm::Constant *getReThrowFn(CodeGenFunction &CGF) { + // void __cxa_rethrow (); + + const llvm::FunctionType *FTy = + llvm::FunctionType::get(llvm::Type::getVoidTy(CGF.getLLVMContext()), false); + + return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_rethrow"); +} + void CodeGenFunction::EmitCXXThrowExpr(const CXXThrowExpr *E) { - // FIXME: Handle rethrows. if (!E->getSubExpr()) { - ErrorUnsupported(E, "rethrow expression"); + Builder.CreateCall(getReThrowFn(*this))->setDoesNotReturn(); + Builder.CreateUnreachable(); + + // Clear the insertion point to indicate we are in unreachable code. + Builder.ClearInsertionPoint(); return; } |