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