1 //===--- CGException.cpp - Emit LLVM Code for C++ exceptions --------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This contains code dealing with C++ exception related code generation.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #include "CodeGenFunction.h"
15 #include "CGCXXABI.h"
16 #include "CGCleanup.h"
17 #include "CGObjCRuntime.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 "llvm/IR/CallSite.h"
23 #include "llvm/IR/Intrinsics.h"
24 
25 using namespace clang;
26 using namespace CodeGen;
27 
28 static llvm::Constant *getFreeExceptionFn(CodeGenModule &CGM) {
29   // void __cxa_free_exception(void *thrown_exception);
30 
31   llvm::FunctionType *FTy =
32     llvm::FunctionType::get(CGM.VoidTy, CGM.Int8PtrTy, /*IsVarArgs=*/false);
33 
34   return CGM.CreateRuntimeFunction(FTy, "__cxa_free_exception");
35 }
36 
37 static llvm::Constant *getUnexpectedFn(CodeGenModule &CGM) {
38   // void __cxa_call_unexpected(void *thrown_exception);
39 
40   llvm::FunctionType *FTy =
41     llvm::FunctionType::get(CGM.VoidTy, CGM.Int8PtrTy, /*IsVarArgs=*/false);
42 
43   return CGM.CreateRuntimeFunction(FTy, "__cxa_call_unexpected");
44 }
45 
46 llvm::Constant *CodeGenModule::getTerminateFn() {
47   // void __terminate();
48 
49   llvm::FunctionType *FTy =
50     llvm::FunctionType::get(VoidTy, /*IsVarArgs=*/false);
51 
52   StringRef name;
53 
54   // In C++, use std::terminate().
55   if (getLangOpts().CPlusPlus &&
56       getTarget().getCXXABI().isItaniumFamily()) {
57     name = "_ZSt9terminatev";
58   } else if (getLangOpts().CPlusPlus &&
59              getTarget().getCXXABI().isMicrosoft()) {
60     name = "\01?terminate@@YAXXZ";
61   } else if (getLangOpts().ObjC1 &&
62              getLangOpts().ObjCRuntime.hasTerminate())
63     name = "objc_terminate";
64   else
65     name = "abort";
66   return CreateRuntimeFunction(FTy, name);
67 }
68 
69 static llvm::Constant *getCatchallRethrowFn(CodeGenModule &CGM,
70                                             StringRef Name) {
71   llvm::FunctionType *FTy =
72     llvm::FunctionType::get(CGM.VoidTy, CGM.Int8PtrTy, /*IsVarArgs=*/false);
73 
74   return CGM.CreateRuntimeFunction(FTy, Name);
75 }
76 
77 namespace {
78   /// The exceptions personality for a function.
79   struct EHPersonality {
80     const char *PersonalityFn;
81 
82     // If this is non-null, this personality requires a non-standard
83     // function for rethrowing an exception after a catchall cleanup.
84     // This function must have prototype void(void*).
85     const char *CatchallRethrowFn;
86 
87     static const EHPersonality &get(CodeGenModule &CGM,
88                                     const FunctionDecl *FD);
89     static const EHPersonality &get(CodeGenFunction &CGF) {
90       return get(CGF.CGM, dyn_cast_or_null<FunctionDecl>(CGF.CurCodeDecl));
91     }
92 
93     static const EHPersonality GNU_C;
94     static const EHPersonality GNU_C_SJLJ;
95     static const EHPersonality GNU_C_SEH;
96     static const EHPersonality GNU_ObjC;
97     static const EHPersonality GNUstep_ObjC;
98     static const EHPersonality GNU_ObjCXX;
99     static const EHPersonality NeXT_ObjC;
100     static const EHPersonality GNU_CPlusPlus;
101     static const EHPersonality GNU_CPlusPlus_SJLJ;
102     static const EHPersonality GNU_CPlusPlus_SEH;
103     static const EHPersonality MSVC_except_handler;
104     static const EHPersonality MSVC_C_specific_handler;
105     static const EHPersonality MSVC_CxxFrameHandler3;
106   };
107 }
108 
109 const EHPersonality EHPersonality::GNU_C = { "__gcc_personality_v0", nullptr };
110 const EHPersonality
111 EHPersonality::GNU_C_SJLJ = { "__gcc_personality_sj0", nullptr };
112 const EHPersonality
113 EHPersonality::GNU_C_SEH = { "__gcc_personality_seh0", nullptr };
114 const EHPersonality
115 EHPersonality::NeXT_ObjC = { "__objc_personality_v0", nullptr };
116 const EHPersonality
117 EHPersonality::GNU_CPlusPlus = { "__gxx_personality_v0", nullptr };
118 const EHPersonality
119 EHPersonality::GNU_CPlusPlus_SJLJ = { "__gxx_personality_sj0", nullptr };
120 const EHPersonality
121 EHPersonality::GNU_CPlusPlus_SEH = { "__gxx_personality_seh0", nullptr };
122 const EHPersonality
123 EHPersonality::GNU_ObjC = {"__gnu_objc_personality_v0", "objc_exception_throw"};
124 const EHPersonality
125 EHPersonality::GNU_ObjCXX = { "__gnustep_objcxx_personality_v0", nullptr };
126 const EHPersonality
127 EHPersonality::GNUstep_ObjC = { "__gnustep_objc_personality_v0", nullptr };
128 const EHPersonality
129 EHPersonality::MSVC_except_handler = { "_except_handler3", nullptr };
130 const EHPersonality
131 EHPersonality::MSVC_C_specific_handler = { "__C_specific_handler", nullptr };
132 const EHPersonality
133 EHPersonality::MSVC_CxxFrameHandler3 = { "__CxxFrameHandler3", nullptr };
134 
135 /// On Win64, use libgcc's SEH personality function. We fall back to dwarf on
136 /// other platforms, unless the user asked for SjLj exceptions.
137 static bool useLibGCCSEHPersonality(const llvm::Triple &T) {
138   return T.isOSWindows() && T.getArch() == llvm::Triple::x86_64;
139 }
140 
141 static const EHPersonality &getCPersonality(const llvm::Triple &T,
142                                             const LangOptions &L) {
143   if (L.SjLjExceptions)
144     return EHPersonality::GNU_C_SJLJ;
145   else if (useLibGCCSEHPersonality(T))
146     return EHPersonality::GNU_C_SEH;
147   return EHPersonality::GNU_C;
148 }
149 
150 static const EHPersonality &getObjCPersonality(const llvm::Triple &T,
151                                                const LangOptions &L) {
152   switch (L.ObjCRuntime.getKind()) {
153   case ObjCRuntime::FragileMacOSX:
154     return getCPersonality(T, L);
155   case ObjCRuntime::MacOSX:
156   case ObjCRuntime::iOS:
157     return EHPersonality::NeXT_ObjC;
158   case ObjCRuntime::GNUstep:
159     if (L.ObjCRuntime.getVersion() >= VersionTuple(1, 7))
160       return EHPersonality::GNUstep_ObjC;
161     // fallthrough
162   case ObjCRuntime::GCC:
163   case ObjCRuntime::ObjFW:
164     return EHPersonality::GNU_ObjC;
165   }
166   llvm_unreachable("bad runtime kind");
167 }
168 
169 static const EHPersonality &getCXXPersonality(const llvm::Triple &T,
170                                               const LangOptions &L) {
171   if (L.SjLjExceptions)
172     return EHPersonality::GNU_CPlusPlus_SJLJ;
173   else if (useLibGCCSEHPersonality(T))
174     return EHPersonality::GNU_CPlusPlus_SEH;
175   return EHPersonality::GNU_CPlusPlus;
176 }
177 
178 /// Determines the personality function to use when both C++
179 /// and Objective-C exceptions are being caught.
180 static const EHPersonality &getObjCXXPersonality(const llvm::Triple &T,
181                                                  const LangOptions &L) {
182   switch (L.ObjCRuntime.getKind()) {
183   // The ObjC personality defers to the C++ personality for non-ObjC
184   // handlers.  Unlike the C++ case, we use the same personality
185   // function on targets using (backend-driven) SJLJ EH.
186   case ObjCRuntime::MacOSX:
187   case ObjCRuntime::iOS:
188     return EHPersonality::NeXT_ObjC;
189 
190   // In the fragile ABI, just use C++ exception handling and hope
191   // they're not doing crazy exception mixing.
192   case ObjCRuntime::FragileMacOSX:
193     return getCXXPersonality(T, L);
194 
195   // The GCC runtime's personality function inherently doesn't support
196   // mixed EH.  Use the C++ personality just to avoid returning null.
197   case ObjCRuntime::GCC:
198   case ObjCRuntime::ObjFW: // XXX: this will change soon
199     return EHPersonality::GNU_ObjC;
200   case ObjCRuntime::GNUstep:
201     return EHPersonality::GNU_ObjCXX;
202   }
203   llvm_unreachable("bad runtime kind");
204 }
205 
206 static const EHPersonality &getSEHPersonalityMSVC(const llvm::Triple &T) {
207   if (T.getArch() == llvm::Triple::x86)
208     return EHPersonality::MSVC_except_handler;
209   return EHPersonality::MSVC_C_specific_handler;
210 }
211 
212 const EHPersonality &EHPersonality::get(CodeGenModule &CGM,
213                                         const FunctionDecl *FD) {
214   const llvm::Triple &T = CGM.getTarget().getTriple();
215   const LangOptions &L = CGM.getLangOpts();
216 
217   // Try to pick a personality function that is compatible with MSVC if we're
218   // not compiling Obj-C. Obj-C users better have an Obj-C runtime that supports
219   // the GCC-style personality function.
220   if (T.isWindowsMSVCEnvironment() && !L.ObjC1) {
221     if (L.SjLjExceptions)
222       return EHPersonality::GNU_CPlusPlus_SJLJ;
223     else if (FD && FD->usesSEHTry())
224       return getSEHPersonalityMSVC(T);
225     else
226       return EHPersonality::MSVC_CxxFrameHandler3;
227   }
228 
229   if (L.CPlusPlus && L.ObjC1)
230     return getObjCXXPersonality(T, L);
231   else if (L.CPlusPlus)
232     return getCXXPersonality(T, L);
233   else if (L.ObjC1)
234     return getObjCPersonality(T, L);
235   else
236     return getCPersonality(T, L);
237 }
238 
239 static llvm::Constant *getPersonalityFn(CodeGenModule &CGM,
240                                         const EHPersonality &Personality) {
241   llvm::Constant *Fn =
242     CGM.CreateRuntimeFunction(llvm::FunctionType::get(CGM.Int32Ty, true),
243                               Personality.PersonalityFn);
244   return Fn;
245 }
246 
247 static llvm::Constant *getOpaquePersonalityFn(CodeGenModule &CGM,
248                                         const EHPersonality &Personality) {
249   llvm::Constant *Fn = getPersonalityFn(CGM, Personality);
250   return llvm::ConstantExpr::getBitCast(Fn, CGM.Int8PtrTy);
251 }
252 
253 /// Check whether a personality function could reasonably be swapped
254 /// for a C++ personality function.
255 static bool PersonalityHasOnlyCXXUses(llvm::Constant *Fn) {
256   for (llvm::User *U : Fn->users()) {
257     // Conditionally white-list bitcasts.
258     if (llvm::ConstantExpr *CE = dyn_cast<llvm::ConstantExpr>(U)) {
259       if (CE->getOpcode() != llvm::Instruction::BitCast) return false;
260       if (!PersonalityHasOnlyCXXUses(CE))
261         return false;
262       continue;
263     }
264 
265     // Otherwise, it has to be a landingpad instruction.
266     llvm::LandingPadInst *LPI = dyn_cast<llvm::LandingPadInst>(U);
267     if (!LPI) return false;
268 
269     for (unsigned I = 0, E = LPI->getNumClauses(); I != E; ++I) {
270       // Look for something that would've been returned by the ObjC
271       // runtime's GetEHType() method.
272       llvm::Value *Val = LPI->getClause(I)->stripPointerCasts();
273       if (LPI->isCatch(I)) {
274         // Check if the catch value has the ObjC prefix.
275         if (llvm::GlobalVariable *GV = dyn_cast<llvm::GlobalVariable>(Val))
276           // ObjC EH selector entries are always global variables with
277           // names starting like this.
278           if (GV->getName().startswith("OBJC_EHTYPE"))
279             return false;
280       } else {
281         // Check if any of the filter values have the ObjC prefix.
282         llvm::Constant *CVal = cast<llvm::Constant>(Val);
283         for (llvm::User::op_iterator
284                II = CVal->op_begin(), IE = CVal->op_end(); II != IE; ++II) {
285           if (llvm::GlobalVariable *GV =
286               cast<llvm::GlobalVariable>((*II)->stripPointerCasts()))
287             // ObjC EH selector entries are always global variables with
288             // names starting like this.
289             if (GV->getName().startswith("OBJC_EHTYPE"))
290               return false;
291         }
292       }
293     }
294   }
295 
296   return true;
297 }
298 
299 /// Try to use the C++ personality function in ObjC++.  Not doing this
300 /// can cause some incompatibilities with gcc, which is more
301 /// aggressive about only using the ObjC++ personality in a function
302 /// when it really needs it.
303 void CodeGenModule::SimplifyPersonality() {
304   // If we're not in ObjC++ -fexceptions, there's nothing to do.
305   if (!LangOpts.CPlusPlus || !LangOpts.ObjC1 || !LangOpts.Exceptions)
306     return;
307 
308   // Both the problem this endeavors to fix and the way the logic
309   // above works is specific to the NeXT runtime.
310   if (!LangOpts.ObjCRuntime.isNeXTFamily())
311     return;
312 
313   const EHPersonality &ObjCXX = EHPersonality::get(*this, /*FD=*/nullptr);
314   const EHPersonality &CXX =
315       getCXXPersonality(getTarget().getTriple(), LangOpts);
316   if (&ObjCXX == &CXX)
317     return;
318 
319   assert(std::strcmp(ObjCXX.PersonalityFn, CXX.PersonalityFn) != 0 &&
320          "Different EHPersonalities using the same personality function.");
321 
322   llvm::Function *Fn = getModule().getFunction(ObjCXX.PersonalityFn);
323 
324   // Nothing to do if it's unused.
325   if (!Fn || Fn->use_empty()) return;
326 
327   // Can't do the optimization if it has non-C++ uses.
328   if (!PersonalityHasOnlyCXXUses(Fn)) return;
329 
330   // Create the C++ personality function and kill off the old
331   // function.
332   llvm::Constant *CXXFn = getPersonalityFn(*this, CXX);
333 
334   // This can happen if the user is screwing with us.
335   if (Fn->getType() != CXXFn->getType()) return;
336 
337   Fn->replaceAllUsesWith(CXXFn);
338   Fn->eraseFromParent();
339 }
340 
341 /// Returns the value to inject into a selector to indicate the
342 /// presence of a catch-all.
343 static llvm::Constant *getCatchAllValue(CodeGenFunction &CGF) {
344   // Possibly we should use @llvm.eh.catch.all.value here.
345   return llvm::ConstantPointerNull::get(CGF.Int8PtrTy);
346 }
347 
348 namespace {
349   /// A cleanup to free the exception object if its initialization
350   /// throws.
351   struct FreeException : EHScopeStack::Cleanup {
352     llvm::Value *exn;
353     FreeException(llvm::Value *exn) : exn(exn) {}
354     void Emit(CodeGenFunction &CGF, Flags flags) override {
355       CGF.EmitNounwindRuntimeCall(getFreeExceptionFn(CGF.CGM), exn);
356     }
357   };
358 }
359 
360 // Emits an exception expression into the given location.  This
361 // differs from EmitAnyExprToMem only in that, if a final copy-ctor
362 // call is required, an exception within that copy ctor causes
363 // std::terminate to be invoked.
364 void CodeGenFunction::EmitAnyExprToExn(const Expr *e, llvm::Value *addr) {
365   // Make sure the exception object is cleaned up if there's an
366   // exception during initialization.
367   pushFullExprCleanup<FreeException>(EHCleanup, addr);
368   EHScopeStack::stable_iterator cleanup = EHStack.stable_begin();
369 
370   // __cxa_allocate_exception returns a void*;  we need to cast this
371   // to the appropriate type for the object.
372   llvm::Type *ty = ConvertTypeForMem(e->getType())->getPointerTo();
373   llvm::Value *typedAddr = Builder.CreateBitCast(addr, ty);
374 
375   // FIXME: this isn't quite right!  If there's a final unelided call
376   // to a copy constructor, then according to [except.terminate]p1 we
377   // must call std::terminate() if that constructor throws, because
378   // technically that copy occurs after the exception expression is
379   // evaluated but before the exception is caught.  But the best way
380   // to handle that is to teach EmitAggExpr to do the final copy
381   // differently if it can't be elided.
382   EmitAnyExprToMem(e, typedAddr, e->getType().getQualifiers(),
383                    /*IsInit*/ true);
384 
385   // Deactivate the cleanup block.
386   DeactivateCleanupBlock(cleanup, cast<llvm::Instruction>(typedAddr));
387 }
388 
389 llvm::Value *CodeGenFunction::getExceptionSlot() {
390   if (!ExceptionSlot)
391     ExceptionSlot = CreateTempAlloca(Int8PtrTy, "exn.slot");
392   return ExceptionSlot;
393 }
394 
395 llvm::Value *CodeGenFunction::getEHSelectorSlot() {
396   if (!EHSelectorSlot)
397     EHSelectorSlot = CreateTempAlloca(Int32Ty, "ehselector.slot");
398   return EHSelectorSlot;
399 }
400 
401 llvm::Value *CodeGenFunction::getExceptionFromSlot() {
402   return Builder.CreateLoad(getExceptionSlot(), "exn");
403 }
404 
405 llvm::Value *CodeGenFunction::getSelectorFromSlot() {
406   return Builder.CreateLoad(getEHSelectorSlot(), "sel");
407 }
408 
409 llvm::Value *CodeGenFunction::getAbnormalTerminationSlot() {
410   if (!AbnormalTerminationSlot)
411     AbnormalTerminationSlot =
412         CreateTempAlloca(Int8Ty, "abnormal.termination.slot");
413   return AbnormalTerminationSlot;
414 }
415 
416 void CodeGenFunction::EmitCXXThrowExpr(const CXXThrowExpr *E,
417                                        bool KeepInsertionPoint) {
418   if (const Expr *SubExpr = E->getSubExpr()) {
419     QualType ThrowType = SubExpr->getType();
420     if (ThrowType->isObjCObjectPointerType()) {
421       const Stmt *ThrowStmt = E->getSubExpr();
422       const ObjCAtThrowStmt S(E->getExprLoc(), const_cast<Stmt *>(ThrowStmt));
423       CGM.getObjCRuntime().EmitThrowStmt(*this, S, false);
424     } else {
425       CGM.getCXXABI().emitThrow(*this, E);
426     }
427   } else {
428     CGM.getCXXABI().emitRethrow(*this, /*isNoReturn=*/true);
429   }
430 
431   // throw is an expression, and the expression emitters expect us
432   // to leave ourselves at a valid insertion point.
433   if (KeepInsertionPoint)
434     EmitBlock(createBasicBlock("throw.cont"));
435 }
436 
437 void CodeGenFunction::EmitStartEHSpec(const Decl *D) {
438   if (!CGM.getLangOpts().CXXExceptions)
439     return;
440 
441   const FunctionDecl* FD = dyn_cast_or_null<FunctionDecl>(D);
442   if (!FD) {
443     // Check if CapturedDecl is nothrow and create terminate scope for it.
444     if (const CapturedDecl* CD = dyn_cast_or_null<CapturedDecl>(D)) {
445       if (CD->isNothrow())
446         EHStack.pushTerminate();
447     }
448     return;
449   }
450   const FunctionProtoType *Proto = FD->getType()->getAs<FunctionProtoType>();
451   if (!Proto)
452     return;
453 
454   ExceptionSpecificationType EST = Proto->getExceptionSpecType();
455   if (isNoexceptExceptionSpec(EST)) {
456     if (Proto->getNoexceptSpec(getContext()) == FunctionProtoType::NR_Nothrow) {
457       // noexcept functions are simple terminate scopes.
458       EHStack.pushTerminate();
459     }
460   } else if (EST == EST_Dynamic || EST == EST_DynamicNone) {
461     // TODO: Revisit exception specifications for the MS ABI.  There is a way to
462     // encode these in an object file but MSVC doesn't do anything with it.
463     if (getTarget().getCXXABI().isMicrosoft())
464       return;
465     unsigned NumExceptions = Proto->getNumExceptions();
466     EHFilterScope *Filter = EHStack.pushFilter(NumExceptions);
467 
468     for (unsigned I = 0; I != NumExceptions; ++I) {
469       QualType Ty = Proto->getExceptionType(I);
470       QualType ExceptType = Ty.getNonReferenceType().getUnqualifiedType();
471       llvm::Value *EHType = CGM.GetAddrOfRTTIDescriptor(ExceptType,
472                                                         /*ForEH=*/true);
473       Filter->setFilter(I, EHType);
474     }
475   }
476 }
477 
478 /// Emit the dispatch block for a filter scope if necessary.
479 static void emitFilterDispatchBlock(CodeGenFunction &CGF,
480                                     EHFilterScope &filterScope) {
481   llvm::BasicBlock *dispatchBlock = filterScope.getCachedEHDispatchBlock();
482   if (!dispatchBlock) return;
483   if (dispatchBlock->use_empty()) {
484     delete dispatchBlock;
485     return;
486   }
487 
488   CGF.EmitBlockAfterUses(dispatchBlock);
489 
490   // If this isn't a catch-all filter, we need to check whether we got
491   // here because the filter triggered.
492   if (filterScope.getNumFilters()) {
493     // Load the selector value.
494     llvm::Value *selector = CGF.getSelectorFromSlot();
495     llvm::BasicBlock *unexpectedBB = CGF.createBasicBlock("ehspec.unexpected");
496 
497     llvm::Value *zero = CGF.Builder.getInt32(0);
498     llvm::Value *failsFilter =
499         CGF.Builder.CreateICmpSLT(selector, zero, "ehspec.fails");
500     CGF.Builder.CreateCondBr(failsFilter, unexpectedBB,
501                              CGF.getEHResumeBlock(false));
502 
503     CGF.EmitBlock(unexpectedBB);
504   }
505 
506   // Call __cxa_call_unexpected.  This doesn't need to be an invoke
507   // because __cxa_call_unexpected magically filters exceptions
508   // according to the last landing pad the exception was thrown
509   // into.  Seriously.
510   llvm::Value *exn = CGF.getExceptionFromSlot();
511   CGF.EmitRuntimeCall(getUnexpectedFn(CGF.CGM), exn)
512     ->setDoesNotReturn();
513   CGF.Builder.CreateUnreachable();
514 }
515 
516 void CodeGenFunction::EmitEndEHSpec(const Decl *D) {
517   if (!CGM.getLangOpts().CXXExceptions)
518     return;
519 
520   const FunctionDecl* FD = dyn_cast_or_null<FunctionDecl>(D);
521   if (!FD) {
522     // Check if CapturedDecl is nothrow and pop terminate scope for it.
523     if (const CapturedDecl* CD = dyn_cast_or_null<CapturedDecl>(D)) {
524       if (CD->isNothrow())
525         EHStack.popTerminate();
526     }
527     return;
528   }
529   const FunctionProtoType *Proto = FD->getType()->getAs<FunctionProtoType>();
530   if (!Proto)
531     return;
532 
533   ExceptionSpecificationType EST = Proto->getExceptionSpecType();
534   if (isNoexceptExceptionSpec(EST)) {
535     if (Proto->getNoexceptSpec(getContext()) == FunctionProtoType::NR_Nothrow) {
536       EHStack.popTerminate();
537     }
538   } else if (EST == EST_Dynamic || EST == EST_DynamicNone) {
539     // TODO: Revisit exception specifications for the MS ABI.  There is a way to
540     // encode these in an object file but MSVC doesn't do anything with it.
541     if (getTarget().getCXXABI().isMicrosoft())
542       return;
543     EHFilterScope &filterScope = cast<EHFilterScope>(*EHStack.begin());
544     emitFilterDispatchBlock(*this, filterScope);
545     EHStack.popFilter();
546   }
547 }
548 
549 void CodeGenFunction::EmitCXXTryStmt(const CXXTryStmt &S) {
550   EnterCXXTryStmt(S);
551   EmitStmt(S.getTryBlock());
552   ExitCXXTryStmt(S);
553 }
554 
555 void CodeGenFunction::EnterCXXTryStmt(const CXXTryStmt &S, bool IsFnTryBlock) {
556   unsigned NumHandlers = S.getNumHandlers();
557   EHCatchScope *CatchScope = EHStack.pushCatch(NumHandlers);
558 
559   for (unsigned I = 0; I != NumHandlers; ++I) {
560     const CXXCatchStmt *C = S.getHandler(I);
561 
562     llvm::BasicBlock *Handler = createBasicBlock("catch");
563     if (C->getExceptionDecl()) {
564       // FIXME: Dropping the reference type on the type into makes it
565       // impossible to correctly implement catch-by-reference
566       // semantics for pointers.  Unfortunately, this is what all
567       // existing compilers do, and it's not clear that the standard
568       // personality routine is capable of doing this right.  See C++ DR 388:
569       //   http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#388
570       Qualifiers CaughtTypeQuals;
571       QualType CaughtType = CGM.getContext().getUnqualifiedArrayType(
572           C->getCaughtType().getNonReferenceType(), CaughtTypeQuals);
573 
574       llvm::Constant *TypeInfo = nullptr;
575       if (CaughtType->isObjCObjectPointerType())
576         TypeInfo = CGM.getObjCRuntime().GetEHType(CaughtType);
577       else
578         TypeInfo =
579             CGM.getAddrOfCXXCatchHandlerType(CaughtType, C->getCaughtType());
580       CatchScope->setHandler(I, TypeInfo, Handler);
581     } else {
582       // No exception decl indicates '...', a catch-all.
583       CatchScope->setCatchAllHandler(I, Handler);
584     }
585   }
586 }
587 
588 llvm::BasicBlock *
589 CodeGenFunction::getEHDispatchBlock(EHScopeStack::stable_iterator si) {
590   // The dispatch block for the end of the scope chain is a block that
591   // just resumes unwinding.
592   if (si == EHStack.stable_end())
593     return getEHResumeBlock(true);
594 
595   // Otherwise, we should look at the actual scope.
596   EHScope &scope = *EHStack.find(si);
597 
598   llvm::BasicBlock *dispatchBlock = scope.getCachedEHDispatchBlock();
599   if (!dispatchBlock) {
600     switch (scope.getKind()) {
601     case EHScope::Catch: {
602       // Apply a special case to a single catch-all.
603       EHCatchScope &catchScope = cast<EHCatchScope>(scope);
604       if (catchScope.getNumHandlers() == 1 &&
605           catchScope.getHandler(0).isCatchAll()) {
606         dispatchBlock = catchScope.getHandler(0).Block;
607 
608       // Otherwise, make a dispatch block.
609       } else {
610         dispatchBlock = createBasicBlock("catch.dispatch");
611       }
612       break;
613     }
614 
615     case EHScope::Cleanup:
616       dispatchBlock = createBasicBlock("ehcleanup");
617       break;
618 
619     case EHScope::Filter:
620       dispatchBlock = createBasicBlock("filter.dispatch");
621       break;
622 
623     case EHScope::Terminate:
624       dispatchBlock = getTerminateHandler();
625       break;
626     }
627     scope.setCachedEHDispatchBlock(dispatchBlock);
628   }
629   return dispatchBlock;
630 }
631 
632 /// Check whether this is a non-EH scope, i.e. a scope which doesn't
633 /// affect exception handling.  Currently, the only non-EH scopes are
634 /// normal-only cleanup scopes.
635 static bool isNonEHScope(const EHScope &S) {
636   switch (S.getKind()) {
637   case EHScope::Cleanup:
638     return !cast<EHCleanupScope>(S).isEHCleanup();
639   case EHScope::Filter:
640   case EHScope::Catch:
641   case EHScope::Terminate:
642     return false;
643   }
644 
645   llvm_unreachable("Invalid EHScope Kind!");
646 }
647 
648 llvm::BasicBlock *CodeGenFunction::getInvokeDestImpl() {
649   assert(EHStack.requiresLandingPad());
650   assert(!EHStack.empty());
651 
652   // If exceptions are disabled, there are usually no landingpads. However, when
653   // SEH is enabled, functions using SEH still get landingpads.
654   const LangOptions &LO = CGM.getLangOpts();
655   if (!LO.Exceptions) {
656     if (!LO.Borland && !LO.MicrosoftExt)
657       return nullptr;
658     if (!currentFunctionUsesSEHTry())
659       return nullptr;
660   }
661 
662   // Check the innermost scope for a cached landing pad.  If this is
663   // a non-EH cleanup, we'll check enclosing scopes in EmitLandingPad.
664   llvm::BasicBlock *LP = EHStack.begin()->getCachedLandingPad();
665   if (LP) return LP;
666 
667   // Build the landing pad for this scope.
668   LP = EmitLandingPad();
669   assert(LP);
670 
671   // Cache the landing pad on the innermost scope.  If this is a
672   // non-EH scope, cache the landing pad on the enclosing scope, too.
673   for (EHScopeStack::iterator ir = EHStack.begin(); true; ++ir) {
674     ir->setCachedLandingPad(LP);
675     if (!isNonEHScope(*ir)) break;
676   }
677 
678   return LP;
679 }
680 
681 llvm::BasicBlock *CodeGenFunction::EmitLandingPad() {
682   assert(EHStack.requiresLandingPad());
683 
684   EHScope &innermostEHScope = *EHStack.find(EHStack.getInnermostEHScope());
685   switch (innermostEHScope.getKind()) {
686   case EHScope::Terminate:
687     return getTerminateLandingPad();
688 
689   case EHScope::Catch:
690   case EHScope::Cleanup:
691   case EHScope::Filter:
692     if (llvm::BasicBlock *lpad = innermostEHScope.getCachedLandingPad())
693       return lpad;
694   }
695 
696   // Save the current IR generation state.
697   CGBuilderTy::InsertPoint savedIP = Builder.saveAndClearIP();
698   auto DL = ApplyDebugLocation::CreateDefaultArtificial(*this, CurEHLocation);
699 
700   const EHPersonality &personality = EHPersonality::get(*this);
701 
702   // Create and configure the landing pad.
703   llvm::BasicBlock *lpad = createBasicBlock("lpad");
704   EmitBlock(lpad);
705 
706   llvm::LandingPadInst *LPadInst =
707     Builder.CreateLandingPad(llvm::StructType::get(Int8PtrTy, Int32Ty, nullptr),
708                              getOpaquePersonalityFn(CGM, personality), 0);
709 
710   llvm::Value *LPadExn = Builder.CreateExtractValue(LPadInst, 0);
711   Builder.CreateStore(LPadExn, getExceptionSlot());
712   llvm::Value *LPadSel = Builder.CreateExtractValue(LPadInst, 1);
713   Builder.CreateStore(LPadSel, getEHSelectorSlot());
714 
715   // Save the exception pointer.  It's safe to use a single exception
716   // pointer per function because EH cleanups can never have nested
717   // try/catches.
718   // Build the landingpad instruction.
719 
720   // Accumulate all the handlers in scope.
721   bool hasCatchAll = false;
722   bool hasCleanup = false;
723   bool hasFilter = false;
724   SmallVector<llvm::Value*, 4> filterTypes;
725   llvm::SmallPtrSet<llvm::Value*, 4> catchTypes;
726   for (EHScopeStack::iterator I = EHStack.begin(), E = EHStack.end(); I != E;
727        ++I) {
728 
729     switch (I->getKind()) {
730     case EHScope::Cleanup:
731       // If we have a cleanup, remember that.
732       hasCleanup = (hasCleanup || cast<EHCleanupScope>(*I).isEHCleanup());
733       continue;
734 
735     case EHScope::Filter: {
736       assert(I.next() == EHStack.end() && "EH filter is not end of EH stack");
737       assert(!hasCatchAll && "EH filter reached after catch-all");
738 
739       // Filter scopes get added to the landingpad in weird ways.
740       EHFilterScope &filter = cast<EHFilterScope>(*I);
741       hasFilter = true;
742 
743       // Add all the filter values.
744       for (unsigned i = 0, e = filter.getNumFilters(); i != e; ++i)
745         filterTypes.push_back(filter.getFilter(i));
746       goto done;
747     }
748 
749     case EHScope::Terminate:
750       // Terminate scopes are basically catch-alls.
751       assert(!hasCatchAll);
752       hasCatchAll = true;
753       goto done;
754 
755     case EHScope::Catch:
756       break;
757     }
758 
759     EHCatchScope &catchScope = cast<EHCatchScope>(*I);
760     for (unsigned hi = 0, he = catchScope.getNumHandlers(); hi != he; ++hi) {
761       EHCatchScope::Handler handler = catchScope.getHandler(hi);
762 
763       // If this is a catch-all, register that and abort.
764       if (!handler.Type) {
765         assert(!hasCatchAll);
766         hasCatchAll = true;
767         goto done;
768       }
769 
770       // Check whether we already have a handler for this type.
771       if (catchTypes.insert(handler.Type).second)
772         // If not, add it directly to the landingpad.
773         LPadInst->addClause(handler.Type);
774     }
775   }
776 
777  done:
778   // If we have a catch-all, add null to the landingpad.
779   assert(!(hasCatchAll && hasFilter));
780   if (hasCatchAll) {
781     LPadInst->addClause(getCatchAllValue(*this));
782 
783   // If we have an EH filter, we need to add those handlers in the
784   // right place in the landingpad, which is to say, at the end.
785   } else if (hasFilter) {
786     // Create a filter expression: a constant array indicating which filter
787     // types there are. The personality routine only lands here if the filter
788     // doesn't match.
789     SmallVector<llvm::Constant*, 8> Filters;
790     llvm::ArrayType *AType =
791       llvm::ArrayType::get(!filterTypes.empty() ?
792                              filterTypes[0]->getType() : Int8PtrTy,
793                            filterTypes.size());
794 
795     for (unsigned i = 0, e = filterTypes.size(); i != e; ++i)
796       Filters.push_back(cast<llvm::Constant>(filterTypes[i]));
797     llvm::Constant *FilterArray = llvm::ConstantArray::get(AType, Filters);
798     LPadInst->addClause(FilterArray);
799 
800     // Also check whether we need a cleanup.
801     if (hasCleanup)
802       LPadInst->setCleanup(true);
803 
804   // Otherwise, signal that we at least have cleanups.
805   } else if (hasCleanup) {
806     LPadInst->setCleanup(true);
807   }
808 
809   assert((LPadInst->getNumClauses() > 0 || LPadInst->isCleanup()) &&
810          "landingpad instruction has no clauses!");
811 
812   // Tell the backend how to generate the landing pad.
813   Builder.CreateBr(getEHDispatchBlock(EHStack.getInnermostEHScope()));
814 
815   // Restore the old IR generation state.
816   Builder.restoreIP(savedIP);
817 
818   return lpad;
819 }
820 
821 /// Emit the structure of the dispatch block for the given catch scope.
822 /// It is an invariant that the dispatch block already exists.
823 static void emitCatchDispatchBlock(CodeGenFunction &CGF,
824                                    EHCatchScope &catchScope) {
825   llvm::BasicBlock *dispatchBlock = catchScope.getCachedEHDispatchBlock();
826   assert(dispatchBlock);
827 
828   // If there's only a single catch-all, getEHDispatchBlock returned
829   // that catch-all as the dispatch block.
830   if (catchScope.getNumHandlers() == 1 &&
831       catchScope.getHandler(0).isCatchAll()) {
832     assert(dispatchBlock == catchScope.getHandler(0).Block);
833     return;
834   }
835 
836   CGBuilderTy::InsertPoint savedIP = CGF.Builder.saveIP();
837   CGF.EmitBlockAfterUses(dispatchBlock);
838 
839   // Select the right handler.
840   llvm::Value *llvm_eh_typeid_for =
841     CGF.CGM.getIntrinsic(llvm::Intrinsic::eh_typeid_for);
842 
843   // Load the selector value.
844   llvm::Value *selector = CGF.getSelectorFromSlot();
845 
846   // Test against each of the exception types we claim to catch.
847   for (unsigned i = 0, e = catchScope.getNumHandlers(); ; ++i) {
848     assert(i < e && "ran off end of handlers!");
849     const EHCatchScope::Handler &handler = catchScope.getHandler(i);
850 
851     llvm::Value *typeValue = handler.Type;
852     assert(typeValue && "fell into catch-all case!");
853     typeValue = CGF.Builder.CreateBitCast(typeValue, CGF.Int8PtrTy);
854 
855     // Figure out the next block.
856     bool nextIsEnd;
857     llvm::BasicBlock *nextBlock;
858 
859     // If this is the last handler, we're at the end, and the next
860     // block is the block for the enclosing EH scope.
861     if (i + 1 == e) {
862       nextBlock = CGF.getEHDispatchBlock(catchScope.getEnclosingEHScope());
863       nextIsEnd = true;
864 
865     // If the next handler is a catch-all, we're at the end, and the
866     // next block is that handler.
867     } else if (catchScope.getHandler(i+1).isCatchAll()) {
868       nextBlock = catchScope.getHandler(i+1).Block;
869       nextIsEnd = true;
870 
871     // Otherwise, we're not at the end and we need a new block.
872     } else {
873       nextBlock = CGF.createBasicBlock("catch.fallthrough");
874       nextIsEnd = false;
875     }
876 
877     // Figure out the catch type's index in the LSDA's type table.
878     llvm::CallInst *typeIndex =
879       CGF.Builder.CreateCall(llvm_eh_typeid_for, typeValue);
880     typeIndex->setDoesNotThrow();
881 
882     llvm::Value *matchesTypeIndex =
883       CGF.Builder.CreateICmpEQ(selector, typeIndex, "matches");
884     CGF.Builder.CreateCondBr(matchesTypeIndex, handler.Block, nextBlock);
885 
886     // If the next handler is a catch-all, we're completely done.
887     if (nextIsEnd) {
888       CGF.Builder.restoreIP(savedIP);
889       return;
890     }
891     // Otherwise we need to emit and continue at that block.
892     CGF.EmitBlock(nextBlock);
893   }
894 }
895 
896 void CodeGenFunction::popCatchScope() {
897   EHCatchScope &catchScope = cast<EHCatchScope>(*EHStack.begin());
898   if (catchScope.hasEHBranches())
899     emitCatchDispatchBlock(*this, catchScope);
900   EHStack.popCatch();
901 }
902 
903 void CodeGenFunction::ExitCXXTryStmt(const CXXTryStmt &S, bool IsFnTryBlock) {
904   unsigned NumHandlers = S.getNumHandlers();
905   EHCatchScope &CatchScope = cast<EHCatchScope>(*EHStack.begin());
906   assert(CatchScope.getNumHandlers() == NumHandlers);
907 
908   // If the catch was not required, bail out now.
909   if (!CatchScope.hasEHBranches()) {
910     CatchScope.clearHandlerBlocks();
911     EHStack.popCatch();
912     return;
913   }
914 
915   // Emit the structure of the EH dispatch for this catch.
916   emitCatchDispatchBlock(*this, CatchScope);
917 
918   // Copy the handler blocks off before we pop the EH stack.  Emitting
919   // the handlers might scribble on this memory.
920   SmallVector<EHCatchScope::Handler, 8> Handlers(NumHandlers);
921   memcpy(Handlers.data(), CatchScope.begin(),
922          NumHandlers * sizeof(EHCatchScope::Handler));
923 
924   EHStack.popCatch();
925 
926   // The fall-through block.
927   llvm::BasicBlock *ContBB = createBasicBlock("try.cont");
928 
929   // We just emitted the body of the try; jump to the continue block.
930   if (HaveInsertPoint())
931     Builder.CreateBr(ContBB);
932 
933   // Determine if we need an implicit rethrow for all these catch handlers;
934   // see the comment below.
935   bool doImplicitRethrow = false;
936   if (IsFnTryBlock)
937     doImplicitRethrow = isa<CXXDestructorDecl>(CurCodeDecl) ||
938                         isa<CXXConstructorDecl>(CurCodeDecl);
939 
940   // Perversely, we emit the handlers backwards precisely because we
941   // want them to appear in source order.  In all of these cases, the
942   // catch block will have exactly one predecessor, which will be a
943   // particular block in the catch dispatch.  However, in the case of
944   // a catch-all, one of the dispatch blocks will branch to two
945   // different handlers, and EmitBlockAfterUses will cause the second
946   // handler to be moved before the first.
947   for (unsigned I = NumHandlers; I != 0; --I) {
948     llvm::BasicBlock *CatchBlock = Handlers[I-1].Block;
949     EmitBlockAfterUses(CatchBlock);
950 
951     // Catch the exception if this isn't a catch-all.
952     const CXXCatchStmt *C = S.getHandler(I-1);
953 
954     // Enter a cleanup scope, including the catch variable and the
955     // end-catch.
956     RunCleanupsScope CatchScope(*this);
957 
958     // Initialize the catch variable and set up the cleanups.
959     CGM.getCXXABI().emitBeginCatch(*this, C);
960 
961     // Emit the PGO counter increment.
962     RegionCounter CatchCnt = getPGORegionCounter(C);
963     CatchCnt.beginRegion(Builder);
964 
965     // Perform the body of the catch.
966     EmitStmt(C->getHandlerBlock());
967 
968     // [except.handle]p11:
969     //   The currently handled exception is rethrown if control
970     //   reaches the end of a handler of the function-try-block of a
971     //   constructor or destructor.
972 
973     // It is important that we only do this on fallthrough and not on
974     // return.  Note that it's illegal to put a return in a
975     // constructor function-try-block's catch handler (p14), so this
976     // really only applies to destructors.
977     if (doImplicitRethrow && HaveInsertPoint()) {
978       CGM.getCXXABI().emitRethrow(*this, /*isNoReturn*/false);
979       Builder.CreateUnreachable();
980       Builder.ClearInsertionPoint();
981     }
982 
983     // Fall out through the catch cleanups.
984     CatchScope.ForceCleanup();
985 
986     // Branch out of the try.
987     if (HaveInsertPoint())
988       Builder.CreateBr(ContBB);
989   }
990 
991   RegionCounter ContCnt = getPGORegionCounter(&S);
992   EmitBlock(ContBB);
993   ContCnt.beginRegion(Builder);
994 }
995 
996 namespace {
997   struct CallEndCatchForFinally : EHScopeStack::Cleanup {
998     llvm::Value *ForEHVar;
999     llvm::Value *EndCatchFn;
1000     CallEndCatchForFinally(llvm::Value *ForEHVar, llvm::Value *EndCatchFn)
1001       : ForEHVar(ForEHVar), EndCatchFn(EndCatchFn) {}
1002 
1003     void Emit(CodeGenFunction &CGF, Flags flags) override {
1004       llvm::BasicBlock *EndCatchBB = CGF.createBasicBlock("finally.endcatch");
1005       llvm::BasicBlock *CleanupContBB =
1006         CGF.createBasicBlock("finally.cleanup.cont");
1007 
1008       llvm::Value *ShouldEndCatch =
1009         CGF.Builder.CreateLoad(ForEHVar, "finally.endcatch");
1010       CGF.Builder.CreateCondBr(ShouldEndCatch, EndCatchBB, CleanupContBB);
1011       CGF.EmitBlock(EndCatchBB);
1012       CGF.EmitRuntimeCallOrInvoke(EndCatchFn); // catch-all, so might throw
1013       CGF.EmitBlock(CleanupContBB);
1014     }
1015   };
1016 
1017   struct PerformFinally : EHScopeStack::Cleanup {
1018     const Stmt *Body;
1019     llvm::Value *ForEHVar;
1020     llvm::Value *EndCatchFn;
1021     llvm::Value *RethrowFn;
1022     llvm::Value *SavedExnVar;
1023 
1024     PerformFinally(const Stmt *Body, llvm::Value *ForEHVar,
1025                    llvm::Value *EndCatchFn,
1026                    llvm::Value *RethrowFn, llvm::Value *SavedExnVar)
1027       : Body(Body), ForEHVar(ForEHVar), EndCatchFn(EndCatchFn),
1028         RethrowFn(RethrowFn), SavedExnVar(SavedExnVar) {}
1029 
1030     void Emit(CodeGenFunction &CGF, Flags flags) override {
1031       // Enter a cleanup to call the end-catch function if one was provided.
1032       if (EndCatchFn)
1033         CGF.EHStack.pushCleanup<CallEndCatchForFinally>(NormalAndEHCleanup,
1034                                                         ForEHVar, EndCatchFn);
1035 
1036       // Save the current cleanup destination in case there are
1037       // cleanups in the finally block.
1038       llvm::Value *SavedCleanupDest =
1039         CGF.Builder.CreateLoad(CGF.getNormalCleanupDestSlot(),
1040                                "cleanup.dest.saved");
1041 
1042       // Emit the finally block.
1043       CGF.EmitStmt(Body);
1044 
1045       // If the end of the finally is reachable, check whether this was
1046       // for EH.  If so, rethrow.
1047       if (CGF.HaveInsertPoint()) {
1048         llvm::BasicBlock *RethrowBB = CGF.createBasicBlock("finally.rethrow");
1049         llvm::BasicBlock *ContBB = CGF.createBasicBlock("finally.cont");
1050 
1051         llvm::Value *ShouldRethrow =
1052           CGF.Builder.CreateLoad(ForEHVar, "finally.shouldthrow");
1053         CGF.Builder.CreateCondBr(ShouldRethrow, RethrowBB, ContBB);
1054 
1055         CGF.EmitBlock(RethrowBB);
1056         if (SavedExnVar) {
1057           CGF.EmitRuntimeCallOrInvoke(RethrowFn,
1058                                       CGF.Builder.CreateLoad(SavedExnVar));
1059         } else {
1060           CGF.EmitRuntimeCallOrInvoke(RethrowFn);
1061         }
1062         CGF.Builder.CreateUnreachable();
1063 
1064         CGF.EmitBlock(ContBB);
1065 
1066         // Restore the cleanup destination.
1067         CGF.Builder.CreateStore(SavedCleanupDest,
1068                                 CGF.getNormalCleanupDestSlot());
1069       }
1070 
1071       // Leave the end-catch cleanup.  As an optimization, pretend that
1072       // the fallthrough path was inaccessible; we've dynamically proven
1073       // that we're not in the EH case along that path.
1074       if (EndCatchFn) {
1075         CGBuilderTy::InsertPoint SavedIP = CGF.Builder.saveAndClearIP();
1076         CGF.PopCleanupBlock();
1077         CGF.Builder.restoreIP(SavedIP);
1078       }
1079 
1080       // Now make sure we actually have an insertion point or the
1081       // cleanup gods will hate us.
1082       CGF.EnsureInsertPoint();
1083     }
1084   };
1085 }
1086 
1087 /// Enters a finally block for an implementation using zero-cost
1088 /// exceptions.  This is mostly general, but hard-codes some
1089 /// language/ABI-specific behavior in the catch-all sections.
1090 void CodeGenFunction::FinallyInfo::enter(CodeGenFunction &CGF,
1091                                          const Stmt *body,
1092                                          llvm::Constant *beginCatchFn,
1093                                          llvm::Constant *endCatchFn,
1094                                          llvm::Constant *rethrowFn) {
1095   assert((beginCatchFn != nullptr) == (endCatchFn != nullptr) &&
1096          "begin/end catch functions not paired");
1097   assert(rethrowFn && "rethrow function is required");
1098 
1099   BeginCatchFn = beginCatchFn;
1100 
1101   // The rethrow function has one of the following two types:
1102   //   void (*)()
1103   //   void (*)(void*)
1104   // In the latter case we need to pass it the exception object.
1105   // But we can't use the exception slot because the @finally might
1106   // have a landing pad (which would overwrite the exception slot).
1107   llvm::FunctionType *rethrowFnTy =
1108     cast<llvm::FunctionType>(
1109       cast<llvm::PointerType>(rethrowFn->getType())->getElementType());
1110   SavedExnVar = nullptr;
1111   if (rethrowFnTy->getNumParams())
1112     SavedExnVar = CGF.CreateTempAlloca(CGF.Int8PtrTy, "finally.exn");
1113 
1114   // A finally block is a statement which must be executed on any edge
1115   // out of a given scope.  Unlike a cleanup, the finally block may
1116   // contain arbitrary control flow leading out of itself.  In
1117   // addition, finally blocks should always be executed, even if there
1118   // are no catch handlers higher on the stack.  Therefore, we
1119   // surround the protected scope with a combination of a normal
1120   // cleanup (to catch attempts to break out of the block via normal
1121   // control flow) and an EH catch-all (semantically "outside" any try
1122   // statement to which the finally block might have been attached).
1123   // The finally block itself is generated in the context of a cleanup
1124   // which conditionally leaves the catch-all.
1125 
1126   // Jump destination for performing the finally block on an exception
1127   // edge.  We'll never actually reach this block, so unreachable is
1128   // fine.
1129   RethrowDest = CGF.getJumpDestInCurrentScope(CGF.getUnreachableBlock());
1130 
1131   // Whether the finally block is being executed for EH purposes.
1132   ForEHVar = CGF.CreateTempAlloca(CGF.Builder.getInt1Ty(), "finally.for-eh");
1133   CGF.Builder.CreateStore(CGF.Builder.getFalse(), ForEHVar);
1134 
1135   // Enter a normal cleanup which will perform the @finally block.
1136   CGF.EHStack.pushCleanup<PerformFinally>(NormalCleanup, body,
1137                                           ForEHVar, endCatchFn,
1138                                           rethrowFn, SavedExnVar);
1139 
1140   // Enter a catch-all scope.
1141   llvm::BasicBlock *catchBB = CGF.createBasicBlock("finally.catchall");
1142   EHCatchScope *catchScope = CGF.EHStack.pushCatch(1);
1143   catchScope->setCatchAllHandler(0, catchBB);
1144 }
1145 
1146 void CodeGenFunction::FinallyInfo::exit(CodeGenFunction &CGF) {
1147   // Leave the finally catch-all.
1148   EHCatchScope &catchScope = cast<EHCatchScope>(*CGF.EHStack.begin());
1149   llvm::BasicBlock *catchBB = catchScope.getHandler(0).Block;
1150 
1151   CGF.popCatchScope();
1152 
1153   // If there are any references to the catch-all block, emit it.
1154   if (catchBB->use_empty()) {
1155     delete catchBB;
1156   } else {
1157     CGBuilderTy::InsertPoint savedIP = CGF.Builder.saveAndClearIP();
1158     CGF.EmitBlock(catchBB);
1159 
1160     llvm::Value *exn = nullptr;
1161 
1162     // If there's a begin-catch function, call it.
1163     if (BeginCatchFn) {
1164       exn = CGF.getExceptionFromSlot();
1165       CGF.EmitNounwindRuntimeCall(BeginCatchFn, exn);
1166     }
1167 
1168     // If we need to remember the exception pointer to rethrow later, do so.
1169     if (SavedExnVar) {
1170       if (!exn) exn = CGF.getExceptionFromSlot();
1171       CGF.Builder.CreateStore(exn, SavedExnVar);
1172     }
1173 
1174     // Tell the cleanups in the finally block that we're do this for EH.
1175     CGF.Builder.CreateStore(CGF.Builder.getTrue(), ForEHVar);
1176 
1177     // Thread a jump through the finally cleanup.
1178     CGF.EmitBranchThroughCleanup(RethrowDest);
1179 
1180     CGF.Builder.restoreIP(savedIP);
1181   }
1182 
1183   // Finally, leave the @finally cleanup.
1184   CGF.PopCleanupBlock();
1185 }
1186 
1187 llvm::BasicBlock *CodeGenFunction::getTerminateLandingPad() {
1188   if (TerminateLandingPad)
1189     return TerminateLandingPad;
1190 
1191   CGBuilderTy::InsertPoint SavedIP = Builder.saveAndClearIP();
1192 
1193   // This will get inserted at the end of the function.
1194   TerminateLandingPad = createBasicBlock("terminate.lpad");
1195   Builder.SetInsertPoint(TerminateLandingPad);
1196 
1197   // Tell the backend that this is a landing pad.
1198   const EHPersonality &Personality = EHPersonality::get(*this);
1199   llvm::LandingPadInst *LPadInst =
1200     Builder.CreateLandingPad(llvm::StructType::get(Int8PtrTy, Int32Ty, nullptr),
1201                              getOpaquePersonalityFn(CGM, Personality), 0);
1202   LPadInst->addClause(getCatchAllValue(*this));
1203 
1204   llvm::Value *Exn = 0;
1205   if (getLangOpts().CPlusPlus)
1206     Exn = Builder.CreateExtractValue(LPadInst, 0);
1207   llvm::CallInst *terminateCall =
1208       CGM.getCXXABI().emitTerminateForUnexpectedException(*this, Exn);
1209   terminateCall->setDoesNotReturn();
1210   Builder.CreateUnreachable();
1211 
1212   // Restore the saved insertion state.
1213   Builder.restoreIP(SavedIP);
1214 
1215   return TerminateLandingPad;
1216 }
1217 
1218 llvm::BasicBlock *CodeGenFunction::getTerminateHandler() {
1219   if (TerminateHandler)
1220     return TerminateHandler;
1221 
1222   CGBuilderTy::InsertPoint SavedIP = Builder.saveAndClearIP();
1223 
1224   // Set up the terminate handler.  This block is inserted at the very
1225   // end of the function by FinishFunction.
1226   TerminateHandler = createBasicBlock("terminate.handler");
1227   Builder.SetInsertPoint(TerminateHandler);
1228   llvm::Value *Exn = 0;
1229   if (getLangOpts().CPlusPlus)
1230     Exn = getExceptionFromSlot();
1231   llvm::CallInst *terminateCall =
1232       CGM.getCXXABI().emitTerminateForUnexpectedException(*this, Exn);
1233   terminateCall->setDoesNotReturn();
1234   Builder.CreateUnreachable();
1235 
1236   // Restore the saved insertion state.
1237   Builder.restoreIP(SavedIP);
1238 
1239   return TerminateHandler;
1240 }
1241 
1242 llvm::BasicBlock *CodeGenFunction::getEHResumeBlock(bool isCleanup) {
1243   if (EHResumeBlock) return EHResumeBlock;
1244 
1245   CGBuilderTy::InsertPoint SavedIP = Builder.saveIP();
1246 
1247   // We emit a jump to a notional label at the outermost unwind state.
1248   EHResumeBlock = createBasicBlock("eh.resume");
1249   Builder.SetInsertPoint(EHResumeBlock);
1250 
1251   const EHPersonality &Personality = EHPersonality::get(*this);
1252 
1253   // This can always be a call because we necessarily didn't find
1254   // anything on the EH stack which needs our help.
1255   const char *RethrowName = Personality.CatchallRethrowFn;
1256   if (RethrowName != nullptr && !isCleanup) {
1257     EmitRuntimeCall(getCatchallRethrowFn(CGM, RethrowName),
1258                     getExceptionFromSlot())->setDoesNotReturn();
1259     Builder.CreateUnreachable();
1260     Builder.restoreIP(SavedIP);
1261     return EHResumeBlock;
1262   }
1263 
1264   // Recreate the landingpad's return value for the 'resume' instruction.
1265   llvm::Value *Exn = getExceptionFromSlot();
1266   llvm::Value *Sel = getSelectorFromSlot();
1267 
1268   llvm::Type *LPadType = llvm::StructType::get(Exn->getType(),
1269                                                Sel->getType(), nullptr);
1270   llvm::Value *LPadVal = llvm::UndefValue::get(LPadType);
1271   LPadVal = Builder.CreateInsertValue(LPadVal, Exn, 0, "lpad.val");
1272   LPadVal = Builder.CreateInsertValue(LPadVal, Sel, 1, "lpad.val");
1273 
1274   Builder.CreateResume(LPadVal);
1275   Builder.restoreIP(SavedIP);
1276   return EHResumeBlock;
1277 }
1278 
1279 void CodeGenFunction::EmitSEHTryStmt(const SEHTryStmt &S) {
1280   // FIXME: Implement SEH on other architectures.
1281   const llvm::Triple &T = CGM.getTarget().getTriple();
1282   if (T.getArch() != llvm::Triple::x86_64 ||
1283       !T.isKnownWindowsMSVCEnvironment()) {
1284     ErrorUnsupported(&S, "__try statement");
1285     return;
1286   }
1287 
1288   SEHFinallyInfo FI;
1289   EnterSEHTryStmt(S, FI);
1290   {
1291     JumpDest TryExit = getJumpDestInCurrentScope("__try.__leave");
1292 
1293     SEHTryEpilogueStack.push_back(&TryExit);
1294     EmitStmt(S.getTryBlock());
1295     SEHTryEpilogueStack.pop_back();
1296 
1297     if (!TryExit.getBlock()->use_empty())
1298       EmitBlock(TryExit.getBlock(), /*IsFinished=*/true);
1299     else
1300       delete TryExit.getBlock();
1301   }
1302   ExitSEHTryStmt(S, FI);
1303 }
1304 
1305 namespace {
1306 struct PerformSEHFinally : EHScopeStack::Cleanup  {
1307   CodeGenFunction::SEHFinallyInfo *FI;
1308   PerformSEHFinally(CodeGenFunction::SEHFinallyInfo *FI) : FI(FI) {}
1309 
1310   void Emit(CodeGenFunction &CGF, Flags F) override {
1311     // Cleanups are emitted at most twice: once for normal control flow and once
1312     // for exception control flow. Branch into the finally block, and remember
1313     // the continuation block so we can branch out later.
1314     if (!FI->FinallyBB) {
1315       FI->FinallyBB = CGF.createBasicBlock("__finally");
1316       FI->FinallyBB->insertInto(CGF.CurFn);
1317       FI->FinallyBB->moveAfter(CGF.Builder.GetInsertBlock());
1318     }
1319 
1320     // Set the termination status and branch in.
1321     CGF.Builder.CreateStore(
1322         llvm::ConstantInt::get(CGF.Int8Ty, F.isForEHCleanup()),
1323         CGF.getAbnormalTerminationSlot());
1324     CGF.Builder.CreateBr(FI->FinallyBB);
1325 
1326     // Create a continuation block for normal or exceptional control.
1327     if (F.isForEHCleanup()) {
1328       assert(!FI->ResumeBB && "double emission for EH");
1329       FI->ResumeBB = CGF.createBasicBlock("__finally.resume");
1330       CGF.EmitBlock(FI->ResumeBB);
1331     } else {
1332       assert(F.isForNormalCleanup() && !FI->ContBB && "double normal emission");
1333       FI->ContBB = CGF.createBasicBlock("__finally.cont");
1334       CGF.EmitBlock(FI->ContBB);
1335       // Try to keep source order.
1336       FI->ContBB->moveAfter(FI->FinallyBB);
1337     }
1338   }
1339 };
1340 }
1341 
1342 /// Create a stub filter function that will ultimately hold the code of the
1343 /// filter expression. The EH preparation passes in LLVM will outline the code
1344 /// from the main function body into this stub.
1345 llvm::Function *
1346 CodeGenFunction::GenerateSEHFilterFunction(CodeGenFunction &ParentCGF,
1347                                            const SEHExceptStmt &Except) {
1348   const Decl *ParentCodeDecl = ParentCGF.CurCodeDecl;
1349   llvm::Function *ParentFn = ParentCGF.CurFn;
1350 
1351   Expr *FilterExpr = Except.getFilterExpr();
1352 
1353   // Get the mangled function name.
1354   SmallString<128> Name;
1355   {
1356     llvm::raw_svector_ostream OS(Name);
1357     const NamedDecl *Parent = dyn_cast_or_null<NamedDecl>(ParentCodeDecl);
1358     assert(Parent && "FIXME: handle unnamed decls (lambdas, blocks) with SEH");
1359     CGM.getCXXABI().getMangleContext().mangleSEHFilterExpression(Parent, OS);
1360   }
1361 
1362   // Arrange a function with the declaration:
1363   // int filt(EXCEPTION_POINTERS *exception_pointers, void *frame_pointer)
1364   QualType RetTy = getContext().IntTy;
1365   FunctionArgList Args;
1366   SEHPointersDecl = ImplicitParamDecl::Create(
1367       getContext(), nullptr, FilterExpr->getLocStart(),
1368       &getContext().Idents.get("exception_pointers"), getContext().VoidPtrTy);
1369   Args.push_back(SEHPointersDecl);
1370   Args.push_back(ImplicitParamDecl::Create(
1371       getContext(), nullptr, FilterExpr->getLocStart(),
1372       &getContext().Idents.get("frame_pointer"), getContext().VoidPtrTy));
1373   const CGFunctionInfo &FnInfo = CGM.getTypes().arrangeFreeFunctionDeclaration(
1374       RetTy, Args, FunctionType::ExtInfo(), /*isVariadic=*/false);
1375   llvm::FunctionType *FnTy = CGM.getTypes().GetFunctionType(FnInfo);
1376   llvm::Function *Fn = llvm::Function::Create(FnTy, ParentFn->getLinkage(),
1377                                               Name.str(), &CGM.getModule());
1378   // The filter is either in the same comdat as the function, or it's internal.
1379   if (llvm::Comdat *C = ParentFn->getComdat()) {
1380     Fn->setComdat(C);
1381   } else if (ParentFn->hasWeakLinkage() || ParentFn->hasLinkOnceLinkage()) {
1382     // FIXME: Unreachable with Rafael's changes?
1383     llvm::Comdat *C = CGM.getModule().getOrInsertComdat(ParentFn->getName());
1384     ParentFn->setComdat(C);
1385     Fn->setComdat(C);
1386   } else {
1387     Fn->setLinkage(llvm::GlobalValue::InternalLinkage);
1388   }
1389 
1390   StartFunction(GlobalDecl(), RetTy, Fn, FnInfo, Args,
1391                 FilterExpr->getLocStart(), FilterExpr->getLocStart());
1392 
1393   EmitSEHExceptionCodeSave();
1394 
1395   // Insert dummy allocas for every local variable in scope. We'll initialize
1396   // them and prune the unused ones after we find out which ones were
1397   // referenced.
1398   for (const auto &DeclPtrs : ParentCGF.LocalDeclMap) {
1399     const Decl *VD = DeclPtrs.first;
1400     llvm::Value *Ptr = DeclPtrs.second;
1401     auto *ValTy = cast<llvm::PointerType>(Ptr->getType())->getElementType();
1402     LocalDeclMap[VD] = CreateTempAlloca(ValTy, Ptr->getName() + ".filt");
1403   }
1404 
1405   // Emit the original filter expression, convert to i32, and return.
1406   llvm::Value *R = EmitScalarExpr(FilterExpr);
1407   R = Builder.CreateIntCast(R, CGM.IntTy,
1408                             FilterExpr->getType()->isSignedIntegerType());
1409   Builder.CreateStore(R, ReturnValue);
1410 
1411   FinishFunction(FilterExpr->getLocEnd());
1412 
1413   for (const auto &DeclPtrs : ParentCGF.LocalDeclMap) {
1414     const Decl *VD = DeclPtrs.first;
1415     auto *Alloca = cast<llvm::AllocaInst>(LocalDeclMap[VD]);
1416     if (Alloca->hasNUses(0)) {
1417       Alloca->eraseFromParent();
1418       continue;
1419     }
1420     ErrorUnsupported(FilterExpr,
1421                      "SEH filter expression local variable capture");
1422   }
1423 
1424   return Fn;
1425 }
1426 
1427 void CodeGenFunction::EmitSEHExceptionCodeSave() {
1428   // Save the exception code in the exception slot to unify exception access in
1429   // the filter function and the landing pad.
1430   // struct EXCEPTION_POINTERS {
1431   //   EXCEPTION_RECORD *ExceptionRecord;
1432   //   CONTEXT *ContextRecord;
1433   // };
1434   // void *exn.slot =
1435   //     (void *)(uintptr_t)exception_pointers->ExceptionRecord->ExceptionCode;
1436   llvm::Value *Ptrs = Builder.CreateLoad(GetAddrOfLocalVar(SEHPointersDecl));
1437   llvm::Type *RecordTy = CGM.Int32Ty->getPointerTo();
1438   llvm::Type *PtrsTy = llvm::StructType::get(RecordTy, CGM.VoidPtrTy, nullptr);
1439   Ptrs = Builder.CreateBitCast(Ptrs, PtrsTy->getPointerTo());
1440   llvm::Value *Rec = Builder.CreateStructGEP(Ptrs, 0);
1441   Rec = Builder.CreateLoad(Rec);
1442   llvm::Value *Code = Builder.CreateLoad(Rec);
1443   Code = Builder.CreateZExt(Code, CGM.IntPtrTy);
1444   // FIXME: Change landing pads to produce {i32, i32} and make the exception
1445   // slot an i32.
1446   Code = Builder.CreateIntToPtr(Code, CGM.VoidPtrTy);
1447   Builder.CreateStore(Code, getExceptionSlot());
1448 }
1449 
1450 llvm::Value *CodeGenFunction::EmitSEHExceptionInfo() {
1451   // Sema should diagnose calling this builtin outside of a filter context, but
1452   // don't crash if we screw up.
1453   if (!SEHPointersDecl)
1454     return llvm::UndefValue::get(Int8PtrTy);
1455   return Builder.CreateLoad(GetAddrOfLocalVar(SEHPointersDecl));
1456 }
1457 
1458 llvm::Value *CodeGenFunction::EmitSEHExceptionCode() {
1459   // If we're in a landing pad or filter function, the exception slot contains
1460   // the code.
1461   assert(ExceptionSlot);
1462   llvm::Value *Code =
1463       Builder.CreatePtrToInt(getExceptionFromSlot(), CGM.IntPtrTy);
1464   return Builder.CreateTrunc(Code, CGM.Int32Ty);
1465 }
1466 
1467 llvm::Value *CodeGenFunction::EmitSEHAbnormalTermination() {
1468   // Load from the abnormal termination slot. It will be uninitialized outside
1469   // of __finally blocks, which we should warn or error on.
1470   llvm::Value *IsEH = Builder.CreateLoad(getAbnormalTerminationSlot());
1471   return Builder.CreateZExt(IsEH, Int32Ty);
1472 }
1473 
1474 void CodeGenFunction::EnterSEHTryStmt(const SEHTryStmt &S, SEHFinallyInfo &FI) {
1475   if (S.getFinallyHandler()) {
1476     // Push a cleanup for __finally blocks.
1477     EHStack.pushCleanup<PerformSEHFinally>(NormalAndEHCleanup, &FI);
1478     return;
1479   }
1480 
1481   // Otherwise, we must have an __except block.
1482   SEHExceptStmt *Except = S.getExceptHandler();
1483   assert(Except);
1484   EHCatchScope *CatchScope = EHStack.pushCatch(1);
1485 
1486   // If the filter is known to evaluate to 1, then we can use the clause "catch
1487   // i8* null".
1488   llvm::Constant *C =
1489       CGM.EmitConstantExpr(Except->getFilterExpr(), getContext().IntTy, this);
1490   if (C && C->isOneValue()) {
1491     CatchScope->setCatchAllHandler(0, createBasicBlock("__except"));
1492     return;
1493   }
1494 
1495   // In general, we have to emit an outlined filter function. Use the function
1496   // in place of the RTTI typeinfo global that C++ EH uses.
1497   CodeGenFunction FilterCGF(CGM, /*suppressNewContext=*/true);
1498   llvm::Function *FilterFunc =
1499       FilterCGF.GenerateSEHFilterFunction(*this, *Except);
1500   llvm::Constant *OpaqueFunc =
1501       llvm::ConstantExpr::getBitCast(FilterFunc, Int8PtrTy);
1502   CatchScope->setHandler(0, OpaqueFunc, createBasicBlock("__except"));
1503 }
1504 
1505 void CodeGenFunction::ExitSEHTryStmt(const SEHTryStmt &S, SEHFinallyInfo &FI) {
1506   // Just pop the cleanup if it's a __finally block.
1507   if (const SEHFinallyStmt *Finally = S.getFinallyHandler()) {
1508     PopCleanupBlock();
1509     assert(FI.ContBB && "did not emit normal cleanup");
1510 
1511     // Emit the code into FinallyBB.
1512     CGBuilderTy::InsertPoint SavedIP = Builder.saveIP();
1513     Builder.SetInsertPoint(FI.FinallyBB);
1514     EmitStmt(Finally->getBlock());
1515 
1516     if (HaveInsertPoint()) {
1517       if (FI.ResumeBB) {
1518         llvm::Value *IsEH = Builder.CreateLoad(getAbnormalTerminationSlot(),
1519                                                "abnormal.termination");
1520         IsEH = Builder.CreateICmpEQ(IsEH, llvm::ConstantInt::get(Int8Ty, 0));
1521         Builder.CreateCondBr(IsEH, FI.ContBB, FI.ResumeBB);
1522       } else {
1523         // There was nothing exceptional in the try body, so we only have normal
1524         // control flow.
1525         Builder.CreateBr(FI.ContBB);
1526       }
1527     }
1528 
1529     Builder.restoreIP(SavedIP);
1530 
1531     return;
1532   }
1533 
1534   // Otherwise, we must have an __except block.
1535   const SEHExceptStmt *Except = S.getExceptHandler();
1536   assert(Except && "__try must have __finally xor __except");
1537   EHCatchScope &CatchScope = cast<EHCatchScope>(*EHStack.begin());
1538 
1539   // Don't emit the __except block if the __try block lacked invokes.
1540   // TODO: Model unwind edges from instructions, either with iload / istore or
1541   // a try body function.
1542   if (!CatchScope.hasEHBranches()) {
1543     CatchScope.clearHandlerBlocks();
1544     EHStack.popCatch();
1545     return;
1546   }
1547 
1548   // The fall-through block.
1549   llvm::BasicBlock *ContBB = createBasicBlock("__try.cont");
1550 
1551   // We just emitted the body of the __try; jump to the continue block.
1552   if (HaveInsertPoint())
1553     Builder.CreateBr(ContBB);
1554 
1555   // Check if our filter function returned true.
1556   emitCatchDispatchBlock(*this, CatchScope);
1557 
1558   // Grab the block before we pop the handler.
1559   llvm::BasicBlock *ExceptBB = CatchScope.getHandler(0).Block;
1560   EHStack.popCatch();
1561 
1562   EmitBlockAfterUses(ExceptBB);
1563 
1564   // Emit the __except body.
1565   EmitStmt(Except->getBlock());
1566 
1567   if (HaveInsertPoint())
1568     Builder.CreateBr(ContBB);
1569 
1570   EmitBlock(ContBB);
1571 }
1572 
1573 void CodeGenFunction::EmitSEHLeaveStmt(const SEHLeaveStmt &S) {
1574   // If this code is reachable then emit a stop point (if generating
1575   // debug info). We have to do this ourselves because we are on the
1576   // "simple" statement path.
1577   if (HaveInsertPoint())
1578     EmitStopPoint(&S);
1579 
1580   assert(!SEHTryEpilogueStack.empty() &&
1581          "sema should have rejected this __leave");
1582   EmitBranchThroughCleanup(*SEHTryEpilogueStack.back());
1583 }
1584