Home | History | Annotate | Download | only in CodeGen

Lines Matching refs:CGF

337 static llvm::Constant *getCatchAllValue(CodeGenFunction &CGF) {
339 return llvm::ConstantPointerNull::get(CGF.Int8PtrTy);
348 void Emit(CodeGenFunction &CGF, Flags flags) override {
349 CGF.EmitNounwindRuntimeCall(getFreeExceptionFn(CGF.CGM), exn);
358 static void EmitAnyExprToExn(CodeGenFunction &CGF, const Expr *e,
362 CGF.pushFullExprCleanup<FreeException>(EHCleanup, addr);
363 EHScopeStack::stable_iterator cleanup = CGF.EHStack.stable_begin();
367 llvm::Type *ty = CGF.ConvertTypeForMem(e->getType())->getPointerTo();
368 llvm::Value *typedAddr = CGF.Builder.CreateBitCast(addr, ty);
377 CGF.EmitAnyExprToMem(e, typedAddr, e->getType().getQualifiers(),
381 CGF.DeactivateCleanupBlock(cleanup, cast<llvm::Instruction>(typedAddr));
513 static void emitFilterDispatchBlock(CodeGenFunction &CGF,
522 CGF.EmitBlockAfterUses(dispatchBlock);
528 llvm::Value *selector = CGF.getSelectorFromSlot();
529 llvm::BasicBlock *unexpectedBB = CGF.createBasicBlock("ehspec.unexpected");
531 llvm::Value *zero = CGF.Builder.getInt32(0);
533 CGF.Builder.CreateICmpSLT(selector, zero, "ehspec.fails");
534 CGF.Builder.CreateCondBr(failsFilter, unexpectedBB, CGF.getEHResumeBlock(false));
536 CGF.EmitBlock(unexpectedBB);
543 llvm::Value *exn = CGF.getExceptionFromSlot();
544 CGF.EmitRuntimeCall(getUnexpectedFn(CGF.CGM), exn)
546 CGF.Builder.CreateUnreachable();
865 void Emit(CodeGenFunction &CGF, Flags flags) override {
867 CGF.EmitNounwindRuntimeCall(getEndCatchFn(CGF.CGM));
871 CGF.EmitRuntimeCallOrInvoke(getEndCatchFn(CGF.CGM));
880 static llvm::Value *CallBeginCatch(CodeGenFunction &CGF,
884 CGF.EmitNounwindRuntimeCall(getBeginCatchFn(CGF.CGM), Exn);
886 CGF.EHStack.pushCleanup<CallEndCatch>(NormalAndEHCleanup, EndMightThrow);
893 static void InitCatchParam(CodeGenFunction &CGF,
898 llvm::Value *Exn = CGF.getExceptionFromSlot();
901 CGF.CGM.getContext().getCanonicalType(CatchParam.getType());
902 llvm::Type *LLVMCatchTy = CGF.ConvertTypeForMem(CatchType);
911 llvm::Value *AdjustedExn = CallBeginCatch(CGF, Exn, EndCatchMightThrow);
926 CGF.CGM.getTargetCodeGenInfo().getSizeOfUnwindException();
927 AdjustedExn = CGF.Builder.CreateConstGEP1_32(Exn, HeaderSize);
949 llvm::Value *ExnPtrTmp = CGF.CreateTempAlloca(PtrTy, "exn.byref.tmp");
950 llvm::Value *Casted = CGF.Builder.CreateBitCast(AdjustedExn, PtrTy);
951 CGF.Builder.CreateStore(Casted, ExnPtrTmp);
959 CGF.Builder.CreateBitCast(AdjustedExn, LLVMCatchTy, "exn.byref");
960 CGF.Builder.CreateStore(ExnCast, ParamAddr);
965 TypeEvaluationKind TEK = CGF.getEvaluationKind(CatchType);
967 llvm::Value *AdjustedExn = CallBeginCatch(CGF, Exn, false);
973 CGF.Builder.CreateBitCast(AdjustedExn, LLVMCatchTy, "exn.casted");
977 CastExn = CGF.EmitARCRetainNonBlock(CastExn);
983 CGF.Builder.CreateStore(CastExn, ParamAddr);
987 CGF.EmitARCInitWeak(ParamAddr, CastExn);
996 llvm::Value *Cast = CGF.Builder.CreateBitCast(AdjustedExn, PtrTy);
998 LValue srcLV = CGF.MakeNaturalAlignAddrLValue(Cast, CatchType);
999 LValue destLV = CGF.MakeAddrLValue(ParamAddr, CatchType,
1000 CGF.getContext().getDeclAlign(&CatchParam));
1003 CGF.EmitStoreOfComplex(CGF.EmitLoadOfComplex(srcLV, Loc), destLV,
1007 llvm::Value *ExnLoad = CGF.EmitLoadOfScalar(srcLV, Loc);
1008 CGF.EmitStoreOfScalar(ExnLoad, destLV, /*init*/ true);
1025 llvm::Value *rawAdjustedExn = CallBeginCatch(CGF, Exn, true);
1026 llvm::Value *adjustedExn = CGF.Builder.CreateBitCast(rawAdjustedExn, PtrTy);
1027 CGF.EmitAggregateCopy(ParamAddr, adjustedExn, CatchType);
1034 CGF.EmitNounwindRuntimeCall(getGetExceptionPtrFn(CGF.CGM), Exn);
1037 llvm::Value *adjustedExn = CGF.Builder.CreateBitCast(rawAdjustedExn, PtrTy);
1042 opaque(CGF, OpaqueValueExpr::findInCopyConstruct(copyExpr),
1043 CGF.MakeAddrLValue(adjustedExn, CatchParam.getType()));
1046 CGF.EHStack.pushTerminate();
1049 CharUnits Alignment = CGF.getContext().getDeclAlign(&CatchParam);
1050 CGF.EmitAggExpr(copyExpr,
1057 CGF.EHStack.popTerminate();
1063 CallBeginCatch(CGF, Exn, true);
1068 static void BeginCatch(CodeGenFunction &CGF, const CXXCatchStmt *S) {
1094 llvm::Value *Exn = CGF.getExceptionFromSlot();
1095 CallBeginCatch(CGF, Exn, true);
1100 CodeGenFunction::AutoVarEmission var = CGF.EmitAutoVarAlloca(*CatchParam);
1101 InitCatchParam(CGF, *CatchParam, var.getObjectAddress(CGF), S->getLocStart());
1102 CGF.EmitAutoVarCleanups(var);
1107 static void emitCatchDispatchBlock(CodeGenFunction &CGF,
1120 CGBuilderTy::InsertPoint savedIP = CGF.Builder.saveIP();
1121 CGF.EmitBlockAfterUses(dispatchBlock);
1125 CGF.CGM.getIntrinsic(llvm::Intrinsic::eh_typeid_for);
1128 llvm::Value *selector = CGF.getSelectorFromSlot();
1137 typeValue = CGF.Builder.CreateBitCast(typeValue, CGF.Int8PtrTy);
1146 nextBlock = CGF.getEHDispatchBlock(catchScope.getEnclosingEHScope());
1157 nextBlock = CGF.createBasicBlock("catch.fallthrough");
1163 CGF.Builder.CreateCall(llvm_eh_typeid_for, typeValue);
1167 CGF.Builder.CreateICmpEQ(selector, typeIndex, "matches");
1168 CGF.Builder.CreateCondBr(matchesTypeIndex, handler.Block, nextBlock);
1172 CGF.Builder.restoreIP(savedIP);
1176 CGF.EmitBlock(nextBlock);
1287 void Emit(CodeGenFunction &CGF, Flags flags) override {
1288 llvm::BasicBlock *EndCatchBB = CGF.createBasicBlock("finally.endcatch");
1290 CGF.createBasicBlock("finally.cleanup.cont");
1293 CGF.Builder.CreateLoad(ForEHVar, "finally.endcatch");
1294 CGF.Builder.CreateCondBr(ShouldEndCatch, EndCatchBB, CleanupContBB);
1295 CGF.EmitBlock(EndCatchBB);
1296 CGF.EmitRuntimeCallOrInvoke(EndCatchFn); // catch-all, so might throw
1297 CGF.EmitBlock(CleanupContBB);
1314 void Emit(CodeGenFunction &CGF, Flags flags) override {
1317 CGF.EHStack.pushCleanup<CallEndCatchForFinally>(NormalAndEHCleanup,
1323 CGF.Builder.CreateLoad(CGF.getNormalCleanupDestSlot(),
1327 CGF.EmitStmt(Body);
1331 if (CGF.HaveInsertPoint()) {
1332 llvm::BasicBlock *RethrowBB = CGF.createBasicBlock("finally.rethrow");
1333 llvm::BasicBlock *ContBB = CGF.createBasicBlock("finally.cont");
1336 CGF.Builder.CreateLoad(ForEHVar, "finally.shouldthrow");
1337 CGF.Builder.CreateCondBr(ShouldRethrow, RethrowBB, ContBB);
1339 CGF.EmitBlock(RethrowBB);
1341 CGF.EmitRuntimeCallOrInvoke(RethrowFn,
1342 CGF.Builder.CreateLoad(SavedExnVar));
1344 CGF.EmitRuntimeCallOrInvoke(RethrowFn);
1346 CGF.Builder.CreateUnreachable();
1348 CGF.EmitBlock(ContBB);
1351 CGF.Builder.CreateStore(SavedCleanupDest,
1352 CGF.getNormalCleanupDestSlot());
1359 CGBuilderTy::InsertPoint SavedIP = CGF.Builder.saveAndClearIP();
1360 CGF.PopCleanupBlock();
1361 CGF.Builder.restoreIP(SavedIP);
1366 CGF.EnsureInsertPoint();
1374 void CodeGenFunction::FinallyInfo::enter(CodeGenFunction &CGF,
1396 SavedExnVar = CGF.CreateTempAlloca(CGF.Int8PtrTy, "finally.exn");
1413 RethrowDest = CGF.getJumpDestInCurrentScope(CGF.getUnreachableBlock());
1416 ForEHVar = CGF.CreateTempAlloca(CGF.Builder.getInt1Ty(), "finally.for-eh");
1417 CGF.Builder.CreateStore(CGF.Builder.getFalse(), ForEHVar);
1420 CGF.EHStack.pushCleanup<PerformFinally>(NormalCleanup, body,
1425 llvm::BasicBlock *catchBB = CGF.createBasicBlock("finally.catchall");
1426 EHCatchScope *catchScope = CGF.EHStack.pushCatch(1);
1430 void CodeGenFunction::FinallyInfo::exit(CodeGenFunction &CGF) {
1432 EHCatchScope &catchScope = cast<EHCatchScope>(*CGF.EHStack.begin());
1435 CGF.popCatchScope();
1441 CGBuilderTy::InsertPoint savedIP = CGF.Builder.saveAndClearIP();
1442 CGF.EmitBlock(catchBB);
1448 exn = CGF.getExceptionFromSlot();
1449 CGF.EmitNounwindRuntimeCall(BeginCatchFn, exn);
1454 if (!exn) exn = CGF.getExceptionFromSlot();
1455 CGF.Builder.CreateStore(exn, SavedExnVar);
1459 CGF.Builder.CreateStore(CGF.Builder.getTrue(), ForEHVar);
1462 CGF.EmitBranchThroughCleanup(RethrowDest);
1464 CGF.Builder.restoreIP(savedIP);
1468 CGF.PopCleanupBlock();