Lines Matching refs:llvm

20 #include "llvm/IR/CallSite.h"
21 #include "llvm/IR/Intrinsics.h"
26 static llvm::Constant *getAllocateExceptionFn(CodeGenModule &CGM) {
29 llvm::FunctionType *FTy =
30 llvm::FunctionType::get(CGM.Int8PtrTy, CGM.SizeTy, /*IsVarArgs=*/false);
35 static llvm::Constant *getFreeExceptionFn(CodeGenModule &CGM) {
38 llvm::FunctionType *FTy =
39 llvm::FunctionType::get(CGM.VoidTy, CGM.Int8PtrTy, /*IsVarArgs=*/false);
44 static llvm::Constant *getThrowFn(CodeGenModule &CGM) {
48 llvm::Type *Args[3] = { CGM.Int8PtrTy, CGM.Int8PtrTy, CGM.Int8PtrTy };
49 llvm::FunctionType *FTy =
50 llvm::FunctionType::get(CGM.VoidTy, Args, /*IsVarArgs=*/false);
55 static llvm::Constant *getReThrowFn(CodeGenModule &CGM) {
58 llvm::FunctionType *FTy =
59 llvm::FunctionType::get(CGM.VoidTy, /*IsVarArgs=*/false);
64 static llvm::Constant *getGetExceptionPtrFn(CodeGenModule &CGM) {
67 llvm::FunctionType *FTy =
68 llvm::FunctionType::get(CGM.Int8PtrTy, CGM.Int8PtrTy, /*IsVarArgs=*/false);
73 static llvm::Constant *getBeginCatchFn(CodeGenModule &CGM) {
76 llvm::FunctionType *FTy =
77 llvm::FunctionType::get(CGM.Int8PtrTy, CGM.Int8PtrTy, /*IsVarArgs=*/false);
82 static llvm::Constant *getEndCatchFn(CodeGenModule &CGM) {
85 llvm::FunctionType *FTy =
86 llvm::FunctionType::get(CGM.VoidTy, /*IsVarArgs=*/false);
91 static llvm::Constant *getUnexpectedFn(CodeGenModule &CGM) {
94 llvm::FunctionType *FTy =
95 llvm::FunctionType::get(CGM.VoidTy, CGM.Int8PtrTy, /*IsVarArgs=*/false);
100 static llvm::Constant *getTerminateFn(CodeGenModule &CGM) {
103 llvm::FunctionType *FTy =
104 llvm::FunctionType::get(CGM.VoidTy, /*IsVarArgs=*/false);
119 static llvm::Constant *getCatchallRethrowFn(CodeGenModule &CGM,
121 llvm::FunctionType *FTy =
122 llvm::FunctionType::get(CGM.VoidTy, CGM.Int8PtrTy, /*IsVarArgs=*/false);
234 static llvm::Constant *getPersonalityFn(CodeGenModule &CGM,
236 llvm::Constant *Fn =
237 CGM.CreateRuntimeFunction(llvm::FunctionType::get(CGM.Int32Ty, true),
242 static llvm::Constant *getOpaquePersonalityFn(CodeGenModule &CGM,
244 llvm::Constant *Fn = getPersonalityFn(CGM, Personality);
245 return llvm::ConstantExpr::getBitCast(Fn, CGM.Int8PtrTy);
250 static bool PersonalityHasOnlyCXXUses(llvm::Constant *Fn) {
251 for (llvm::User *U : Fn->users()) {
253 if (llvm::ConstantExpr *CE = dyn_cast<llvm::ConstantExpr>(U)) {
254 if (CE->getOpcode() != llvm::Instruction::BitCast) return false;
261 llvm::LandingPadInst *LPI = dyn_cast<llvm::LandingPadInst>(U);
267 llvm::Value *Val = LPI->getClause(I)->stripPointerCasts();
270 if (llvm::GlobalVariable *GV = dyn_cast<llvm::GlobalVariable>(Val))
277 llvm::Constant *CVal = cast<llvm::Constant>(Val);
278 for (llvm::User::op_iterator
280 if (llvm::GlobalVariable *GV =
281 cast<llvm::GlobalVariable>((*II)->stripPointerCasts()))
316 llvm::Function *Fn = getModule().getFunction(ObjCXX.PersonalityFn);
326 llvm::Constant *CXXFn = getPersonalityFn(*this, CXX);
337 static llvm::Constant *getCatchAllValue(CodeGenFunction &CGF) {
338 // Possibly we should use @llvm.eh.catch.all.value here.
339 return llvm::ConstantPointerNull::get(CGF.Int8PtrTy);
346 llvm::Value *exn;
347 FreeException(llvm::Value *exn) : exn(exn) {}
359 llvm::Value *addr) {
367 llvm::Type *ty = CGF.ConvertTypeForMem(e->getType())->getPointerTo();
368 llvm::Value *typedAddr = CGF.Builder.CreateBitCast(addr, ty);
381 CGF.DeactivateCleanupBlock(cleanup, cast<llvm::Instruction>(typedAddr));
384 llvm::Value *CodeGenFunction::getExceptionSlot() {
390 llvm::Value *CodeGenFunction::getEHSelectorSlot() {
396 llvm::Value *CodeGenFunction::getExceptionFromSlot() {
400 llvm::Value *CodeGenFunction::getSelectorFromSlot() {
413 ArrayRef<llvm::Value*>());
438 llvm::Type *SizeTy = ConvertType(getContext().getSizeType());
441 llvm::Constant *AllocExceptionFn = getAllocateExceptionFn(CGM);
442 llvm::CallInst *ExceptionPtr =
444 llvm::ConstantInt::get(SizeTy, TypeSize),
450 llvm::Constant *TypeInfo = CGM.GetAddrOfRTTIDescriptor(ThrowType,
455 llvm::Constant *Dtor = nullptr;
461 Dtor = llvm::ConstantExpr::getBitCast(Dtor, Int8PtrTy);
464 if (!Dtor) Dtor = llvm::Constant::getNullValue(Int8PtrTy);
466 llvm::Value *args[] = { ExceptionPtr, TypeInfo, Dtor };
505 llvm::Value *EHType = CGM.GetAddrOfRTTIDescriptor(ExceptType,
515 llvm::BasicBlock *dispatchBlock = filterScope.getCachedEHDispatchBlock();
528 llvm::Value *selector = CGF.getSelectorFromSlot();
529 llvm::BasicBlock *unexpectedBB = CGF.createBasicBlock("ehspec.unexpected");
531 llvm::Value *zero = CGF.Builder.getInt32(0);
532 llvm::Value *failsFilter =
543 llvm::Value *exn = CGF.getExceptionFromSlot();
596 llvm::BasicBlock *Handler = createBasicBlock("catch");
607 llvm::Constant *TypeInfo = nullptr;
620 llvm::BasicBlock *
630 llvm::BasicBlock *dispatchBlock = scope.getCachedEHDispatchBlock();
680 llvm::BasicBlock *CodeGenFunction::getInvokeDestImpl() {
689 llvm::BasicBlock *LP = EHStack.begin()->getCachedLandingPad();
706 llvm::BasicBlock *CodeGenFunction::EmitLandingPad() {
717 if (llvm::BasicBlock *lpad = innermostEHScope.getCachedLandingPad())
730 llvm::BasicBlock *lpad = createBasicBlock("lpad");
733 llvm::LandingPadInst *LPadInst =
734 Builder.CreateLandingPad(llvm::StructType::get(Int8PtrTy, Int32Ty, NULL),
737 llvm::Value *LPadExn = Builder.CreateExtractValue(LPadInst, 0);
739 llvm::Value *LPadSel = Builder.CreateExtractValue(LPadInst, 1);
751 SmallVector<llvm::Value*, 4> filterTypes;
752 llvm::SmallPtrSet<llvm::Value*, 4> catchTypes;
816 SmallVector<llvm::Constant*, 8> Filters;
817 llvm::ArrayType *AType =
818 llvm::ArrayType::get(!filterTypes.empty() ?
823 Filters.push_back(cast<llvm::Constant>(filterTypes[i]));
824 llvm::Constant *FilterArray = llvm::ConstantArray::get(AType, Filters);
880 static llvm::Value *CallBeginCatch(CodeGenFunction &CGF,
881 llvm::Value *Exn,
883 llvm::CallInst *call =
895 llvm::Value *ParamAddr,
898 llvm::Value *Exn = CGF.getExceptionFromSlot();
902 llvm::Type *LLVMCatchTy = CGF.ConvertTypeForMem(CatchType);
911 llvm::Value *AdjustedExn = CallBeginCatch(CGF, Exn, EndCatchMightThrow);
945 llvm::Type *PtrTy =
946 cast<llvm::PointerType>(LLVMCatchTy)->getElementType();
949 llvm::Value *ExnPtrTmp = CGF.CreateTempAlloca(PtrTy, "exn.byref.tmp");
950 llvm::Value *Casted = CGF.Builder.CreateBitCast(AdjustedExn, PtrTy);
958 llvm::Value *ExnCast =
967 llvm::Value *AdjustedExn = CallBeginCatch(CGF, Exn, false);
972 llvm::Value *CastExn =
995 llvm::Type *PtrTy = LLVMCatchTy->getPointerTo(0); // addrspace 0 ok
996 llvm::Value *Cast = CGF.Builder.CreateBitCast(AdjustedExn, PtrTy);
1007 llvm::Value *ExnLoad = CGF.EmitLoadOfScalar(srcLV, Loc);
1019 llvm::Type *PtrTy = LLVMCatchTy->getPointerTo(0); // addrspace 0 ok
1025 llvm::Value *rawAdjustedExn = CallBeginCatch(CGF, Exn, true);
1026 llvm::Value *adjustedExn = CGF.Builder.CreateBitCast(rawAdjustedExn, PtrTy);
1033 llvm::CallInst *rawAdjustedExn =
1037 llvm::Value *adjustedExn = CGF.Builder.CreateBitCast(rawAdjustedExn, PtrTy);
1094 llvm::Value *Exn = CGF.getExceptionFromSlot();
1109 llvm::BasicBlock *dispatchBlock = catchScope.getCachedEHDispatchBlock();
1124 llvm::Value *llvm_eh_typeid_for =
1125 CGF.CGM.getIntrinsic(llvm::Intrinsic::eh_typeid_for);
1128 llvm::Value *selector = CGF.getSelectorFromSlot();
1135 llvm::Value *typeValue = handler.Type;
1141 llvm::BasicBlock *nextBlock;
1162 llvm::CallInst *typeIndex =
1166 llvm::Value *matchesTypeIndex =
1211 llvm::BasicBlock *ContBB = createBasicBlock("try.cont");
1232 llvm::BasicBlock *CatchBlock = Handlers[I-1].Block;
1282 llvm::Value *ForEHVar;
1283 llvm::Value *EndCatchFn;
1284 CallEndCatchForFinally(llvm::Value *ForEHVar, llvm::Value *EndCatchFn)
1288 llvm::BasicBlock *EndCatchBB = CGF.createBasicBlock("finally.endcatch");
1289 llvm::BasicBlock *CleanupContBB =
1292 llvm::Value *ShouldEndCatch =
1303 llvm::Value *ForEHVar;
1304 llvm::Value *EndCatchFn;
1305 llvm::Value *RethrowFn;
1306 llvm::Value *SavedExnVar;
1308 PerformFinally(const Stmt *Body, llvm::Value *ForEHVar,
1309 llvm::Value *EndCatchFn,
1310 llvm::Value *RethrowFn, llvm::Value *SavedExnVar)
1322 llvm::Value *SavedCleanupDest =
1332 llvm::BasicBlock *RethrowBB = CGF.createBasicBlock("finally.rethrow");
1333 llvm::BasicBlock *ContBB = CGF.createBasicBlock("finally.cont");
1335 llvm::Value *ShouldRethrow =
1376 llvm::Constant *beginCatchFn,
1377 llvm::Constant *endCatchFn,
1378 llvm::Constant *rethrowFn) {
1391 llvm::FunctionType *rethrowFnTy =
1392 cast<llvm::FunctionType>(
1393 cast<llvm::PointerType>(rethrowFn->getType())->getElementType());
1425 llvm::BasicBlock *catchBB = CGF.createBasicBlock("finally.catchall");
1433 llvm::BasicBlock *catchBB = catchScope.getHandler(0).Block;
1444 llvm::Value *exn = nullptr;
1486 static llvm::Constant *getClangCallTerminateFn(CodeGenModule &CGM) {
1487 llvm::FunctionType *fnTy =
1488 llvm::FunctionType::get(CGM.VoidTy, CGM.Int8PtrTy, /*IsVarArgs=*/false);
1489 llvm::Constant *fnRef =
1492 llvm::Function *fn = dyn_cast<llvm::Function>(fnRef);
1500 fn->addFnAttr(llvm::Attribute::NoInline);
1504 fn->setLinkage(llvm::Function::LinkOnceODRLinkage);
1505 fn->setVisibility(llvm::Function::HiddenVisibility);
1508 llvm::BasicBlock *entry =
1509 llvm::BasicBlock::Create(CGM.getLLVMContext(), "", fn);
1513 llvm::Value *exn = &*fn->arg_begin();
1516 llvm::CallInst *catchCall = builder.CreateCall(getBeginCatchFn(CGM), exn);
1521 llvm::CallInst *termCall = builder.CreateCall(getTerminateFn(CGM));
1533 llvm::BasicBlock *CodeGenFunction::getTerminateLandingPad() {
1545 llvm::LandingPadInst *LPadInst =
1546 Builder.CreateLandingPad(llvm::StructType::get(Int8PtrTy, Int32Ty, NULL),
1550 llvm::CallInst *terminateCall;
1553 llvm::Value *exn = Builder.CreateExtractValue(LPadInst, 0);
1567 llvm::BasicBlock *CodeGenFunction::getTerminateHandler() {
1577 llvm::CallInst *terminateCall;
1580 llvm::Value *exn = getExceptionFromSlot();
1594 llvm::BasicBlock *CodeGenFunction::getEHResumeBlock(bool isCleanup) {
1618 llvm::Value *Exn = getExceptionFromSlot();
1619 llvm::Value *Sel = getSelectorFromSlot();
1621 llvm::Type *LPadType = llvm::StructType::get(Exn->getType(),
1623 llvm::Value *LPadVal = llvm::UndefValue::get(LPadType);