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