OLD | NEW |
1 //===--- CGException.cpp - Emit LLVM Code for C++ exceptions --------------===// | 1 //===--- CGException.cpp - Emit LLVM Code for C++ exceptions --------------===// |
2 // | 2 // |
3 // The LLVM Compiler Infrastructure | 3 // The LLVM Compiler Infrastructure |
4 // | 4 // |
5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
7 // | 7 // |
8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
9 // | 9 // |
10 // This contains code dealing with C++ exception related code generation. | 10 // This contains code dealing with C++ exception related code generation. |
(...skipping 401 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
412 } | 412 } |
413 | 413 |
414 llvm::Value *CodeGenFunction::getExceptionFromSlot() { | 414 llvm::Value *CodeGenFunction::getExceptionFromSlot() { |
415 return Builder.CreateLoad(getExceptionSlot(), "exn"); | 415 return Builder.CreateLoad(getExceptionSlot(), "exn"); |
416 } | 416 } |
417 | 417 |
418 llvm::Value *CodeGenFunction::getSelectorFromSlot() { | 418 llvm::Value *CodeGenFunction::getSelectorFromSlot() { |
419 return Builder.CreateLoad(getEHSelectorSlot(), "sel"); | 419 return Builder.CreateLoad(getEHSelectorSlot(), "sel"); |
420 } | 420 } |
421 | 421 |
422 void CodeGenFunction::EmitCXXThrowExpr(const CXXThrowExpr *E, | 422 void CodeGenFunction::EmitCXXThrowExpr(const CXXThrowExpr *E) { |
423 bool KeepInsertionPoint) { | |
424 if (!E->getSubExpr()) { | 423 if (!E->getSubExpr()) { |
425 EmitNoreturnRuntimeCallOrInvoke(getReThrowFn(CGM), | 424 EmitNoreturnRuntimeCallOrInvoke(getReThrowFn(CGM), |
426 ArrayRef<llvm::Value*>()); | 425 ArrayRef<llvm::Value*>()); |
427 | 426 |
428 // throw is an expression, and the expression emitters expect us | 427 // throw is an expression, and the expression emitters expect us |
429 // to leave ourselves at a valid insertion point. | 428 // to leave ourselves at a valid insertion point. |
430 if (KeepInsertionPoint) | 429 EmitBlock(createBasicBlock("throw.cont")); |
431 EmitBlock(createBasicBlock("throw.cont")); | |
432 | 430 |
433 return; | 431 return; |
434 } | 432 } |
435 | 433 |
436 QualType ThrowType = E->getSubExpr()->getType(); | 434 QualType ThrowType = E->getSubExpr()->getType(); |
437 | 435 |
438 if (ThrowType->isObjCObjectPointerType()) { | 436 if (ThrowType->isObjCObjectPointerType()) { |
439 const Stmt *ThrowStmt = E->getSubExpr(); | 437 const Stmt *ThrowStmt = E->getSubExpr(); |
440 const ObjCAtThrowStmt S(E->getExprLoc(), | 438 const ObjCAtThrowStmt S(E->getExprLoc(), |
441 const_cast<Stmt *>(ThrowStmt)); | 439 const_cast<Stmt *>(ThrowStmt)); |
442 CGM.getObjCRuntime().EmitThrowStmt(*this, S, false); | 440 CGM.getObjCRuntime().EmitThrowStmt(*this, S, false); |
443 // This will clear insertion point which was not cleared in | 441 // This will clear insertion point which was not cleared in |
444 // call to EmitThrowStmt. | 442 // call to EmitThrowStmt. |
445 if (KeepInsertionPoint) | 443 EmitBlock(createBasicBlock("throw.cont")); |
446 EmitBlock(createBasicBlock("throw.cont")); | |
447 return; | 444 return; |
448 } | 445 } |
449 | 446 |
450 // Now allocate the exception object. | 447 // Now allocate the exception object. |
451 llvm::Type *SizeTy = ConvertType(getContext().getSizeType()); | 448 llvm::Type *SizeTy = ConvertType(getContext().getSizeType()); |
452 uint64_t TypeSize = getContext().getTypeSizeInChars(ThrowType).getQuantity(); | 449 uint64_t TypeSize = getContext().getTypeSizeInChars(ThrowType).getQuantity(); |
453 | 450 |
454 llvm::Constant *AllocExceptionFn = getAllocateExceptionFn(CGM); | 451 llvm::Constant *AllocExceptionFn = getAllocateExceptionFn(CGM); |
455 llvm::CallInst *ExceptionPtr = | 452 llvm::CallInst *ExceptionPtr = |
456 EmitNounwindRuntimeCall(AllocExceptionFn, | 453 EmitNounwindRuntimeCall(AllocExceptionFn, |
(...skipping 17 matching lines...) Expand all Loading... |
474 Dtor = llvm::ConstantExpr::getBitCast(Dtor, Int8PtrTy); | 471 Dtor = llvm::ConstantExpr::getBitCast(Dtor, Int8PtrTy); |
475 } | 472 } |
476 } | 473 } |
477 if (!Dtor) Dtor = llvm::Constant::getNullValue(Int8PtrTy); | 474 if (!Dtor) Dtor = llvm::Constant::getNullValue(Int8PtrTy); |
478 | 475 |
479 llvm::Value *args[] = { ExceptionPtr, TypeInfo, Dtor }; | 476 llvm::Value *args[] = { ExceptionPtr, TypeInfo, Dtor }; |
480 EmitNoreturnRuntimeCallOrInvoke(getThrowFn(CGM), args); | 477 EmitNoreturnRuntimeCallOrInvoke(getThrowFn(CGM), args); |
481 | 478 |
482 // throw is an expression, and the expression emitters expect us | 479 // throw is an expression, and the expression emitters expect us |
483 // to leave ourselves at a valid insertion point. | 480 // to leave ourselves at a valid insertion point. |
484 if (KeepInsertionPoint) | 481 EmitBlock(createBasicBlock("throw.cont")); |
485 EmitBlock(createBasicBlock("throw.cont")); | |
486 } | 482 } |
487 | 483 |
488 void CodeGenFunction::EmitStartEHSpec(const Decl *D) { | 484 void CodeGenFunction::EmitStartEHSpec(const Decl *D) { |
489 if (!CGM.getLangOpts().CXXExceptions) | 485 if (!CGM.getLangOpts().CXXExceptions) |
490 return; | 486 return; |
491 | 487 |
492 const FunctionDecl* FD = dyn_cast_or_null<FunctionDecl>(D); | 488 const FunctionDecl* FD = dyn_cast_or_null<FunctionDecl>(D); |
493 if (FD == 0) | 489 if (FD == 0) |
494 return; | 490 return; |
495 const FunctionProtoType *Proto = FD->getType()->getAs<FunctionProtoType>(); | 491 const FunctionProtoType *Proto = FD->getType()->getAs<FunctionProtoType>(); |
(...skipping 1180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1676 break; | 1672 break; |
1677 } | 1673 } |
1678 } | 1674 } |
1679 | 1675 |
1680 Builder.CreateUnreachable(); | 1676 Builder.CreateUnreachable(); |
1681 | 1677 |
1682 Builder.restoreIP(SavedIP); | 1678 Builder.restoreIP(SavedIP); |
1683 | 1679 |
1684 return EHResumeBlock; | 1680 return EHResumeBlock; |
1685 } | 1681 } |
OLD | NEW |