Lines Matching full:llvm
1 //===---- CGBuiltin.cpp - Emit LLVM Code for builtins ---------------------===//
3 // The LLVM Compiler Infrastructure
10 // This contains code to emit Objective-C code as LLVM code.
24 #include "llvm/ADT/STLExtras.h"
25 #include "llvm/IR/CallSite.h"
26 #include "llvm/IR/DataLayout.h"
27 #include "llvm/IR/InlineAsm.h"
31 typedef llvm::PointerIntPair<llvm::Value*,1,bool> TryEmitResult;
41 static llvm::Constant *getNullForVariable(llvm::Value *addr) {
42 llvm::Type *type =
43 cast<llvm::PointerType>(addr->getType())->getElementType();
44 return llvm::ConstantPointerNull::get(cast<llvm::PointerType>(type));
48 llvm::Value *CodeGenFunction::EmitObjCStringLiteral(const ObjCStringLiteral *E)
50 llvm::Constant *C =
53 return llvm::ConstantExpr::getBitCast(C, ConvertType(E->getType()));
60 llvm::Value *
75 llvm::Value *Receiver = Runtime.GetClass(*this, ClassDecl);
90 llvm::Value *CodeGenFunction::EmitObjCCollectionLiteral(const Expr *E,
101 llvm::APInt APNumElements(Context.getTypeSize(Context.getSizeType()),
109 llvm::Value *Objects = CreateMemTemp(ElementArrayType, "objects");
110 llvm::Value *Keys = nullptr;
116 SmallVector<llvm::Value *, 16> NeededObjects;
131 llvm::Value *value = EmitScalarExpr(Rhs);
143 llvm::Value *keyValue = EmitScalarExpr(Key);
152 llvm::Value *valueValue = EmitScalarExpr(Value);
174 llvm::Value *Count =
175 llvm::ConstantInt::get(CGM.getTypes().ConvertType(ArgQT), NumElements);
186 llvm::Value *Receiver = Runtime.GetClass(*this, Class);
205 llvm::Value *CodeGenFunction::EmitObjCArrayLiteral(const ObjCArrayLiteral *E) {
209 llvm::Value *CodeGenFunction::EmitObjCDictionaryLiteral(
215 llvm::Value *CodeGenFunction::EmitObjCSelectorExpr(const ObjCSelectorExpr *E) {
223 llvm::Value *CodeGenFunction::EmitObjCProtocolExpr(const ObjCProtocolExpr *E) {
320 llvm::Value *Receiver = nullptr;
386 llvm::Value *selfAddr =
416 llvm::Value *selfAddr =
418 llvm::Value *newSelf = result.getScalarVal();
422 llvm::Type *selfTy =
423 cast<llvm::PointerType>(selfAddr->getType())->getElementType();
444 llvm::Value *self = CGF.LoadObjCSelf();
461 /// the LLVM function and sets the other context used by
471 llvm::Function *Fn = CGM.getObjCRuntime().GenerateMethod(OMD, CD);
498 static llvm::Value *emitARCRetainLoadOfScalar(CodeGenFunction &CGF,
521 llvm::Value *src =
529 llvm::Value *dest = CGF.Builder.CreateBitCast(CGF.ReturnValue, CGF.VoidPtrTy);
540 llvm::Value *fn = CGF.CGM.getObjCRuntime().GetGetStructFunction();
550 static bool hasUnalignedAtomics(llvm::Triple::ArchType arch) {
559 llvm::Triple::ArchType arch) {
719 llvm::Triple::ArchType arch =
747 llvm::Constant *AtomicHelperFn =
785 llvm::Value *returnAddr,
787 llvm::Constant *AtomicHelperFn) {
796 llvm::Value *ivarAddr =
805 llvm::Value *copyCppAtomicObjectFn =
818 llvm::Constant *AtomicHelperFn) {
852 llvm::Type *bitcastType =
853 llvm::Type::getIntNTy(getLLVMContext(),
858 llvm::Value *ivarAddr = LV.getAddress();
860 llvm::LoadInst *load = Builder.CreateLoad(ivarAddr, "load");
862 load->setAtomic(llvm::Unordered);
875 llvm::Value *getPropertyFn =
885 llvm::Value *cmd =
887 llvm::Value *self = Builder.CreateBitCast(LoadObjCSelf(), VoidPtrTy);
888 llvm::Value *ivarOffset =
900 llvm::Instruction *CallInstruction;
906 if (llvm::CallInst *call = dyn_cast<llvm::CallInst>(CallInstruction))
949 llvm::Value *value;
989 llvm::Value *ivarAddr = CGF.EmitLValueForIvar(CGF.TypeOfSelfObject(),
999 llvm::Value *argAddr = CGF.EmitLValue(&argRef).getAddress();
1004 llvm::Value *size =
1015 llvm::Value *copyStructFn = CGF.CGM.getObjCRuntime().GetSetStructFunction();
1029 llvm::Constant *AtomicHelperFn) {
1035 llvm::Value *ivarAddr =
1045 llvm::Value *argAddr = CGF.EmitLValue(&argRef).getAddress();
1052 llvm::Value *copyCppAtomicObjectFn =
1095 llvm::Constant *AtomicHelperFn) {
1120 llvm::Value *argAddr = LocalDeclMap[*setterMethod->param_begin()];
1124 llvm::Value *ivarAddr = ivarLValue.getAddress();
1128 llvm::Type *bitcastType =
1129 llvm::Type::getIntNTy(getLLVMContext(),
1138 llvm::Value *load = Builder.CreateLoad(argAddr);
1141 llvm::StoreInst *store = Builder.CreateStore(load, ivarAddr);
1143 store->setAtomic(llvm::Unordered);
1150 llvm::Value *setOptimizedPropertyFn = nullptr;
1151 llvm::Value *setPropertyFn = nullptr;
1173 llvm::Value *cmd =
1175 llvm::Value *self =
1177 llvm::Value *ivarOffset =
1179 llvm::Value *arg = LocalDeclMap[*setterMethod->param_begin()];
1276 llvm::Constant *AtomicHelperFn =
1291 llvm::Value *addr;
1296 DestroyIvar(llvm::Value *addr, const ObjCIvarDecl *ivar,
1313 llvm::Value *addr,
1315 llvm::Value *null = getNullForVariable(addr);
1323 llvm::Value *self = CGF.LoadObjCSelf();
1379 llvm::Value *SelfAsId =
1406 llvm::Value *CodeGenFunction::LoadObjCSelf() {
1422 llvm::Constant *EnumerationMutationFn =
1443 llvm::Value *StatePtr = CreateMemTemp(StateTy, "state.ptr");
1456 CGM.getContext().Selectors.getSelector(llvm::array_lengthof(II), &II[0]);
1460 llvm::APInt(32, NumItems),
1462 llvm::Value *ItemsPtr = CreateMemTemp(ItemsTy, "items.ptr");
1465 llvm::Value *Collection;
1493 llvm::Type *UnsignedLongLTy = ConvertType(getContext().UnsignedLongTy);
1494 llvm::Constant *Count = llvm::ConstantInt::get(UnsignedLongLTy, NumItems);
1505 llvm::Value *initialBufferLimit = CountRV.getScalarVal();
1507 llvm::BasicBlock *EmptyBB = createBasicBlock("forcoll.empty");
1508 llvm::BasicBlock *LoopInitBB = createBasicBlock("forcoll.loopinit");
1510 llvm::Value *zero = llvm::Constant::getNullValue(UnsignedLongLTy);
1527 llvm::Value *StateMutationsPtrPtr =
1529 llvm::Value *StateMutationsPtr = Builder.CreateLoad(StateMutationsPtrPtr,
1532 llvm::Value *initialMutations =
1537 llvm::BasicBlock *LoopBodyBB = createBasicBlock("forcoll.loopbody");
1541 llvm::PHINode *index = Builder.CreatePHI(UnsignedLongLTy, 3, "forcoll.index");
1545 llvm::PHINode *count = Builder.CreatePHI(UnsignedLongLTy, 3, "forcoll.count");
1554 llvm::Value *currentMutations
1557 llvm::BasicBlock *WasMutatedBB = createBasicBlock("forcoll.mutated");
1558 llvm::BasicBlock *WasNotMutatedBB = createBasicBlock("forcoll.notmutated");
1565 llvm::Value *V =
1603 llvm::Type *convertedElementType = ConvertType(elementType);
1608 llvm::Value *StateItemsPtr =
1610 llvm::Value *EnumStateItems =
1614 llvm::Value *CurrentItemPtr =
1616 llvm::Value *CurrentItem = Builder.CreateLoad(CurrentItemPtr);
1650 llvm
1653 llvm::Value *indexPlusOne
1654 = Builder.CreateAdd(index, llvm::ConstantInt::get(UnsignedLongLTy, 1));
1677 llvm::Value *refetchCount = CountRV.getScalarVal();
1692 llvm::Value *null = llvm::Constant::getNullValue(convertedElementType);
1722 llvm::Value *CodeGenFunction::EmitObjCProduceObject(QualType type,
1723 llvm::Value *value) {
1729 CallObjCRelease(llvm::Value *object) : object(object) {}
1730 llvm::Value *object;
1741 llvm::Value *CodeGenFunction::EmitObjCConsumeObject(QualType type,
1742 llvm::Value *object) {
1749 llvm::Value *CodeGenFunction::EmitObjCExtendObjectLifetime(QualType type,
1750 llvm::Value *value) {
1756 void CodeGenFunction::EmitARCIntrinsicUse(ArrayRef<llvm::Value*> values) {
1757 llvm::Constant *&fn = CGM.getARCEntrypoints().clang_arc_use;
1759 llvm::FunctionType *fnType =
1760 llvm::FunctionType::get(CGM.VoidTy, ArrayRef<llvm::Type*>(), true);
1770 static llvm::Constant *createARCRuntimeFunction(CodeGenModule &CGM,
1771 llvm::FunctionType *type,
1773 llvm::Constant *fn = CGM.CreateRuntimeFunction(type, fnName);
1775 if (llvm::Function *f = dyn_cast<llvm::Function>(fn)) {
1780 f->setLinkage(llvm::Function::ExternalWeakLinkage);
1784 f->addFnAttr(llvm::Attribute::NonLazyBind);
1794 static llvm::Value *emitARCValueOperation(CodeGenFunction &CGF,
1795 llvm::Value *value,
1796 llvm::Constant *&fn,
1799 if (isa<llvm::ConstantPointerNull>(value)) return value;
1802 llvm::FunctionType *fnType =
1803 llvm::FunctionType::get(CGF.Int8PtrTy, CGF.Int8PtrTy, false);
1808 llvm::Type *origType = value->getType();
1812 llvm::CallInst *call = CGF.EmitNounwindRuntimeCall(fn, value);
1822 static llvm::Value *emitARCLoadOperation(CodeGenFunction &CGF,
1823 llvm::Value *addr,
1824 llvm::Constant *&fn,
1827 llvm::FunctionType *fnType =
1828 llvm::FunctionType::get(CGF.Int8PtrTy, CGF.Int8PtrPtrTy, false);
1833 llvm::Type *origType = addr->getType();
1837 llvm::Value *result = CGF.EmitNounwindRuntimeCall(fn, addr);
1842 cast<llvm::PointerType>(origType)->getElementType());
1849 static llvm::Value *emitARCStoreOperation(CodeGenFunction &CGF,
1850 llvm::Value *addr,
1851 llvm::Value *value,
1852 llvm::Constant *&fn,
1855 assert(cast<llvm::PointerType>(addr->getType())->getElementType()
1859 llvm::Type *argTypes[] = { CGF.Int8PtrPtrTy, CGF.Int8PtrTy };
1861 llvm::FunctionType *fnType
1862 = llvm::FunctionType::get(CGF.Int8PtrTy, argTypes, false);
1866 llvm::Type *origType = value->getType();
1868 llvm::Value *args[] = {
1872 llvm::CallInst *result = CGF.EmitNounwindRuntimeCall(fn, args);
1882 llvm::Value *dst,
1883 llvm::Value *src,
1884 llvm::Constant *&fn,
1889 llvm::Type *argTypes[] = { CGF.Int8PtrPtrTy, CGF.Int8PtrPtrTy };
1891 llvm::FunctionType *fnType
1892 = llvm::FunctionType::get(CGF.Builder.getVoidTy(), argTypes, false);
1896 llvm::Value *args[] = {
1906 llvm::Value *CodeGenFunction::EmitARCRetain(QualType type, llvm::Value *value) {
1915 llvm::Value *CodeGenFunction::EmitARCRetainNonBlock(llvm::Value *value) {
1927 llvm::Value *CodeGenFunction::EmitARCRetainBlock(llvm::Value *value,
1929 llvm::Value *result
1938 if (!mandatory && isa<llvm::Instruction>(result)) {
1939 llvm::CallInst *call
1940 = cast<llvm::CallInst>(result->stripPointerCasts());
1943 SmallVector<llvm::Value*,1> args;
1945 llvm::MDNode::get(Builder.getContext(), args));
1956 llvm::Value *
1957 CodeGenFunction::EmitARCRetainAutoreleasedReturnValue(llvm::Value *value) {
1960 llvm::InlineAsm *&marker
1973 llvm::FunctionType *type =
1974 llvm::FunctionType::get(VoidTy, /*variadic*/false);
1976 marker = llvm::InlineAsm::get(type, assembly, "", /*sideeffects*/ true);
1982 llvm::NamedMDNode *metadata =
1987 llvm::Value *string = llvm::MDString::get(getLLVMContext(), assembly);
1988 metadata->addOperand(llvm::MDNode::get(getLLVMContext(), string));
2003 void CodeGenFunction::EmitARCRelease(llvm::Value *value,
2005 if (isa<llvm::ConstantPointerNull>(value)) return;
2007 llvm::Constant *&fn = CGM.getARCEntrypoints().objc_release;
2009 llvm::FunctionType *fnType =
2010 llvm::FunctionType::get(Builder.getVoidTy(), Int8PtrTy, false);
2018 llvm::CallInst *call = EmitNounwindRuntimeCall(fn, value);
2021 SmallVector<llvm::Value*,1> args;
2023 llvm::MDNode::get(Builder.getContext(), args));
2036 void CodeGenFunction::EmitARCDestroyStrong(llvm::Value *addr,
2039 llvm::PointerType *addrTy = cast<llvm::PointerType>(addr->getType());
2040 llvm::Value *null = llvm::ConstantPointerNull::get(
2041 cast<llvm::PointerType>(addrTy->getElementType()));
2046 llvm::Value *value = Builder.CreateLoad(addr);
2052 llvm::Value *CodeGenFunction::EmitARCStoreStrongCall(llvm::Value *addr,
2053 llvm::Value *value,
2055 assert(cast<llvm::PointerType>(addr->getType())->getElementType()
2058 llvm::Constant *&fn = CGM.getARCEntrypoints().objc_storeStrong;
2060 llvm::Type *argTypes[] = { Int8PtrPtrTy, Int8PtrTy };
2061 llvm::FunctionType *fnType
2062 = llvm::FunctionType::get(Builder.getVoidTy(), argTypes, false);
2066 llvm::Value *args[] = {
2079 llvm::Value *CodeGenFunction::EmitARCStoreStrong(LValue dst,
2080 llvm::Value *newValue,
2100 llvm::Value *oldValue = EmitLoadOfScalar(dst, SourceLocation());
2114 llvm::Value *CodeGenFunction::EmitARCAutorelease(llvm::Value *value) {
2122 llvm::Value *
2123 CodeGenFunction::EmitARCAutoreleaseReturnValue(llvm::Value *value) {
2132 llvm::Value *
2133 CodeGenFunction::EmitARCRetainAutoreleaseReturnValue(llvm::Value *value) {
2145 llvm::Value *CodeGenFunction::EmitARCRetainAutorelease(QualType type,
2146 llvm::Value *value) {
2150 if (isa<llvm::ConstantPointerNull>(value)) return value;
2152 llvm::Type *origType = value->getType();
2161 llvm::Value *
2162 CodeGenFunction::EmitARCRetainAutoreleaseNonBlock(llvm::Value *value) {
2170 llvm::Value *CodeGenFunction::EmitARCLoadWeak(llvm::Value *addr) {
2177 llvm::Value *CodeGenFunction::EmitARCLoadWeakRetained(llvm::Value *addr) {
2185 llvm::Value *CodeGenFunction::EmitARCStoreWeak(llvm::Value *addr,
2186 llvm::Value *value,
2197 void CodeGenFunction::EmitARCInitWeak(llvm::Value *addr, llvm::Value *value) {
2202 if (isa<llvm::ConstantPointerNull>(value) &&
2215 void CodeGenFunction::EmitARCDestroyWeak(llvm::Value *addr) {
2216 llvm::Constant *&fn = CGM.getARCEntrypoints().objc_destroyWeak;
2218 llvm::FunctionType *fnType =
2219 llvm::FunctionType::get(Builder.getVoidTy(), Int8PtrPtrTy, false);
2232 void CodeGenFunction::EmitARCMoveWeak(llvm::Value *dst, llvm::Value *src) {
2241 void CodeGenFunction::EmitARCCopyWeak(llvm::Value *dst, llvm::Value *src) {
2249 llvm::Value *CodeGenFunction::EmitObjCAutoreleasePoolPush() {
2250 llvm::Constant *&fn = CGM.getRREntrypoints().objc_autoreleasePoolPush;
2252 llvm::FunctionType *fnType =
2253 llvm::FunctionType::get(Int8PtrTy, false);
2262 void CodeGenFunction::EmitObjCAutoreleasePoolPop(llvm::Value *value) {
2265 llvm::Constant *&fn = CGM.getRREntrypoints().objc_autoreleasePoolPop;
2267 llvm::FunctionType *fnType =
2268 llvm::FunctionType::get(Builder.getVoidTy(), Int8PtrTy, false);
2284 llvm::Value *CodeGenFunction::EmitObjCMRRAutoreleasePoolPush() {
2286 llvm::Value *Receiver = Runtime.EmitNSAutoreleasePoolClassRef(*this);
2309 void CodeGenFunction::EmitObjCMRRAutoreleasePoolPop(llvm::Value *Arg) {
2318 llvm::Value *addr,
2324 llvm::Value *addr,
2330 llvm::Value *addr,
2337 llvm::Value *Token;
2339 CallObjCAutoreleasePoolObject(llvm::Value *token) : Token(token) {}
2346 llvm::Value *Token;
2348 CallObjCMRRAutoreleasePoolObject(llvm::Value *token) : Token(token) {}
2356 void CodeGenFunction::EmitObjCAutoreleasePoolCleanup(llvm::Value *Ptr) {
2398 llvm::Value *result = CGF.EmitLoadOfLValue(lv,
2420 static llvm::Value *emitARCRetainAfterCall(CodeGenFunction &CGF,
2421 llvm::Value *value);
2425 static llvm::Value *emitARCRetainCall(CodeGenFunction &CGF, const Expr *e) {
2426 llvm::Value *value = CGF.EmitScalarExpr(e);
2430 static llvm::Value *emitARCRetainAfterCall(CodeGenFunction &CGF,
2431 llvm::Value *value) {
2432 if (llvm::CallInst *call = dyn_cast<llvm::CallInst>(value)) {
2437 ++llvm::BasicBlock::iterator(call));
2442 } else if (llvm::InvokeInst *invoke = dyn_cast<llvm::InvokeInst>(value)) {
2446 llvm::BasicBlock *BB = invoke->getNormalDest();
2455 } else if (llvm::BitCastInst *bitcast = dyn_cast<llvm::BitCastInst>(value)) {
2456 llvm::Value *operand = bitcast->getOperand(0);
2567 llvm::Type *resultType = nullptr;
2585 llvm::Value *value = loadResult.getPointer();
2608 llvm::Value *result = CGF.EmitScalarExpr(ce->getSubExpr());
2617 llvm::Value *result; // will be a +0 value
2650 llvm::Value *result = emitARCRetainCall(CGF, ce->getSubExpr());
2673 llvm::Value *result = emitARCRetainCall(CGF, e);
2682 llvm::Value *value = result.getPointer();
2695 llvm::Value *result = CGF.EmitScalarExpr(e);
2700 static llvm::Value *emitARCRetainLoadOfScalar(CodeGenFunction &CGF,
2704 llvm::Value *value = result.getPointer();
2714 llvm::Value *CodeGenFunction::EmitARCRetainScalarExpr(const Expr *e) {
2723 llvm::Value *value = result.getPointer();
2729 llvm::Value *
2739 llvm::Value *value = result.getPointer();
2747 llvm::Value *CodeGenFunction::EmitARCExtendBlockObject(const Expr *e) {
2748 llvm::Value *result;
2765 llvm::Value *CodeGenFunction::EmitObjCThrowOperand(const Expr *expr) {
2781 std::pair<LValue,llvm::Value*>
2786 llvm::Value *value = result.getPointer();
2802 llvm::Value *oldValue = EmitLoadOfScalar(lvalue, SourceLocation());
2809 return std::pair<LValue,llvm::Value*>(lvalue, value);
2812 std::pair<LValue,llvm::Value*>
2814 llvm::Value *value = EmitARCRetainAutoreleaseScalarExpr(e->getRHS());
2819 return std::pair<LValue,llvm::Value*>(lvalue, value);
2834 llvm::Value *token = EmitObjCAutoreleasePoolPush();
2837 llvm::Value *token = EmitObjCMRRAutoreleasePoolPush();
2850 void CodeGenFunction::EmitExtendGCLifetime(llvm::Value *object) {
2852 llvm::FunctionType *extenderType
2853 = llvm::FunctionType::get(VoidTy, VoidPtrTy, RequiredArgs::All);
2854 llvm::Value *extender
2855 = llvm::InlineAsm::get(extenderType,
2868 llvm::Constant *
2880 llvm::Constant *HelperFn = nullptr;
2912 llvm::FunctionType *LTy = CGM.getTypes().GetFunctionType(FI);
2914 llvm::Function *Fn =
2915 llvm::Function::Create(LTy, llvm::GlobalValue::InternalLinkage,
2940 HelperFn = llvm::ConstantExpr::getBitCast(Fn, VoidPtrTy);
2945 llvm::Constant *
2957 llvm::Constant *HelperFn = nullptr;
2991 llvm::FunctionType *LTy = CGM.getTypes().GetFunctionType(FI);
2993 llvm::Function *Fn =
2994 llvm::Function::Create(LTy, llvm::GlobalValue::InternalLinkage,
3041 HelperFn = llvm::ConstantExpr::getBitCast(Fn, VoidPtrTy);
3046 llvm::Value *
3047 CodeGenFunction::EmitBlockCopyAndAutorelease(llvm::Value *Block, QualType Ty) {
3058 llvm::Value *Val = Block;