Lines Matching full:llvm
1 //===--- CGDecl.cpp - Emit LLVM Code for declarations ---------------------===//
3 // The LLVM Compiler Infrastructure
10 // This contains code to emit Decl nodes as LLVM code.
26 #include "llvm/IR/DataLayout.h"
27 #include "llvm/IR/GlobalVariable.h"
28 #include "llvm/IR/Intrinsics.h"
29 #include "llvm/IR/Type.h"
128 llvm::GlobalValue::LinkageTypes Linkage =
175 llvm::Constant *
178 llvm::GlobalValue::LinkageTypes Linkage) {
189 llvm::Type *LTy = CGM.getTypes().ConvertTypeForMem(Ty);
192 llvm::GlobalVariable *GV =
193 new llvm::GlobalVariable(CGM.getModule(), LTy,
196 llvm::GlobalVariable::NotThreadLocal,
206 GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
208 GV->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass);
214 llvm::PointerType *PTy = llvm::PointerType::get(LTy, ExpectedAddrSpace);
215 return llvm::ConstantExpr::getAddrSpaceCast(GV, PTy);
233 llvm::GlobalVariable *
235 llvm::GlobalVariable *GV) {
236 llvm::Constant *Init = CGM.EmitConstantInit(D, this);
256 // in the LLVM type system.)
258 llvm::GlobalVariable *OldGV = GV;
260 GV = new llvm::GlobalVariable(CGM.getModule(), Init->getType(),
272 llvm::Constant *NewPtrForOldDecl =
273 llvm::ConstantExpr::getBitCast(GV, OldGV->getType());
294 llvm::GlobalValue::LinkageTypes Linkage) {
295 llvm::Value *&DMEntry = LocalDeclMap[&D];
301 llvm::Constant *addr =
319 llvm::Type *expectedType = addr->getType();
321 llvm::GlobalVariable *var =
322 cast<llvm::GlobalVariable>(addr->stripPointerCasts());
343 llvm::Constant *castedAddr =
344 llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(var, expectedType);
361 DestroyObject(llvm::Value *addr, QualType type,
367 llvm::Value *addr;
382 DestroyNRVOVariable(llvm::Value *addr,
384 llvm::Value *NRVOFlag)
388 llvm::Value *NRVOFlag;
389 llvm::Value *Loc;
395 llvm::BasicBlock *SkipDtorBB = nullptr;
398 llvm::BasicBlock *RunDtorBB = CGF.createBasicBlock("nrvo.unused");
400 llvm::Value *DidNRVO = CGF.Builder.CreateLoad(NRVOFlag, "nrvo.val");
415 llvm::Value *Stack;
416 CallStackRestore(llvm::Value *Stack) : Stack(Stack) {}
418 llvm::Value *V = CGF.Builder.CreateLoad(Stack);
419 llvm::Value *F = CGF.CGM.getIntrinsic(llvm::Intrinsic::stackrestore);
433 llvm::Value *value = CGF.EmitLoadOfScalar(CGF.EmitDeclRefLValue(&DRE),
440 llvm::Constant *CleanupFn;
444 CallCleanupFunction(llvm::Constant *CleanupFn, const CGFunctionInfo *Info,
453 llvm::Value *Addr = CGF.EmitDeclRefLValue(&DRE).getAddress();
462 llvm::Value *Arg =
472 /// A cleanup to call @llvm.lifetime.end.
474 llvm::Value *Addr;
475 llvm::Value *Size;
477 CallLifetimeEnd(llvm::Value *addr, llvm::Value *size)
481 llvm::Value *castAddr = CGF.Builder.CreateBitCast(Addr, CGF.Int8PtrTy);
492 llvm::Value *addr,
571 llvm::Value *value = EmitScalarExpr(init);
606 llvm::PointerType *ty
607 = cast<llvm::PointerType>(tempLV.getAddress()->getType());
608 ty = cast<llvm::PointerType>(ty->getElementType());
610 llvm::Value *zero = llvm::ConstantPointerNull::get(ty);
622 llvm::Value *value = nullptr;
663 llvm::Value *oldValue = EmitLoadOfScalar(lvalue, init->getExprLoc());
673 void CodeGenFunction::EmitScalarInit(llvm::Value *init, LValue lvalue) {
706 static bool canEmitInitWithFewStoresAfterMemset(llvm::Constant *Init,
709 if (isa<llvm::ConstantAggregateZero>(Init) ||
710 isa<llvm::ConstantPointerNull>(Init) ||
711 isa<llvm::UndefValue>(Init))
713 if (isa<llvm::ConstantInt>(Init) || isa<llvm::ConstantFP>(Init) ||
714 isa<llvm::ConstantVector>(Init) || isa<llvm::BlockAddress>(Init) ||
715 isa<llvm::ConstantExpr>(Init))
719 if (isa<llvm::ConstantArray>(Init) || isa<llvm::ConstantStruct>(Init)) {
721 llvm::Constant *Elt = cast<llvm::Constant>(Init->getOperand(i));
728 if (llvm::ConstantDataSequential *CDS =
729 dyn_cast<llvm::ConstantDataSequential>(Init)) {
731 llvm::Constant *Elt = CDS->getElementAsConstant(i);
745 static void emitStoresForInitAfterMemset(llvm::Constant *Init, llvm::Value *Loc,
747 assert(!Init->isNullValue() && !isa<llvm::UndefValue>(Init) &&
750 if (isa<llvm::ConstantInt>(Init) || isa<llvm::ConstantFP>(Init) ||
751 isa<llvm::ConstantVector>(Init) || isa<llvm::BlockAddress>(Init) ||
752 isa<llvm::ConstantExpr>(Init)) {
757 if (llvm::ConstantDataSequential *CDS =
758 dyn_cast<llvm::ConstantDataSequential>(Init)) {
760 llvm::Constant *Elt = CDS->getElementAsConstant(i);
763 if (!Elt->isNullValue() && !isa<llvm::UndefValue>(Elt))
770 assert((isa<llvm::ConstantStruct>(Init) || isa<llvm::ConstantArray>(Init)) &&
774 llvm::Constant *Elt = cast<llvm::Constant>(Init->getOperand(i));
777 if (!Elt->isNullValue() && !isa<llvm::UndefValue>(Elt))
788 static bool shouldUseMemSetPlusStoresToInitialize(llvm::Constant *Init,
791 if (isa<llvm::ConstantAggregateZero>(Init)) return true;
804 /// Should we use the LLVM lifetime intrinsics for the given local variable?
846 llvm::Value *DeclPtr;
870 EmitStaticVarDecl(D, llvm::GlobalValue::InternalLinkage);
883 llvm::Type *LTy = ConvertTypeForMem(Ty);
896 llvm::Value *Zero = Builder.getFalse();
897 llvm
910 llvm::AllocaInst *Alloc = CreateTempAlloca(LTy);
924 llvm::Value *sizeV = llvm::ConstantInt::get(Int64Ty, size);
927 llvm::Value *castAddr = Builder.CreateBitCast(Alloc, Int8PtrTy);
939 llvm::Value *Stack = CreateTempAlloca(Int8PtrTy, "saved_stack");
941 llvm::Value *F = CGM.getIntrinsic(llvm::Intrinsic::stacksave);
942 llvm::Value *V = Builder.CreateCall(F);
953 llvm::Value *elementCount;
957 llvm::Type *llvmTy = ConvertTypeForMem(elementType);
960 llvm::AllocaInst *vla = Builder.CreateAlloca(llvmTy, elementCount, "vla");
966 llvm::Value *&DMEntry = LocalDeclMap[&D];
1084 llvm::Value *Loc =
1087 llvm::Constant *constant = nullptr;
1110 llvm::Value *SizeVal =
1111 llvm::ConstantInt::get(IntPtrTy,
1114 llvm::Type *BP = Int8PtrTy;
1122 Builder.CreateMemSet(Loc, llvm::ConstantInt::get(Int8Ty, 0), SizeVal,
1125 if (!constant->isNullValue() && !isa<llvm::UndefValue>(constant)) {
1133 llvm::GlobalVariable *GV =
1134 new llvm::GlobalVariable(CGM.getModule(), constant->getType(), true,
1135 llvm::GlobalValue::PrivateLinkage,
1140 llvm::Value *SrcPtr = GV;
1157 /// to the LLVM mapping of the variable's type
1208 llvm::Value *addr = emission.getObjectAddress(*this);
1270 // Make sure we call @llvm.lifetime.end. This needs to happen
1292 llvm::Constant *F = CGM.GetAddrOfFunction(FD);
1322 llvm::Value *addr, QualType type) {
1332 llvm::Value *addr, QualType type) {
1340 void CodeGenFunction::pushDestroy(CleanupKind cleanupKind, llvm::Value *addr,
1347 void CodeGenFunction::pushStackRestore(CleanupKind Kind, llvm::Value *SPMem) {
1352 CleanupKind cleanupKind, llvm::Value *addr, QualType type,
1382 void CodeGenFunction::emitDestroy(llvm::Value *addr, QualType type,
1389 llvm::Value *begin = addr;
1390 llvm::Value *length = emitArrayLength(arrayType, type, begin);
1396 if (llvm::ConstantInt *constLength = dyn_cast<llvm::ConstantInt>(length)) {
1402 llvm::Value *end = Builder.CreateInBoundsGEP(begin, length);
1417 void CodeGenFunction::emitArrayDestroy(llvm::Value *begin,
1418 llvm::Value *end,
1427 llvm::BasicBlock *bodyBB = createBasicBlock("arraydestroy.body");
1428 llvm::BasicBlock *doneBB = createBasicBlock("arraydestroy.done");
1431 llvm::Value *isEmpty = Builder.CreateICmpEQ(begin, end,
1437 llvm::BasicBlock *entryBB = Builder.GetInsertBlock();
1439 llvm::PHINode *elementPast =
1444 llvm::Value *negativeOne = llvm::ConstantInt::get(SizeTy, -1, true);
1445 llvm::Value *element = Builder.CreateInBoundsGEP(elementPast, negativeOne,
1458 llvm::Value *done = Builder.CreateICmpEQ(element, begin, "arraydestroy.done");
1469 llvm::Value *begin, llvm::Value *end,
1482 llvm::Value *zero = llvm::ConstantInt::get(CGF.SizeTy, arrayDepth+1);
1484 SmallVector<llvm::Value*,4> gepIndices(arrayDepth, zero);
1501 llvm::Value *ArrayBegin;
1502 llvm::Value *ArrayEnd;
1506 RegularPartialArrayDestroy(llvm::Value *arrayBegin, llvm::Value *arrayEnd,
1522 llvm::Value *ArrayBegin;
1523 llvm::Value *ArrayEndPointer;
1527 IrregularPartialArrayDestroy(llvm::Value *arrayBegin,
1528 llvm::Value *arrayEndPointer,
1535 llvm::Value *arrayEnd = CGF.Builder.CreateLoad(ArrayEndPointer);
1548 void CodeGenFunction::pushIrregularPartialArrayCleanup(llvm::Value *arrayBegin,
1549 llvm::Value *arrayEndPointer,
1563 void CodeGenFunction::pushRegularPartialArrayCleanup(llvm::Value *arrayBegin,
1564 llvm::Value *arrayEnd,
1572 /// Lazily declare the @llvm.lifetime.start intrinsic.
1573 llvm::Constant *CodeGenModule::getLLVMLifetimeStartFn() {
1575 LifetimeStartFn = llvm::Intrinsic::getDeclaration(&getModule(),
1576 llvm::Intrinsic::lifetime_start);
1580 /// Lazily declare the @llvm.lifetime.end intrinsic.
1581 llvm::Constant *CodeGenModule::getLLVMLifetimeEndFn() {
1583 LifetimeEndFn = llvm::Intrinsic::getDeclaration(&getModule(),
1584 llvm::Intrinsic::lifetime_end);
1594 ConsumeARCParameter(llvm::Value *param,
1598 llvm::Value *Param;
1609 void CodeGenFunction::EmitParmDecl(const VarDecl &D, llvm::Value *Arg,
1624 llvm::Value *LocalAddr = nullptr;
1627 llvm::AllocaInst *Alloc = CreateTempAlloca(ConvertTypeForMem(Ty),
1647 llvm::Value *DeclPtr;
1654 unsigned AS = cast<llvm::PointerType>(Arg->getType())->getAddressSpace();
1655 llvm::Type *IRTy = ConvertTypeForMem(Ty)->getPointerTo(AS);
1667 llvm::AllocaInst *Alloc = CreateTempAlloca(ConvertTypeForMem(Ty),
1702 llvm::Value *Null = CGM.EmitNullConstant(D.getType());
1737 llvm::Value *&DMEntry = LocalDeclMap[&D];