Home | History | Annotate | Download | only in CodeGen
      1 //===--- CGException.cpp - Emit LLVM Code for C++ exceptions --------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This contains code dealing with C++ exception related code generation.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #include "clang/AST/StmtCXX.h"
     15 
     16 #include "llvm/Intrinsics.h"
     17 #include "llvm/IntrinsicInst.h"
     18 #include "llvm/Support/CallSite.h"
     19 
     20 #include "CGObjCRuntime.h"
     21 #include "CodeGenFunction.h"
     22 #include "CGException.h"
     23 #include "CGCleanup.h"
     24 #include "TargetInfo.h"
     25 
     26 using namespace clang;
     27 using namespace CodeGen;
     28 
     29 static llvm::Constant *getAllocateExceptionFn(CodeGenFunction &CGF) {
     30   // void *__cxa_allocate_exception(size_t thrown_size);
     31 
     32   llvm::Type *ArgTys[] = { CGF.SizeTy };
     33   llvm::FunctionType *FTy =
     34     llvm::FunctionType::get(CGF.Int8PtrTy, ArgTys, /*IsVarArgs=*/false);
     35 
     36   return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_allocate_exception");
     37 }
     38 
     39 static llvm::Constant *getFreeExceptionFn(CodeGenFunction &CGF) {
     40   // void __cxa_free_exception(void *thrown_exception);
     41 
     42   llvm::Type *ArgTys[] = { CGF.Int8PtrTy };
     43   llvm::FunctionType *FTy =
     44     llvm::FunctionType::get(CGF.VoidTy, ArgTys, /*IsVarArgs=*/false);
     45 
     46   return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_free_exception");
     47 }
     48 
     49 static llvm::Constant *getThrowFn(CodeGenFunction &CGF) {
     50   // void __cxa_throw(void *thrown_exception, std::type_info *tinfo,
     51   //                  void (*dest) (void *));
     52 
     53   llvm::Type *Args[3] = { CGF.Int8PtrTy, CGF.Int8PtrTy, CGF.Int8PtrTy };
     54   llvm::FunctionType *FTy =
     55     llvm::FunctionType::get(CGF.VoidTy, Args, /*IsVarArgs=*/false);
     56 
     57   return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_throw");
     58 }
     59 
     60 static llvm::Constant *getReThrowFn(CodeGenFunction &CGF) {
     61   // void __cxa_rethrow();
     62 
     63   llvm::FunctionType *FTy =
     64     llvm::FunctionType::get(CGF.VoidTy, /*IsVarArgs=*/false);
     65 
     66   return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_rethrow");
     67 }
     68 
     69 static llvm::Constant *getGetExceptionPtrFn(CodeGenFunction &CGF) {
     70   // void *__cxa_get_exception_ptr(void*);
     71 
     72   llvm::Type *ArgTys[] = { CGF.Int8PtrTy };
     73   llvm::FunctionType *FTy =
     74     llvm::FunctionType::get(CGF.Int8PtrTy, ArgTys, /*IsVarArgs=*/false);
     75 
     76   return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_get_exception_ptr");
     77 }
     78 
     79 static llvm::Constant *getBeginCatchFn(CodeGenFunction &CGF) {
     80   // void *__cxa_begin_catch(void*);
     81 
     82   llvm::Type *ArgTys[] = { CGF.Int8PtrTy };
     83   llvm::FunctionType *FTy =
     84     llvm::FunctionType::get(CGF.Int8PtrTy, ArgTys, /*IsVarArgs=*/false);
     85 
     86   return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_begin_catch");
     87 }
     88 
     89 static llvm::Constant *getEndCatchFn(CodeGenFunction &CGF) {
     90   // void __cxa_end_catch();
     91 
     92   llvm::FunctionType *FTy =
     93     llvm::FunctionType::get(CGF.VoidTy, /*IsVarArgs=*/false);
     94 
     95   return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_end_catch");
     96 }
     97 
     98 static llvm::Constant *getUnexpectedFn(CodeGenFunction &CGF) {
     99   // void __cxa_call_unexepcted(void *thrown_exception);
    100 
    101   llvm::Type *ArgTys[] = { CGF.Int8PtrTy };
    102   llvm::FunctionType *FTy =
    103     llvm::FunctionType::get(CGF.VoidTy, ArgTys, /*IsVarArgs=*/false);
    104 
    105   return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_call_unexpected");
    106 }
    107 
    108 llvm::Constant *CodeGenFunction::getUnwindResumeFn() {
    109   llvm::Type *ArgTys[] = { Int8PtrTy };
    110   llvm::FunctionType *FTy =
    111     llvm::FunctionType::get(VoidTy, ArgTys, /*IsVarArgs=*/false);
    112 
    113   if (CGM.getLangOptions().SjLjExceptions)
    114     return CGM.CreateRuntimeFunction(FTy, "_Unwind_SjLj_Resume");
    115   return CGM.CreateRuntimeFunction(FTy, "_Unwind_Resume");
    116 }
    117 
    118 llvm::Constant *CodeGenFunction::getUnwindResumeOrRethrowFn() {
    119   llvm::Type *ArgTys[] = { Int8PtrTy };
    120   llvm::FunctionType *FTy =
    121     llvm::FunctionType::get(VoidTy, ArgTys, /*IsVarArgs=*/false);
    122 
    123   if (CGM.getLangOptions().SjLjExceptions)
    124     return CGM.CreateRuntimeFunction(FTy, "_Unwind_SjLj_Resume_or_Rethrow");
    125   return CGM.CreateRuntimeFunction(FTy, "_Unwind_Resume_or_Rethrow");
    126 }
    127 
    128 static llvm::Constant *getTerminateFn(CodeGenFunction &CGF) {
    129   // void __terminate();
    130 
    131   llvm::FunctionType *FTy =
    132     llvm::FunctionType::get(CGF.VoidTy, /*IsVarArgs=*/false);
    133 
    134   llvm::StringRef name;
    135 
    136   // In C++, use std::terminate().
    137   if (CGF.getLangOptions().CPlusPlus)
    138     name = "_ZSt9terminatev"; // FIXME: mangling!
    139   else if (CGF.getLangOptions().ObjC1 &&
    140            CGF.CGM.getCodeGenOpts().ObjCRuntimeHasTerminate)
    141     name = "objc_terminate";
    142   else
    143     name = "abort";
    144   return CGF.CGM.CreateRuntimeFunction(FTy, name);
    145 }
    146 
    147 static llvm::Constant *getCatchallRethrowFn(CodeGenFunction &CGF,
    148                                             llvm::StringRef Name) {
    149   llvm::Type *ArgTys[] = { CGF.Int8PtrTy };
    150   llvm::FunctionType *FTy =
    151     llvm::FunctionType::get(CGF.VoidTy, ArgTys, /*IsVarArgs=*/false);
    152 
    153   return CGF.CGM.CreateRuntimeFunction(FTy, Name);
    154 }
    155 
    156 const EHPersonality EHPersonality::GNU_C("__gcc_personality_v0");
    157 const EHPersonality EHPersonality::GNU_C_SJLJ("__gcc_personality_sj0");
    158 const EHPersonality EHPersonality::NeXT_ObjC("__objc_personality_v0");
    159 const EHPersonality EHPersonality::GNU_CPlusPlus("__gxx_personality_v0");
    160 const EHPersonality EHPersonality::GNU_CPlusPlus_SJLJ("__gxx_personality_sj0");
    161 const EHPersonality EHPersonality::GNU_ObjC("__gnu_objc_personality_v0",
    162                                             "objc_exception_throw");
    163 const EHPersonality EHPersonality::GNU_ObjCXX("__gnustep_objcxx_personality_v0");
    164 
    165 static const EHPersonality &getCPersonality(const LangOptions &L) {
    166   if (L.SjLjExceptions)
    167     return EHPersonality::GNU_C_SJLJ;
    168   return EHPersonality::GNU_C;
    169 }
    170 
    171 static const EHPersonality &getObjCPersonality(const LangOptions &L) {
    172   if (L.NeXTRuntime) {
    173     if (L.ObjCNonFragileABI) return EHPersonality::NeXT_ObjC;
    174     else return getCPersonality(L);
    175   } else {
    176     return EHPersonality::GNU_ObjC;
    177   }
    178 }
    179 
    180 static const EHPersonality &getCXXPersonality(const LangOptions &L) {
    181   if (L.SjLjExceptions)
    182     return EHPersonality::GNU_CPlusPlus_SJLJ;
    183   else
    184     return EHPersonality::GNU_CPlusPlus;
    185 }
    186 
    187 /// Determines the personality function to use when both C++
    188 /// and Objective-C exceptions are being caught.
    189 static const EHPersonality &getObjCXXPersonality(const LangOptions &L) {
    190   // The ObjC personality defers to the C++ personality for non-ObjC
    191   // handlers.  Unlike the C++ case, we use the same personality
    192   // function on targets using (backend-driven) SJLJ EH.
    193   if (L.NeXTRuntime) {
    194     if (L.ObjCNonFragileABI)
    195       return EHPersonality::NeXT_ObjC;
    196 
    197     // In the fragile ABI, just use C++ exception handling and hope
    198     // they're not doing crazy exception mixing.
    199     else
    200       return getCXXPersonality(L);
    201   }
    202 
    203   // The GNU runtime's personality function inherently doesn't support
    204   // mixed EH.  Use the C++ personality just to avoid returning null.
    205   return EHPersonality::GNU_ObjCXX;
    206 }
    207 
    208 const EHPersonality &EHPersonality::get(const LangOptions &L) {
    209   if (L.CPlusPlus && L.ObjC1)
    210     return getObjCXXPersonality(L);
    211   else if (L.CPlusPlus)
    212     return getCXXPersonality(L);
    213   else if (L.ObjC1)
    214     return getObjCPersonality(L);
    215   else
    216     return getCPersonality(L);
    217 }
    218 
    219 static llvm::Constant *getPersonalityFn(CodeGenModule &CGM,
    220                                         const EHPersonality &Personality) {
    221   llvm::Constant *Fn =
    222     CGM.CreateRuntimeFunction(llvm::FunctionType::get(
    223                                 llvm::Type::getInt32Ty(CGM.getLLVMContext()),
    224                                 true),
    225                               Personality.getPersonalityFnName());
    226   return Fn;
    227 }
    228 
    229 static llvm::Constant *getOpaquePersonalityFn(CodeGenModule &CGM,
    230                                         const EHPersonality &Personality) {
    231   llvm::Constant *Fn = getPersonalityFn(CGM, Personality);
    232   return llvm::ConstantExpr::getBitCast(Fn, CGM.Int8PtrTy);
    233 }
    234 
    235 /// Check whether a personality function could reasonably be swapped
    236 /// for a C++ personality function.
    237 static bool PersonalityHasOnlyCXXUses(llvm::Constant *Fn) {
    238   for (llvm::Constant::use_iterator
    239          I = Fn->use_begin(), E = Fn->use_end(); I != E; ++I) {
    240     llvm::User *User = *I;
    241 
    242     // Conditionally white-list bitcasts.
    243     if (llvm::ConstantExpr *CE = dyn_cast<llvm::ConstantExpr>(User)) {
    244       if (CE->getOpcode() != llvm::Instruction::BitCast) return false;
    245       if (!PersonalityHasOnlyCXXUses(CE))
    246         return false;
    247       continue;
    248     }
    249 
    250     // Otherwise, it has to be a selector call.
    251     if (!isa<llvm::EHSelectorInst>(User)) return false;
    252 
    253     llvm::EHSelectorInst *Selector = cast<llvm::EHSelectorInst>(User);
    254     for (unsigned I = 2, E = Selector->getNumArgOperands(); I != E; ++I) {
    255       // Look for something that would've been returned by the ObjC
    256       // runtime's GetEHType() method.
    257       llvm::GlobalVariable *GV
    258         = dyn_cast<llvm::GlobalVariable>(Selector->getArgOperand(I));
    259       if (!GV) continue;
    260 
    261       // ObjC EH selector entries are always global variables with
    262       // names starting like this.
    263       if (GV->getName().startswith("OBJC_EHTYPE"))
    264         return false;
    265     }
    266   }
    267 
    268   return true;
    269 }
    270 
    271 /// Try to use the C++ personality function in ObjC++.  Not doing this
    272 /// can cause some incompatibilities with gcc, which is more
    273 /// aggressive about only using the ObjC++ personality in a function
    274 /// when it really needs it.
    275 void CodeGenModule::SimplifyPersonality() {
    276   // For now, this is really a Darwin-specific operation.
    277   if (!Context.Target.getTriple().isOSDarwin())
    278     return;
    279 
    280   // If we're not in ObjC++ -fexceptions, there's nothing to do.
    281   if (!Features.CPlusPlus || !Features.ObjC1 || !Features.Exceptions)
    282     return;
    283 
    284   const EHPersonality &ObjCXX = EHPersonality::get(Features);
    285   const EHPersonality &CXX = getCXXPersonality(Features);
    286   if (&ObjCXX == &CXX ||
    287       ObjCXX.getPersonalityFnName() == CXX.getPersonalityFnName())
    288     return;
    289 
    290   llvm::Function *Fn =
    291     getModule().getFunction(ObjCXX.getPersonalityFnName());
    292 
    293   // Nothing to do if it's unused.
    294   if (!Fn || Fn->use_empty()) return;
    295 
    296   // Can't do the optimization if it has non-C++ uses.
    297   if (!PersonalityHasOnlyCXXUses(Fn)) return;
    298 
    299   // Create the C++ personality function and kill off the old
    300   // function.
    301   llvm::Constant *CXXFn = getPersonalityFn(*this, CXX);
    302 
    303   // This can happen if the user is screwing with us.
    304   if (Fn->getType() != CXXFn->getType()) return;
    305 
    306   Fn->replaceAllUsesWith(CXXFn);
    307   Fn->eraseFromParent();
    308 }
    309 
    310 /// Returns the value to inject into a selector to indicate the
    311 /// presence of a catch-all.
    312 static llvm::Constant *getCatchAllValue(CodeGenFunction &CGF) {
    313   // Possibly we should use @llvm.eh.catch.all.value here.
    314   return llvm::ConstantPointerNull::get(CGF.Int8PtrTy);
    315 }
    316 
    317 /// Returns the value to inject into a selector to indicate the
    318 /// presence of a cleanup.
    319 static llvm::Constant *getCleanupValue(CodeGenFunction &CGF) {
    320   return llvm::ConstantInt::get(CGF.Builder.getInt32Ty(), 0);
    321 }
    322 
    323 namespace {
    324   /// A cleanup to free the exception object if its initialization
    325   /// throws.
    326   struct FreeException : EHScopeStack::Cleanup {
    327     llvm::Value *exn;
    328     FreeException(llvm::Value *exn) : exn(exn) {}
    329     void Emit(CodeGenFunction &CGF, Flags flags) {
    330       CGF.Builder.CreateCall(getFreeExceptionFn(CGF), exn)
    331         ->setDoesNotThrow();
    332     }
    333   };
    334 }
    335 
    336 // Emits an exception expression into the given location.  This
    337 // differs from EmitAnyExprToMem only in that, if a final copy-ctor
    338 // call is required, an exception within that copy ctor causes
    339 // std::terminate to be invoked.
    340 static void EmitAnyExprToExn(CodeGenFunction &CGF, const Expr *e,
    341                              llvm::Value *addr) {
    342   // Make sure the exception object is cleaned up if there's an
    343   // exception during initialization.
    344   CGF.pushFullExprCleanup<FreeException>(EHCleanup, addr);
    345   EHScopeStack::stable_iterator cleanup = CGF.EHStack.stable_begin();
    346 
    347   // __cxa_allocate_exception returns a void*;  we need to cast this
    348   // to the appropriate type for the object.
    349   llvm::Type *ty = CGF.ConvertTypeForMem(e->getType())->getPointerTo();
    350   llvm::Value *typedAddr = CGF.Builder.CreateBitCast(addr, ty);
    351 
    352   // FIXME: this isn't quite right!  If there's a final unelided call
    353   // to a copy constructor, then according to [except.terminate]p1 we
    354   // must call std::terminate() if that constructor throws, because
    355   // technically that copy occurs after the exception expression is
    356   // evaluated but before the exception is caught.  But the best way
    357   // to handle that is to teach EmitAggExpr to do the final copy
    358   // differently if it can't be elided.
    359   CGF.EmitAnyExprToMem(e, typedAddr, e->getType().getQualifiers(),
    360                        /*IsInit*/ true);
    361 
    362   // Deactivate the cleanup block.
    363   CGF.DeactivateCleanupBlock(cleanup);
    364 }
    365 
    366 llvm::Value *CodeGenFunction::getExceptionSlot() {
    367   if (!ExceptionSlot)
    368     ExceptionSlot = CreateTempAlloca(Int8PtrTy, "exn.slot");
    369   return ExceptionSlot;
    370 }
    371 
    372 llvm::Value *CodeGenFunction::getEHSelectorSlot() {
    373   if (!EHSelectorSlot)
    374     EHSelectorSlot = CreateTempAlloca(Int32Ty, "ehselector.slot");
    375   return EHSelectorSlot;
    376 }
    377 
    378 void CodeGenFunction::EmitCXXThrowExpr(const CXXThrowExpr *E) {
    379   if (!E->getSubExpr()) {
    380     if (getInvokeDest()) {
    381       Builder.CreateInvoke(getReThrowFn(*this),
    382                            getUnreachableBlock(),
    383                            getInvokeDest())
    384         ->setDoesNotReturn();
    385     } else {
    386       Builder.CreateCall(getReThrowFn(*this))->setDoesNotReturn();
    387       Builder.CreateUnreachable();
    388     }
    389 
    390     // throw is an expression, and the expression emitters expect us
    391     // to leave ourselves at a valid insertion point.
    392     EmitBlock(createBasicBlock("throw.cont"));
    393 
    394     return;
    395   }
    396 
    397   QualType ThrowType = E->getSubExpr()->getType();
    398 
    399   // Now allocate the exception object.
    400   llvm::Type *SizeTy = ConvertType(getContext().getSizeType());
    401   uint64_t TypeSize = getContext().getTypeSizeInChars(ThrowType).getQuantity();
    402 
    403   llvm::Constant *AllocExceptionFn = getAllocateExceptionFn(*this);
    404   llvm::CallInst *ExceptionPtr =
    405     Builder.CreateCall(AllocExceptionFn,
    406                        llvm::ConstantInt::get(SizeTy, TypeSize),
    407                        "exception");
    408   ExceptionPtr->setDoesNotThrow();
    409 
    410   EmitAnyExprToExn(*this, E->getSubExpr(), ExceptionPtr);
    411 
    412   // Now throw the exception.
    413   llvm::Constant *TypeInfo = CGM.GetAddrOfRTTIDescriptor(ThrowType,
    414                                                          /*ForEH=*/true);
    415 
    416   // The address of the destructor.  If the exception type has a
    417   // trivial destructor (or isn't a record), we just pass null.
    418   llvm::Constant *Dtor = 0;
    419   if (const RecordType *RecordTy = ThrowType->getAs<RecordType>()) {
    420     CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordTy->getDecl());
    421     if (!Record->hasTrivialDestructor()) {
    422       CXXDestructorDecl *DtorD = Record->getDestructor();
    423       Dtor = CGM.GetAddrOfCXXDestructor(DtorD, Dtor_Complete);
    424       Dtor = llvm::ConstantExpr::getBitCast(Dtor, Int8PtrTy);
    425     }
    426   }
    427   if (!Dtor) Dtor = llvm::Constant::getNullValue(Int8PtrTy);
    428 
    429   if (getInvokeDest()) {
    430     llvm::InvokeInst *ThrowCall =
    431       Builder.CreateInvoke3(getThrowFn(*this),
    432                             getUnreachableBlock(), getInvokeDest(),
    433                             ExceptionPtr, TypeInfo, Dtor);
    434     ThrowCall->setDoesNotReturn();
    435   } else {
    436     llvm::CallInst *ThrowCall =
    437       Builder.CreateCall3(getThrowFn(*this), ExceptionPtr, TypeInfo, Dtor);
    438     ThrowCall->setDoesNotReturn();
    439     Builder.CreateUnreachable();
    440   }
    441 
    442   // throw is an expression, and the expression emitters expect us
    443   // to leave ourselves at a valid insertion point.
    444   EmitBlock(createBasicBlock("throw.cont"));
    445 }
    446 
    447 void CodeGenFunction::EmitStartEHSpec(const Decl *D) {
    448   if (!CGM.getLangOptions().CXXExceptions)
    449     return;
    450 
    451   const FunctionDecl* FD = dyn_cast_or_null<FunctionDecl>(D);
    452   if (FD == 0)
    453     return;
    454   const FunctionProtoType *Proto = FD->getType()->getAs<FunctionProtoType>();
    455   if (Proto == 0)
    456     return;
    457 
    458   ExceptionSpecificationType EST = Proto->getExceptionSpecType();
    459   if (isNoexceptExceptionSpec(EST)) {
    460     if (Proto->getNoexceptSpec(getContext()) == FunctionProtoType::NR_Nothrow) {
    461       // noexcept functions are simple terminate scopes.
    462       EHStack.pushTerminate();
    463     }
    464   } else if (EST == EST_Dynamic || EST == EST_DynamicNone) {
    465     unsigned NumExceptions = Proto->getNumExceptions();
    466     EHFilterScope *Filter = EHStack.pushFilter(NumExceptions);
    467 
    468     for (unsigned I = 0; I != NumExceptions; ++I) {
    469       QualType Ty = Proto->getExceptionType(I);
    470       QualType ExceptType = Ty.getNonReferenceType().getUnqualifiedType();
    471       llvm::Value *EHType = CGM.GetAddrOfRTTIDescriptor(ExceptType,
    472                                                         /*ForEH=*/true);
    473       Filter->setFilter(I, EHType);
    474     }
    475   }
    476 }
    477 
    478 void CodeGenFunction::EmitEndEHSpec(const Decl *D) {
    479   if (!CGM.getLangOptions().CXXExceptions)
    480     return;
    481 
    482   const FunctionDecl* FD = dyn_cast_or_null<FunctionDecl>(D);
    483   if (FD == 0)
    484     return;
    485   const FunctionProtoType *Proto = FD->getType()->getAs<FunctionProtoType>();
    486   if (Proto == 0)
    487     return;
    488 
    489   ExceptionSpecificationType EST = Proto->getExceptionSpecType();
    490   if (isNoexceptExceptionSpec(EST)) {
    491     if (Proto->getNoexceptSpec(getContext()) == FunctionProtoType::NR_Nothrow) {
    492       EHStack.popTerminate();
    493     }
    494   } else if (EST == EST_Dynamic || EST == EST_DynamicNone) {
    495     EHStack.popFilter();
    496   }
    497 }
    498 
    499 void CodeGenFunction::EmitCXXTryStmt(const CXXTryStmt &S) {
    500   EnterCXXTryStmt(S);
    501   EmitStmt(S.getTryBlock());
    502   ExitCXXTryStmt(S);
    503 }
    504 
    505 void CodeGenFunction::EnterCXXTryStmt(const CXXTryStmt &S, bool IsFnTryBlock) {
    506   unsigned NumHandlers = S.getNumHandlers();
    507   EHCatchScope *CatchScope = EHStack.pushCatch(NumHandlers);
    508 
    509   for (unsigned I = 0; I != NumHandlers; ++I) {
    510     const CXXCatchStmt *C = S.getHandler(I);
    511 
    512     llvm::BasicBlock *Handler = createBasicBlock("catch");
    513     if (C->getExceptionDecl()) {
    514       // FIXME: Dropping the reference type on the type into makes it
    515       // impossible to correctly implement catch-by-reference
    516       // semantics for pointers.  Unfortunately, this is what all
    517       // existing compilers do, and it's not clear that the standard
    518       // personality routine is capable of doing this right.  See C++ DR 388:
    519       //   http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#388
    520       QualType CaughtType = C->getCaughtType();
    521       CaughtType = CaughtType.getNonReferenceType().getUnqualifiedType();
    522 
    523       llvm::Value *TypeInfo = 0;
    524       if (CaughtType->isObjCObjectPointerType())
    525         TypeInfo = CGM.getObjCRuntime().GetEHType(CaughtType);
    526       else
    527         TypeInfo = CGM.GetAddrOfRTTIDescriptor(CaughtType, /*ForEH=*/true);
    528       CatchScope->setHandler(I, TypeInfo, Handler);
    529     } else {
    530       // No exception decl indicates '...', a catch-all.
    531       CatchScope->setCatchAllHandler(I, Handler);
    532     }
    533   }
    534 }
    535 
    536 /// Check whether this is a non-EH scope, i.e. a scope which doesn't
    537 /// affect exception handling.  Currently, the only non-EH scopes are
    538 /// normal-only cleanup scopes.
    539 static bool isNonEHScope(const EHScope &S) {
    540   switch (S.getKind()) {
    541   case EHScope::Cleanup:
    542     return !cast<EHCleanupScope>(S).isEHCleanup();
    543   case EHScope::Filter:
    544   case EHScope::Catch:
    545   case EHScope::Terminate:
    546     return false;
    547   }
    548 
    549   // Suppress warning.
    550   return false;
    551 }
    552 
    553 llvm::BasicBlock *CodeGenFunction::getInvokeDestImpl() {
    554   assert(EHStack.requiresLandingPad());
    555   assert(!EHStack.empty());
    556 
    557   if (!CGM.getLangOptions().Exceptions)
    558     return 0;
    559 
    560   // Check the innermost scope for a cached landing pad.  If this is
    561   // a non-EH cleanup, we'll check enclosing scopes in EmitLandingPad.
    562   llvm::BasicBlock *LP = EHStack.begin()->getCachedLandingPad();
    563   if (LP) return LP;
    564 
    565   // Build the landing pad for this scope.
    566   LP = EmitLandingPad();
    567   assert(LP);
    568 
    569   // Cache the landing pad on the innermost scope.  If this is a
    570   // non-EH scope, cache the landing pad on the enclosing scope, too.
    571   for (EHScopeStack::iterator ir = EHStack.begin(); true; ++ir) {
    572     ir->setCachedLandingPad(LP);
    573     if (!isNonEHScope(*ir)) break;
    574   }
    575 
    576   return LP;
    577 }
    578 
    579 // This code contains a hack to work around a design flaw in
    580 // LLVM's EH IR which breaks semantics after inlining.  This same
    581 // hack is implemented in llvm-gcc.
    582 //
    583 // The LLVM EH abstraction is basically a thin veneer over the
    584 // traditional GCC zero-cost design: for each range of instructions
    585 // in the function, there is (at most) one "landing pad" with an
    586 // associated chain of EH actions.  A language-specific personality
    587 // function interprets this chain of actions and (1) decides whether
    588 // or not to resume execution at the landing pad and (2) if so,
    589 // provides an integer indicating why it's stopping.  In LLVM IR,
    590 // the association of a landing pad with a range of instructions is
    591 // achieved via an invoke instruction, the chain of actions becomes
    592 // the arguments to the @llvm.eh.selector call, and the selector
    593 // call returns the integer indicator.  Other than the required
    594 // presence of two intrinsic function calls in the landing pad,
    595 // the IR exactly describes the layout of the output code.
    596 //
    597 // A principal advantage of this design is that it is completely
    598 // language-agnostic; in theory, the LLVM optimizers can treat
    599 // landing pads neutrally, and targets need only know how to lower
    600 // the intrinsics to have a functioning exceptions system (assuming
    601 // that platform exceptions follow something approximately like the
    602 // GCC design).  Unfortunately, landing pads cannot be combined in a
    603 // language-agnostic way: given selectors A and B, there is no way
    604 // to make a single landing pad which faithfully represents the
    605 // semantics of propagating an exception first through A, then
    606 // through B, without knowing how the personality will interpret the
    607 // (lowered form of the) selectors.  This means that inlining has no
    608 // choice but to crudely chain invokes (i.e., to ignore invokes in
    609 // the inlined function, but to turn all unwindable calls into
    610 // invokes), which is only semantically valid if every unwind stops
    611 // at every landing pad.
    612 //
    613 // Therefore, the invoke-inline hack is to guarantee that every
    614 // landing pad has a catch-all.
    615 enum CleanupHackLevel_t {
    616   /// A level of hack that requires that all landing pads have
    617   /// catch-alls.
    618   CHL_MandatoryCatchall,
    619 
    620   /// A level of hack that requires that all landing pads handle
    621   /// cleanups.
    622   CHL_MandatoryCleanup,
    623 
    624   /// No hacks at all;  ideal IR generation.
    625   CHL_Ideal
    626 };
    627 const CleanupHackLevel_t CleanupHackLevel = CHL_MandatoryCleanup;
    628 
    629 llvm::BasicBlock *CodeGenFunction::EmitLandingPad() {
    630   assert(EHStack.requiresLandingPad());
    631 
    632   for (EHScopeStack::iterator ir = EHStack.begin(); ; ) {
    633     assert(ir != EHStack.end() &&
    634            "stack requiring landing pad is nothing but non-EH scopes?");
    635 
    636     // If this is a terminate scope, just use the singleton terminate
    637     // landing pad.
    638     if (isa<EHTerminateScope>(*ir))
    639       return getTerminateLandingPad();
    640 
    641     // If this isn't an EH scope, iterate; otherwise break out.
    642     if (!isNonEHScope(*ir)) break;
    643     ++ir;
    644 
    645     // We haven't checked this scope for a cached landing pad yet.
    646     if (llvm::BasicBlock *LP = ir->getCachedLandingPad())
    647       return LP;
    648   }
    649 
    650   // Save the current IR generation state.
    651   CGBuilderTy::InsertPoint SavedIP = Builder.saveAndClearIP();
    652 
    653   const EHPersonality &Personality = EHPersonality::get(getLangOptions());
    654 
    655   // Create and configure the landing pad.
    656   llvm::BasicBlock *LP = createBasicBlock("lpad");
    657   EmitBlock(LP);
    658 
    659   // Save the exception pointer.  It's safe to use a single exception
    660   // pointer per function because EH cleanups can never have nested
    661   // try/catches.
    662   llvm::CallInst *Exn =
    663     Builder.CreateCall(CGM.getIntrinsic(llvm::Intrinsic::eh_exception), "exn");
    664   Exn->setDoesNotThrow();
    665   Builder.CreateStore(Exn, getExceptionSlot());
    666 
    667   // Build the selector arguments.
    668   llvm::SmallVector<llvm::Value*, 8> EHSelector;
    669   EHSelector.push_back(Exn);
    670   EHSelector.push_back(getOpaquePersonalityFn(CGM, Personality));
    671 
    672   // Accumulate all the handlers in scope.
    673   llvm::DenseMap<llvm::Value*, UnwindDest> EHHandlers;
    674   UnwindDest CatchAll;
    675   bool HasEHCleanup = false;
    676   bool HasEHFilter = false;
    677   llvm::SmallVector<llvm::Value*, 8> EHFilters;
    678   for (EHScopeStack::iterator I = EHStack.begin(), E = EHStack.end();
    679          I != E; ++I) {
    680 
    681     switch (I->getKind()) {
    682     case EHScope::Cleanup:
    683       if (!HasEHCleanup)
    684         HasEHCleanup = cast<EHCleanupScope>(*I).isEHCleanup();
    685       // We otherwise don't care about cleanups.
    686       continue;
    687 
    688     case EHScope::Filter: {
    689       assert(I.next() == EHStack.end() && "EH filter is not end of EH stack");
    690       assert(!CatchAll.isValid() && "EH filter reached after catch-all");
    691 
    692       // Filter scopes get added to the selector in weird ways.
    693       EHFilterScope &Filter = cast<EHFilterScope>(*I);
    694       HasEHFilter = true;
    695 
    696       // Add all the filter values which we aren't already explicitly
    697       // catching.
    698       for (unsigned I = 0, E = Filter.getNumFilters(); I != E; ++I) {
    699         llvm::Value *FV = Filter.getFilter(I);
    700         if (!EHHandlers.count(FV))
    701           EHFilters.push_back(FV);
    702       }
    703       goto done;
    704     }
    705 
    706     case EHScope::Terminate:
    707       // Terminate scopes are basically catch-alls.
    708       assert(!CatchAll.isValid());
    709       CatchAll = UnwindDest(getTerminateHandler(),
    710                             EHStack.getEnclosingEHCleanup(I),
    711                             cast<EHTerminateScope>(*I).getDestIndex());
    712       goto done;
    713 
    714     case EHScope::Catch:
    715       break;
    716     }
    717 
    718     EHCatchScope &Catch = cast<EHCatchScope>(*I);
    719     for (unsigned HI = 0, HE = Catch.getNumHandlers(); HI != HE; ++HI) {
    720       EHCatchScope::Handler Handler = Catch.getHandler(HI);
    721 
    722       // Catch-all.  We should only have one of these per catch.
    723       if (!Handler.Type) {
    724         assert(!CatchAll.isValid());
    725         CatchAll = UnwindDest(Handler.Block,
    726                               EHStack.getEnclosingEHCleanup(I),
    727                               Handler.Index);
    728         continue;
    729       }
    730 
    731       // Check whether we already have a handler for this type.
    732       UnwindDest &Dest = EHHandlers[Handler.Type];
    733       if (Dest.isValid()) continue;
    734 
    735       EHSelector.push_back(Handler.Type);
    736       Dest = UnwindDest(Handler.Block,
    737                         EHStack.getEnclosingEHCleanup(I),
    738                         Handler.Index);
    739     }
    740 
    741     // Stop if we found a catch-all.
    742     if (CatchAll.isValid()) break;
    743   }
    744 
    745  done:
    746   unsigned LastToEmitInLoop = EHSelector.size();
    747 
    748   // If we have a catch-all, add null to the selector.
    749   if (CatchAll.isValid()) {
    750     EHSelector.push_back(getCatchAllValue(*this));
    751 
    752   // If we have an EH filter, we need to add those handlers in the
    753   // right place in the selector, which is to say, at the end.
    754   } else if (HasEHFilter) {
    755     // Create a filter expression: an integer constant saying how many
    756     // filters there are (+1 to avoid ambiguity with 0 for cleanup),
    757     // followed by the filter types.  The personality routine only
    758     // lands here if the filter doesn't match.
    759     EHSelector.push_back(llvm::ConstantInt::get(Builder.getInt32Ty(),
    760                                                 EHFilters.size() + 1));
    761     EHSelector.append(EHFilters.begin(), EHFilters.end());
    762 
    763     // Also check whether we need a cleanup.
    764     if (CleanupHackLevel == CHL_MandatoryCatchall || HasEHCleanup)
    765       EHSelector.push_back(CleanupHackLevel == CHL_MandatoryCatchall
    766                            ? getCatchAllValue(*this)
    767                            : getCleanupValue(*this));
    768 
    769   // Otherwise, signal that we at least have cleanups.
    770   } else if (CleanupHackLevel == CHL_MandatoryCatchall || HasEHCleanup) {
    771     EHSelector.push_back(CleanupHackLevel == CHL_MandatoryCatchall
    772                          ? getCatchAllValue(*this)
    773                          : getCleanupValue(*this));
    774 
    775   // At the MandatoryCleanup hack level, we don't need to actually
    776   // spuriously tell the unwinder that we have cleanups, but we do
    777   // need to always be prepared to handle cleanups.
    778   } else if (CleanupHackLevel == CHL_MandatoryCleanup) {
    779     // Just don't decrement LastToEmitInLoop.
    780 
    781   } else {
    782     assert(LastToEmitInLoop > 2);
    783     LastToEmitInLoop--;
    784   }
    785 
    786   assert(EHSelector.size() >= 3 && "selector call has only two arguments!");
    787 
    788   // Tell the backend how to generate the landing pad.
    789   llvm::CallInst *Selection =
    790     Builder.CreateCall(CGM.getIntrinsic(llvm::Intrinsic::eh_selector),
    791                        EHSelector, "eh.selector");
    792   Selection->setDoesNotThrow();
    793 
    794   // Save the selector value in mandatory-cleanup mode.
    795   if (CleanupHackLevel == CHL_MandatoryCleanup)
    796     Builder.CreateStore(Selection, getEHSelectorSlot());
    797 
    798   // Select the right handler.
    799   llvm::Value *llvm_eh_typeid_for =
    800     CGM.getIntrinsic(llvm::Intrinsic::eh_typeid_for);
    801 
    802   // The results of llvm_eh_typeid_for aren't reliable --- at least
    803   // not locally --- so we basically have to do this as an 'if' chain.
    804   // We walk through the first N-1 catch clauses, testing and chaining,
    805   // and then fall into the final clause (which is either a cleanup, a
    806   // filter (possibly with a cleanup), a catch-all, or another catch).
    807   for (unsigned I = 2; I != LastToEmitInLoop; ++I) {
    808     llvm::Value *Type = EHSelector[I];
    809     UnwindDest Dest = EHHandlers[Type];
    810     assert(Dest.isValid() && "no handler entry for value in selector?");
    811 
    812     // Figure out where to branch on a match.  As a debug code-size
    813     // optimization, if the scope depth matches the innermost cleanup,
    814     // we branch directly to the catch handler.
    815     llvm::BasicBlock *Match = Dest.getBlock();
    816     bool MatchNeedsCleanup =
    817       Dest.getScopeDepth() != EHStack.getInnermostEHCleanup();
    818     if (MatchNeedsCleanup)
    819       Match = createBasicBlock("eh.match");
    820 
    821     llvm::BasicBlock *Next = createBasicBlock("eh.next");
    822 
    823     // Check whether the exception matches.
    824     llvm::CallInst *Id
    825       = Builder.CreateCall(llvm_eh_typeid_for,
    826                            Builder.CreateBitCast(Type, Int8PtrTy));
    827     Id->setDoesNotThrow();
    828     Builder.CreateCondBr(Builder.CreateICmpEQ(Selection, Id),
    829                          Match, Next);
    830 
    831     // Emit match code if necessary.
    832     if (MatchNeedsCleanup) {
    833       EmitBlock(Match);
    834       EmitBranchThroughEHCleanup(Dest);
    835     }
    836 
    837     // Continue to the next match.
    838     EmitBlock(Next);
    839   }
    840 
    841   // Emit the final case in the selector.
    842   // This might be a catch-all....
    843   if (CatchAll.isValid()) {
    844     assert(isa<llvm::ConstantPointerNull>(EHSelector.back()));
    845     EmitBranchThroughEHCleanup(CatchAll);
    846 
    847   // ...or an EH filter...
    848   } else if (HasEHFilter) {
    849     llvm::Value *SavedSelection = Selection;
    850 
    851     // First, unwind out to the outermost scope if necessary.
    852     if (EHStack.hasEHCleanups()) {
    853       // The end here might not dominate the beginning, so we might need to
    854       // save the selector if we need it.
    855       llvm::AllocaInst *SelectorVar = 0;
    856       if (HasEHCleanup) {
    857         SelectorVar = CreateTempAlloca(Builder.getInt32Ty(), "selector.var");
    858         Builder.CreateStore(Selection, SelectorVar);
    859       }
    860 
    861       llvm::BasicBlock *CleanupContBB = createBasicBlock("ehspec.cleanup.cont");
    862       EmitBranchThroughEHCleanup(UnwindDest(CleanupContBB, EHStack.stable_end(),
    863                                             EHStack.getNextEHDestIndex()));
    864       EmitBlock(CleanupContBB);
    865 
    866       if (HasEHCleanup)
    867         SavedSelection = Builder.CreateLoad(SelectorVar, "ehspec.saved-selector");
    868     }
    869 
    870     // If there was a cleanup, we'll need to actually check whether we
    871     // landed here because the filter triggered.
    872     if (CleanupHackLevel != CHL_Ideal || HasEHCleanup) {
    873       llvm::BasicBlock *UnexpectedBB = createBasicBlock("ehspec.unexpected");
    874 
    875       llvm::Constant *Zero = llvm::ConstantInt::get(Int32Ty, 0);
    876       llvm::Value *FailsFilter =
    877         Builder.CreateICmpSLT(SavedSelection, Zero, "ehspec.fails");
    878       Builder.CreateCondBr(FailsFilter, UnexpectedBB, getRethrowDest().getBlock());
    879 
    880       EmitBlock(UnexpectedBB);
    881     }
    882 
    883     // Call __cxa_call_unexpected.  This doesn't need to be an invoke
    884     // because __cxa_call_unexpected magically filters exceptions
    885     // according to the last landing pad the exception was thrown
    886     // into.  Seriously.
    887     Builder.CreateCall(getUnexpectedFn(*this),
    888                        Builder.CreateLoad(getExceptionSlot()))
    889       ->setDoesNotReturn();
    890     Builder.CreateUnreachable();
    891 
    892   // ...or a normal catch handler...
    893   } else if (CleanupHackLevel == CHL_Ideal && !HasEHCleanup) {
    894     llvm::Value *Type = EHSelector.back();
    895     EmitBranchThroughEHCleanup(EHHandlers[Type]);
    896 
    897   // ...or a cleanup.
    898   } else {
    899     EmitBranchThroughEHCleanup(getRethrowDest());
    900   }
    901 
    902   // Restore the old IR generation state.
    903   Builder.restoreIP(SavedIP);
    904 
    905   return LP;
    906 }
    907 
    908 namespace {
    909   /// A cleanup to call __cxa_end_catch.  In many cases, the caught
    910   /// exception type lets us state definitively that the thrown exception
    911   /// type does not have a destructor.  In particular:
    912   ///   - Catch-alls tell us nothing, so we have to conservatively
    913   ///     assume that the thrown exception might have a destructor.
    914   ///   - Catches by reference behave according to their base types.
    915   ///   - Catches of non-record types will only trigger for exceptions
    916   ///     of non-record types, which never have destructors.
    917   ///   - Catches of record types can trigger for arbitrary subclasses
    918   ///     of the caught type, so we have to assume the actual thrown
    919   ///     exception type might have a throwing destructor, even if the
    920   ///     caught type's destructor is trivial or nothrow.
    921   struct CallEndCatch : EHScopeStack::Cleanup {
    922     CallEndCatch(bool MightThrow) : MightThrow(MightThrow) {}
    923     bool MightThrow;
    924 
    925     void Emit(CodeGenFunction &CGF, Flags flags) {
    926       if (!MightThrow) {
    927         CGF.Builder.CreateCall(getEndCatchFn(CGF))->setDoesNotThrow();
    928         return;
    929       }
    930 
    931       CGF.EmitCallOrInvoke(getEndCatchFn(CGF));
    932     }
    933   };
    934 }
    935 
    936 /// Emits a call to __cxa_begin_catch and enters a cleanup to call
    937 /// __cxa_end_catch.
    938 ///
    939 /// \param EndMightThrow - true if __cxa_end_catch might throw
    940 static llvm::Value *CallBeginCatch(CodeGenFunction &CGF,
    941                                    llvm::Value *Exn,
    942                                    bool EndMightThrow) {
    943   llvm::CallInst *Call = CGF.Builder.CreateCall(getBeginCatchFn(CGF), Exn);
    944   Call->setDoesNotThrow();
    945 
    946   CGF.EHStack.pushCleanup<CallEndCatch>(NormalAndEHCleanup, EndMightThrow);
    947 
    948   return Call;
    949 }
    950 
    951 /// A "special initializer" callback for initializing a catch
    952 /// parameter during catch initialization.
    953 static void InitCatchParam(CodeGenFunction &CGF,
    954                            const VarDecl &CatchParam,
    955                            llvm::Value *ParamAddr) {
    956   // Load the exception from where the landing pad saved it.
    957   llvm::Value *Exn = CGF.Builder.CreateLoad(CGF.getExceptionSlot(), "exn");
    958 
    959   CanQualType CatchType =
    960     CGF.CGM.getContext().getCanonicalType(CatchParam.getType());
    961   llvm::Type *LLVMCatchTy = CGF.ConvertTypeForMem(CatchType);
    962 
    963   // If we're catching by reference, we can just cast the object
    964   // pointer to the appropriate pointer.
    965   if (isa<ReferenceType>(CatchType)) {
    966     QualType CaughtType = cast<ReferenceType>(CatchType)->getPointeeType();
    967     bool EndCatchMightThrow = CaughtType->isRecordType();
    968 
    969     // __cxa_begin_catch returns the adjusted object pointer.
    970     llvm::Value *AdjustedExn = CallBeginCatch(CGF, Exn, EndCatchMightThrow);
    971 
    972     // We have no way to tell the personality function that we're
    973     // catching by reference, so if we're catching a pointer,
    974     // __cxa_begin_catch will actually return that pointer by value.
    975     if (const PointerType *PT = dyn_cast<PointerType>(CaughtType)) {
    976       QualType PointeeType = PT->getPointeeType();
    977 
    978       // When catching by reference, generally we should just ignore
    979       // this by-value pointer and use the exception object instead.
    980       if (!PointeeType->isRecordType()) {
    981 
    982         // Exn points to the struct _Unwind_Exception header, which
    983         // we have to skip past in order to reach the exception data.
    984         unsigned HeaderSize =
    985           CGF.CGM.getTargetCodeGenInfo().getSizeOfUnwindException();
    986         AdjustedExn = CGF.Builder.CreateConstGEP1_32(Exn, HeaderSize);
    987 
    988       // However, if we're catching a pointer-to-record type that won't
    989       // work, because the personality function might have adjusted
    990       // the pointer.  There's actually no way for us to fully satisfy
    991       // the language/ABI contract here:  we can't use Exn because it
    992       // might have the wrong adjustment, but we can't use the by-value
    993       // pointer because it's off by a level of abstraction.
    994       //
    995       // The current solution is to dump the adjusted pointer into an
    996       // alloca, which breaks language semantics (because changing the
    997       // pointer doesn't change the exception) but at least works.
    998       // The better solution would be to filter out non-exact matches
    999       // and rethrow them, but this is tricky because the rethrow
   1000       // really needs to be catchable by other sites at this landing
   1001       // pad.  The best solution is to fix the personality function.
   1002       } else {
   1003         // Pull the pointer for the reference type off.
   1004         llvm::Type *PtrTy =
   1005           cast<llvm::PointerType>(LLVMCatchTy)->getElementType();
   1006 
   1007         // Create the temporary and write the adjusted pointer into it.
   1008         llvm::Value *ExnPtrTmp = CGF.CreateTempAlloca(PtrTy, "exn.byref.tmp");
   1009         llvm::Value *Casted = CGF.Builder.CreateBitCast(AdjustedExn, PtrTy);
   1010         CGF.Builder.CreateStore(Casted, ExnPtrTmp);
   1011 
   1012         // Bind the reference to the temporary.
   1013         AdjustedExn = ExnPtrTmp;
   1014       }
   1015     }
   1016 
   1017     llvm::Value *ExnCast =
   1018       CGF.Builder.CreateBitCast(AdjustedExn, LLVMCatchTy, "exn.byref");
   1019     CGF.Builder.CreateStore(ExnCast, ParamAddr);
   1020     return;
   1021   }
   1022 
   1023   // Non-aggregates (plus complexes).
   1024   bool IsComplex = false;
   1025   if (!CGF.hasAggregateLLVMType(CatchType) ||
   1026       (IsComplex = CatchType->isAnyComplexType())) {
   1027     llvm::Value *AdjustedExn = CallBeginCatch(CGF, Exn, false);
   1028 
   1029     // If the catch type is a pointer type, __cxa_begin_catch returns
   1030     // the pointer by value.
   1031     if (CatchType->hasPointerRepresentation()) {
   1032       llvm::Value *CastExn =
   1033         CGF.Builder.CreateBitCast(AdjustedExn, LLVMCatchTy, "exn.casted");
   1034       CGF.Builder.CreateStore(CastExn, ParamAddr);
   1035       return;
   1036     }
   1037 
   1038     // Otherwise, it returns a pointer into the exception object.
   1039 
   1040     llvm::Type *PtrTy = LLVMCatchTy->getPointerTo(0); // addrspace 0 ok
   1041     llvm::Value *Cast = CGF.Builder.CreateBitCast(AdjustedExn, PtrTy);
   1042 
   1043     if (IsComplex) {
   1044       CGF.StoreComplexToAddr(CGF.LoadComplexFromAddr(Cast, /*volatile*/ false),
   1045                              ParamAddr, /*volatile*/ false);
   1046     } else {
   1047       unsigned Alignment =
   1048         CGF.getContext().getDeclAlign(&CatchParam).getQuantity();
   1049       llvm::Value *ExnLoad = CGF.Builder.CreateLoad(Cast, "exn.scalar");
   1050       CGF.EmitStoreOfScalar(ExnLoad, ParamAddr, /*volatile*/ false, Alignment,
   1051                             CatchType);
   1052     }
   1053     return;
   1054   }
   1055 
   1056   assert(isa<RecordType>(CatchType) && "unexpected catch type!");
   1057 
   1058   llvm::Type *PtrTy = LLVMCatchTy->getPointerTo(0); // addrspace 0 ok
   1059 
   1060   // Check for a copy expression.  If we don't have a copy expression,
   1061   // that means a trivial copy is okay.
   1062   const Expr *copyExpr = CatchParam.getInit();
   1063   if (!copyExpr) {
   1064     llvm::Value *rawAdjustedExn = CallBeginCatch(CGF, Exn, true);
   1065     llvm::Value *adjustedExn = CGF.Builder.CreateBitCast(rawAdjustedExn, PtrTy);
   1066     CGF.EmitAggregateCopy(ParamAddr, adjustedExn, CatchType);
   1067     return;
   1068   }
   1069 
   1070   // We have to call __cxa_get_exception_ptr to get the adjusted
   1071   // pointer before copying.
   1072   llvm::CallInst *rawAdjustedExn =
   1073     CGF.Builder.CreateCall(getGetExceptionPtrFn(CGF), Exn);
   1074   rawAdjustedExn->setDoesNotThrow();
   1075 
   1076   // Cast that to the appropriate type.
   1077   llvm::Value *adjustedExn = CGF.Builder.CreateBitCast(rawAdjustedExn, PtrTy);
   1078 
   1079   // The copy expression is defined in terms of an OpaqueValueExpr.
   1080   // Find it and map it to the adjusted expression.
   1081   CodeGenFunction::OpaqueValueMapping
   1082     opaque(CGF, OpaqueValueExpr::findInCopyConstruct(copyExpr),
   1083            CGF.MakeAddrLValue(adjustedExn, CatchParam.getType()));
   1084 
   1085   // Call the copy ctor in a terminate scope.
   1086   CGF.EHStack.pushTerminate();
   1087 
   1088   // Perform the copy construction.
   1089   CGF.EmitAggExpr(copyExpr, AggValueSlot::forAddr(ParamAddr, Qualifiers(),
   1090                                                   false));
   1091 
   1092   // Leave the terminate scope.
   1093   CGF.EHStack.popTerminate();
   1094 
   1095   // Undo the opaque value mapping.
   1096   opaque.pop();
   1097 
   1098   // Finally we can call __cxa_begin_catch.
   1099   CallBeginCatch(CGF, Exn, true);
   1100 }
   1101 
   1102 /// Begins a catch statement by initializing the catch variable and
   1103 /// calling __cxa_begin_catch.
   1104 static void BeginCatch(CodeGenFunction &CGF, const CXXCatchStmt *S) {
   1105   // We have to be very careful with the ordering of cleanups here:
   1106   //   C++ [except.throw]p4:
   1107   //     The destruction [of the exception temporary] occurs
   1108   //     immediately after the destruction of the object declared in
   1109   //     the exception-declaration in the handler.
   1110   //
   1111   // So the precise ordering is:
   1112   //   1.  Construct catch variable.
   1113   //   2.  __cxa_begin_catch
   1114   //   3.  Enter __cxa_end_catch cleanup
   1115   //   4.  Enter dtor cleanup
   1116   //
   1117   // We do this by using a slightly abnormal initialization process.
   1118   // Delegation sequence:
   1119   //   - ExitCXXTryStmt opens a RunCleanupsScope
   1120   //     - EmitAutoVarAlloca creates the variable and debug info
   1121   //       - InitCatchParam initializes the variable from the exception
   1122   //       - CallBeginCatch calls __cxa_begin_catch
   1123   //       - CallBeginCatch enters the __cxa_end_catch cleanup
   1124   //     - EmitAutoVarCleanups enters the variable destructor cleanup
   1125   //   - EmitCXXTryStmt emits the code for the catch body
   1126   //   - EmitCXXTryStmt close the RunCleanupsScope
   1127 
   1128   VarDecl *CatchParam = S->getExceptionDecl();
   1129   if (!CatchParam) {
   1130     llvm::Value *Exn = CGF.Builder.CreateLoad(CGF.getExceptionSlot(), "exn");
   1131     CallBeginCatch(CGF, Exn, true);
   1132     return;
   1133   }
   1134 
   1135   // Emit the local.
   1136   CodeGenFunction::AutoVarEmission var = CGF.EmitAutoVarAlloca(*CatchParam);
   1137   InitCatchParam(CGF, *CatchParam, var.getObjectAddress(CGF));
   1138   CGF.EmitAutoVarCleanups(var);
   1139 }
   1140 
   1141 namespace {
   1142   struct CallRethrow : EHScopeStack::Cleanup {
   1143     void Emit(CodeGenFunction &CGF, Flags flags) {
   1144       CGF.EmitCallOrInvoke(getReThrowFn(CGF));
   1145     }
   1146   };
   1147 }
   1148 
   1149 void CodeGenFunction::ExitCXXTryStmt(const CXXTryStmt &S, bool IsFnTryBlock) {
   1150   unsigned NumHandlers = S.getNumHandlers();
   1151   EHCatchScope &CatchScope = cast<EHCatchScope>(*EHStack.begin());
   1152   assert(CatchScope.getNumHandlers() == NumHandlers);
   1153 
   1154   // Copy the handler blocks off before we pop the EH stack.  Emitting
   1155   // the handlers might scribble on this memory.
   1156   llvm::SmallVector<EHCatchScope::Handler, 8> Handlers(NumHandlers);
   1157   memcpy(Handlers.data(), CatchScope.begin(),
   1158          NumHandlers * sizeof(EHCatchScope::Handler));
   1159   EHStack.popCatch();
   1160 
   1161   // The fall-through block.
   1162   llvm::BasicBlock *ContBB = createBasicBlock("try.cont");
   1163 
   1164   // We just emitted the body of the try; jump to the continue block.
   1165   if (HaveInsertPoint())
   1166     Builder.CreateBr(ContBB);
   1167 
   1168   // Determine if we need an implicit rethrow for all these catch handlers.
   1169   bool ImplicitRethrow = false;
   1170   if (IsFnTryBlock)
   1171     ImplicitRethrow = isa<CXXDestructorDecl>(CurCodeDecl) ||
   1172                       isa<CXXConstructorDecl>(CurCodeDecl);
   1173 
   1174   for (unsigned I = 0; I != NumHandlers; ++I) {
   1175     llvm::BasicBlock *CatchBlock = Handlers[I].Block;
   1176     EmitBlock(CatchBlock);
   1177 
   1178     // Catch the exception if this isn't a catch-all.
   1179     const CXXCatchStmt *C = S.getHandler(I);
   1180 
   1181     // Enter a cleanup scope, including the catch variable and the
   1182     // end-catch.
   1183     RunCleanupsScope CatchScope(*this);
   1184 
   1185     // Initialize the catch variable and set up the cleanups.
   1186     BeginCatch(*this, C);
   1187 
   1188     // If there's an implicit rethrow, push a normal "cleanup" to call
   1189     // _cxa_rethrow.  This needs to happen before __cxa_end_catch is
   1190     // called, and so it is pushed after BeginCatch.
   1191     if (ImplicitRethrow)
   1192       EHStack.pushCleanup<CallRethrow>(NormalCleanup);
   1193 
   1194     // Perform the body of the catch.
   1195     EmitStmt(C->getHandlerBlock());
   1196 
   1197     // Fall out through the catch cleanups.
   1198     CatchScope.ForceCleanup();
   1199 
   1200     // Branch out of the try.
   1201     if (HaveInsertPoint())
   1202       Builder.CreateBr(ContBB);
   1203   }
   1204 
   1205   EmitBlock(ContBB);
   1206 }
   1207 
   1208 namespace {
   1209   struct CallEndCatchForFinally : EHScopeStack::Cleanup {
   1210     llvm::Value *ForEHVar;
   1211     llvm::Value *EndCatchFn;
   1212     CallEndCatchForFinally(llvm::Value *ForEHVar, llvm::Value *EndCatchFn)
   1213       : ForEHVar(ForEHVar), EndCatchFn(EndCatchFn) {}
   1214 
   1215     void Emit(CodeGenFunction &CGF, Flags flags) {
   1216       llvm::BasicBlock *EndCatchBB = CGF.createBasicBlock("finally.endcatch");
   1217       llvm::BasicBlock *CleanupContBB =
   1218         CGF.createBasicBlock("finally.cleanup.cont");
   1219 
   1220       llvm::Value *ShouldEndCatch =
   1221         CGF.Builder.CreateLoad(ForEHVar, "finally.endcatch");
   1222       CGF.Builder.CreateCondBr(ShouldEndCatch, EndCatchBB, CleanupContBB);
   1223       CGF.EmitBlock(EndCatchBB);
   1224       CGF.EmitCallOrInvoke(EndCatchFn); // catch-all, so might throw
   1225       CGF.EmitBlock(CleanupContBB);
   1226     }
   1227   };
   1228 
   1229   struct PerformFinally : EHScopeStack::Cleanup {
   1230     const Stmt *Body;
   1231     llvm::Value *ForEHVar;
   1232     llvm::Value *EndCatchFn;
   1233     llvm::Value *RethrowFn;
   1234     llvm::Value *SavedExnVar;
   1235 
   1236     PerformFinally(const Stmt *Body, llvm::Value *ForEHVar,
   1237                    llvm::Value *EndCatchFn,
   1238                    llvm::Value *RethrowFn, llvm::Value *SavedExnVar)
   1239       : Body(Body), ForEHVar(ForEHVar), EndCatchFn(EndCatchFn),
   1240         RethrowFn(RethrowFn), SavedExnVar(SavedExnVar) {}
   1241 
   1242     void Emit(CodeGenFunction &CGF, Flags flags) {
   1243       // Enter a cleanup to call the end-catch function if one was provided.
   1244       if (EndCatchFn)
   1245         CGF.EHStack.pushCleanup<CallEndCatchForFinally>(NormalAndEHCleanup,
   1246                                                         ForEHVar, EndCatchFn);
   1247 
   1248       // Save the current cleanup destination in case there are
   1249       // cleanups in the finally block.
   1250       llvm::Value *SavedCleanupDest =
   1251         CGF.Builder.CreateLoad(CGF.getNormalCleanupDestSlot(),
   1252                                "cleanup.dest.saved");
   1253 
   1254       // Emit the finally block.
   1255       CGF.EmitStmt(Body);
   1256 
   1257       // If the end of the finally is reachable, check whether this was
   1258       // for EH.  If so, rethrow.
   1259       if (CGF.HaveInsertPoint()) {
   1260         llvm::BasicBlock *RethrowBB = CGF.createBasicBlock("finally.rethrow");
   1261         llvm::BasicBlock *ContBB = CGF.createBasicBlock("finally.cont");
   1262 
   1263         llvm::Value *ShouldRethrow =
   1264           CGF.Builder.CreateLoad(ForEHVar, "finally.shouldthrow");
   1265         CGF.Builder.CreateCondBr(ShouldRethrow, RethrowBB, ContBB);
   1266 
   1267         CGF.EmitBlock(RethrowBB);
   1268         if (SavedExnVar) {
   1269           CGF.EmitCallOrInvoke(RethrowFn, CGF.Builder.CreateLoad(SavedExnVar));
   1270         } else {
   1271           CGF.EmitCallOrInvoke(RethrowFn);
   1272         }
   1273         CGF.Builder.CreateUnreachable();
   1274 
   1275         CGF.EmitBlock(ContBB);
   1276 
   1277         // Restore the cleanup destination.
   1278         CGF.Builder.CreateStore(SavedCleanupDest,
   1279                                 CGF.getNormalCleanupDestSlot());
   1280       }
   1281 
   1282       // Leave the end-catch cleanup.  As an optimization, pretend that
   1283       // the fallthrough path was inaccessible; we've dynamically proven
   1284       // that we're not in the EH case along that path.
   1285       if (EndCatchFn) {
   1286         CGBuilderTy::InsertPoint SavedIP = CGF.Builder.saveAndClearIP();
   1287         CGF.PopCleanupBlock();
   1288         CGF.Builder.restoreIP(SavedIP);
   1289       }
   1290 
   1291       // Now make sure we actually have an insertion point or the
   1292       // cleanup gods will hate us.
   1293       CGF.EnsureInsertPoint();
   1294     }
   1295   };
   1296 }
   1297 
   1298 /// Enters a finally block for an implementation using zero-cost
   1299 /// exceptions.  This is mostly general, but hard-codes some
   1300 /// language/ABI-specific behavior in the catch-all sections.
   1301 void CodeGenFunction::FinallyInfo::enter(CodeGenFunction &CGF,
   1302                                          const Stmt *body,
   1303                                          llvm::Constant *beginCatchFn,
   1304                                          llvm::Constant *endCatchFn,
   1305                                          llvm::Constant *rethrowFn) {
   1306   assert((beginCatchFn != 0) == (endCatchFn != 0) &&
   1307          "begin/end catch functions not paired");
   1308   assert(rethrowFn && "rethrow function is required");
   1309 
   1310   BeginCatchFn = beginCatchFn;
   1311 
   1312   // The rethrow function has one of the following two types:
   1313   //   void (*)()
   1314   //   void (*)(void*)
   1315   // In the latter case we need to pass it the exception object.
   1316   // But we can't use the exception slot because the @finally might
   1317   // have a landing pad (which would overwrite the exception slot).
   1318   llvm::FunctionType *rethrowFnTy =
   1319     cast<llvm::FunctionType>(
   1320       cast<llvm::PointerType>(rethrowFn->getType())->getElementType());
   1321   SavedExnVar = 0;
   1322   if (rethrowFnTy->getNumParams())
   1323     SavedExnVar = CGF.CreateTempAlloca(CGF.Int8PtrTy, "finally.exn");
   1324 
   1325   // A finally block is a statement which must be executed on any edge
   1326   // out of a given scope.  Unlike a cleanup, the finally block may
   1327   // contain arbitrary control flow leading out of itself.  In
   1328   // addition, finally blocks should always be executed, even if there
   1329   // are no catch handlers higher on the stack.  Therefore, we
   1330   // surround the protected scope with a combination of a normal
   1331   // cleanup (to catch attempts to break out of the block via normal
   1332   // control flow) and an EH catch-all (semantically "outside" any try
   1333   // statement to which the finally block might have been attached).
   1334   // The finally block itself is generated in the context of a cleanup
   1335   // which conditionally leaves the catch-all.
   1336 
   1337   // Jump destination for performing the finally block on an exception
   1338   // edge.  We'll never actually reach this block, so unreachable is
   1339   // fine.
   1340   RethrowDest = CGF.getJumpDestInCurrentScope(CGF.getUnreachableBlock());
   1341 
   1342   // Whether the finally block is being executed for EH purposes.
   1343   ForEHVar = CGF.CreateTempAlloca(CGF.Builder.getInt1Ty(), "finally.for-eh");
   1344   CGF.Builder.CreateStore(CGF.Builder.getFalse(), ForEHVar);
   1345 
   1346   // Enter a normal cleanup which will perform the @finally block.
   1347   CGF.EHStack.pushCleanup<PerformFinally>(NormalCleanup, body,
   1348                                           ForEHVar, endCatchFn,
   1349                                           rethrowFn, SavedExnVar);
   1350 
   1351   // Enter a catch-all scope.
   1352   llvm::BasicBlock *catchBB = CGF.createBasicBlock("finally.catchall");
   1353   EHCatchScope *catchScope = CGF.EHStack.pushCatch(1);
   1354   catchScope->setCatchAllHandler(0, catchBB);
   1355 }
   1356 
   1357 void CodeGenFunction::FinallyInfo::exit(CodeGenFunction &CGF) {
   1358   // Leave the finally catch-all.
   1359   EHCatchScope &catchScope = cast<EHCatchScope>(*CGF.EHStack.begin());
   1360   llvm::BasicBlock *catchBB = catchScope.getHandler(0).Block;
   1361   CGF.EHStack.popCatch();
   1362 
   1363   // If there are any references to the catch-all block, emit it.
   1364   if (catchBB->use_empty()) {
   1365     delete catchBB;
   1366   } else {
   1367     CGBuilderTy::InsertPoint savedIP = CGF.Builder.saveAndClearIP();
   1368     CGF.EmitBlock(catchBB);
   1369 
   1370     llvm::Value *exn = 0;
   1371 
   1372     // If there's a begin-catch function, call it.
   1373     if (BeginCatchFn) {
   1374       exn = CGF.Builder.CreateLoad(CGF.getExceptionSlot());
   1375       CGF.Builder.CreateCall(BeginCatchFn, exn)->setDoesNotThrow();
   1376     }
   1377 
   1378     // If we need to remember the exception pointer to rethrow later, do so.
   1379     if (SavedExnVar) {
   1380       if (!exn) exn = CGF.Builder.CreateLoad(CGF.getExceptionSlot());
   1381       CGF.Builder.CreateStore(exn, SavedExnVar);
   1382     }
   1383 
   1384     // Tell the cleanups in the finally block that we're do this for EH.
   1385     CGF.Builder.CreateStore(CGF.Builder.getTrue(), ForEHVar);
   1386 
   1387     // Thread a jump through the finally cleanup.
   1388     CGF.EmitBranchThroughCleanup(RethrowDest);
   1389 
   1390     CGF.Builder.restoreIP(savedIP);
   1391   }
   1392 
   1393   // Finally, leave the @finally cleanup.
   1394   CGF.PopCleanupBlock();
   1395 }
   1396 
   1397 llvm::BasicBlock *CodeGenFunction::getTerminateLandingPad() {
   1398   if (TerminateLandingPad)
   1399     return TerminateLandingPad;
   1400 
   1401   CGBuilderTy::InsertPoint SavedIP = Builder.saveAndClearIP();
   1402 
   1403   // This will get inserted at the end of the function.
   1404   TerminateLandingPad = createBasicBlock("terminate.lpad");
   1405   Builder.SetInsertPoint(TerminateLandingPad);
   1406 
   1407   // Tell the backend that this is a landing pad.
   1408   llvm::CallInst *Exn =
   1409     Builder.CreateCall(CGM.getIntrinsic(llvm::Intrinsic::eh_exception), "exn");
   1410   Exn->setDoesNotThrow();
   1411 
   1412   const EHPersonality &Personality = EHPersonality::get(CGM.getLangOptions());
   1413 
   1414   // Tell the backend what the exception table should be:
   1415   // nothing but a catch-all.
   1416   llvm::Value *Args[3] = { Exn, getOpaquePersonalityFn(CGM, Personality),
   1417                            getCatchAllValue(*this) };
   1418   Builder.CreateCall(CGM.getIntrinsic(llvm::Intrinsic::eh_selector),
   1419                      Args, "eh.selector")
   1420     ->setDoesNotThrow();
   1421 
   1422   llvm::CallInst *TerminateCall = Builder.CreateCall(getTerminateFn(*this));
   1423   TerminateCall->setDoesNotReturn();
   1424   TerminateCall->setDoesNotThrow();
   1425   Builder.CreateUnreachable();
   1426 
   1427   // Restore the saved insertion state.
   1428   Builder.restoreIP(SavedIP);
   1429 
   1430   return TerminateLandingPad;
   1431 }
   1432 
   1433 llvm::BasicBlock *CodeGenFunction::getTerminateHandler() {
   1434   if (TerminateHandler)
   1435     return TerminateHandler;
   1436 
   1437   CGBuilderTy::InsertPoint SavedIP = Builder.saveAndClearIP();
   1438 
   1439   // Set up the terminate handler.  This block is inserted at the very
   1440   // end of the function by FinishFunction.
   1441   TerminateHandler = createBasicBlock("terminate.handler");
   1442   Builder.SetInsertPoint(TerminateHandler);
   1443   llvm::CallInst *TerminateCall = Builder.CreateCall(getTerminateFn(*this));
   1444   TerminateCall->setDoesNotReturn();
   1445   TerminateCall->setDoesNotThrow();
   1446   Builder.CreateUnreachable();
   1447 
   1448   // Restore the saved insertion state.
   1449   Builder.restoreIP(SavedIP);
   1450 
   1451   return TerminateHandler;
   1452 }
   1453 
   1454 CodeGenFunction::UnwindDest CodeGenFunction::getRethrowDest() {
   1455   if (RethrowBlock.isValid()) return RethrowBlock;
   1456 
   1457   CGBuilderTy::InsertPoint SavedIP = Builder.saveIP();
   1458 
   1459   // We emit a jump to a notional label at the outermost unwind state.
   1460   llvm::BasicBlock *Unwind = createBasicBlock("eh.resume");
   1461   Builder.SetInsertPoint(Unwind);
   1462 
   1463   const EHPersonality &Personality = EHPersonality::get(CGM.getLangOptions());
   1464 
   1465   // This can always be a call because we necessarily didn't find
   1466   // anything on the EH stack which needs our help.
   1467   llvm::StringRef RethrowName = Personality.getCatchallRethrowFnName();
   1468   if (!RethrowName.empty()) {
   1469     Builder.CreateCall(getCatchallRethrowFn(*this, RethrowName),
   1470                        Builder.CreateLoad(getExceptionSlot()))
   1471       ->setDoesNotReturn();
   1472   } else {
   1473     llvm::Value *Exn = Builder.CreateLoad(getExceptionSlot());
   1474 
   1475     switch (CleanupHackLevel) {
   1476     case CHL_MandatoryCatchall:
   1477       // In mandatory-catchall mode, we need to use
   1478       // _Unwind_Resume_or_Rethrow, or whatever the personality's
   1479       // equivalent is.
   1480       Builder.CreateCall(getUnwindResumeOrRethrowFn(), Exn)
   1481         ->setDoesNotReturn();
   1482       break;
   1483     case CHL_MandatoryCleanup: {
   1484       // In mandatory-cleanup mode, we should use llvm.eh.resume.
   1485       llvm::Value *Selector = Builder.CreateLoad(getEHSelectorSlot());
   1486       Builder.CreateCall2(CGM.getIntrinsic(llvm::Intrinsic::eh_resume),
   1487                           Exn, Selector)
   1488         ->setDoesNotReturn();
   1489       break;
   1490     }
   1491     case CHL_Ideal:
   1492       // In an idealized mode where we don't have to worry about the
   1493       // optimizer combining landing pads, we should just use
   1494       // _Unwind_Resume (or the personality's equivalent).
   1495       Builder.CreateCall(getUnwindResumeFn(), Exn)
   1496         ->setDoesNotReturn();
   1497       break;
   1498     }
   1499   }
   1500 
   1501   Builder.CreateUnreachable();
   1502 
   1503   Builder.restoreIP(SavedIP);
   1504 
   1505   RethrowBlock = UnwindDest(Unwind, EHStack.stable_end(), 0);
   1506   return RethrowBlock;
   1507 }
   1508 
   1509