diff options
Diffstat (limited to 'contrib/llvm-project/clang/lib/CodeGen/CGBlocks.cpp')
-rw-r--r-- | contrib/llvm-project/clang/lib/CodeGen/CGBlocks.cpp | 80 |
1 files changed, 37 insertions, 43 deletions
diff --git a/contrib/llvm-project/clang/lib/CodeGen/CGBlocks.cpp b/contrib/llvm-project/clang/lib/CodeGen/CGBlocks.cpp index 1f1de3df857c..ff6ca0914e0d 100644 --- a/contrib/llvm-project/clang/lib/CodeGen/CGBlocks.cpp +++ b/contrib/llvm-project/clang/lib/CodeGen/CGBlocks.cpp @@ -216,8 +216,9 @@ static llvm::Constant *buildBlockDescriptor(CodeGenModule &CGM, llvm::Constant *disposeHelper = buildDisposeHelper(CGM, blockInfo); elements.add(disposeHelper); - if (cast<llvm::Function>(copyHelper->getOperand(0))->hasInternalLinkage() || - cast<llvm::Function>(disposeHelper->getOperand(0)) + if (cast<llvm::Function>(copyHelper->stripPointerCasts()) + ->hasInternalLinkage() || + cast<llvm::Function>(disposeHelper->stripPointerCasts()) ->hasInternalLinkage()) hasInternalHelper = true; } @@ -1105,7 +1106,7 @@ llvm::Value *CodeGenFunction::EmitBlockLiteral(const CGBlockInfo &blockInfo) { if (IsOpenCL) { CGM.getOpenCLRuntime().recordBlockInfo(blockInfo.BlockExpression, InvokeFn, - result); + result, blockInfo.StructureType); } return result; @@ -1160,8 +1161,7 @@ llvm::Type *CodeGenModule::getGenericBlockLiteralType() { SmallVector<llvm::Type *, 8> StructFields( {IntTy, IntTy, getOpenCLRuntime().getGenericVoidPointerType()}); if (auto *Helper = getTargetCodeGenInfo().getTargetOpenCLBlockHelper()) { - for (auto I : Helper->getCustomFieldTypes()) - StructFields.push_back(I); + llvm::append_range(StructFields, Helper->getCustomFieldTypes()); } GenericBlockLiteralType = llvm::StructType::create( StructFields, "struct.__opencl_block_literal_generic"); @@ -1263,10 +1263,9 @@ Address CodeGenFunction::GetAddrOfBlockDecl(const VarDecl *variable) { // to byref*. auto &byrefInfo = getBlockByrefInfo(variable); - addr = Address(Builder.CreateLoad(addr), byrefInfo.ByrefAlignment); + addr = Address(Builder.CreateLoad(addr), Int8Ty, byrefInfo.ByrefAlignment); - auto byrefPointerType = llvm::PointerType::get(byrefInfo.Type, 0); - addr = Builder.CreateBitCast(addr, byrefPointerType, "byref.addr"); + addr = Builder.CreateElementBitCast(addr, byrefInfo.Type, "byref.addr"); addr = emitBlockByrefAddress(addr, byrefInfo, /*follow*/ true, variable->getName()); @@ -1402,7 +1401,8 @@ static llvm::Constant *buildGlobalBlock(CodeGenModule &CGM, if (CGM.getContext().getLangOpts().OpenCL) CGM.getOpenCLRuntime().recordBlockInfo( blockInfo.BlockExpression, - cast<llvm::Function>(blockFn->stripPointerCasts()), Result); + cast<llvm::Function>(blockFn->stripPointerCasts()), Result, + literal->getValueType()); return Result; } @@ -1441,15 +1441,12 @@ void CodeGenFunction::setBlockContextParameter(const ImplicitParamDecl *D, Address CodeGenFunction::LoadBlockStruct() { assert(BlockInfo && "not in a block invocation function!"); assert(BlockPointer && "no block pointer set!"); - return Address(BlockPointer, BlockInfo->BlockAlign); + return Address(BlockPointer, BlockInfo->StructureType, BlockInfo->BlockAlign); } -llvm::Function * -CodeGenFunction::GenerateBlockFunction(GlobalDecl GD, - const CGBlockInfo &blockInfo, - const DeclMapTy &ldm, - bool IsLambdaConversionToBlock, - bool BuildGlobalBlock) { +llvm::Function *CodeGenFunction::GenerateBlockFunction( + GlobalDecl GD, const CGBlockInfo &blockInfo, const DeclMapTy &ldm, + bool IsLambdaConversionToBlock, bool BuildGlobalBlock) { const BlockDecl *blockDecl = blockInfo.getBlockDecl(); CurGD = GD; @@ -1940,15 +1937,15 @@ CodeGenFunction::GenerateCopyHelperFunction(const CGBlockInfo &blockInfo) { StartFunction(GlobalDecl(), ReturnTy, Fn, FI, args); auto AL = ApplyDebugLocation::CreateArtificial(*this); - llvm::Type *structPtrTy = blockInfo.StructureType->getPointerTo(); - Address src = GetAddrOfLocalVar(&SrcDecl); - src = Address(Builder.CreateLoad(src), blockInfo.BlockAlign); - src = Builder.CreateBitCast(src, structPtrTy, "block.source"); + src = Address(Builder.CreateLoad(src), Int8Ty, blockInfo.BlockAlign); + src = Builder.CreateElementBitCast(src, blockInfo.StructureType, + "block.source"); Address dst = GetAddrOfLocalVar(&DstDecl); - dst = Address(Builder.CreateLoad(dst), blockInfo.BlockAlign); - dst = Builder.CreateBitCast(dst, structPtrTy, "block.dest"); + dst = Address(Builder.CreateLoad(dst), Int8Ty, blockInfo.BlockAlign); + dst = + Builder.CreateElementBitCast(dst, blockInfo.StructureType, "block.dest"); for (auto &capture : blockInfo.SortedCaptures) { if (capture.isConstantOrTrivial()) @@ -2130,11 +2127,9 @@ CodeGenFunction::GenerateDestroyHelperFunction(const CGBlockInfo &blockInfo) { auto AL = ApplyDebugLocation::CreateArtificial(*this); - llvm::Type *structPtrTy = blockInfo.StructureType->getPointerTo(); - Address src = GetAddrOfLocalVar(&SrcDecl); - src = Address(Builder.CreateLoad(src), blockInfo.BlockAlign); - src = Builder.CreateBitCast(src, structPtrTy, "block"); + src = Address(Builder.CreateLoad(src), Int8Ty, blockInfo.BlockAlign); + src = Builder.CreateElementBitCast(src, blockInfo.StructureType, "block"); CodeGenFunction::RunCleanupsScope cleanups(*this); @@ -2171,9 +2166,9 @@ public: void emitCopy(CodeGenFunction &CGF, Address destField, Address srcField) override { - destField = CGF.Builder.CreateBitCast(destField, CGF.VoidPtrTy); + destField = CGF.Builder.CreateElementBitCast(destField, CGF.Int8Ty); - srcField = CGF.Builder.CreateBitCast(srcField, CGF.VoidPtrPtrTy); + srcField = CGF.Builder.CreateElementBitCast(srcField, CGF.Int8PtrTy); llvm::Value *srcValue = CGF.Builder.CreateLoad(srcField); unsigned flags = (Flags | BLOCK_BYREF_CALLER).getBitMask(); @@ -2186,7 +2181,7 @@ public: } void emitDispose(CodeGenFunction &CGF, Address field) override { - field = CGF.Builder.CreateBitCast(field, CGF.Int8PtrTy->getPointerTo(0)); + field = CGF.Builder.CreateElementBitCast(field, CGF.Int8PtrTy); llvm::Value *value = CGF.Builder.CreateLoad(field); CGF.BuildBlockRelease(value, Flags | BLOCK_BYREF_CALLER, false); @@ -2376,23 +2371,21 @@ generateByrefCopyHelper(CodeGenFunction &CGF, const BlockByrefInfo &byrefInfo, auto AL = ApplyDebugLocation::CreateArtificial(CGF); if (generator.needsCopy()) { - llvm::Type *byrefPtrType = byrefInfo.Type->getPointerTo(0); - // dst->x Address destField = CGF.GetAddrOfLocalVar(&Dst); - destField = Address(CGF.Builder.CreateLoad(destField), + destField = Address(CGF.Builder.CreateLoad(destField), CGF.Int8Ty, byrefInfo.ByrefAlignment); - destField = CGF.Builder.CreateBitCast(destField, byrefPtrType); - destField = CGF.emitBlockByrefAddress(destField, byrefInfo, false, - "dest-object"); + destField = CGF.Builder.CreateElementBitCast(destField, byrefInfo.Type); + destField = + CGF.emitBlockByrefAddress(destField, byrefInfo, false, "dest-object"); // src->x Address srcField = CGF.GetAddrOfLocalVar(&Src); - srcField = Address(CGF.Builder.CreateLoad(srcField), + srcField = Address(CGF.Builder.CreateLoad(srcField), CGF.Int8Ty, byrefInfo.ByrefAlignment); - srcField = CGF.Builder.CreateBitCast(srcField, byrefPtrType); - srcField = CGF.emitBlockByrefAddress(srcField, byrefInfo, false, - "src-object"); + srcField = CGF.Builder.CreateElementBitCast(srcField, byrefInfo.Type); + srcField = + CGF.emitBlockByrefAddress(srcField, byrefInfo, false, "src-object"); generator.emitCopy(CGF, destField, srcField); } @@ -2446,9 +2439,9 @@ generateByrefDisposeHelper(CodeGenFunction &CGF, if (generator.needsDispose()) { Address addr = CGF.GetAddrOfLocalVar(&Src); - addr = Address(CGF.Builder.CreateLoad(addr), byrefInfo.ByrefAlignment); - auto byrefPtrType = byrefInfo.Type->getPointerTo(0); - addr = CGF.Builder.CreateBitCast(addr, byrefPtrType); + addr = Address(CGF.Builder.CreateLoad(addr), CGF.Int8Ty, + byrefInfo.ByrefAlignment); + addr = CGF.Builder.CreateElementBitCast(addr, byrefInfo.Type); addr = CGF.emitBlockByrefAddress(addr, byrefInfo, false, "object"); generator.emitDispose(CGF, addr); @@ -2594,7 +2587,8 @@ Address CodeGenFunction::emitBlockByrefAddress(Address baseAddr, // Chase the forwarding address if requested. if (followForward) { Address forwardingAddr = Builder.CreateStructGEP(baseAddr, 1, "forwarding"); - baseAddr = Address(Builder.CreateLoad(forwardingAddr), info.ByrefAlignment); + baseAddr = Address(Builder.CreateLoad(forwardingAddr), info.Type, + info.ByrefAlignment); } return Builder.CreateStructGEP(baseAddr, info.FieldIndex, name); |