Lines Matching defs:CGM
52 static llvm::Constant *buildGlobalBlock(CodeGenModule &CGM,
57 static llvm::Constant *buildCopyHelper(CodeGenModule &CGM,
59 return CodeGenFunction(CGM).GenerateCopyHelperFunction(blockInfo);
63 static llvm::Constant *buildDisposeHelper(CodeGenModule &CGM,
65 return CodeGenFunction(CGM).GenerateDestroyHelperFunction(blockInfo);
84 CodeGenModule &CGM);
87 CodeGenModule &CGM) {
92 if (CGM.getLangOpts().Exceptions)
94 if (CGM.getCodeGenOpts().ObjCAutoRefCountExceptions)
110 BlockInfo.BlockAlign, CGM);
116 BlockInfo.BlockAlign, CGM);
118 BlockInfo.BlockAlign, CGM);
126 if (!CGM.getCodeGenOpts().DisableBlockSignatureString) {
128 CGM.getContext().getObjCEncodingForBlock(BlockInfo.getBlockExpr());
134 Name += "l" + CGM.getObjCRuntime().getRCBlockLayoutStr(CGM, BlockInfo);
152 static llvm::Constant *buildBlockDescriptor(CodeGenModule &CGM,
154 ASTContext &C = CGM.getContext();
157 cast<llvm::IntegerType>(CGM.getTypes().ConvertType(C.UnsignedLongTy));
159 if (CGM.getLangOpts().OpenCL)
161 CGM.getLLVMContext(), C.getTargetAddressSpace(LangAS::opencl_constant));
163 i8p = CGM.VoidPtrTy;
169 CGM.getLangOpts().getGC() == LangOptions::NonGC) {
170 descName = getBlockDescriptorName(blockInfo, CGM);
171 if (llvm::GlobalValue *desc = CGM.getModule().getNamedValue(descName))
177 ConstantInitBuilder builder(CGM);
193 llvm::Constant *copyHelper = buildCopyHelper(CGM, blockInfo);
197 llvm::Constant *disposeHelper = buildDisposeHelper(CGM, blockInfo);
208 if (CGM.getCodeGenOpts().DisableBlockSignatureString) {
212 CGM.getContext().getObjCEncodingForBlock(blockInfo.getBlockExpr());
213 elements.add(CGM.GetAddrOfConstantCString(typeAtEncoding).getPointer());
218 if (CGM.getLangOpts().getGC() != LangOptions::NonGC)
219 elements.add(CGM.getObjCRuntime().BuildGCBlockLayout(CGM, blockInfo));
221 elements.add(CGM.getObjCRuntime().BuildRCBlockLayout(CGM, blockInfo));
243 elements.finishAndCreateGlobal(descName, CGM.getPointerAlign(),
247 if (CGM.supportsCOMDAT())
248 global->setComdat(CGM.getModule().getOrInsertComdat(descName));
393 CGBlockInfo &Info, CodeGenModule &CGM) {
402 const LangOptions &LangOpts = CGM.getLangOpts();
446 static llvm::Constant *tryCaptureAsConstant(CodeGenModule &CGM,
464 if (CGM.getLangOpts().CPlusPlus && !isSafeForCXXConstantCapture(type))
473 return ConstantEmitter(CGM, CGF).tryEmitAbstractForInitializer(*var);
482 static void initializeForBlockHeader(CodeGenModule &CGM, CGBlockInfo &info,
486 if (CGM.getLangOpts().OpenCL) {
490 CGM.getTarget().getPointerAlign(LangAS::opencl_generic) / 8);
492 CGM.getTarget().getPointerWidth(LangAS::opencl_generic) / 8);
493 assert(CGM.getIntSize() <= GenPtrSize);
494 assert(CGM.getIntAlign() <= GenPtrAlign);
495 assert((2 * CGM.getIntSize()).isMultipleOf(GenPtrAlign));
496 elementTypes.push_back(CGM.IntTy); /* total size */
497 elementTypes.push_back(CGM.IntTy); /* align */
499 CGM.getOpenCLRuntime()
502 2 * CGM.getIntSize().getQuantity() + GenPtrSize.getQuantity();
505 CGM.getTargetCodeGenInfo().getTargetOpenCLBlockHelper()) {
509 unsigned Align = CGM.getDataLayout().getABITypeAlign(I).value();
513 Offset += CGM.getDataLayout().getTypeAllocSize(I);
522 assert(CGM.getIntSize() <= CGM.getPointerSize());
523 assert(CGM.getIntAlign() <= CGM.getPointerAlign());
524 assert((2 * CGM.getIntSize()).isMultipleOf(CGM.getPointerAlign()));
525 info.BlockAlign = CGM.getPointerAlign();
526 info.BlockSize = 3 * CGM.getPointerSize() + 2 * CGM.getIntSize();
527 elementTypes.push_back(CGM.VoidPtrTy);
528 elementTypes.push_back(CGM.IntTy);
529 elementTypes.push_back(CGM.IntTy);
530 elementTypes.push_back(CGM.VoidPtrTy);
531 elementTypes.push_back(CGM.getBlockDescriptorType());
554 static void computeBlockInfo(CodeGenModule &CGM, CodeGenFunction *CGF,
556 ASTContext &C = CGM.getContext();
560 initializeForBlockHeader(CGM, info, elementTypes);
563 CGM.getTargetCodeGenInfo().getTargetOpenCLBlockHelper())
568 llvm::StructType::get(CGM.getLLVMContext(), elementTypes, true);
573 CGM.getLangOpts().getGC() == LangOptions::NonGC)
594 llvm::Type *llvmType = CGM.getTypes().ConvertType(thisType);
595 auto TInfo = CGM.getContext().getTypeInfoInChars(thisType);
599 layout, info, CGM);
608 CharUnits align = CGM.getPointerAlign();
615 addBlockLayout(align, CGM.getPointerSize(), &CI, CGM.VoidPtrTy,
616 variable->getType(), layout, info, CGM);
622 if (llvm::Constant *constant = tryCaptureAsConstant(CGM, CGF, variable)) {
630 if (CGM.getLangOpts().CPlusPlus)
644 CGM.getTypes().ConvertTypeForMem(VT);
646 addBlockLayout(align, size, &CI, llvmType, VT, layout, info, CGM);
652 llvm::StructType::get(CGM.getLLVMContext(), elementTypes, true);
731 elementTypes.push_back(llvm::ArrayType::get(CGM.Int8Ty,
749 elementTypes.push_back(llvm::ArrayType::get(CGM.Int8Ty,
763 llvm::StructType::get(CGM.getLLVMContext(), elementTypes, true);
773 if (llvm::Constant *Block = CGM.getAddrOfGlobalBlockIfEmitted(blockExpr))
777 computeBlockInfo(CGM, this, blockInfo);
786 bool IsOpenCL = CGM.getContext().getLangOpts().OpenCL;
788 IsOpenCL ? CGM.getOpenCLRuntime().getGenericVoidPointerType() : VoidPtrTy;
791 CGM.getTarget().getPointerWidth(GenVoidPtrAddr) / 8);
794 CodeGenFunction BlockCGF{CGM, true};
802 return CGM.getAddrOfGlobalBlockIfEmitted(blockInfo.BlockExpression);
817 ? CGM.getNSConcreteGlobalBlock()
818 : CGM.getNSConcreteStackBlock();
822 descriptor = buildBlockDescriptor(CGM, blockInfo);
825 if (!CGM.getCodeGenOpts().DisableBlockSignatureString)
876 CGM.getTargetCodeGenInfo().getTargetOpenCLBlockHelper()) {
881 CGM.getDataLayout().getTypeAllocSize(I.first->getType())),
980 CGM.getCodeGenOpts().OptimizationLevel != 0) {
1047 CGM.getCodeGenOpts().OptimizationLevel != 0) {
1048 assert(CGM.getLangOpts().ObjCAutoRefCount &&
1089 CGM.getOpenCLRuntime().recordBlockInfo(blockInfo.BlockExpression, InvokeFn,
1169 llvm::Type *GenBlockTy = CGM.getGenericBlockLiteralType();
1181 CGM.getOpenCLRuntime().getGenericVoidPointerType();
1192 Func = CGM.getOpenCLRuntime().getInvokeFunction(E->getCallee());
1217 CGM.getTypes().arrangeBlockFunctionCall(Args, FuncTy);
1288 static llvm::Constant *buildGlobalBlock(CodeGenModule &CGM,
1295 assert(!CGM.getAddrOfGlobalBlockIfEmitted(blockInfo.BlockExpression) &&
1299 ConstantInitBuilder builder(CGM);
1302 bool IsOpenCL = CGM.getLangOpts().OpenCL;
1303 bool IsWindows = CGM.getTarget().getTriple().isOSWindows();
1307 fields.addNullPointer(CGM.Int8PtrPtrTy);
1309 fields.add(CGM.getNSConcreteGlobalBlock());
1313 if (!CGM.getCodeGenOpts().DisableBlockSignatureString)
1318 fields.addInt(CGM.IntTy, flags.getBitMask());
1321 fields.addInt(CGM.IntTy, 0);
1323 fields.addInt(CGM.IntTy, blockInfo.BlockSize.getQuantity());
1324 fields.addInt(CGM.IntTy, blockInfo.BlockAlign.getQuantity());
1332 fields.add(buildBlockDescriptor(CGM, blockInfo));
1334 CGM.getTargetCodeGenInfo().getTargetOpenCLBlockHelper()) {
1335 for (auto *I : Helper->getCustomFieldValues(CGM, blockInfo)) {
1341 if (CGM.getContext().getLangOpts().OpenCL)
1342 AddrSpace = CGM.getContext().getTargetAddressSpace(LangAS::opencl_global);
1353 auto *Init = llvm::Function::Create(llvm::FunctionType::get(CGM.VoidTy,
1355 &CGM.getModule());
1356 llvm::IRBuilder<> b(llvm::BasicBlock::Create(CGM.getLLVMContext(), "entry",
1358 b.CreateAlignedStore(CGM.getNSConcreteGlobalBlock(),
1360 CGM.getPointerAlign().getAsAlign());
1364 auto *InitVar = new llvm::GlobalVariable(CGM.getModule(), Init->getType(),
1368 CGM.addUsedGlobal(InitVar);
1373 CGM.getTypes().ConvertType(blockInfo.getBlockExpr()->getType());
1376 CGM.setAddrOfGlobalBlock(blockInfo.BlockExpression, Result);
1377 if (CGM.getContext().getLangOpts().OpenCL)
1378 CGM.getOpenCLRuntime().recordBlockInfo(
1395 if (CGM.getCodeGenOpts().hasReducedDebugInfo()) {
1461 const IdentifierInfo *II = &CGM.getContext().Idents.get(".block_descriptor");
1474 CGM.getTypes().arrangeBlockFunctionDeclaration(fnType, args);
1475 if (CGM.ReturnSlotInterferesWithArgs(fnInfo))
1478 llvm::FunctionType *fnLLVMType = CGM.getTypes().GetFunctionType(fnInfo);
1480 StringRef name = CGM.getBlockMangledName(GD, blockDecl);
1482 fnLLVMType, llvm::GlobalValue::InternalLinkage, name, &CGM.getModule());
1483 CGM.SetInternalFunctionAttributes(blockDecl, fn, fnInfo);
1487 ? CGM.getOpenCLRuntime().getGenericVoidPointerType()
1489 buildGlobalBlock(CGM, blockInfo,
1503 if (CGM.getCodeGenOpts().OptimizationLevel == 0) {
1568 if (CGM.getCodeGenOpts().hasReducedDebugInfo()) {
1697 CodeGenModule &CGM) {
1699 ASTContext &Ctx = CGM.getContext();
1726 CGM.getCXXABI().getMangleContext().mangleCanonicalTypeName(CaptureTy, Out);
1792 CharUnits BlockAlignment, CaptureStrKind StrKind, CodeGenModule &CGM) {
1799 if (CGM.getLangOpts().Exceptions)
1801 if (CGM.getCodeGenOpts().ObjCAutoRefCountExceptions)
1809 Name += getBlockCaptureStr(Cap, StrKind, BlockAlignment, CGM);
1860 CodeGenModule &CGM) {
1862 CGM.SetInternalFunctionAttributes(GlobalDecl(), Fn, FI);
1866 CGM.SetLLVMFunctionAttributes(GlobalDecl(), FI, Fn, /*IsThunk=*/false);
1867 CGM.SetLLVMFunctionAttributesForDefinition(nullptr, Fn);
1882 CaptureStrKind::CopyHelper, CGM);
1884 if (llvm::GlobalValue *Func = CGM.getModule().getNamedValue(FuncName))
1898 CGM.getTypes().arrangeBuiltinFunctionDeclaration(ReturnTy, args);
1902 llvm::FunctionType *LTy = CGM.getTypes().GetFunctionType(FI);
1906 FuncName, &CGM.getModule());
1907 if (CGM.supportsCOMDAT())
1908 Fn->setComdat(CGM.getModule().getOrInsertComdat(FuncName));
1915 CGM);
1961 if (CGM.getCodeGenOpts().OptimizationLevel == 0) {
1991 EmitRuntimeCallOrInvoke(CGM.getBlockObjectAssign(), args);
1993 EmitNounwindRuntimeCall(CGM.getBlockObjectAssign(), args);
2071 CaptureStrKind::DisposeHelper, CGM);
2073 if (llvm::GlobalValue *Func = CGM.getModule().getNamedValue(FuncName))
2085 CGM.getTypes().arrangeBuiltinFunctionDeclaration(ReturnTy, args);
2089 llvm::FunctionType *LTy = CGM.getTypes().GetFunctionType(FI);
2093 FuncName, &CGM.getModule());
2094 if (CGM.supportsCOMDAT())
2095 Fn->setComdat(CGM.getModule().getOrInsertComdat(FuncName));
2101 CGM);
2154 llvm::FunctionCallee fn = CGF.CGM.getBlockObjectAssign();
2208 if (CGF.CGM.getCodeGenOpts().OptimizationLevel == 0) {
2330 CGF.CGM.getTypes().arrangeBuiltinFunctionDeclaration(ReturnTy, args);
2332 llvm::FunctionType *LTy = CGF.CGM.getTypes().GetFunctionType(FI);
2338 "__Block_byref_object_copy_", &CGF.CGM.getModule());
2344 CGF.CGM.SetInternalFunctionAttributes(GlobalDecl(), Fn, FI);
2374 static llvm::Constant *buildByrefCopyHelper(CodeGenModule &CGM,
2377 CodeGenFunction CGF(CGM);
2395 CGF.CGM.getTypes().arrangeBuiltinFunctionDeclaration(R, args);
2397 llvm::FunctionType *LTy = CGF.CGM.getTypes().GetFunctionType(FI);
2404 &CGF.CGM.getModule());
2409 CGF.CGM.SetInternalFunctionAttributes(GlobalDecl(), Fn, FI);
2430 static llvm::Constant *buildByrefDisposeHelper(CodeGenModule &CGM,
2433 CodeGenFunction CGF(CGM);
2440 static T *buildByrefHelpers(CodeGenModule &CGM, const BlockByrefInfo &byrefInfo,
2447 = CGM.ByrefHelpersCache.FindNodeOrInsertPos(id, insertPos);
2450 generator.CopyHelper = buildByrefCopyHelper(CGM, byrefInfo, generator);
2451 generator.DisposeHelper = buildByrefDisposeHelper(CGM, byrefInfo, generator);
2453 T *copy = new (CGM.getContext()) T(std::forward<T>(generator));
2454 CGM.ByrefHelpersCache.InsertNode(copy, insertPos);
2479 CGM.getContext().getBlockVarCopyInit(&var).getCopyExpr();
2483 CGM, byrefInfo, CXXByrefHelpers(valueAlignment, type, copyExpr));
2491 CGM, byrefInfo, NonTrivialCStructByrefHelpers(valueAlignment, type));
2512 return ::buildByrefHelpers(CGM, byrefInfo,
2520 return ::buildByrefHelpers(CGM, byrefInfo,
2526 return ::buildByrefHelpers(CGM, byrefInfo,
2536 } else if (CGM.getContext().isObjCNSObjectType(type) ||
2546 return ::buildByrefHelpers(CGM, byrefInfo,
2653 } else if (CGM.getDataLayout().getABITypeAlign(varTy) >
2740 if (CGM.getLangOpts().ObjCGCBitmapPrint) {
2763 CharUnits byrefSize = CGM.GetTargetTypeStoreSize(byrefType);
2775 auto layoutInfo = CGM.getObjCRuntime().BuildByrefLayout(CGM, type);
2782 llvm::FunctionCallee F = CGM.getBlockObjectDispose();
2800 static void configureBlocksRuntimeObject(CodeGenModule &CGM,
2804 if (CGM.getTarget().getTriple().isOSBinFormatCOFF()) {
2805 const IdentifierInfo &II = CGM.getContext().Idents.get(C->getName());
2806 TranslationUnitDecl *TUDecl = CGM.getContext().getTranslationUnitDecl();
2829 if (CGM.getLangOpts().BlocksRuntimeOptional && GV->isDeclaration() &&
2833 CGM.setDSOLocal(GV);