Lines Matching refs:CGM
51 static llvm::Constant *buildGlobalBlock(CodeGenModule &CGM,
56 static llvm::Constant *buildCopyHelper(CodeGenModule &CGM,
58 return CodeGenFunction(CGM).GenerateCopyHelperFunction(blockInfo);
62 static llvm::Constant *buildDisposeHelper(CodeGenModule &CGM,
64 return CodeGenFunction(CGM).GenerateDestroyHelperFunction(blockInfo);
120 CodeGenModule &CGM);
123 CodeGenModule &CGM) {
128 if (CGM.getLangOpts().Exceptions)
130 if (CGM.getCodeGenOpts().ObjCAutoRefCountExceptions)
135 findBlockCapturedManagedEntities(BlockInfo, CGM.getContext().getLangOpts(),
147 BlockInfo.BlockAlign, CGM);
153 BlockInfo.BlockAlign, CGM);
155 BlockInfo.BlockAlign, CGM);
162 CGM.getContext().getObjCEncodingForBlock(BlockInfo.getBlockExpr());
167 Name += "l" + CGM.getObjCRuntime().getRCBlockLayoutStr(CGM, BlockInfo);
185 static llvm::Constant *buildBlockDescriptor(CodeGenModule &CGM,
187 ASTContext &C = CGM.getContext();
190 cast<llvm::IntegerType>(CGM.getTypes().ConvertType(C.UnsignedLongTy));
192 if (CGM.getLangOpts().OpenCL)
195 CGM.getLLVMContext(), C.getTargetAddressSpace(LangAS::opencl_constant));
197 i8p = CGM.VoidPtrTy;
203 CGM.getLangOpts().getGC() == LangOptions::NonGC) {
204 descName = getBlockDescriptorName(blockInfo, CGM);
205 if (llvm::GlobalValue *desc = CGM.getModule().getNamedValue(descName))
207 CGM.getBlockDescriptorType());
212 ConstantInitBuilder builder(CGM);
228 llvm::Constant *copyHelper = buildCopyHelper(CGM, blockInfo);
232 llvm::Constant *disposeHelper = buildDisposeHelper(CGM, blockInfo);
243 CGM.getContext().getObjCEncodingForBlock(blockInfo.getBlockExpr());
245 CGM.GetAddrOfConstantCString(typeAtEncoding).getPointer(), i8p));
249 if (CGM.getLangOpts().getGC() != LangOptions::NonGC)
250 elements.add(CGM.getObjCRuntime().BuildGCBlockLayout(CGM, blockInfo));
252 elements.add(CGM.getObjCRuntime().BuildRCBlockLayout(CGM, blockInfo));
274 elements.finishAndCreateGlobal(descName, CGM.getPointerAlign(),
278 if (CGM.supportsCOMDAT())
279 global->setComdat(CGM.getModule().getOrInsertComdat(descName));
284 return llvm::ConstantExpr::getBitCast(global, CGM.getBlockDescriptorType());
412 static llvm::Constant *tryCaptureAsConstant(CodeGenModule &CGM,
430 if (CGM.getLangOpts().CPlusPlus && !isSafeForCXXConstantCapture(type))
439 return ConstantEmitter(CGM, CGF).tryEmitAbstractForInitializer(*var);
448 static void initializeForBlockHeader(CodeGenModule &CGM, CGBlockInfo &info,
452 if (CGM.getLangOpts().OpenCL) {
456 CGM.getContext().getTargetAddressSpace(LangAS::opencl_generic);
458 CharUnits::fromQuantity(CGM.getTarget().getPointerAlign(GenericAS) / 8);
460 CharUnits::fromQuantity(CGM.getTarget().getPointerWidth(GenericAS) / 8);
461 assert(CGM.getIntSize() <= GenPtrSize);
462 assert(CGM.getIntAlign() <= GenPtrAlign);
463 assert((2 * CGM.getIntSize()).isMultipleOf(GenPtrAlign));
464 elementTypes.push_back(CGM.IntTy); /* total size */
465 elementTypes.push_back(CGM.IntTy); /* align */
467 CGM.getOpenCLRuntime()
470 2 * CGM.getIntSize().getQuantity() + GenPtrSize.getQuantity();
473 CGM.getTargetCodeGenInfo().getTargetOpenCLBlockHelper()) {
477 unsigned Align = CGM.getDataLayout().getABITypeAlignment(I);
481 Offset += CGM.getDataLayout().getTypeAllocSize(I);
490 assert(CGM.getIntSize() <= CGM.getPointerSize());
491 assert(CGM.getIntAlign() <= CGM.getPointerAlign());
492 assert((2 * CGM.getIntSize()).isMultipleOf(CGM.getPointerAlign()));
493 info.BlockAlign = CGM.getPointerAlign();
494 info.BlockSize = 3 * CGM.getPointerSize() + 2 * CGM.getIntSize();
495 elementTypes.push_back(CGM.VoidPtrTy);
496 elementTypes.push_back(CGM.IntTy);
497 elementTypes.push_back(CGM.IntTy);
498 elementTypes.push_back(CGM.VoidPtrTy);
499 elementTypes.push_back(CGM.getBlockDescriptorType());
522 static void computeBlockInfo(CodeGenModule &CGM, CodeGenFunction *CGF,
524 ASTContext &C = CGM.getContext();
528 initializeForBlockHeader(CGM, info, elementTypes);
531 CGM.getTargetCodeGenInfo().getTargetOpenCLBlockHelper())
536 llvm::StructType::get(CGM.getLLVMContext(), elementTypes, true);
541 CGM.getLangOpts().getGC() == LangOptions::NonGC)
559 llvm::Type *llvmType = CGM.getTypes().ConvertType(thisType);
560 auto TInfo = CGM.getContext().getTypeInfoInChars(thisType);
577 CharUnits align = CGM.getPointerAlign();
584 layout.push_back(BlockLayoutChunk(align, CGM.getPointerSize(),
586 CGM.VoidPtrTy, variable->getType()));
592 if (llvm::Constant *constant = tryCaptureAsConstant(CGM, CGF, variable)) {
640 } else if (CGM.getLangOpts().CPlusPlus) {
657 CGM.getTypes().ConvertTypeForMem(VT);
666 llvm::StructType::get(CGM.getLLVMContext(), elementTypes, true);
743 elementTypes.push_back(llvm::ArrayType::get(CGM.Int8Ty,
761 elementTypes.push_back(llvm::ArrayType::get(CGM.Int8Ty,
774 llvm::StructType::get(CGM.getLLVMContext(), elementTypes, true);
784 if (llvm::Constant *Block = CGM.getAddrOfGlobalBlockIfEmitted(blockExpr))
788 computeBlockInfo(CGM, this, blockInfo);
797 bool IsOpenCL = CGM.getContext().getLangOpts().OpenCL;
799 IsOpenCL ? CGM.getOpenCLRuntime().getGenericVoidPointerType() : VoidPtrTy;
802 CGM.getTarget().getPointerWidth(
803 CGM.getContext().getTargetAddressSpace(GenVoidPtrAddr)) /
807 CodeGenFunction BlockCGF{CGM, true};
815 return CGM.getAddrOfGlobalBlockIfEmitted(blockInfo.BlockExpression);
830 ? CGM.getNSConcreteGlobalBlock()
831 : CGM.getNSConcreteStackBlock();
835 descriptor = buildBlockDescriptor(CGM, blockInfo);
888 CGM.getTargetCodeGenInfo().getTargetOpenCLBlockHelper()) {
893 CGM.getDataLayout().getTypeAllocSize(I.first->getType())),
992 CGM.getCodeGenOpts().OptimizationLevel != 0) {
1059 CGM.getCodeGenOpts().OptimizationLevel != 0) {
1060 assert(CGM.getLangOpts().ObjCAutoRefCount &&
1101 CGM.getOpenCLRuntime().recordBlockInfo(blockInfo.BlockExpression, InvokeFn,
1182 llvm::Type *GenBlockTy = CGM.getGenericBlockLiteralType();
1194 CGM.getOpenCLRuntime().getGenericVoidPointerType();
1205 Func = CGM.getOpenCLRuntime().getInvokeFunction(E->getCallee());
1230 CGM.getTypes().arrangeBlockFunctionCall(Args, FuncTy);
1233 llvm::Type *BlockFTy = CGM.getTypes().GetFunctionType(FnInfo);
1309 static llvm::Constant *buildGlobalBlock(CodeGenModule &CGM,
1316 assert(!CGM.getAddrOfGlobalBlockIfEmitted(blockInfo.BlockExpression) &&
1320 ConstantInitBuilder builder(CGM);
1323 bool IsOpenCL = CGM.getLangOpts().OpenCL;
1324 bool IsWindows = CGM.getTarget().getTriple().isOSWindows();
1328 fields.addNullPointer(CGM.Int8PtrPtrTy);
1330 fields.add(CGM.getNSConcreteGlobalBlock());
1337 fields.addInt(CGM.IntTy, flags.getBitMask());
1340 fields.addInt(CGM.IntTy, 0);
1342 fields.addInt(CGM.IntTy, blockInfo.BlockSize.getQuantity());
1343 fields.addInt(CGM.IntTy, blockInfo.BlockAlign.getQuantity());
1351 fields.add(buildBlockDescriptor(CGM, blockInfo));
1353 CGM.getTargetCodeGenInfo().getTargetOpenCLBlockHelper()) {
1354 for (auto I : Helper->getCustomFieldValues(CGM, blockInfo)) {
1360 if (CGM.getContext().getLangOpts().OpenCL)
1361 AddrSpace = CGM.getContext().getTargetAddressSpace(LangAS::opencl_global);
1372 auto *Init = llvm::Function::Create(llvm::FunctionType::get(CGM.VoidTy,
1374 &CGM.getModule());
1375 llvm::IRBuilder<> b(llvm::BasicBlock::Create(CGM.getLLVMContext(), "entry",
1377 b.CreateAlignedStore(CGM.getNSConcreteGlobalBlock(),
1379 CGM.getPointerAlign().getAsAlign());
1383 auto *InitVar = new llvm::GlobalVariable(CGM.getModule(), Init->getType(),
1387 CGM.addUsedGlobal(InitVar);
1392 CGM.getTypes().ConvertType(blockInfo.getBlockExpr()->getType());
1395 CGM.setAddrOfGlobalBlock(blockInfo.BlockExpression, Result);
1396 if (CGM.getContext().getLangOpts().OpenCL)
1397 CGM.getOpenCLRuntime().recordBlockInfo(
1413 if (CGM.getCodeGenOpts().hasReducedDebugInfo()) {
1481 IdentifierInfo *II = &CGM.getContext().Idents.get(".block_descriptor");
1494 CGM.getTypes().arrangeBlockFunctionDeclaration(fnType, args);
1495 if (CGM.ReturnSlotInterferesWithArgs(fnInfo))
1498 llvm::FunctionType *fnLLVMType = CGM.getTypes().GetFunctionType(fnInfo);
1500 StringRef name = CGM.getBlockMangledName(GD, blockDecl);
1502 fnLLVMType, llvm::GlobalValue::InternalLinkage, name, &CGM.getModule());
1503 CGM.SetInternalFunctionAttributes(blockDecl, fn, fnInfo);
1507 ? CGM.getOpenCLRuntime().getGenericVoidPointerType()
1509 buildGlobalBlock(CGM, blockInfo,
1523 if (CGM.getCodeGenOpts().OptimizationLevel == 0) {
1585 if (CGM.getCodeGenOpts().hasReducedDebugInfo()) {
1738 CodeGenModule &CGM) {
1740 ASTContext &Ctx = CGM.getContext();
1766 CGM.getCXXABI().getMangleContext().mangleTypeName(CaptureTy, Out);
1833 CharUnits BlockAlignment, CaptureStrKind StrKind, CodeGenModule &CGM) {
1840 if (CGM.getLangOpts().Exceptions)
1842 if (CGM.getCodeGenOpts().ObjCAutoRefCountExceptions)
1848 Name += getBlockCaptureStr(E, StrKind, BlockAlignment, CGM);
1899 CodeGenModule &CGM) {
1901 CGM.SetInternalFunctionAttributes(GlobalDecl(), Fn, FI);
1905 CGM.SetLLVMFunctionAttributes(GlobalDecl(), FI, Fn, /*IsThunk=*/false);
1906 CGM.SetLLVMFunctionAttributesForDefinition(nullptr, Fn);
1923 CaptureStrKind::CopyHelper, CGM);
1925 if (llvm::GlobalValue *Func = CGM.getModule().getNamedValue(FuncName))
1939 CGM.getTypes().arrangeBuiltinFunctionDeclaration(ReturnTy, args);
1943 llvm::FunctionType *LTy = CGM.getTypes().GetFunctionType(FI);
1947 FuncName, &CGM.getModule());
1948 if (CGM.supportsCOMDAT())
1949 Fn->setComdat(CGM.getModule().getOrInsertComdat(FuncName));
1962 CGM);
2010 if (CGM.getCodeGenOpts().OptimizationLevel == 0) {
2040 EmitRuntimeCallOrInvoke(CGM.getBlockObjectAssign(), args);
2042 EmitNounwindRuntimeCall(CGM.getBlockObjectAssign(), args);
2120 CaptureStrKind::DisposeHelper, CGM);
2122 if (llvm::GlobalValue *Func = CGM.getModule().getNamedValue(FuncName))
2134 CGM.getTypes().arrangeBuiltinFunctionDeclaration(ReturnTy, args);
2138 llvm::FunctionType *LTy = CGM.getTypes().GetFunctionType(FI);
2142 FuncName, &CGM.getModule());
2143 if (CGM.supportsCOMDAT())
2144 Fn->setComdat(CGM.getModule().getOrInsertComdat(FuncName));
2157 CGM);
2212 llvm::FunctionCallee fn = CGF.CGM.getBlockObjectAssign();
2266 if (CGF.CGM.getCodeGenOpts().OptimizationLevel == 0) {
2388 CGF.CGM.getTypes().arrangeBuiltinFunctionDeclaration(ReturnTy, args);
2390 llvm::FunctionType *LTy = CGF.CGM.getTypes().GetFunctionType(FI);
2396 "__Block_byref_object_copy_", &CGF.CGM.getModule());
2410 CGF.CGM.SetInternalFunctionAttributes(GlobalDecl(), Fn, FI);
2442 static llvm::Constant *buildByrefCopyHelper(CodeGenModule &CGM,
2445 CodeGenFunction CGF(CGM);
2463 CGF.CGM.getTypes().arrangeBuiltinFunctionDeclaration(R, args);
2465 llvm::FunctionType *LTy = CGF.CGM.getTypes().GetFunctionType(FI);
2472 &CGF.CGM.getModule());
2485 CGF.CGM.SetInternalFunctionAttributes(GlobalDecl(), Fn, FI);
2505 static llvm::Constant *buildByrefDisposeHelper(CodeGenModule &CGM,
2508 CodeGenFunction CGF(CGM);
2515 static T *buildByrefHelpers(CodeGenModule &CGM, const BlockByrefInfo &byrefInfo,
2522 = CGM.ByrefHelpersCache.FindNodeOrInsertPos(id, insertPos);
2525 CGM, byrefInfo, generator);
2526 generator.DisposeHelper = buildByrefDisposeHelper(CGM, byrefInfo, generator);
2528 T *copy = new (CGM.getContext()) T(std::forward<T>(generator));
2529 CGM.ByrefHelpersCache.InsertNode(copy, insertPos);
2554 CGM.getContext().getBlockVarCopyInit(&var).getCopyExpr();
2558 CGM, byrefInfo, CXXByrefHelpers(valueAlignment, type, copyExpr));
2566 CGM, byrefInfo, NonTrivialCStructByrefHelpers(valueAlignment, type));
2587 return ::buildByrefHelpers(CGM, byrefInfo,
2595 return ::buildByrefHelpers(CGM, byrefInfo,
2601 return ::buildByrefHelpers(CGM, byrefInfo,
2611 } else if (CGM.getContext().isObjCNSObjectType(type) ||
2621 return ::buildByrefHelpers(CGM, byrefInfo,
2727 } else if (CGM.getDataLayout().getABITypeAlignment(varTy)
2814 if (CGM.getLangOpts().ObjCGCBitmapPrint) {
2837 CharUnits byrefSize = CGM.GetTargetTypeStoreSize(byrefType);
2849 auto layoutInfo = CGM.getObjCRuntime().BuildByrefLayout(CGM, type);
2856 llvm::FunctionCallee F = CGM.getBlockObjectDispose();
2876 static void configureBlocksRuntimeObject(CodeGenModule &CGM,
2880 if (CGM.getTarget().getTriple().isOSBinFormatCOFF()) {
2881 IdentifierInfo &II = CGM.getContext().Idents.get(C->getName());
2882 TranslationUnitDecl *TUDecl = CGM.getContext().getTranslationUnitDecl();
2905 if (CGM.getLangOpts().BlocksRuntimeOptional && GV->isDeclaration() &&
2909 CGM.setDSOLocal(GV);