Home | History | Annotate | Line # | Download | only in CodeGen
      1 //===--- CGException.cpp - Emit LLVM Code for C++ exceptions ----*- C++ -*-===//
      2 //
      3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
      4 // See https://llvm.org/LICENSE.txt for license information.
      5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
      6 //
      7 //===----------------------------------------------------------------------===//
      8 //
      9 // This contains code dealing with C++ exception related code generation.
     10 //
     11 //===----------------------------------------------------------------------===//
     12 
     13 #include "CGCXXABI.h"
     14 #include "CGCleanup.h"
     15 #include "CGObjCRuntime.h"
     16 #include "CodeGenFunction.h"
     17 #include "ConstantEmitter.h"
     18 #include "TargetInfo.h"
     19 #include "clang/AST/Mangle.h"
     20 #include "clang/AST/StmtCXX.h"
     21 #include "clang/AST/StmtObjC.h"
     22 #include "clang/AST/StmtVisitor.h"
     23 #include "clang/Basic/DiagnosticSema.h"
     24 #include "clang/Basic/TargetBuiltins.h"
     25 #include "llvm/IR/IntrinsicInst.h"
     26 #include "llvm/IR/Intrinsics.h"
     27 #include "llvm/IR/IntrinsicsWebAssembly.h"
     28 #include "llvm/Support/SaveAndRestore.h"
     29 
     30 using namespace clang;
     31 using namespace CodeGen;
     32 
     33 static llvm::FunctionCallee getFreeExceptionFn(CodeGenModule &CGM) {
     34   // void __cxa_free_exception(void *thrown_exception);
     35 
     36   llvm::FunctionType *FTy =
     37     llvm::FunctionType::get(CGM.VoidTy, CGM.Int8PtrTy, /*isVarArg=*/false);
     38 
     39   return CGM.CreateRuntimeFunction(FTy, "__cxa_free_exception");
     40 }
     41 
     42 static llvm::FunctionCallee getSehTryBeginFn(CodeGenModule &CGM) {
     43   llvm::FunctionType *FTy =
     44       llvm::FunctionType::get(CGM.VoidTy, /*isVarArg=*/false);
     45   return CGM.CreateRuntimeFunction(FTy, "llvm.seh.try.begin");
     46 }
     47 
     48 static llvm::FunctionCallee getSehTryEndFn(CodeGenModule &CGM) {
     49   llvm::FunctionType *FTy =
     50       llvm::FunctionType::get(CGM.VoidTy, /*isVarArg=*/false);
     51   return CGM.CreateRuntimeFunction(FTy, "llvm.seh.try.end");
     52 }
     53 
     54 static llvm::FunctionCallee getUnexpectedFn(CodeGenModule &CGM) {
     55   // void __cxa_call_unexpected(void *thrown_exception);
     56 
     57   llvm::FunctionType *FTy =
     58     llvm::FunctionType::get(CGM.VoidTy, CGM.Int8PtrTy, /*isVarArg=*/false);
     59 
     60   return CGM.CreateRuntimeFunction(FTy, "__cxa_call_unexpected");
     61 }
     62 
     63 llvm::FunctionCallee CodeGenModule::getTerminateFn() {
     64   // void __terminate();
     65 
     66   llvm::FunctionType *FTy =
     67     llvm::FunctionType::get(VoidTy, /*isVarArg=*/false);
     68 
     69   StringRef name;
     70 
     71   // In C++, use std::terminate().
     72   if (getLangOpts().CPlusPlus &&
     73       getTarget().getCXXABI().isItaniumFamily()) {
     74     name = "_ZSt9terminatev";
     75   } else if (getLangOpts().CPlusPlus &&
     76              getTarget().getCXXABI().isMicrosoft()) {
     77     if (getLangOpts().isCompatibleWithMSVC(LangOptions::MSVC2015))
     78       name = "__std_terminate";
     79     else
     80       name = "?terminate@@YAXXZ";
     81   } else if (getLangOpts().ObjC &&
     82              getLangOpts().ObjCRuntime.hasTerminate())
     83     name = "objc_terminate";
     84   else
     85     name = "abort";
     86   return CreateRuntimeFunction(FTy, name);
     87 }
     88 
     89 static llvm::FunctionCallee getCatchallRethrowFn(CodeGenModule &CGM,
     90                                                  StringRef Name) {
     91   llvm::FunctionType *FTy =
     92     llvm::FunctionType::get(CGM.VoidTy, CGM.Int8PtrTy, /*isVarArg=*/false);
     93 
     94   return CGM.CreateRuntimeFunction(FTy, Name);
     95 }
     96 
     97 const EHPersonality EHPersonality::GNU_C = { "__gcc_personality_v0", nullptr };
     98 const EHPersonality
     99 EHPersonality::GNU_C_SJLJ = { "__gcc_personality_sj0", nullptr };
    100 const EHPersonality
    101 EHPersonality::GNU_C_SEH = { "__gcc_personality_seh0", nullptr };
    102 const EHPersonality
    103 EHPersonality::NeXT_ObjC = { "__objc_personality_v0", nullptr };
    104 const EHPersonality
    105 EHPersonality::GNU_CPlusPlus = { "__gxx_personality_v0", nullptr };
    106 const EHPersonality
    107 EHPersonality::GNU_CPlusPlus_SJLJ = { "__gxx_personality_sj0", nullptr };
    108 const EHPersonality
    109 EHPersonality::GNU_CPlusPlus_SEH = { "__gxx_personality_seh0", nullptr };
    110 const EHPersonality
    111 EHPersonality::GNU_ObjC = {"__gnu_objc_personality_v0", "objc_exception_throw"};
    112 const EHPersonality
    113 EHPersonality::GNU_ObjC_SJLJ = {"__gnu_objc_personality_sj0", "objc_exception_throw"};
    114 const EHPersonality
    115 EHPersonality::GNU_ObjC_SEH = {"__gnu_objc_personality_seh0", "objc_exception_throw"};
    116 const EHPersonality
    117 EHPersonality::GNU_ObjCXX = { "__gnustep_objcxx_personality_v0", nullptr };
    118 const EHPersonality
    119 EHPersonality::GNUstep_ObjC = { "__gnustep_objc_personality_v0", nullptr };
    120 const EHPersonality
    121 EHPersonality::MSVC_except_handler = { "_except_handler3", nullptr };
    122 const EHPersonality
    123 EHPersonality::MSVC_C_specific_handler = { "__C_specific_handler", nullptr };
    124 const EHPersonality
    125 EHPersonality::MSVC_CxxFrameHandler3 = { "__CxxFrameHandler3", nullptr };
    126 const EHPersonality
    127 EHPersonality::GNU_Wasm_CPlusPlus = { "__gxx_wasm_personality_v0", nullptr };
    128 const EHPersonality EHPersonality::XL_CPlusPlus = {"__xlcxx_personality_v1",
    129                                                    nullptr};
    130 
    131 static const EHPersonality &getCPersonality(const TargetInfo &Target,
    132                                             const LangOptions &L) {
    133   const llvm::Triple &T = Target.getTriple();
    134   if (T.isWindowsMSVCEnvironment())
    135     return EHPersonality::MSVC_CxxFrameHandler3;
    136   if (L.hasSjLjExceptions())
    137     return EHPersonality::GNU_C_SJLJ;
    138   if (L.hasDWARFExceptions())
    139     return EHPersonality::GNU_C;
    140   if (L.hasSEHExceptions())
    141     return EHPersonality::GNU_C_SEH;
    142   return EHPersonality::GNU_C;
    143 }
    144 
    145 static const EHPersonality &getObjCPersonality(const TargetInfo &Target,
    146                                                const LangOptions &L) {
    147   const llvm::Triple &T = Target.getTriple();
    148   if (T.isWindowsMSVCEnvironment())
    149     return EHPersonality::MSVC_CxxFrameHandler3;
    150 
    151   switch (L.ObjCRuntime.getKind()) {
    152   case ObjCRuntime::FragileMacOSX:
    153     return getCPersonality(Target, L);
    154   case ObjCRuntime::MacOSX:
    155   case ObjCRuntime::iOS:
    156   case ObjCRuntime::WatchOS:
    157     return EHPersonality::NeXT_ObjC;
    158   case ObjCRuntime::GNUstep:
    159     if (L.ObjCRuntime.getVersion() >= VersionTuple(1, 7))
    160       return EHPersonality::GNUstep_ObjC;
    161     LLVM_FALLTHROUGH;
    162   case ObjCRuntime::GCC:
    163   case ObjCRuntime::ObjFW:
    164     if (L.hasSjLjExceptions())
    165       return EHPersonality::GNU_ObjC_SJLJ;
    166     if (L.hasSEHExceptions())
    167       return EHPersonality::GNU_ObjC_SEH;
    168     return EHPersonality::GNU_ObjC;
    169   }
    170   llvm_unreachable("bad runtime kind");
    171 }
    172 
    173 static const EHPersonality &getCXXPersonality(const TargetInfo &Target,
    174                                               const LangOptions &L) {
    175   const llvm::Triple &T = Target.getTriple();
    176   if (T.isWindowsMSVCEnvironment())
    177     return EHPersonality::MSVC_CxxFrameHandler3;
    178   if (T.isOSAIX())
    179     return EHPersonality::XL_CPlusPlus;
    180   if (L.hasSjLjExceptions())
    181     return EHPersonality::GNU_CPlusPlus_SJLJ;
    182   if (L.hasDWARFExceptions())
    183     return EHPersonality::GNU_CPlusPlus;
    184   if (L.hasSEHExceptions())
    185     return EHPersonality::GNU_CPlusPlus_SEH;
    186   if (L.hasWasmExceptions())
    187     return EHPersonality::GNU_Wasm_CPlusPlus;
    188   return EHPersonality::GNU_CPlusPlus;
    189 }
    190 
    191 /// Determines the personality function to use when both C++
    192 /// and Objective-C exceptions are being caught.
    193 static const EHPersonality &getObjCXXPersonality(const TargetInfo &Target,
    194                                                  const LangOptions &L) {
    195   if (Target.getTriple().isWindowsMSVCEnvironment())
    196     return EHPersonality::MSVC_CxxFrameHandler3;
    197 
    198   switch (L.ObjCRuntime.getKind()) {
    199   // In the fragile ABI, just use C++ exception handling and hope
    200   // they're not doing crazy exception mixing.
    201   case ObjCRuntime::FragileMacOSX:
    202     return getCXXPersonality(Target, L);
    203 
    204   // The ObjC personality defers to the C++ personality for non-ObjC
    205   // handlers.  Unlike the C++ case, we use the same personality
    206   // function on targets using (backend-driven) SJLJ EH.
    207   case ObjCRuntime::MacOSX:
    208   case ObjCRuntime::iOS:
    209   case ObjCRuntime::WatchOS:
    210     return getObjCPersonality(Target, L);
    211 
    212   case ObjCRuntime::GNUstep:
    213     return EHPersonality::GNU_ObjCXX;
    214 
    215   // The GCC runtime's personality function inherently doesn't support
    216   // mixed EH.  Use the ObjC personality just to avoid returning null.
    217   case ObjCRuntime::GCC:
    218   case ObjCRuntime::ObjFW:
    219     return getObjCPersonality(Target, L);
    220   }
    221   llvm_unreachable("bad runtime kind");
    222 }
    223 
    224 static const EHPersonality &getSEHPersonalityMSVC(const llvm::Triple &T) {
    225   if (T.getArch() == llvm::Triple::x86)
    226     return EHPersonality::MSVC_except_handler;
    227   return EHPersonality::MSVC_C_specific_handler;
    228 }
    229 
    230 const EHPersonality &EHPersonality::get(CodeGenModule &CGM,
    231                                         const FunctionDecl *FD) {
    232   const llvm::Triple &T = CGM.getTarget().getTriple();
    233   const LangOptions &L = CGM.getLangOpts();
    234   const TargetInfo &Target = CGM.getTarget();
    235 
    236   // Functions using SEH get an SEH personality.
    237   if (FD && FD->usesSEHTry())
    238     return getSEHPersonalityMSVC(T);
    239 
    240   if (L.ObjC)
    241     return L.CPlusPlus ? getObjCXXPersonality(Target, L)
    242                        : getObjCPersonality(Target, L);
    243   return L.CPlusPlus ? getCXXPersonality(Target, L)
    244                      : getCPersonality(Target, L);
    245 }
    246 
    247 const EHPersonality &EHPersonality::get(CodeGenFunction &CGF) {
    248   const auto *FD = CGF.CurCodeDecl;
    249   // For outlined finallys and filters, use the SEH personality in case they
    250   // contain more SEH. This mostly only affects finallys. Filters could
    251   // hypothetically use gnu statement expressions to sneak in nested SEH.
    252   FD = FD ? FD : CGF.CurSEHParent;
    253   return get(CGF.CGM, dyn_cast_or_null<FunctionDecl>(FD));
    254 }
    255 
    256 static llvm::FunctionCallee getPersonalityFn(CodeGenModule &CGM,
    257                                              const EHPersonality &Personality) {
    258   return CGM.CreateRuntimeFunction(llvm::FunctionType::get(CGM.Int32Ty, true),
    259                                    Personality.PersonalityFn,
    260                                    llvm::AttributeList(), /*Local=*/true);
    261 }
    262 
    263 static llvm::Constant *getOpaquePersonalityFn(CodeGenModule &CGM,
    264                                         const EHPersonality &Personality) {
    265   llvm::FunctionCallee Fn = getPersonalityFn(CGM, Personality);
    266   llvm::PointerType* Int8PtrTy = llvm::PointerType::get(
    267       llvm::Type::getInt8Ty(CGM.getLLVMContext()),
    268       CGM.getDataLayout().getProgramAddressSpace());
    269 
    270   return llvm::ConstantExpr::getBitCast(cast<llvm::Constant>(Fn.getCallee()),
    271                                         Int8PtrTy);
    272 }
    273 
    274 /// Check whether a landingpad instruction only uses C++ features.
    275 static bool LandingPadHasOnlyCXXUses(llvm::LandingPadInst *LPI) {
    276   for (unsigned I = 0, E = LPI->getNumClauses(); I != E; ++I) {
    277     // Look for something that would've been returned by the ObjC
    278     // runtime's GetEHType() method.
    279     llvm::Value *Val = LPI->getClause(I)->stripPointerCasts();
    280     if (LPI->isCatch(I)) {
    281       // Check if the catch value has the ObjC prefix.
    282       if (llvm::GlobalVariable *GV = dyn_cast<llvm::GlobalVariable>(Val))
    283         // ObjC EH selector entries are always global variables with
    284         // names starting like this.
    285         if (GV->getName().startswith("OBJC_EHTYPE"))
    286           return false;
    287     } else {
    288       // Check if any of the filter values have the ObjC prefix.
    289       llvm::Constant *CVal = cast<llvm::Constant>(Val);
    290       for (llvm::User::op_iterator
    291               II = CVal->op_begin(), IE = CVal->op_end(); II != IE; ++II) {
    292         if (llvm::GlobalVariable *GV =
    293             cast<llvm::GlobalVariable>((*II)->stripPointerCasts()))
    294           // ObjC EH selector entries are always global variables with
    295           // names starting like this.
    296           if (GV->getName().startswith("OBJC_EHTYPE"))
    297             return false;
    298       }
    299     }
    300   }
    301   return true;
    302 }
    303 
    304 /// Check whether a personality function could reasonably be swapped
    305 /// for a C++ personality function.
    306 static bool PersonalityHasOnlyCXXUses(llvm::Constant *Fn) {
    307   for (llvm::User *U : Fn->users()) {
    308     // Conditionally white-list bitcasts.
    309     if (llvm::ConstantExpr *CE = dyn_cast<llvm::ConstantExpr>(U)) {
    310       if (CE->getOpcode() != llvm::Instruction::BitCast) return false;
    311       if (!PersonalityHasOnlyCXXUses(CE))
    312         return false;
    313       continue;
    314     }
    315 
    316     // Otherwise it must be a function.
    317     llvm::Function *F = dyn_cast<llvm::Function>(U);
    318     if (!F) return false;
    319 
    320     for (auto BB = F->begin(), E = F->end(); BB != E; ++BB) {
    321       if (BB->isLandingPad())
    322         if (!LandingPadHasOnlyCXXUses(BB->getLandingPadInst()))
    323           return false;
    324     }
    325   }
    326 
    327   return true;
    328 }
    329 
    330 /// Try to use the C++ personality function in ObjC++.  Not doing this
    331 /// can cause some incompatibilities with gcc, which is more
    332 /// aggressive about only using the ObjC++ personality in a function
    333 /// when it really needs it.
    334 void CodeGenModule::SimplifyPersonality() {
    335   // If we're not in ObjC++ -fexceptions, there's nothing to do.
    336   if (!LangOpts.CPlusPlus || !LangOpts.ObjC || !LangOpts.Exceptions)
    337     return;
    338 
    339   // Both the problem this endeavors to fix and the way the logic
    340   // above works is specific to the NeXT runtime.
    341   if (!LangOpts.ObjCRuntime.isNeXTFamily())
    342     return;
    343 
    344   const EHPersonality &ObjCXX = EHPersonality::get(*this, /*FD=*/nullptr);
    345   const EHPersonality &CXX = getCXXPersonality(getTarget(), LangOpts);
    346   if (&ObjCXX == &CXX)
    347     return;
    348 
    349   assert(std::strcmp(ObjCXX.PersonalityFn, CXX.PersonalityFn) != 0 &&
    350          "Different EHPersonalities using the same personality function.");
    351 
    352   llvm::Function *Fn = getModule().getFunction(ObjCXX.PersonalityFn);
    353 
    354   // Nothing to do if it's unused.
    355   if (!Fn || Fn->use_empty()) return;
    356 
    357   // Can't do the optimization if it has non-C++ uses.
    358   if (!PersonalityHasOnlyCXXUses(Fn)) return;
    359 
    360   // Create the C++ personality function and kill off the old
    361   // function.
    362   llvm::FunctionCallee CXXFn = getPersonalityFn(*this, CXX);
    363 
    364   // This can happen if the user is screwing with us.
    365   if (Fn->getType() != CXXFn.getCallee()->getType())
    366     return;
    367 
    368   Fn->replaceAllUsesWith(CXXFn.getCallee());
    369   Fn->eraseFromParent();
    370 }
    371 
    372 /// Returns the value to inject into a selector to indicate the
    373 /// presence of a catch-all.
    374 static llvm::Constant *getCatchAllValue(CodeGenFunction &CGF) {
    375   // Possibly we should use @llvm.eh.catch.all.value here.
    376   return llvm::ConstantPointerNull::get(CGF.Int8PtrTy);
    377 }
    378 
    379 namespace {
    380   /// A cleanup to free the exception object if its initialization
    381   /// throws.
    382   struct FreeException final : EHScopeStack::Cleanup {
    383     llvm::Value *exn;
    384     FreeException(llvm::Value *exn) : exn(exn) {}
    385     void Emit(CodeGenFunction &CGF, Flags flags) override {
    386       CGF.EmitNounwindRuntimeCall(getFreeExceptionFn(CGF.CGM), exn);
    387     }
    388   };
    389 } // end anonymous namespace
    390 
    391 // Emits an exception expression into the given location.  This
    392 // differs from EmitAnyExprToMem only in that, if a final copy-ctor
    393 // call is required, an exception within that copy ctor causes
    394 // std::terminate to be invoked.
    395 void CodeGenFunction::EmitAnyExprToExn(const Expr *e, Address addr) {
    396   // Make sure the exception object is cleaned up if there's an
    397   // exception during initialization.
    398   pushFullExprCleanup<FreeException>(EHCleanup, addr.getPointer());
    399   EHScopeStack::stable_iterator cleanup = EHStack.stable_begin();
    400 
    401   // __cxa_allocate_exception returns a void*;  we need to cast this
    402   // to the appropriate type for the object.
    403   llvm::Type *ty = ConvertTypeForMem(e->getType())->getPointerTo();
    404   Address typedAddr = Builder.CreateBitCast(addr, ty);
    405 
    406   // FIXME: this isn't quite right!  If there's a final unelided call
    407   // to a copy constructor, then according to [except.terminate]p1 we
    408   // must call std::terminate() if that constructor throws, because
    409   // technically that copy occurs after the exception expression is
    410   // evaluated but before the exception is caught.  But the best way
    411   // to handle that is to teach EmitAggExpr to do the final copy
    412   // differently if it can't be elided.
    413   EmitAnyExprToMem(e, typedAddr, e->getType().getQualifiers(),
    414                    /*IsInit*/ true);
    415 
    416   // Deactivate the cleanup block.
    417   DeactivateCleanupBlock(cleanup,
    418                          cast<llvm::Instruction>(typedAddr.getPointer()));
    419 }
    420 
    421 Address CodeGenFunction::getExceptionSlot() {
    422   if (!ExceptionSlot)
    423     ExceptionSlot = CreateTempAlloca(Int8PtrTy, "exn.slot");
    424   return Address(ExceptionSlot, getPointerAlign());
    425 }
    426 
    427 Address CodeGenFunction::getEHSelectorSlot() {
    428   if (!EHSelectorSlot)
    429     EHSelectorSlot = CreateTempAlloca(Int32Ty, "ehselector.slot");
    430   return Address(EHSelectorSlot, CharUnits::fromQuantity(4));
    431 }
    432 
    433 llvm::Value *CodeGenFunction::getExceptionFromSlot() {
    434   return Builder.CreateLoad(getExceptionSlot(), "exn");
    435 }
    436 
    437 llvm::Value *CodeGenFunction::getSelectorFromSlot() {
    438   return Builder.CreateLoad(getEHSelectorSlot(), "sel");
    439 }
    440 
    441 void CodeGenFunction::EmitCXXThrowExpr(const CXXThrowExpr *E,
    442                                        bool KeepInsertionPoint) {
    443   if (const Expr *SubExpr = E->getSubExpr()) {
    444     QualType ThrowType = SubExpr->getType();
    445     if (ThrowType->isObjCObjectPointerType()) {
    446       const Stmt *ThrowStmt = E->getSubExpr();
    447       const ObjCAtThrowStmt S(E->getExprLoc(), const_cast<Stmt *>(ThrowStmt));
    448       CGM.getObjCRuntime().EmitThrowStmt(*this, S, false);
    449     } else {
    450       CGM.getCXXABI().emitThrow(*this, E);
    451     }
    452   } else {
    453     CGM.getCXXABI().emitRethrow(*this, /*isNoReturn=*/true);
    454   }
    455 
    456   // throw is an expression, and the expression emitters expect us
    457   // to leave ourselves at a valid insertion point.
    458   if (KeepInsertionPoint)
    459     EmitBlock(createBasicBlock("throw.cont"));
    460 }
    461 
    462 void CodeGenFunction::EmitStartEHSpec(const Decl *D) {
    463   if (!CGM.getLangOpts().CXXExceptions)
    464     return;
    465 
    466   const FunctionDecl* FD = dyn_cast_or_null<FunctionDecl>(D);
    467   if (!FD) {
    468     // Check if CapturedDecl is nothrow and create terminate scope for it.
    469     if (const CapturedDecl* CD = dyn_cast_or_null<CapturedDecl>(D)) {
    470       if (CD->isNothrow())
    471         EHStack.pushTerminate();
    472     }
    473     return;
    474   }
    475   const FunctionProtoType *Proto = FD->getType()->getAs<FunctionProtoType>();
    476   if (!Proto)
    477     return;
    478 
    479   ExceptionSpecificationType EST = Proto->getExceptionSpecType();
    480   if (isNoexceptExceptionSpec(EST) && Proto->canThrow() == CT_Cannot) {
    481     // noexcept functions are simple terminate scopes.
    482     if (!getLangOpts().EHAsynch) // -EHa: HW exception still can occur
    483       EHStack.pushTerminate();
    484   } else if (EST == EST_Dynamic || EST == EST_DynamicNone) {
    485     // TODO: Revisit exception specifications for the MS ABI.  There is a way to
    486     // encode these in an object file but MSVC doesn't do anything with it.
    487     if (getTarget().getCXXABI().isMicrosoft())
    488       return;
    489     // In Wasm EH we currently treat 'throw()' in the same way as 'noexcept'. In
    490     // case of throw with types, we ignore it and print a warning for now.
    491     // TODO Correctly handle exception specification in Wasm EH
    492     if (CGM.getLangOpts().hasWasmExceptions()) {
    493       if (EST == EST_DynamicNone)
    494         EHStack.pushTerminate();
    495       else
    496         CGM.getDiags().Report(D->getLocation(),
    497                               diag::warn_wasm_dynamic_exception_spec_ignored)
    498             << FD->getExceptionSpecSourceRange();
    499       return;
    500     }
    501     // Currently Emscripten EH only handles 'throw()' but not 'throw' with
    502     // types. 'throw()' handling will be done in JS glue code so we don't need
    503     // to do anything in that case. Just print a warning message in case of
    504     // throw with types.
    505     // TODO Correctly handle exception specification in Emscripten EH
    506     if (getTarget().getCXXABI() == TargetCXXABI::WebAssembly &&
    507         CGM.getLangOpts().getExceptionHandling() ==
    508             LangOptions::ExceptionHandlingKind::None &&
    509         EST == EST_Dynamic)
    510       CGM.getDiags().Report(D->getLocation(),
    511                             diag::warn_wasm_dynamic_exception_spec_ignored)
    512           << FD->getExceptionSpecSourceRange();
    513 
    514     unsigned NumExceptions = Proto->getNumExceptions();
    515     EHFilterScope *Filter = EHStack.pushFilter(NumExceptions);
    516 
    517     for (unsigned I = 0; I != NumExceptions; ++I) {
    518       QualType Ty = Proto->getExceptionType(I);
    519       QualType ExceptType = Ty.getNonReferenceType().getUnqualifiedType();
    520       llvm::Value *EHType = CGM.GetAddrOfRTTIDescriptor(ExceptType,
    521                                                         /*ForEH=*/true);
    522       Filter->setFilter(I, EHType);
    523     }
    524   }
    525 }
    526 
    527 /// Emit the dispatch block for a filter scope if necessary.
    528 static void emitFilterDispatchBlock(CodeGenFunction &CGF,
    529                                     EHFilterScope &filterScope) {
    530   llvm::BasicBlock *dispatchBlock = filterScope.getCachedEHDispatchBlock();
    531   if (!dispatchBlock) return;
    532   if (dispatchBlock->use_empty()) {
    533     delete dispatchBlock;
    534     return;
    535   }
    536 
    537   CGF.EmitBlockAfterUses(dispatchBlock);
    538 
    539   // If this isn't a catch-all filter, we need to check whether we got
    540   // here because the filter triggered.
    541   if (filterScope.getNumFilters()) {
    542     // Load the selector value.
    543     llvm::Value *selector = CGF.getSelectorFromSlot();
    544     llvm::BasicBlock *unexpectedBB = CGF.createBasicBlock("ehspec.unexpected");
    545 
    546     llvm::Value *zero = CGF.Builder.getInt32(0);
    547     llvm::Value *failsFilter =
    548         CGF.Builder.CreateICmpSLT(selector, zero, "ehspec.fails");
    549     CGF.Builder.CreateCondBr(failsFilter, unexpectedBB,
    550                              CGF.getEHResumeBlock(false));
    551 
    552     CGF.EmitBlock(unexpectedBB);
    553   }
    554 
    555   // Call __cxa_call_unexpected.  This doesn't need to be an invoke
    556   // because __cxa_call_unexpected magically filters exceptions
    557   // according to the last landing pad the exception was thrown
    558   // into.  Seriously.
    559   llvm::Value *exn = CGF.getExceptionFromSlot();
    560   CGF.EmitRuntimeCall(getUnexpectedFn(CGF.CGM), exn)
    561     ->setDoesNotReturn();
    562   CGF.Builder.CreateUnreachable();
    563 }
    564 
    565 void CodeGenFunction::EmitEndEHSpec(const Decl *D) {
    566   if (!CGM.getLangOpts().CXXExceptions)
    567     return;
    568 
    569   const FunctionDecl* FD = dyn_cast_or_null<FunctionDecl>(D);
    570   if (!FD) {
    571     // Check if CapturedDecl is nothrow and pop terminate scope for it.
    572     if (const CapturedDecl* CD = dyn_cast_or_null<CapturedDecl>(D)) {
    573       if (CD->isNothrow() && !EHStack.empty())
    574         EHStack.popTerminate();
    575     }
    576     return;
    577   }
    578   const FunctionProtoType *Proto = FD->getType()->getAs<FunctionProtoType>();
    579   if (!Proto)
    580     return;
    581 
    582   ExceptionSpecificationType EST = Proto->getExceptionSpecType();
    583   if (isNoexceptExceptionSpec(EST) && Proto->canThrow() == CT_Cannot &&
    584       !EHStack.empty() /* possible empty when under async exceptions */) {
    585     EHStack.popTerminate();
    586   } else if (EST == EST_Dynamic || EST == EST_DynamicNone) {
    587     // TODO: Revisit exception specifications for the MS ABI.  There is a way to
    588     // encode these in an object file but MSVC doesn't do anything with it.
    589     if (getTarget().getCXXABI().isMicrosoft())
    590       return;
    591     // In wasm we currently treat 'throw()' in the same way as 'noexcept'. In
    592     // case of throw with types, we ignore it and print a warning for now.
    593     // TODO Correctly handle exception specification in wasm
    594     if (CGM.getLangOpts().hasWasmExceptions()) {
    595       if (EST == EST_DynamicNone)
    596         EHStack.popTerminate();
    597       return;
    598     }
    599     EHFilterScope &filterScope = cast<EHFilterScope>(*EHStack.begin());
    600     emitFilterDispatchBlock(*this, filterScope);
    601     EHStack.popFilter();
    602   }
    603 }
    604 
    605 void CodeGenFunction::EmitCXXTryStmt(const CXXTryStmt &S) {
    606   EnterCXXTryStmt(S);
    607   EmitStmt(S.getTryBlock());
    608   ExitCXXTryStmt(S);
    609 }
    610 
    611 void CodeGenFunction::EnterCXXTryStmt(const CXXTryStmt &S, bool IsFnTryBlock) {
    612   unsigned NumHandlers = S.getNumHandlers();
    613   EHCatchScope *CatchScope = EHStack.pushCatch(NumHandlers);
    614 
    615   for (unsigned I = 0; I != NumHandlers; ++I) {
    616     const CXXCatchStmt *C = S.getHandler(I);
    617 
    618     llvm::BasicBlock *Handler = createBasicBlock("catch");
    619     if (C->getExceptionDecl()) {
    620       // FIXME: Dropping the reference type on the type into makes it
    621       // impossible to correctly implement catch-by-reference
    622       // semantics for pointers.  Unfortunately, this is what all
    623       // existing compilers do, and it's not clear that the standard
    624       // personality routine is capable of doing this right.  See C++ DR 388:
    625       //   http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#388
    626       Qualifiers CaughtTypeQuals;
    627       QualType CaughtType = CGM.getContext().getUnqualifiedArrayType(
    628           C->getCaughtType().getNonReferenceType(), CaughtTypeQuals);
    629 
    630       CatchTypeInfo TypeInfo{nullptr, 0};
    631       if (CaughtType->isObjCObjectPointerType())
    632         TypeInfo.RTTI = CGM.getObjCRuntime().GetEHType(CaughtType);
    633       else
    634         TypeInfo = CGM.getCXXABI().getAddrOfCXXCatchHandlerType(
    635             CaughtType, C->getCaughtType());
    636       CatchScope->setHandler(I, TypeInfo, Handler);
    637     } else {
    638       // No exception decl indicates '...', a catch-all.
    639       CatchScope->setHandler(I, CGM.getCXXABI().getCatchAllTypeInfo(), Handler);
    640       // Under async exceptions, catch(...) need to catch HW exception too
    641       // Mark scope with SehTryBegin as a SEH __try scope
    642       if (getLangOpts().EHAsynch)
    643         EmitRuntimeCallOrInvoke(getSehTryBeginFn(CGM));
    644     }
    645   }
    646 }
    647 
    648 llvm::BasicBlock *
    649 CodeGenFunction::getEHDispatchBlock(EHScopeStack::stable_iterator si) {
    650   if (EHPersonality::get(*this).usesFuncletPads())
    651     return getFuncletEHDispatchBlock(si);
    652 
    653   // The dispatch block for the end of the scope chain is a block that
    654   // just resumes unwinding.
    655   if (si == EHStack.stable_end())
    656     return getEHResumeBlock(true);
    657 
    658   // Otherwise, we should look at the actual scope.
    659   EHScope &scope = *EHStack.find(si);
    660 
    661   llvm::BasicBlock *dispatchBlock = scope.getCachedEHDispatchBlock();
    662   if (!dispatchBlock) {
    663     switch (scope.getKind()) {
    664     case EHScope::Catch: {
    665       // Apply a special case to a single catch-all.
    666       EHCatchScope &catchScope = cast<EHCatchScope>(scope);
    667       if (catchScope.getNumHandlers() == 1 &&
    668           catchScope.getHandler(0).isCatchAll()) {
    669         dispatchBlock = catchScope.getHandler(0).Block;
    670 
    671       // Otherwise, make a dispatch block.
    672       } else {
    673         dispatchBlock = createBasicBlock("catch.dispatch");
    674       }
    675       break;
    676     }
    677 
    678     case EHScope::Cleanup:
    679       dispatchBlock = createBasicBlock("ehcleanup");
    680       break;
    681 
    682     case EHScope::Filter:
    683       dispatchBlock = createBasicBlock("filter.dispatch");
    684       break;
    685 
    686     case EHScope::Terminate:
    687       dispatchBlock = getTerminateHandler();
    688       break;
    689     }
    690     scope.setCachedEHDispatchBlock(dispatchBlock);
    691   }
    692   return dispatchBlock;
    693 }
    694 
    695 llvm::BasicBlock *
    696 CodeGenFunction::getFuncletEHDispatchBlock(EHScopeStack::stable_iterator SI) {
    697   // Returning nullptr indicates that the previous dispatch block should unwind
    698   // to caller.
    699   if (SI == EHStack.stable_end())
    700     return nullptr;
    701 
    702   // Otherwise, we should look at the actual scope.
    703   EHScope &EHS = *EHStack.find(SI);
    704 
    705   llvm::BasicBlock *DispatchBlock = EHS.getCachedEHDispatchBlock();
    706   if (DispatchBlock)
    707     return DispatchBlock;
    708 
    709   if (EHS.getKind() == EHScope::Terminate)
    710     DispatchBlock = getTerminateFunclet();
    711   else
    712     DispatchBlock = createBasicBlock();
    713   CGBuilderTy Builder(*this, DispatchBlock);
    714 
    715   switch (EHS.getKind()) {
    716   case EHScope::Catch:
    717     DispatchBlock->setName("catch.dispatch");
    718     break;
    719 
    720   case EHScope::Cleanup:
    721     DispatchBlock->setName("ehcleanup");
    722     break;
    723 
    724   case EHScope::Filter:
    725     llvm_unreachable("exception specifications not handled yet!");
    726 
    727   case EHScope::Terminate:
    728     DispatchBlock->setName("terminate");
    729     break;
    730   }
    731   EHS.setCachedEHDispatchBlock(DispatchBlock);
    732   return DispatchBlock;
    733 }
    734 
    735 /// Check whether this is a non-EH scope, i.e. a scope which doesn't
    736 /// affect exception handling.  Currently, the only non-EH scopes are
    737 /// normal-only cleanup scopes.
    738 static bool isNonEHScope(const EHScope &S) {
    739   switch (S.getKind()) {
    740   case EHScope::Cleanup:
    741     return !cast<EHCleanupScope>(S).isEHCleanup();
    742   case EHScope::Filter:
    743   case EHScope::Catch:
    744   case EHScope::Terminate:
    745     return false;
    746   }
    747 
    748   llvm_unreachable("Invalid EHScope Kind!");
    749 }
    750 
    751 llvm::BasicBlock *CodeGenFunction::getInvokeDestImpl() {
    752   assert(EHStack.requiresLandingPad());
    753   assert(!EHStack.empty());
    754 
    755   // If exceptions are disabled/ignored and SEH is not in use, then there is no
    756   // invoke destination. SEH "works" even if exceptions are off. In practice,
    757   // this means that C++ destructors and other EH cleanups don't run, which is
    758   // consistent with MSVC's behavior, except in the presence of -EHa
    759   const LangOptions &LO = CGM.getLangOpts();
    760   if (!LO.Exceptions || LO.IgnoreExceptions) {
    761     if (!LO.Borland && !LO.MicrosoftExt)
    762       return nullptr;
    763     if (!currentFunctionUsesSEHTry())
    764       return nullptr;
    765   }
    766 
    767   // CUDA device code doesn't have exceptions.
    768   if (LO.CUDA && LO.CUDAIsDevice)
    769     return nullptr;
    770 
    771   // Check the innermost scope for a cached landing pad.  If this is
    772   // a non-EH cleanup, we'll check enclosing scopes in EmitLandingPad.
    773   llvm::BasicBlock *LP = EHStack.begin()->getCachedLandingPad();
    774   if (LP) return LP;
    775 
    776   const EHPersonality &Personality = EHPersonality::get(*this);
    777 
    778   if (!CurFn->hasPersonalityFn())
    779     CurFn->setPersonalityFn(getOpaquePersonalityFn(CGM, Personality));
    780 
    781   if (Personality.usesFuncletPads()) {
    782     // We don't need separate landing pads in the funclet model.
    783     LP = getEHDispatchBlock(EHStack.getInnermostEHScope());
    784   } else {
    785     // Build the landing pad for this scope.
    786     LP = EmitLandingPad();
    787   }
    788 
    789   assert(LP);
    790 
    791   // Cache the landing pad on the innermost scope.  If this is a
    792   // non-EH scope, cache the landing pad on the enclosing scope, too.
    793   for (EHScopeStack::iterator ir = EHStack.begin(); true; ++ir) {
    794     ir->setCachedLandingPad(LP);
    795     if (!isNonEHScope(*ir)) break;
    796   }
    797 
    798   return LP;
    799 }
    800 
    801 llvm::BasicBlock *CodeGenFunction::EmitLandingPad() {
    802   assert(EHStack.requiresLandingPad());
    803   assert(!CGM.getLangOpts().IgnoreExceptions &&
    804          "LandingPad should not be emitted when -fignore-exceptions are in "
    805          "effect.");
    806   EHScope &innermostEHScope = *EHStack.find(EHStack.getInnermostEHScope());
    807   switch (innermostEHScope.getKind()) {
    808   case EHScope::Terminate:
    809     return getTerminateLandingPad();
    810 
    811   case EHScope::Catch:
    812   case EHScope::Cleanup:
    813   case EHScope::Filter:
    814     if (llvm::BasicBlock *lpad = innermostEHScope.getCachedLandingPad())
    815       return lpad;
    816   }
    817 
    818   // Save the current IR generation state.
    819   CGBuilderTy::InsertPoint savedIP = Builder.saveAndClearIP();
    820   auto DL = ApplyDebugLocation::CreateDefaultArtificial(*this, CurEHLocation);
    821 
    822   // Create and configure the landing pad.
    823   llvm::BasicBlock *lpad = createBasicBlock("lpad");
    824   EmitBlock(lpad);
    825 
    826   llvm::LandingPadInst *LPadInst =
    827       Builder.CreateLandingPad(llvm::StructType::get(Int8PtrTy, Int32Ty), 0);
    828 
    829   llvm::Value *LPadExn = Builder.CreateExtractValue(LPadInst, 0);
    830   Builder.CreateStore(LPadExn, getExceptionSlot());
    831   llvm::Value *LPadSel = Builder.CreateExtractValue(LPadInst, 1);
    832   Builder.CreateStore(LPadSel, getEHSelectorSlot());
    833 
    834   // Save the exception pointer.  It's safe to use a single exception
    835   // pointer per function because EH cleanups can never have nested
    836   // try/catches.
    837   // Build the landingpad instruction.
    838 
    839   // Accumulate all the handlers in scope.
    840   bool hasCatchAll = false;
    841   bool hasCleanup = false;
    842   bool hasFilter = false;
    843   SmallVector<llvm::Value*, 4> filterTypes;
    844   llvm::SmallPtrSet<llvm::Value*, 4> catchTypes;
    845   for (EHScopeStack::iterator I = EHStack.begin(), E = EHStack.end(); I != E;
    846        ++I) {
    847 
    848     switch (I->getKind()) {
    849     case EHScope::Cleanup:
    850       // If we have a cleanup, remember that.
    851       hasCleanup = (hasCleanup || cast<EHCleanupScope>(*I).isEHCleanup());
    852       continue;
    853 
    854     case EHScope::Filter: {
    855       assert(I.next() == EHStack.end() && "EH filter is not end of EH stack");
    856       assert(!hasCatchAll && "EH filter reached after catch-all");
    857 
    858       // Filter scopes get added to the landingpad in weird ways.
    859       EHFilterScope &filter = cast<EHFilterScope>(*I);
    860       hasFilter = true;
    861 
    862       // Add all the filter values.
    863       for (unsigned i = 0, e = filter.getNumFilters(); i != e; ++i)
    864         filterTypes.push_back(filter.getFilter(i));
    865       goto done;
    866     }
    867 
    868     case EHScope::Terminate:
    869       // Terminate scopes are basically catch-alls.
    870       assert(!hasCatchAll);
    871       hasCatchAll = true;
    872       goto done;
    873 
    874     case EHScope::Catch:
    875       break;
    876     }
    877 
    878     EHCatchScope &catchScope = cast<EHCatchScope>(*I);
    879     for (unsigned hi = 0, he = catchScope.getNumHandlers(); hi != he; ++hi) {
    880       EHCatchScope::Handler handler = catchScope.getHandler(hi);
    881       assert(handler.Type.Flags == 0 &&
    882              "landingpads do not support catch handler flags");
    883 
    884       // If this is a catch-all, register that and abort.
    885       if (!handler.Type.RTTI) {
    886         assert(!hasCatchAll);
    887         hasCatchAll = true;
    888         goto done;
    889       }
    890 
    891       // Check whether we already have a handler for this type.
    892       if (catchTypes.insert(handler.Type.RTTI).second)
    893         // If not, add it directly to the landingpad.
    894         LPadInst->addClause(handler.Type.RTTI);
    895     }
    896   }
    897 
    898  done:
    899   // If we have a catch-all, add null to the landingpad.
    900   assert(!(hasCatchAll && hasFilter));
    901   if (hasCatchAll) {
    902     LPadInst->addClause(getCatchAllValue(*this));
    903 
    904   // If we have an EH filter, we need to add those handlers in the
    905   // right place in the landingpad, which is to say, at the end.
    906   } else if (hasFilter) {
    907     // Create a filter expression: a constant array indicating which filter
    908     // types there are. The personality routine only lands here if the filter
    909     // doesn't match.
    910     SmallVector<llvm::Constant*, 8> Filters;
    911     llvm::ArrayType *AType =
    912       llvm::ArrayType::get(!filterTypes.empty() ?
    913                              filterTypes[0]->getType() : Int8PtrTy,
    914                            filterTypes.size());
    915 
    916     for (unsigned i = 0, e = filterTypes.size(); i != e; ++i)
    917       Filters.push_back(cast<llvm::Constant>(filterTypes[i]));
    918     llvm::Constant *FilterArray = llvm::ConstantArray::get(AType, Filters);
    919     LPadInst->addClause(FilterArray);
    920 
    921     // Also check whether we need a cleanup.
    922     if (hasCleanup)
    923       LPadInst->setCleanup(true);
    924 
    925   // Otherwise, signal that we at least have cleanups.
    926   } else if (hasCleanup) {
    927     LPadInst->setCleanup(true);
    928   }
    929 
    930   assert((LPadInst->getNumClauses() > 0 || LPadInst->isCleanup()) &&
    931          "landingpad instruction has no clauses!");
    932 
    933   // Tell the backend how to generate the landing pad.
    934   Builder.CreateBr(getEHDispatchBlock(EHStack.getInnermostEHScope()));
    935 
    936   // Restore the old IR generation state.
    937   Builder.restoreIP(savedIP);
    938 
    939   return lpad;
    940 }
    941 
    942 static void emitCatchPadBlock(CodeGenFunction &CGF, EHCatchScope &CatchScope) {
    943   llvm::BasicBlock *DispatchBlock = CatchScope.getCachedEHDispatchBlock();
    944   assert(DispatchBlock);
    945 
    946   CGBuilderTy::InsertPoint SavedIP = CGF.Builder.saveIP();
    947   CGF.EmitBlockAfterUses(DispatchBlock);
    948 
    949   llvm::Value *ParentPad = CGF.CurrentFuncletPad;
    950   if (!ParentPad)
    951     ParentPad = llvm::ConstantTokenNone::get(CGF.getLLVMContext());
    952   llvm::BasicBlock *UnwindBB =
    953       CGF.getEHDispatchBlock(CatchScope.getEnclosingEHScope());
    954 
    955   unsigned NumHandlers = CatchScope.getNumHandlers();
    956   llvm::CatchSwitchInst *CatchSwitch =
    957       CGF.Builder.CreateCatchSwitch(ParentPad, UnwindBB, NumHandlers);
    958 
    959   // Test against each of the exception types we claim to catch.
    960   for (unsigned I = 0; I < NumHandlers; ++I) {
    961     const EHCatchScope::Handler &Handler = CatchScope.getHandler(I);
    962 
    963     CatchTypeInfo TypeInfo = Handler.Type;
    964     if (!TypeInfo.RTTI)
    965       TypeInfo.RTTI = llvm::Constant::getNullValue(CGF.VoidPtrTy);
    966 
    967     CGF.Builder.SetInsertPoint(Handler.Block);
    968 
    969     if (EHPersonality::get(CGF).isMSVCXXPersonality()) {
    970       CGF.Builder.CreateCatchPad(
    971           CatchSwitch, {TypeInfo.RTTI, CGF.Builder.getInt32(TypeInfo.Flags),
    972                         llvm::Constant::getNullValue(CGF.VoidPtrTy)});
    973     } else {
    974       CGF.Builder.CreateCatchPad(CatchSwitch, {TypeInfo.RTTI});
    975     }
    976 
    977     CatchSwitch->addHandler(Handler.Block);
    978   }
    979   CGF.Builder.restoreIP(SavedIP);
    980 }
    981 
    982 // Wasm uses Windows-style EH instructions, but it merges all catch clauses into
    983 // one big catchpad, within which we use Itanium's landingpad-style selector
    984 // comparison instructions.
    985 static void emitWasmCatchPadBlock(CodeGenFunction &CGF,
    986                                   EHCatchScope &CatchScope) {
    987   llvm::BasicBlock *DispatchBlock = CatchScope.getCachedEHDispatchBlock();
    988   assert(DispatchBlock);
    989 
    990   CGBuilderTy::InsertPoint SavedIP = CGF.Builder.saveIP();
    991   CGF.EmitBlockAfterUses(DispatchBlock);
    992 
    993   llvm::Value *ParentPad = CGF.CurrentFuncletPad;
    994   if (!ParentPad)
    995     ParentPad = llvm::ConstantTokenNone::get(CGF.getLLVMContext());
    996   llvm::BasicBlock *UnwindBB =
    997       CGF.getEHDispatchBlock(CatchScope.getEnclosingEHScope());
    998 
    999   unsigned NumHandlers = CatchScope.getNumHandlers();
   1000   llvm::CatchSwitchInst *CatchSwitch =
   1001       CGF.Builder.CreateCatchSwitch(ParentPad, UnwindBB, NumHandlers);
   1002 
   1003   // We don't use a landingpad instruction, so generate intrinsic calls to
   1004   // provide exception and selector values.
   1005   llvm::BasicBlock *WasmCatchStartBlock = CGF.createBasicBlock("catch.start");
   1006   CatchSwitch->addHandler(WasmCatchStartBlock);
   1007   CGF.EmitBlockAfterUses(WasmCatchStartBlock);
   1008 
   1009   // Create a catchpad instruction.
   1010   SmallVector<llvm::Value *, 4> CatchTypes;
   1011   for (unsigned I = 0, E = NumHandlers; I < E; ++I) {
   1012     const EHCatchScope::Handler &Handler = CatchScope.getHandler(I);
   1013     CatchTypeInfo TypeInfo = Handler.Type;
   1014     if (!TypeInfo.RTTI)
   1015       TypeInfo.RTTI = llvm::Constant::getNullValue(CGF.VoidPtrTy);
   1016     CatchTypes.push_back(TypeInfo.RTTI);
   1017   }
   1018   auto *CPI = CGF.Builder.CreateCatchPad(CatchSwitch, CatchTypes);
   1019 
   1020   // Create calls to wasm.get.exception and wasm.get.ehselector intrinsics.
   1021   // Before they are lowered appropriately later, they provide values for the
   1022   // exception and selector.
   1023   llvm::Function *GetExnFn =
   1024       CGF.CGM.getIntrinsic(llvm::Intrinsic::wasm_get_exception);
   1025   llvm::Function *GetSelectorFn =
   1026       CGF.CGM.getIntrinsic(llvm::Intrinsic::wasm_get_ehselector);
   1027   llvm::CallInst *Exn = CGF.Builder.CreateCall(GetExnFn, CPI);
   1028   CGF.Builder.CreateStore(Exn, CGF.getExceptionSlot());
   1029   llvm::CallInst *Selector = CGF.Builder.CreateCall(GetSelectorFn, CPI);
   1030 
   1031   llvm::Function *TypeIDFn = CGF.CGM.getIntrinsic(llvm::Intrinsic::eh_typeid_for);
   1032 
   1033   // If there's only a single catch-all, branch directly to its handler.
   1034   if (CatchScope.getNumHandlers() == 1 &&
   1035       CatchScope.getHandler(0).isCatchAll()) {
   1036     CGF.Builder.CreateBr(CatchScope.getHandler(0).Block);
   1037     CGF.Builder.restoreIP(SavedIP);
   1038     return;
   1039   }
   1040 
   1041   // Test against each of the exception types we claim to catch.
   1042   for (unsigned I = 0, E = NumHandlers;; ++I) {
   1043     assert(I < E && "ran off end of handlers!");
   1044     const EHCatchScope::Handler &Handler = CatchScope.getHandler(I);
   1045     CatchTypeInfo TypeInfo = Handler.Type;
   1046     if (!TypeInfo.RTTI)
   1047       TypeInfo.RTTI = llvm::Constant::getNullValue(CGF.VoidPtrTy);
   1048 
   1049     // Figure out the next block.
   1050     llvm::BasicBlock *NextBlock;
   1051 
   1052     bool EmitNextBlock = false, NextIsEnd = false;
   1053 
   1054     // If this is the last handler, we're at the end, and the next block is a
   1055     // block that contains a call to the rethrow function, so we can unwind to
   1056     // the enclosing EH scope. The call itself will be generated later.
   1057     if (I + 1 == E) {
   1058       NextBlock = CGF.createBasicBlock("rethrow");
   1059       EmitNextBlock = true;
   1060       NextIsEnd = true;
   1061 
   1062       // If the next handler is a catch-all, we're at the end, and the
   1063       // next block is that handler.
   1064     } else if (CatchScope.getHandler(I + 1).isCatchAll()) {
   1065       NextBlock = CatchScope.getHandler(I + 1).Block;
   1066       NextIsEnd = true;
   1067 
   1068       // Otherwise, we're not at the end and we need a new block.
   1069     } else {
   1070       NextBlock = CGF.createBasicBlock("catch.fallthrough");
   1071       EmitNextBlock = true;
   1072     }
   1073 
   1074     // Figure out the catch type's index in the LSDA's type table.
   1075     llvm::CallInst *TypeIndex = CGF.Builder.CreateCall(TypeIDFn, TypeInfo.RTTI);
   1076     TypeIndex->setDoesNotThrow();
   1077 
   1078     llvm::Value *MatchesTypeIndex =
   1079         CGF.Builder.CreateICmpEQ(Selector, TypeIndex, "matches");
   1080     CGF.Builder.CreateCondBr(MatchesTypeIndex, Handler.Block, NextBlock);
   1081 
   1082     if (EmitNextBlock)
   1083       CGF.EmitBlock(NextBlock);
   1084     if (NextIsEnd)
   1085       break;
   1086   }
   1087 
   1088   CGF.Builder.restoreIP(SavedIP);
   1089 }
   1090 
   1091 /// Emit the structure of the dispatch block for the given catch scope.
   1092 /// It is an invariant that the dispatch block already exists.
   1093 static void emitCatchDispatchBlock(CodeGenFunction &CGF,
   1094                                    EHCatchScope &catchScope) {
   1095   if (EHPersonality::get(CGF).isWasmPersonality())
   1096     return emitWasmCatchPadBlock(CGF, catchScope);
   1097   if (EHPersonality::get(CGF).usesFuncletPads())
   1098     return emitCatchPadBlock(CGF, catchScope);
   1099 
   1100   llvm::BasicBlock *dispatchBlock = catchScope.getCachedEHDispatchBlock();
   1101   assert(dispatchBlock);
   1102 
   1103   // If there's only a single catch-all, getEHDispatchBlock returned
   1104   // that catch-all as the dispatch block.
   1105   if (catchScope.getNumHandlers() == 1 &&
   1106       catchScope.getHandler(0).isCatchAll()) {
   1107     assert(dispatchBlock == catchScope.getHandler(0).Block);
   1108     return;
   1109   }
   1110 
   1111   CGBuilderTy::InsertPoint savedIP = CGF.Builder.saveIP();
   1112   CGF.EmitBlockAfterUses(dispatchBlock);
   1113 
   1114   // Select the right handler.
   1115   llvm::Function *llvm_eh_typeid_for =
   1116     CGF.CGM.getIntrinsic(llvm::Intrinsic::eh_typeid_for);
   1117 
   1118   // Load the selector value.
   1119   llvm::Value *selector = CGF.getSelectorFromSlot();
   1120 
   1121   // Test against each of the exception types we claim to catch.
   1122   for (unsigned i = 0, e = catchScope.getNumHandlers(); ; ++i) {
   1123     assert(i < e && "ran off end of handlers!");
   1124     const EHCatchScope::Handler &handler = catchScope.getHandler(i);
   1125 
   1126     llvm::Value *typeValue = handler.Type.RTTI;
   1127     assert(handler.Type.Flags == 0 &&
   1128            "landingpads do not support catch handler flags");
   1129     assert(typeValue && "fell into catch-all case!");
   1130     typeValue = CGF.Builder.CreateBitCast(typeValue, CGF.Int8PtrTy);
   1131 
   1132     // Figure out the next block.
   1133     bool nextIsEnd;
   1134     llvm::BasicBlock *nextBlock;
   1135 
   1136     // If this is the last handler, we're at the end, and the next
   1137     // block is the block for the enclosing EH scope.
   1138     if (i + 1 == e) {
   1139       nextBlock = CGF.getEHDispatchBlock(catchScope.getEnclosingEHScope());
   1140       nextIsEnd = true;
   1141 
   1142     // If the next handler is a catch-all, we're at the end, and the
   1143     // next block is that handler.
   1144     } else if (catchScope.getHandler(i+1).isCatchAll()) {
   1145       nextBlock = catchScope.getHandler(i+1).Block;
   1146       nextIsEnd = true;
   1147 
   1148     // Otherwise, we're not at the end and we need a new block.
   1149     } else {
   1150       nextBlock = CGF.createBasicBlock("catch.fallthrough");
   1151       nextIsEnd = false;
   1152     }
   1153 
   1154     // Figure out the catch type's index in the LSDA's type table.
   1155     llvm::CallInst *typeIndex =
   1156       CGF.Builder.CreateCall(llvm_eh_typeid_for, typeValue);
   1157     typeIndex->setDoesNotThrow();
   1158 
   1159     llvm::Value *matchesTypeIndex =
   1160       CGF.Builder.CreateICmpEQ(selector, typeIndex, "matches");
   1161     CGF.Builder.CreateCondBr(matchesTypeIndex, handler.Block, nextBlock);
   1162 
   1163     // If the next handler is a catch-all, we're completely done.
   1164     if (nextIsEnd) {
   1165       CGF.Builder.restoreIP(savedIP);
   1166       return;
   1167     }
   1168     // Otherwise we need to emit and continue at that block.
   1169     CGF.EmitBlock(nextBlock);
   1170   }
   1171 }
   1172 
   1173 void CodeGenFunction::popCatchScope() {
   1174   EHCatchScope &catchScope = cast<EHCatchScope>(*EHStack.begin());
   1175   if (catchScope.hasEHBranches())
   1176     emitCatchDispatchBlock(*this, catchScope);
   1177   EHStack.popCatch();
   1178 }
   1179 
   1180 void CodeGenFunction::ExitCXXTryStmt(const CXXTryStmt &S, bool IsFnTryBlock) {
   1181   unsigned NumHandlers = S.getNumHandlers();
   1182   EHCatchScope &CatchScope = cast<EHCatchScope>(*EHStack.begin());
   1183   assert(CatchScope.getNumHandlers() == NumHandlers);
   1184   llvm::BasicBlock *DispatchBlock = CatchScope.getCachedEHDispatchBlock();
   1185 
   1186   // If the catch was not required, bail out now.
   1187   if (!CatchScope.hasEHBranches()) {
   1188     CatchScope.clearHandlerBlocks();
   1189     EHStack.popCatch();
   1190     return;
   1191   }
   1192 
   1193   // Emit the structure of the EH dispatch for this catch.
   1194   emitCatchDispatchBlock(*this, CatchScope);
   1195 
   1196   // Copy the handler blocks off before we pop the EH stack.  Emitting
   1197   // the handlers might scribble on this memory.
   1198   SmallVector<EHCatchScope::Handler, 8> Handlers(
   1199       CatchScope.begin(), CatchScope.begin() + NumHandlers);
   1200 
   1201   EHStack.popCatch();
   1202 
   1203   // The fall-through block.
   1204   llvm::BasicBlock *ContBB = createBasicBlock("try.cont");
   1205 
   1206   // We just emitted the body of the try; jump to the continue block.
   1207   if (HaveInsertPoint())
   1208     Builder.CreateBr(ContBB);
   1209 
   1210   // Determine if we need an implicit rethrow for all these catch handlers;
   1211   // see the comment below.
   1212   bool doImplicitRethrow = false;
   1213   if (IsFnTryBlock)
   1214     doImplicitRethrow = isa<CXXDestructorDecl>(CurCodeDecl) ||
   1215                         isa<CXXConstructorDecl>(CurCodeDecl);
   1216 
   1217   // Wasm uses Windows-style EH instructions, but merges all catch clauses into
   1218   // one big catchpad. So we save the old funclet pad here before we traverse
   1219   // each catch handler.
   1220   SaveAndRestore<llvm::Instruction *> RestoreCurrentFuncletPad(
   1221       CurrentFuncletPad);
   1222   llvm::BasicBlock *WasmCatchStartBlock = nullptr;
   1223   if (EHPersonality::get(*this).isWasmPersonality()) {
   1224     auto *CatchSwitch =
   1225         cast<llvm::CatchSwitchInst>(DispatchBlock->getFirstNonPHI());
   1226     WasmCatchStartBlock = CatchSwitch->hasUnwindDest()
   1227                               ? CatchSwitch->getSuccessor(1)
   1228                               : CatchSwitch->getSuccessor(0);
   1229     auto *CPI = cast<llvm::CatchPadInst>(WasmCatchStartBlock->getFirstNonPHI());
   1230     CurrentFuncletPad = CPI;
   1231   }
   1232 
   1233   // Perversely, we emit the handlers backwards precisely because we
   1234   // want them to appear in source order.  In all of these cases, the
   1235   // catch block will have exactly one predecessor, which will be a
   1236   // particular block in the catch dispatch.  However, in the case of
   1237   // a catch-all, one of the dispatch blocks will branch to two
   1238   // different handlers, and EmitBlockAfterUses will cause the second
   1239   // handler to be moved before the first.
   1240   bool HasCatchAll = false;
   1241   for (unsigned I = NumHandlers; I != 0; --I) {
   1242     HasCatchAll |= Handlers[I - 1].isCatchAll();
   1243     llvm::BasicBlock *CatchBlock = Handlers[I-1].Block;
   1244     EmitBlockAfterUses(CatchBlock);
   1245 
   1246     // Catch the exception if this isn't a catch-all.
   1247     const CXXCatchStmt *C = S.getHandler(I-1);
   1248 
   1249     // Enter a cleanup scope, including the catch variable and the
   1250     // end-catch.
   1251     RunCleanupsScope CatchScope(*this);
   1252 
   1253     // Initialize the catch variable and set up the cleanups.
   1254     SaveAndRestore<llvm::Instruction *> RestoreCurrentFuncletPad(
   1255         CurrentFuncletPad);
   1256     CGM.getCXXABI().emitBeginCatch(*this, C);
   1257 
   1258     // Emit the PGO counter increment.
   1259     incrementProfileCounter(C);
   1260 
   1261     // Perform the body of the catch.
   1262     EmitStmt(C->getHandlerBlock());
   1263 
   1264     // [except.handle]p11:
   1265     //   The currently handled exception is rethrown if control
   1266     //   reaches the end of a handler of the function-try-block of a
   1267     //   constructor or destructor.
   1268 
   1269     // It is important that we only do this on fallthrough and not on
   1270     // return.  Note that it's illegal to put a return in a
   1271     // constructor function-try-block's catch handler (p14), so this
   1272     // really only applies to destructors.
   1273     if (doImplicitRethrow && HaveInsertPoint()) {
   1274       CGM.getCXXABI().emitRethrow(*this, /*isNoReturn*/false);
   1275       Builder.CreateUnreachable();
   1276       Builder.ClearInsertionPoint();
   1277     }
   1278 
   1279     // Fall out through the catch cleanups.
   1280     CatchScope.ForceCleanup();
   1281 
   1282     // Branch out of the try.
   1283     if (HaveInsertPoint())
   1284       Builder.CreateBr(ContBB);
   1285   }
   1286 
   1287   // Because in wasm we merge all catch clauses into one big catchpad, in case
   1288   // none of the types in catch handlers matches after we test against each of
   1289   // them, we should unwind to the next EH enclosing scope. We generate a call
   1290   // to rethrow function here to do that.
   1291   if (EHPersonality::get(*this).isWasmPersonality() && !HasCatchAll) {
   1292     assert(WasmCatchStartBlock);
   1293     // Navigate for the "rethrow" block we created in emitWasmCatchPadBlock().
   1294     // Wasm uses landingpad-style conditional branches to compare selectors, so
   1295     // we follow the false destination for each of the cond branches to reach
   1296     // the rethrow block.
   1297     llvm::BasicBlock *RethrowBlock = WasmCatchStartBlock;
   1298     while (llvm::Instruction *TI = RethrowBlock->getTerminator()) {
   1299       auto *BI = cast<llvm::BranchInst>(TI);
   1300       assert(BI->isConditional());
   1301       RethrowBlock = BI->getSuccessor(1);
   1302     }
   1303     assert(RethrowBlock != WasmCatchStartBlock && RethrowBlock->empty());
   1304     Builder.SetInsertPoint(RethrowBlock);
   1305     llvm::Function *RethrowInCatchFn =
   1306         CGM.getIntrinsic(llvm::Intrinsic::wasm_rethrow);
   1307     EmitNoreturnRuntimeCallOrInvoke(RethrowInCatchFn, {});
   1308   }
   1309 
   1310   EmitBlock(ContBB);
   1311   incrementProfileCounter(&S);
   1312 }
   1313 
   1314 namespace {
   1315   struct CallEndCatchForFinally final : EHScopeStack::Cleanup {
   1316     llvm::Value *ForEHVar;
   1317     llvm::FunctionCallee EndCatchFn;
   1318     CallEndCatchForFinally(llvm::Value *ForEHVar,
   1319                            llvm::FunctionCallee EndCatchFn)
   1320         : ForEHVar(ForEHVar), EndCatchFn(EndCatchFn) {}
   1321 
   1322     void Emit(CodeGenFunction &CGF, Flags flags) override {
   1323       llvm::BasicBlock *EndCatchBB = CGF.createBasicBlock("finally.endcatch");
   1324       llvm::BasicBlock *CleanupContBB =
   1325         CGF.createBasicBlock("finally.cleanup.cont");
   1326 
   1327       llvm::Value *ShouldEndCatch =
   1328         CGF.Builder.CreateFlagLoad(ForEHVar, "finally.endcatch");
   1329       CGF.Builder.CreateCondBr(ShouldEndCatch, EndCatchBB, CleanupContBB);
   1330       CGF.EmitBlock(EndCatchBB);
   1331       CGF.EmitRuntimeCallOrInvoke(EndCatchFn); // catch-all, so might throw
   1332       CGF.EmitBlock(CleanupContBB);
   1333     }
   1334   };
   1335 
   1336   struct PerformFinally final : EHScopeStack::Cleanup {
   1337     const Stmt *Body;
   1338     llvm::Value *ForEHVar;
   1339     llvm::FunctionCallee EndCatchFn;
   1340     llvm::FunctionCallee RethrowFn;
   1341     llvm::Value *SavedExnVar;
   1342 
   1343     PerformFinally(const Stmt *Body, llvm::Value *ForEHVar,
   1344                    llvm::FunctionCallee EndCatchFn,
   1345                    llvm::FunctionCallee RethrowFn, llvm::Value *SavedExnVar)
   1346         : Body(Body), ForEHVar(ForEHVar), EndCatchFn(EndCatchFn),
   1347           RethrowFn(RethrowFn), SavedExnVar(SavedExnVar) {}
   1348 
   1349     void Emit(CodeGenFunction &CGF, Flags flags) override {
   1350       // Enter a cleanup to call the end-catch function if one was provided.
   1351       if (EndCatchFn)
   1352         CGF.EHStack.pushCleanup<CallEndCatchForFinally>(NormalAndEHCleanup,
   1353                                                         ForEHVar, EndCatchFn);
   1354 
   1355       // Save the current cleanup destination in case there are
   1356       // cleanups in the finally block.
   1357       llvm::Value *SavedCleanupDest =
   1358         CGF.Builder.CreateLoad(CGF.getNormalCleanupDestSlot(),
   1359                                "cleanup.dest.saved");
   1360 
   1361       // Emit the finally block.
   1362       CGF.EmitStmt(Body);
   1363 
   1364       // If the end of the finally is reachable, check whether this was
   1365       // for EH.  If so, rethrow.
   1366       if (CGF.HaveInsertPoint()) {
   1367         llvm::BasicBlock *RethrowBB = CGF.createBasicBlock("finally.rethrow");
   1368         llvm::BasicBlock *ContBB = CGF.createBasicBlock("finally.cont");
   1369 
   1370         llvm::Value *ShouldRethrow =
   1371           CGF.Builder.CreateFlagLoad(ForEHVar, "finally.shouldthrow");
   1372         CGF.Builder.CreateCondBr(ShouldRethrow, RethrowBB, ContBB);
   1373 
   1374         CGF.EmitBlock(RethrowBB);
   1375         if (SavedExnVar) {
   1376           CGF.EmitRuntimeCallOrInvoke(RethrowFn,
   1377             CGF.Builder.CreateAlignedLoad(CGF.Int8PtrTy, SavedExnVar,
   1378                                           CGF.getPointerAlign()));
   1379         } else {
   1380           CGF.EmitRuntimeCallOrInvoke(RethrowFn);
   1381         }
   1382         CGF.Builder.CreateUnreachable();
   1383 
   1384         CGF.EmitBlock(ContBB);
   1385 
   1386         // Restore the cleanup destination.
   1387         CGF.Builder.CreateStore(SavedCleanupDest,
   1388                                 CGF.getNormalCleanupDestSlot());
   1389       }
   1390 
   1391       // Leave the end-catch cleanup.  As an optimization, pretend that
   1392       // the fallthrough path was inaccessible; we've dynamically proven
   1393       // that we're not in the EH case along that path.
   1394       if (EndCatchFn) {
   1395         CGBuilderTy::InsertPoint SavedIP = CGF.Builder.saveAndClearIP();
   1396         CGF.PopCleanupBlock();
   1397         CGF.Builder.restoreIP(SavedIP);
   1398       }
   1399 
   1400       // Now make sure we actually have an insertion point or the
   1401       // cleanup gods will hate us.
   1402       CGF.EnsureInsertPoint();
   1403     }
   1404   };
   1405 } // end anonymous namespace
   1406 
   1407 /// Enters a finally block for an implementation using zero-cost
   1408 /// exceptions.  This is mostly general, but hard-codes some
   1409 /// language/ABI-specific behavior in the catch-all sections.
   1410 void CodeGenFunction::FinallyInfo::enter(CodeGenFunction &CGF, const Stmt *body,
   1411                                          llvm::FunctionCallee beginCatchFn,
   1412                                          llvm::FunctionCallee endCatchFn,
   1413                                          llvm::FunctionCallee rethrowFn) {
   1414   assert((!!beginCatchFn) == (!!endCatchFn) &&
   1415          "begin/end catch functions not paired");
   1416   assert(rethrowFn && "rethrow function is required");
   1417 
   1418   BeginCatchFn = beginCatchFn;
   1419 
   1420   // The rethrow function has one of the following two types:
   1421   //   void (*)()
   1422   //   void (*)(void*)
   1423   // In the latter case we need to pass it the exception object.
   1424   // But we can't use the exception slot because the @finally might
   1425   // have a landing pad (which would overwrite the exception slot).
   1426   llvm::FunctionType *rethrowFnTy = rethrowFn.getFunctionType();
   1427   SavedExnVar = nullptr;
   1428   if (rethrowFnTy->getNumParams())
   1429     SavedExnVar = CGF.CreateTempAlloca(CGF.Int8PtrTy, "finally.exn");
   1430 
   1431   // A finally block is a statement which must be executed on any edge
   1432   // out of a given scope.  Unlike a cleanup, the finally block may
   1433   // contain arbitrary control flow leading out of itself.  In
   1434   // addition, finally blocks should always be executed, even if there
   1435   // are no catch handlers higher on the stack.  Therefore, we
   1436   // surround the protected scope with a combination of a normal
   1437   // cleanup (to catch attempts to break out of the block via normal
   1438   // control flow) and an EH catch-all (semantically "outside" any try
   1439   // statement to which the finally block might have been attached).
   1440   // The finally block itself is generated in the context of a cleanup
   1441   // which conditionally leaves the catch-all.
   1442 
   1443   // Jump destination for performing the finally block on an exception
   1444   // edge.  We'll never actually reach this block, so unreachable is
   1445   // fine.
   1446   RethrowDest = CGF.getJumpDestInCurrentScope(CGF.getUnreachableBlock());
   1447 
   1448   // Whether the finally block is being executed for EH purposes.
   1449   ForEHVar = CGF.CreateTempAlloca(CGF.Builder.getInt1Ty(), "finally.for-eh");
   1450   CGF.Builder.CreateFlagStore(false, ForEHVar);
   1451 
   1452   // Enter a normal cleanup which will perform the @finally block.
   1453   CGF.EHStack.pushCleanup<PerformFinally>(NormalCleanup, body,
   1454                                           ForEHVar, endCatchFn,
   1455                                           rethrowFn, SavedExnVar);
   1456 
   1457   // Enter a catch-all scope.
   1458   llvm::BasicBlock *catchBB = CGF.createBasicBlock("finally.catchall");
   1459   EHCatchScope *catchScope = CGF.EHStack.pushCatch(1);
   1460   catchScope->setCatchAllHandler(0, catchBB);
   1461 }
   1462 
   1463 void CodeGenFunction::FinallyInfo::exit(CodeGenFunction &CGF) {
   1464   // Leave the finally catch-all.
   1465   EHCatchScope &catchScope = cast<EHCatchScope>(*CGF.EHStack.begin());
   1466   llvm::BasicBlock *catchBB = catchScope.getHandler(0).Block;
   1467 
   1468   CGF.popCatchScope();
   1469 
   1470   // If there are any references to the catch-all block, emit it.
   1471   if (catchBB->use_empty()) {
   1472     delete catchBB;
   1473   } else {
   1474     CGBuilderTy::InsertPoint savedIP = CGF.Builder.saveAndClearIP();
   1475     CGF.EmitBlock(catchBB);
   1476 
   1477     llvm::Value *exn = nullptr;
   1478 
   1479     // If there's a begin-catch function, call it.
   1480     if (BeginCatchFn) {
   1481       exn = CGF.getExceptionFromSlot();
   1482       CGF.EmitNounwindRuntimeCall(BeginCatchFn, exn);
   1483     }
   1484 
   1485     // If we need to remember the exception pointer to rethrow later, do so.
   1486     if (SavedExnVar) {
   1487       if (!exn) exn = CGF.getExceptionFromSlot();
   1488       CGF.Builder.CreateAlignedStore(exn, SavedExnVar, CGF.getPointerAlign());
   1489     }
   1490 
   1491     // Tell the cleanups in the finally block that we're do this for EH.
   1492     CGF.Builder.CreateFlagStore(true, ForEHVar);
   1493 
   1494     // Thread a jump through the finally cleanup.
   1495     CGF.EmitBranchThroughCleanup(RethrowDest);
   1496 
   1497     CGF.Builder.restoreIP(savedIP);
   1498   }
   1499 
   1500   // Finally, leave the @finally cleanup.
   1501   CGF.PopCleanupBlock();
   1502 }
   1503 
   1504 llvm::BasicBlock *CodeGenFunction::getTerminateLandingPad() {
   1505   if (TerminateLandingPad)
   1506     return TerminateLandingPad;
   1507 
   1508   CGBuilderTy::InsertPoint SavedIP = Builder.saveAndClearIP();
   1509 
   1510   // This will get inserted at the end of the function.
   1511   TerminateLandingPad = createBasicBlock("terminate.lpad");
   1512   Builder.SetInsertPoint(TerminateLandingPad);
   1513 
   1514   // Tell the backend that this is a landing pad.
   1515   const EHPersonality &Personality = EHPersonality::get(*this);
   1516 
   1517   if (!CurFn->hasPersonalityFn())
   1518     CurFn->setPersonalityFn(getOpaquePersonalityFn(CGM, Personality));
   1519 
   1520   llvm::LandingPadInst *LPadInst =
   1521       Builder.CreateLandingPad(llvm::StructType::get(Int8PtrTy, Int32Ty), 0);
   1522   LPadInst->addClause(getCatchAllValue(*this));
   1523 
   1524   llvm::Value *Exn = nullptr;
   1525   if (getLangOpts().CPlusPlus)
   1526     Exn = Builder.CreateExtractValue(LPadInst, 0);
   1527   llvm::CallInst *terminateCall =
   1528       CGM.getCXXABI().emitTerminateForUnexpectedException(*this, Exn);
   1529   terminateCall->setDoesNotReturn();
   1530   Builder.CreateUnreachable();
   1531 
   1532   // Restore the saved insertion state.
   1533   Builder.restoreIP(SavedIP);
   1534 
   1535   return TerminateLandingPad;
   1536 }
   1537 
   1538 llvm::BasicBlock *CodeGenFunction::getTerminateHandler() {
   1539   if (TerminateHandler)
   1540     return TerminateHandler;
   1541 
   1542   // Set up the terminate handler.  This block is inserted at the very
   1543   // end of the function by FinishFunction.
   1544   TerminateHandler = createBasicBlock("terminate.handler");
   1545   CGBuilderTy::InsertPoint SavedIP = Builder.saveAndClearIP();
   1546   Builder.SetInsertPoint(TerminateHandler);
   1547 
   1548   llvm::Value *Exn = nullptr;
   1549   if (getLangOpts().CPlusPlus)
   1550     Exn = getExceptionFromSlot();
   1551   llvm::CallInst *terminateCall =
   1552       CGM.getCXXABI().emitTerminateForUnexpectedException(*this, Exn);
   1553   terminateCall->setDoesNotReturn();
   1554   Builder.CreateUnreachable();
   1555 
   1556   // Restore the saved insertion state.
   1557   Builder.restoreIP(SavedIP);
   1558 
   1559   return TerminateHandler;
   1560 }
   1561 
   1562 llvm::BasicBlock *CodeGenFunction::getTerminateFunclet() {
   1563   assert(EHPersonality::get(*this).usesFuncletPads() &&
   1564          "use getTerminateLandingPad for non-funclet EH");
   1565 
   1566   llvm::BasicBlock *&TerminateFunclet = TerminateFunclets[CurrentFuncletPad];
   1567   if (TerminateFunclet)
   1568     return TerminateFunclet;
   1569 
   1570   CGBuilderTy::InsertPoint SavedIP = Builder.saveAndClearIP();
   1571 
   1572   // Set up the terminate handler.  This block is inserted at the very
   1573   // end of the function by FinishFunction.
   1574   TerminateFunclet = createBasicBlock("terminate.handler");
   1575   Builder.SetInsertPoint(TerminateFunclet);
   1576 
   1577   // Create the cleanuppad using the current parent pad as its token. Use 'none'
   1578   // if this is a top-level terminate scope, which is the common case.
   1579   SaveAndRestore<llvm::Instruction *> RestoreCurrentFuncletPad(
   1580       CurrentFuncletPad);
   1581   llvm::Value *ParentPad = CurrentFuncletPad;
   1582   if (!ParentPad)
   1583     ParentPad = llvm::ConstantTokenNone::get(CGM.getLLVMContext());
   1584   CurrentFuncletPad = Builder.CreateCleanupPad(ParentPad);
   1585 
   1586   // Emit the __std_terminate call.
   1587   llvm::CallInst *terminateCall =
   1588       CGM.getCXXABI().emitTerminateForUnexpectedException(*this, nullptr);
   1589   terminateCall->setDoesNotReturn();
   1590   Builder.CreateUnreachable();
   1591 
   1592   // Restore the saved insertion state.
   1593   Builder.restoreIP(SavedIP);
   1594 
   1595   return TerminateFunclet;
   1596 }
   1597 
   1598 llvm::BasicBlock *CodeGenFunction::getEHResumeBlock(bool isCleanup) {
   1599   if (EHResumeBlock) return EHResumeBlock;
   1600 
   1601   CGBuilderTy::InsertPoint SavedIP = Builder.saveIP();
   1602 
   1603   // We emit a jump to a notional label at the outermost unwind state.
   1604   EHResumeBlock = createBasicBlock("eh.resume");
   1605   Builder.SetInsertPoint(EHResumeBlock);
   1606 
   1607   const EHPersonality &Personality = EHPersonality::get(*this);
   1608 
   1609   // This can always be a call because we necessarily didn't find
   1610   // anything on the EH stack which needs our help.
   1611   const char *RethrowName = Personality.CatchallRethrowFn;
   1612   if (RethrowName != nullptr && !isCleanup) {
   1613     EmitRuntimeCall(getCatchallRethrowFn(CGM, RethrowName),
   1614                     getExceptionFromSlot())->setDoesNotReturn();
   1615     Builder.CreateUnreachable();
   1616     Builder.restoreIP(SavedIP);
   1617     return EHResumeBlock;
   1618   }
   1619 
   1620   // Recreate the landingpad's return value for the 'resume' instruction.
   1621   llvm::Value *Exn = getExceptionFromSlot();
   1622   llvm::Value *Sel = getSelectorFromSlot();
   1623 
   1624   llvm::Type *LPadType = llvm::StructType::get(Exn->getType(), Sel->getType());
   1625   llvm::Value *LPadVal = llvm::UndefValue::get(LPadType);
   1626   LPadVal = Builder.CreateInsertValue(LPadVal, Exn, 0, "lpad.val");
   1627   LPadVal = Builder.CreateInsertValue(LPadVal, Sel, 1, "lpad.val");
   1628 
   1629   Builder.CreateResume(LPadVal);
   1630   Builder.restoreIP(SavedIP);
   1631   return EHResumeBlock;
   1632 }
   1633 
   1634 void CodeGenFunction::EmitSEHTryStmt(const SEHTryStmt &S) {
   1635   EnterSEHTryStmt(S);
   1636   {
   1637     JumpDest TryExit = getJumpDestInCurrentScope("__try.__leave");
   1638 
   1639     SEHTryEpilogueStack.push_back(&TryExit);
   1640 
   1641     llvm::BasicBlock *TryBB = nullptr;
   1642     // IsEHa: emit an invoke to _seh_try_begin() runtime for -EHa
   1643     if (getLangOpts().EHAsynch) {
   1644       EmitRuntimeCallOrInvoke(getSehTryBeginFn(CGM));
   1645       if (SEHTryEpilogueStack.size() == 1) // outermost only
   1646         TryBB = Builder.GetInsertBlock();
   1647     }
   1648 
   1649     EmitStmt(S.getTryBlock());
   1650 
   1651     // Volatilize all blocks in Try, till current insert point
   1652     if (TryBB) {
   1653       llvm::SmallPtrSet<llvm::BasicBlock *, 10> Visited;
   1654       VolatilizeTryBlocks(TryBB, Visited);
   1655     }
   1656 
   1657     SEHTryEpilogueStack.pop_back();
   1658 
   1659     if (!TryExit.getBlock()->use_empty())
   1660       EmitBlock(TryExit.getBlock(), /*IsFinished=*/true);
   1661     else
   1662       delete TryExit.getBlock();
   1663   }
   1664   ExitSEHTryStmt(S);
   1665 }
   1666 
   1667 //  Recursively walk through blocks in a _try
   1668 //      and make all memory instructions volatile
   1669 void CodeGenFunction::VolatilizeTryBlocks(
   1670     llvm::BasicBlock *BB, llvm::SmallPtrSet<llvm::BasicBlock *, 10> &V) {
   1671   if (BB == SEHTryEpilogueStack.back()->getBlock() /* end of Try */ ||
   1672       !V.insert(BB).second /* already visited */ ||
   1673       !BB->getParent() /* not emitted */ || BB->empty())
   1674     return;
   1675 
   1676   if (!BB->isEHPad()) {
   1677     for (llvm::BasicBlock::iterator J = BB->begin(), JE = BB->end(); J != JE;
   1678          ++J) {
   1679       if (auto LI = dyn_cast<llvm::LoadInst>(J)) {
   1680         LI->setVolatile(true);
   1681       } else if (auto SI = dyn_cast<llvm::StoreInst>(J)) {
   1682         SI->setVolatile(true);
   1683       } else if (auto* MCI = dyn_cast<llvm::MemIntrinsic>(J)) {
   1684         MCI->setVolatile(llvm::ConstantInt::get(Builder.getInt1Ty(), 1));
   1685       }
   1686     }
   1687   }
   1688   const llvm::Instruction *TI = BB->getTerminator();
   1689   if (TI) {
   1690     unsigned N = TI->getNumSuccessors();
   1691     for (unsigned I = 0; I < N; I++)
   1692       VolatilizeTryBlocks(TI->getSuccessor(I), V);
   1693   }
   1694 }
   1695 
   1696 namespace {
   1697 struct PerformSEHFinally final : EHScopeStack::Cleanup {
   1698   llvm::Function *OutlinedFinally;
   1699   PerformSEHFinally(llvm::Function *OutlinedFinally)
   1700       : OutlinedFinally(OutlinedFinally) {}
   1701 
   1702   void Emit(CodeGenFunction &CGF, Flags F) override {
   1703     ASTContext &Context = CGF.getContext();
   1704     CodeGenModule &CGM = CGF.CGM;
   1705 
   1706     CallArgList Args;
   1707 
   1708     // Compute the two argument values.
   1709     QualType ArgTys[2] = {Context.UnsignedCharTy, Context.VoidPtrTy};
   1710     llvm::Value *FP = nullptr;
   1711     // If CFG.IsOutlinedSEHHelper is true, then we are within a finally block.
   1712     if (CGF.IsOutlinedSEHHelper) {
   1713       FP = &CGF.CurFn->arg_begin()[1];
   1714     } else {
   1715       llvm::Function *LocalAddrFn =
   1716           CGM.getIntrinsic(llvm::Intrinsic::localaddress);
   1717       FP = CGF.Builder.CreateCall(LocalAddrFn);
   1718     }
   1719 
   1720     llvm::Value *IsForEH =
   1721         llvm::ConstantInt::get(CGF.ConvertType(ArgTys[0]), F.isForEHCleanup());
   1722 
   1723     // Except _leave and fall-through at the end, all other exits in a _try
   1724     //   (return/goto/continue/break) are considered as abnormal terminations
   1725     //   since _leave/fall-through is always Indexed 0,
   1726     //   just use NormalCleanupDestSlot (>= 1 for goto/return/..),
   1727     //   as 1st Arg to indicate abnormal termination
   1728     if (!F.isForEHCleanup() && F.hasExitSwitch()) {
   1729       Address Addr = CGF.getNormalCleanupDestSlot();
   1730       llvm::Value *Load = CGF.Builder.CreateLoad(Addr, "cleanup.dest");
   1731       llvm::Value *Zero = llvm::Constant::getNullValue(CGM.Int32Ty);
   1732       IsForEH = CGF.Builder.CreateICmpNE(Load, Zero);
   1733     }
   1734 
   1735     Args.add(RValue::get(IsForEH), ArgTys[0]);
   1736     Args.add(RValue::get(FP), ArgTys[1]);
   1737 
   1738     // Arrange a two-arg function info and type.
   1739     const CGFunctionInfo &FnInfo =
   1740         CGM.getTypes().arrangeBuiltinFunctionCall(Context.VoidTy, Args);
   1741 
   1742     auto Callee = CGCallee::forDirect(OutlinedFinally);
   1743     CGF.EmitCall(FnInfo, Callee, ReturnValueSlot(), Args);
   1744   }
   1745 };
   1746 } // end anonymous namespace
   1747 
   1748 namespace {
   1749 /// Find all local variable captures in the statement.
   1750 struct CaptureFinder : ConstStmtVisitor<CaptureFinder> {
   1751   CodeGenFunction &ParentCGF;
   1752   const VarDecl *ParentThis;
   1753   llvm::SmallSetVector<const VarDecl *, 4> Captures;
   1754   Address SEHCodeSlot = Address::invalid();
   1755   CaptureFinder(CodeGenFunction &ParentCGF, const VarDecl *ParentThis)
   1756       : ParentCGF(ParentCGF), ParentThis(ParentThis) {}
   1757 
   1758   // Return true if we need to do any capturing work.
   1759   bool foundCaptures() {
   1760     return !Captures.empty() || SEHCodeSlot.isValid();
   1761   }
   1762 
   1763   void Visit(const Stmt *S) {
   1764     // See if this is a capture, then recurse.
   1765     ConstStmtVisitor<CaptureFinder>::Visit(S);
   1766     for (const Stmt *Child : S->children())
   1767       if (Child)
   1768         Visit(Child);
   1769   }
   1770 
   1771   void VisitDeclRefExpr(const DeclRefExpr *E) {
   1772     // If this is already a capture, just make sure we capture 'this'.
   1773     if (E->refersToEnclosingVariableOrCapture())
   1774       Captures.insert(ParentThis);
   1775 
   1776     const auto *D = dyn_cast<VarDecl>(E->getDecl());
   1777     if (D && D->isLocalVarDeclOrParm() && D->hasLocalStorage())
   1778       Captures.insert(D);
   1779   }
   1780 
   1781   void VisitCXXThisExpr(const CXXThisExpr *E) {
   1782     Captures.insert(ParentThis);
   1783   }
   1784 
   1785   void VisitCallExpr(const CallExpr *E) {
   1786     // We only need to add parent frame allocations for these builtins in x86.
   1787     if (ParentCGF.getTarget().getTriple().getArch() != llvm::Triple::x86)
   1788       return;
   1789 
   1790     unsigned ID = E->getBuiltinCallee();
   1791     switch (ID) {
   1792     case Builtin::BI__exception_code:
   1793     case Builtin::BI_exception_code:
   1794       // This is the simple case where we are the outermost finally. All we
   1795       // have to do here is make sure we escape this and recover it in the
   1796       // outlined handler.
   1797       if (!SEHCodeSlot.isValid())
   1798         SEHCodeSlot = ParentCGF.SEHCodeSlotStack.back();
   1799       break;
   1800     }
   1801   }
   1802 };
   1803 } // end anonymous namespace
   1804 
   1805 Address CodeGenFunction::recoverAddrOfEscapedLocal(CodeGenFunction &ParentCGF,
   1806                                                    Address ParentVar,
   1807                                                    llvm::Value *ParentFP) {
   1808   llvm::CallInst *RecoverCall = nullptr;
   1809   CGBuilderTy Builder(*this, AllocaInsertPt);
   1810   if (auto *ParentAlloca = dyn_cast<llvm::AllocaInst>(ParentVar.getPointer())) {
   1811     // Mark the variable escaped if nobody else referenced it and compute the
   1812     // localescape index.
   1813     auto InsertPair = ParentCGF.EscapedLocals.insert(
   1814         std::make_pair(ParentAlloca, ParentCGF.EscapedLocals.size()));
   1815     int FrameEscapeIdx = InsertPair.first->second;
   1816     // call i8* @llvm.localrecover(i8* bitcast(@parentFn), i8* %fp, i32 N)
   1817     llvm::Function *FrameRecoverFn = llvm::Intrinsic::getDeclaration(
   1818         &CGM.getModule(), llvm::Intrinsic::localrecover);
   1819     llvm::Constant *ParentI8Fn =
   1820         llvm::ConstantExpr::getBitCast(ParentCGF.CurFn, Int8PtrTy);
   1821     RecoverCall = Builder.CreateCall(
   1822         FrameRecoverFn, {ParentI8Fn, ParentFP,
   1823                          llvm::ConstantInt::get(Int32Ty, FrameEscapeIdx)});
   1824 
   1825   } else {
   1826     // If the parent didn't have an alloca, we're doing some nested outlining.
   1827     // Just clone the existing localrecover call, but tweak the FP argument to
   1828     // use our FP value. All other arguments are constants.
   1829     auto *ParentRecover =
   1830         cast<llvm::IntrinsicInst>(ParentVar.getPointer()->stripPointerCasts());
   1831     assert(ParentRecover->getIntrinsicID() == llvm::Intrinsic::localrecover &&
   1832            "expected alloca or localrecover in parent LocalDeclMap");
   1833     RecoverCall = cast<llvm::CallInst>(ParentRecover->clone());
   1834     RecoverCall->setArgOperand(1, ParentFP);
   1835     RecoverCall->insertBefore(AllocaInsertPt);
   1836   }
   1837 
   1838   // Bitcast the variable, rename it, and insert it in the local decl map.
   1839   llvm::Value *ChildVar =
   1840       Builder.CreateBitCast(RecoverCall, ParentVar.getType());
   1841   ChildVar->setName(ParentVar.getName());
   1842   return Address(ChildVar, ParentVar.getAlignment());
   1843 }
   1844 
   1845 void CodeGenFunction::EmitCapturedLocals(CodeGenFunction &ParentCGF,
   1846                                          const Stmt *OutlinedStmt,
   1847                                          bool IsFilter) {
   1848   // Find all captures in the Stmt.
   1849   CaptureFinder Finder(ParentCGF, ParentCGF.CXXABIThisDecl);
   1850   Finder.Visit(OutlinedStmt);
   1851 
   1852   // We can exit early on x86_64 when there are no captures. We just have to
   1853   // save the exception code in filters so that __exception_code() works.
   1854   if (!Finder.foundCaptures() &&
   1855       CGM.getTarget().getTriple().getArch() != llvm::Triple::x86) {
   1856     if (IsFilter)
   1857       EmitSEHExceptionCodeSave(ParentCGF, nullptr, nullptr);
   1858     return;
   1859   }
   1860 
   1861   llvm::Value *EntryFP = nullptr;
   1862   CGBuilderTy Builder(CGM, AllocaInsertPt);
   1863   if (IsFilter && CGM.getTarget().getTriple().getArch() == llvm::Triple::x86) {
   1864     // 32-bit SEH filters need to be careful about FP recovery.  The end of the
   1865     // EH registration is passed in as the EBP physical register.  We can
   1866     // recover that with llvm.frameaddress(1).
   1867     EntryFP = Builder.CreateCall(
   1868         CGM.getIntrinsic(llvm::Intrinsic::frameaddress, AllocaInt8PtrTy),
   1869         {Builder.getInt32(1)});
   1870   } else {
   1871     // Otherwise, for x64 and 32-bit finally functions, the parent FP is the
   1872     // second parameter.
   1873     auto AI = CurFn->arg_begin();
   1874     ++AI;
   1875     EntryFP = &*AI;
   1876   }
   1877 
   1878   llvm::Value *ParentFP = EntryFP;
   1879   if (IsFilter) {
   1880     // Given whatever FP the runtime provided us in EntryFP, recover the true
   1881     // frame pointer of the parent function. We only need to do this in filters,
   1882     // since finally funclets recover the parent FP for us.
   1883     llvm::Function *RecoverFPIntrin =
   1884         CGM.getIntrinsic(llvm::Intrinsic::eh_recoverfp);
   1885     llvm::Constant *ParentI8Fn =
   1886         llvm::ConstantExpr::getBitCast(ParentCGF.CurFn, Int8PtrTy);
   1887     ParentFP = Builder.CreateCall(RecoverFPIntrin, {ParentI8Fn, EntryFP});
   1888 
   1889     // if the parent is a _finally, the passed-in ParentFP is the FP
   1890     // of parent _finally, not Establisher's FP (FP of outermost function).
   1891     // Establkisher FP is 2nd paramenter passed into parent _finally.
   1892     // Fortunately, it's always saved in parent's frame. The following
   1893     // code retrieves it, and escapes it so that spill instruction won't be
   1894     // optimized away.
   1895     if (ParentCGF.ParentCGF != nullptr) {
   1896       // Locate and escape Parent's frame_pointer.addr alloca
   1897       // Depending on target, should be 1st/2nd one in LocalDeclMap.
   1898       // Let's just scan for ImplicitParamDecl with VoidPtrTy.
   1899       llvm::AllocaInst *FramePtrAddrAlloca = nullptr;
   1900       for (auto &I : ParentCGF.LocalDeclMap) {
   1901         const VarDecl *D = cast<VarDecl>(I.first);
   1902         if (isa<ImplicitParamDecl>(D) &&
   1903             D->getType() == getContext().VoidPtrTy) {
   1904           assert(D->getName().startswith("frame_pointer"));
   1905           FramePtrAddrAlloca = cast<llvm::AllocaInst>(I.second.getPointer());
   1906           break;
   1907         }
   1908       }
   1909       assert(FramePtrAddrAlloca);
   1910       auto InsertPair = ParentCGF.EscapedLocals.insert(
   1911           std::make_pair(FramePtrAddrAlloca, ParentCGF.EscapedLocals.size()));
   1912       int FrameEscapeIdx = InsertPair.first->second;
   1913 
   1914       // an example of a filter's prolog::
   1915       // %0 = call i8* @llvm.eh.recoverfp(bitcast(@"?fin$0@0@main@@"),..)
   1916       // %1 = call i8* @llvm.localrecover(bitcast(@"?fin$0@0@main@@"),..)
   1917       // %2 = bitcast i8* %1 to i8**
   1918       // %3 = load i8*, i8* *%2, align 8
   1919       //   ==> %3 is the frame-pointer of outermost host function
   1920       llvm::Function *FrameRecoverFn = llvm::Intrinsic::getDeclaration(
   1921           &CGM.getModule(), llvm::Intrinsic::localrecover);
   1922       llvm::Constant *ParentI8Fn =
   1923           llvm::ConstantExpr::getBitCast(ParentCGF.CurFn, Int8PtrTy);
   1924       ParentFP = Builder.CreateCall(
   1925           FrameRecoverFn, {ParentI8Fn, ParentFP,
   1926                            llvm::ConstantInt::get(Int32Ty, FrameEscapeIdx)});
   1927       ParentFP = Builder.CreateBitCast(ParentFP, CGM.VoidPtrPtrTy);
   1928       ParentFP = Builder.CreateLoad(Address(ParentFP, getPointerAlign()));
   1929     }
   1930   }
   1931 
   1932   // Create llvm.localrecover calls for all captures.
   1933   for (const VarDecl *VD : Finder.Captures) {
   1934     if (VD->getType()->isVariablyModifiedType()) {
   1935       CGM.ErrorUnsupported(VD, "VLA captured by SEH");
   1936       continue;
   1937     }
   1938     assert((isa<ImplicitParamDecl>(VD) || VD->isLocalVarDeclOrParm()) &&
   1939            "captured non-local variable");
   1940 
   1941     auto L = ParentCGF.LambdaCaptureFields.find(VD);
   1942     if (L != ParentCGF.LambdaCaptureFields.end()) {
   1943       LambdaCaptureFields[VD] = L->second;
   1944       continue;
   1945     }
   1946 
   1947     // If this decl hasn't been declared yet, it will be declared in the
   1948     // OutlinedStmt.
   1949     auto I = ParentCGF.LocalDeclMap.find(VD);
   1950     if (I == ParentCGF.LocalDeclMap.end())
   1951       continue;
   1952 
   1953     Address ParentVar = I->second;
   1954     Address Recovered =
   1955         recoverAddrOfEscapedLocal(ParentCGF, ParentVar, ParentFP);
   1956     setAddrOfLocalVar(VD, Recovered);
   1957 
   1958     if (isa<ImplicitParamDecl>(VD)) {
   1959       CXXABIThisAlignment = ParentCGF.CXXABIThisAlignment;
   1960       CXXThisAlignment = ParentCGF.CXXThisAlignment;
   1961       CXXABIThisValue = Builder.CreateLoad(Recovered, "this");
   1962       if (ParentCGF.LambdaThisCaptureField) {
   1963         LambdaThisCaptureField = ParentCGF.LambdaThisCaptureField;
   1964         // We are in a lambda function where "this" is captured so the
   1965         // CXXThisValue need to be loaded from the lambda capture
   1966         LValue ThisFieldLValue =
   1967             EmitLValueForLambdaField(LambdaThisCaptureField);
   1968         if (!LambdaThisCaptureField->getType()->isPointerType()) {
   1969           CXXThisValue = ThisFieldLValue.getAddress(*this).getPointer();
   1970         } else {
   1971           CXXThisValue = EmitLoadOfLValue(ThisFieldLValue, SourceLocation())
   1972                              .getScalarVal();
   1973         }
   1974       } else {
   1975         CXXThisValue = CXXABIThisValue;
   1976       }
   1977     }
   1978   }
   1979 
   1980   if (Finder.SEHCodeSlot.isValid()) {
   1981     SEHCodeSlotStack.push_back(
   1982         recoverAddrOfEscapedLocal(ParentCGF, Finder.SEHCodeSlot, ParentFP));
   1983   }
   1984 
   1985   if (IsFilter)
   1986     EmitSEHExceptionCodeSave(ParentCGF, ParentFP, EntryFP);
   1987 }
   1988 
   1989 /// Arrange a function prototype that can be called by Windows exception
   1990 /// handling personalities. On Win64, the prototype looks like:
   1991 /// RetTy func(void *EHPtrs, void *ParentFP);
   1992 void CodeGenFunction::startOutlinedSEHHelper(CodeGenFunction &ParentCGF,
   1993                                              bool IsFilter,
   1994                                              const Stmt *OutlinedStmt) {
   1995   SourceLocation StartLoc = OutlinedStmt->getBeginLoc();
   1996 
   1997   // Get the mangled function name.
   1998   SmallString<128> Name;
   1999   {
   2000     llvm::raw_svector_ostream OS(Name);
   2001     const NamedDecl *ParentSEHFn = ParentCGF.CurSEHParent;
   2002     assert(ParentSEHFn && "No CurSEHParent!");
   2003     MangleContext &Mangler = CGM.getCXXABI().getMangleContext();
   2004     if (IsFilter)
   2005       Mangler.mangleSEHFilterExpression(ParentSEHFn, OS);
   2006     else
   2007       Mangler.mangleSEHFinallyBlock(ParentSEHFn, OS);
   2008   }
   2009 
   2010   FunctionArgList Args;
   2011   if (CGM.getTarget().getTriple().getArch() != llvm::Triple::x86 || !IsFilter) {
   2012     // All SEH finally functions take two parameters. Win64 filters take two
   2013     // parameters. Win32 filters take no parameters.
   2014     if (IsFilter) {
   2015       Args.push_back(ImplicitParamDecl::Create(
   2016           getContext(), /*DC=*/nullptr, StartLoc,
   2017           &getContext().Idents.get("exception_pointers"),
   2018           getContext().VoidPtrTy, ImplicitParamDecl::Other));
   2019     } else {
   2020       Args.push_back(ImplicitParamDecl::Create(
   2021           getContext(), /*DC=*/nullptr, StartLoc,
   2022           &getContext().Idents.get("abnormal_termination"),
   2023           getContext().UnsignedCharTy, ImplicitParamDecl::Other));
   2024     }
   2025     Args.push_back(ImplicitParamDecl::Create(
   2026         getContext(), /*DC=*/nullptr, StartLoc,
   2027         &getContext().Idents.get("frame_pointer"), getContext().VoidPtrTy,
   2028         ImplicitParamDecl::Other));
   2029   }
   2030 
   2031   QualType RetTy = IsFilter ? getContext().LongTy : getContext().VoidTy;
   2032 
   2033   const CGFunctionInfo &FnInfo =
   2034     CGM.getTypes().arrangeBuiltinFunctionDeclaration(RetTy, Args);
   2035 
   2036   llvm::FunctionType *FnTy = CGM.getTypes().GetFunctionType(FnInfo);
   2037   llvm::Function *Fn = llvm::Function::Create(
   2038       FnTy, llvm::GlobalValue::InternalLinkage, Name.str(), &CGM.getModule());
   2039 
   2040   IsOutlinedSEHHelper = true;
   2041 
   2042   StartFunction(GlobalDecl(), RetTy, Fn, FnInfo, Args,
   2043                 OutlinedStmt->getBeginLoc(), OutlinedStmt->getBeginLoc());
   2044   CurSEHParent = ParentCGF.CurSEHParent;
   2045 
   2046   CGM.SetInternalFunctionAttributes(GlobalDecl(), CurFn, FnInfo);
   2047   EmitCapturedLocals(ParentCGF, OutlinedStmt, IsFilter);
   2048 }
   2049 
   2050 /// Create a stub filter function that will ultimately hold the code of the
   2051 /// filter expression. The EH preparation passes in LLVM will outline the code
   2052 /// from the main function body into this stub.
   2053 llvm::Function *
   2054 CodeGenFunction::GenerateSEHFilterFunction(CodeGenFunction &ParentCGF,
   2055                                            const SEHExceptStmt &Except) {
   2056   const Expr *FilterExpr = Except.getFilterExpr();
   2057   startOutlinedSEHHelper(ParentCGF, true, FilterExpr);
   2058 
   2059   // Emit the original filter expression, convert to i32, and return.
   2060   llvm::Value *R = EmitScalarExpr(FilterExpr);
   2061   R = Builder.CreateIntCast(R, ConvertType(getContext().LongTy),
   2062                             FilterExpr->getType()->isSignedIntegerType());
   2063   Builder.CreateStore(R, ReturnValue);
   2064 
   2065   FinishFunction(FilterExpr->getEndLoc());
   2066 
   2067   return CurFn;
   2068 }
   2069 
   2070 llvm::Function *
   2071 CodeGenFunction::GenerateSEHFinallyFunction(CodeGenFunction &ParentCGF,
   2072                                             const SEHFinallyStmt &Finally) {
   2073   const Stmt *FinallyBlock = Finally.getBlock();
   2074   startOutlinedSEHHelper(ParentCGF, false, FinallyBlock);
   2075 
   2076   // Emit the original filter expression, convert to i32, and return.
   2077   EmitStmt(FinallyBlock);
   2078 
   2079   FinishFunction(FinallyBlock->getEndLoc());
   2080 
   2081   return CurFn;
   2082 }
   2083 
   2084 void CodeGenFunction::EmitSEHExceptionCodeSave(CodeGenFunction &ParentCGF,
   2085                                                llvm::Value *ParentFP,
   2086                                                llvm::Value *EntryFP) {
   2087   // Get the pointer to the EXCEPTION_POINTERS struct. This is returned by the
   2088   // __exception_info intrinsic.
   2089   if (CGM.getTarget().getTriple().getArch() != llvm::Triple::x86) {
   2090     // On Win64, the info is passed as the first parameter to the filter.
   2091     SEHInfo = &*CurFn->arg_begin();
   2092     SEHCodeSlotStack.push_back(
   2093         CreateMemTemp(getContext().IntTy, "__exception_code"));
   2094   } else {
   2095     // On Win32, the EBP on entry to the filter points to the end of an
   2096     // exception registration object. It contains 6 32-bit fields, and the info
   2097     // pointer is stored in the second field. So, GEP 20 bytes backwards and
   2098     // load the pointer.
   2099     SEHInfo = Builder.CreateConstInBoundsGEP1_32(Int8Ty, EntryFP, -20);
   2100     SEHInfo = Builder.CreateBitCast(SEHInfo, Int8PtrTy->getPointerTo());
   2101     SEHInfo = Builder.CreateAlignedLoad(Int8PtrTy, SEHInfo, getPointerAlign());
   2102     SEHCodeSlotStack.push_back(recoverAddrOfEscapedLocal(
   2103         ParentCGF, ParentCGF.SEHCodeSlotStack.back(), ParentFP));
   2104   }
   2105 
   2106   // Save the exception code in the exception slot to unify exception access in
   2107   // the filter function and the landing pad.
   2108   // struct EXCEPTION_POINTERS {
   2109   //   EXCEPTION_RECORD *ExceptionRecord;
   2110   //   CONTEXT *ContextRecord;
   2111   // };
   2112   // int exceptioncode = exception_pointers->ExceptionRecord->ExceptionCode;
   2113   llvm::Type *RecordTy = CGM.Int32Ty->getPointerTo();
   2114   llvm::Type *PtrsTy = llvm::StructType::get(RecordTy, CGM.VoidPtrTy);
   2115   llvm::Value *Ptrs = Builder.CreateBitCast(SEHInfo, PtrsTy->getPointerTo());
   2116   llvm::Value *Rec = Builder.CreateStructGEP(PtrsTy, Ptrs, 0);
   2117   Rec = Builder.CreateAlignedLoad(RecordTy, Rec, getPointerAlign());
   2118   llvm::Value *Code = Builder.CreateAlignedLoad(Int32Ty, Rec, getIntAlign());
   2119   assert(!SEHCodeSlotStack.empty() && "emitting EH code outside of __except");
   2120   Builder.CreateStore(Code, SEHCodeSlotStack.back());
   2121 }
   2122 
   2123 llvm::Value *CodeGenFunction::EmitSEHExceptionInfo() {
   2124   // Sema should diagnose calling this builtin outside of a filter context, but
   2125   // don't crash if we screw up.
   2126   if (!SEHInfo)
   2127     return llvm::UndefValue::get(Int8PtrTy);
   2128   assert(SEHInfo->getType() == Int8PtrTy);
   2129   return SEHInfo;
   2130 }
   2131 
   2132 llvm::Value *CodeGenFunction::EmitSEHExceptionCode() {
   2133   assert(!SEHCodeSlotStack.empty() && "emitting EH code outside of __except");
   2134   return Builder.CreateLoad(SEHCodeSlotStack.back());
   2135 }
   2136 
   2137 llvm::Value *CodeGenFunction::EmitSEHAbnormalTermination() {
   2138   // Abnormal termination is just the first parameter to the outlined finally
   2139   // helper.
   2140   auto AI = CurFn->arg_begin();
   2141   return Builder.CreateZExt(&*AI, Int32Ty);
   2142 }
   2143 
   2144 void CodeGenFunction::pushSEHCleanup(CleanupKind Kind,
   2145                                      llvm::Function *FinallyFunc) {
   2146   EHStack.pushCleanup<PerformSEHFinally>(Kind, FinallyFunc);
   2147 }
   2148 
   2149 void CodeGenFunction::EnterSEHTryStmt(const SEHTryStmt &S) {
   2150   CodeGenFunction HelperCGF(CGM, /*suppressNewContext=*/true);
   2151   HelperCGF.ParentCGF = this;
   2152   if (const SEHFinallyStmt *Finally = S.getFinallyHandler()) {
   2153     // Outline the finally block.
   2154     llvm::Function *FinallyFunc =
   2155         HelperCGF.GenerateSEHFinallyFunction(*this, *Finally);
   2156 
   2157     // Push a cleanup for __finally blocks.
   2158     EHStack.pushCleanup<PerformSEHFinally>(NormalAndEHCleanup, FinallyFunc);
   2159     return;
   2160   }
   2161 
   2162   // Otherwise, we must have an __except block.
   2163   const SEHExceptStmt *Except = S.getExceptHandler();
   2164   assert(Except);
   2165   EHCatchScope *CatchScope = EHStack.pushCatch(1);
   2166   SEHCodeSlotStack.push_back(
   2167       CreateMemTemp(getContext().IntTy, "__exception_code"));
   2168 
   2169   // If the filter is known to evaluate to 1, then we can use the clause
   2170   // "catch i8* null". We can't do this on x86 because the filter has to save
   2171   // the exception code.
   2172   llvm::Constant *C =
   2173     ConstantEmitter(*this).tryEmitAbstract(Except->getFilterExpr(),
   2174                                            getContext().IntTy);
   2175   if (CGM.getTarget().getTriple().getArch() != llvm::Triple::x86 && C &&
   2176       C->isOneValue()) {
   2177     CatchScope->setCatchAllHandler(0, createBasicBlock("__except"));
   2178     return;
   2179   }
   2180 
   2181   // In general, we have to emit an outlined filter function. Use the function
   2182   // in place of the RTTI typeinfo global that C++ EH uses.
   2183   llvm::Function *FilterFunc =
   2184       HelperCGF.GenerateSEHFilterFunction(*this, *Except);
   2185   llvm::Constant *OpaqueFunc =
   2186       llvm::ConstantExpr::getBitCast(FilterFunc, Int8PtrTy);
   2187   CatchScope->setHandler(0, OpaqueFunc, createBasicBlock("__except.ret"));
   2188 }
   2189 
   2190 void CodeGenFunction::ExitSEHTryStmt(const SEHTryStmt &S) {
   2191   // Just pop the cleanup if it's a __finally block.
   2192   if (S.getFinallyHandler()) {
   2193     PopCleanupBlock();
   2194     return;
   2195   }
   2196 
   2197   // IsEHa: emit an invoke _seh_try_end() to mark end of FT flow
   2198   if (getLangOpts().EHAsynch && Builder.GetInsertBlock()) {
   2199     llvm::FunctionCallee SehTryEnd = getSehTryEndFn(CGM);
   2200     EmitRuntimeCallOrInvoke(SehTryEnd);
   2201   }
   2202 
   2203   // Otherwise, we must have an __except block.
   2204   const SEHExceptStmt *Except = S.getExceptHandler();
   2205   assert(Except && "__try must have __finally xor __except");
   2206   EHCatchScope &CatchScope = cast<EHCatchScope>(*EHStack.begin());
   2207 
   2208   // Don't emit the __except block if the __try block lacked invokes.
   2209   // TODO: Model unwind edges from instructions, either with iload / istore or
   2210   // a try body function.
   2211   if (!CatchScope.hasEHBranches()) {
   2212     CatchScope.clearHandlerBlocks();
   2213     EHStack.popCatch();
   2214     SEHCodeSlotStack.pop_back();
   2215     return;
   2216   }
   2217 
   2218   // The fall-through block.
   2219   llvm::BasicBlock *ContBB = createBasicBlock("__try.cont");
   2220 
   2221   // We just emitted the body of the __try; jump to the continue block.
   2222   if (HaveInsertPoint())
   2223     Builder.CreateBr(ContBB);
   2224 
   2225   // Check if our filter function returned true.
   2226   emitCatchDispatchBlock(*this, CatchScope);
   2227 
   2228   // Grab the block before we pop the handler.
   2229   llvm::BasicBlock *CatchPadBB = CatchScope.getHandler(0).Block;
   2230   EHStack.popCatch();
   2231 
   2232   EmitBlockAfterUses(CatchPadBB);
   2233 
   2234   // __except blocks don't get outlined into funclets, so immediately do a
   2235   // catchret.
   2236   llvm::CatchPadInst *CPI =
   2237       cast<llvm::CatchPadInst>(CatchPadBB->getFirstNonPHI());
   2238   llvm::BasicBlock *ExceptBB = createBasicBlock("__except");
   2239   Builder.CreateCatchRet(CPI, ExceptBB);
   2240   EmitBlock(ExceptBB);
   2241 
   2242   // On Win64, the exception code is returned in EAX. Copy it into the slot.
   2243   if (CGM.getTarget().getTriple().getArch() != llvm::Triple::x86) {
   2244     llvm::Function *SEHCodeIntrin =
   2245         CGM.getIntrinsic(llvm::Intrinsic::eh_exceptioncode);
   2246     llvm::Value *Code = Builder.CreateCall(SEHCodeIntrin, {CPI});
   2247     Builder.CreateStore(Code, SEHCodeSlotStack.back());
   2248   }
   2249 
   2250   // Emit the __except body.
   2251   EmitStmt(Except->getBlock());
   2252 
   2253   // End the lifetime of the exception code.
   2254   SEHCodeSlotStack.pop_back();
   2255 
   2256   if (HaveInsertPoint())
   2257     Builder.CreateBr(ContBB);
   2258 
   2259   EmitBlock(ContBB);
   2260 }
   2261 
   2262 void CodeGenFunction::EmitSEHLeaveStmt(const SEHLeaveStmt &S) {
   2263   // If this code is reachable then emit a stop point (if generating
   2264   // debug info). We have to do this ourselves because we are on the
   2265   // "simple" statement path.
   2266   if (HaveInsertPoint())
   2267     EmitStopPoint(&S);
   2268 
   2269   // This must be a __leave from a __finally block, which we warn on and is UB.
   2270   // Just emit unreachable.
   2271   if (!isSEHTryScope()) {
   2272     Builder.CreateUnreachable();
   2273     Builder.ClearInsertionPoint();
   2274     return;
   2275   }
   2276 
   2277   EmitBranchThroughCleanup(*SEHTryEpilogueStack.back());
   2278 }
   2279