diff options
Diffstat (limited to 'contrib/llvm-project/clang/lib/CodeGen/CGObjCMac.cpp')
-rw-r--r-- | contrib/llvm-project/clang/lib/CodeGen/CGObjCMac.cpp | 508 |
1 files changed, 220 insertions, 288 deletions
diff --git a/contrib/llvm-project/clang/lib/CodeGen/CGObjCMac.cpp b/contrib/llvm-project/clang/lib/CodeGen/CGObjCMac.cpp index 4c4a316308ce..517f7cddebc1 100644 --- a/contrib/llvm-project/clang/lib/CodeGen/CGObjCMac.cpp +++ b/contrib/llvm-project/clang/lib/CodeGen/CGObjCMac.cpp @@ -174,6 +174,7 @@ protected: public: llvm::IntegerType *ShortTy, *IntTy, *LongTy; llvm::PointerType *Int8PtrTy, *Int8PtrPtrTy; + llvm::PointerType *Int8PtrProgramASTy; llvm::Type *IvarOffsetVarTy; /// ObjectPtrTy - LLVM type for object handles (typeof(id)) @@ -736,14 +737,17 @@ public: // Also it is safe to make it readnone, since we never load or store the // classref except by calling this function. llvm::Type *params[] = { Int8PtrPtrTy }; + llvm::LLVMContext &C = CGM.getLLVMContext(); + llvm::AttributeSet AS = llvm::AttributeSet::get(C, { + llvm::Attribute::get(C, llvm::Attribute::NonLazyBind), + llvm::Attribute::getWithMemoryEffects(C, llvm::MemoryEffects::none()), + llvm::Attribute::get(C, llvm::Attribute::NoUnwind), + }); llvm::FunctionCallee F = CGM.CreateRuntimeFunction( llvm::FunctionType::get(ClassnfABIPtrTy, params, false), "objc_loadClassref", llvm::AttributeList::get(CGM.getLLVMContext(), - llvm::AttributeList::FunctionIndex, - {llvm::Attribute::NonLazyBind, - llvm::Attribute::ReadNone, - llvm::Attribute::NoUnwind})); + llvm::AttributeList::FunctionIndex, AS)); if (!CGM.getTriple().isOSBinFormatCOFF()) cast<llvm::Function>(F.getCallee())->setLinkage( llvm::Function::ExternalWeakLinkage); @@ -1170,7 +1174,7 @@ public: static ProtocolMethodLists get(const ObjCProtocolDecl *PD) { ProtocolMethodLists result; - for (auto MD : PD->methods()) { + for (auto *MD : PD->methods()) { size_t index = (2 * size_t(MD->isOptional())) + (size_t(MD->isClassMethod())); result.Methods[index].push_back(MD); @@ -1709,8 +1713,8 @@ public: /// A helper class for performing the null-initialization of a return /// value. struct NullReturnState { - llvm::BasicBlock *NullBB; - NullReturnState() : NullBB(nullptr) {} + llvm::BasicBlock *NullBB = nullptr; + NullReturnState() = default; /// Perform a null-check of the given receiver. void init(CodeGenFunction &CGF, llvm::Value *receiver) { @@ -1754,37 +1758,9 @@ struct NullReturnState { // Okay, start emitting the null-receiver block. CGF.EmitBlock(NullBB); - // Release any consumed arguments we've got. + // Destroy any consumed arguments we've got. if (Method) { - CallArgList::const_iterator I = CallArgs.begin(); - for (ObjCMethodDecl::param_const_iterator i = Method->param_begin(), - e = Method->param_end(); i != e; ++i, ++I) { - const ParmVarDecl *ParamDecl = (*i); - if (ParamDecl->hasAttr<NSConsumedAttr>()) { - RValue RV = I->getRValue(CGF); - assert(RV.isScalar() && - "NullReturnState::complete - arg not on object"); - CGF.EmitARCRelease(RV.getScalarVal(), ARCImpreciseLifetime); - } else { - QualType QT = ParamDecl->getType(); - auto *RT = QT->getAs<RecordType>(); - if (RT && RT->getDecl()->isParamDestroyedInCallee()) { - RValue RV = I->getRValue(CGF); - QualType::DestructionKind DtorKind = QT.isDestructedType(); - switch (DtorKind) { - case QualType::DK_cxx_destructor: - CGF.destroyCXXObject(CGF, RV.getAggregateAddress(), QT); - break; - case QualType::DK_nontrivial_c_struct: - CGF.destroyNonTrivialCStruct(CGF, RV.getAggregateAddress(), QT); - break; - default: - llvm_unreachable("unexpected dtor kind"); - break; - } - } - } - } + CGObjCRuntime::destroyCalleeDestroyedArguments(CGF, Method, CallArgs); } // The phi code below assumes that we haven't needed any control flow yet. @@ -1874,7 +1850,7 @@ static bool hasObjCExceptionAttribute(ASTContext &Context, static llvm::GlobalValue::LinkageTypes getLinkageTypeForObjCMetadata(CodeGenModule &CGM, StringRef Section) { if (CGM.getTriple().isOSBinFormatMachO() && - (Section.empty() || Section.startswith("__DATA"))) + (Section.empty() || Section.starts_with("__DATA"))) return llvm::GlobalValue::InternalLinkage; return llvm::GlobalValue::PrivateLinkage; } @@ -1982,9 +1958,8 @@ llvm::Constant *CGObjCMac::getNSConstantStringClassRef() { llvm::Type *PTy = llvm::ArrayType::get(CGM.IntTy, 0); auto GV = CGM.CreateRuntimeVariable(PTy, str); - auto V = llvm::ConstantExpr::getBitCast(GV, CGM.IntTy->getPointerTo()); - ConstantStringClassRef = V; - return V; + ConstantStringClassRef = GV; + return GV; } llvm::Constant *CGObjCNonFragileABIMac::getNSConstantStringClassRef() { @@ -1996,12 +1971,8 @@ llvm::Constant *CGObjCNonFragileABIMac::getNSConstantStringClassRef() { StringClass.empty() ? "OBJC_CLASS_$_NSConstantString" : "OBJC_CLASS_$_" + StringClass; llvm::Constant *GV = GetClassGlobal(str, NotForDefinition); - - // Make sure the result is of the correct type. - auto V = llvm::ConstantExpr::getBitCast(GV, CGM.IntTy->getPointerTo()); - - ConstantStringClassRef = V; - return V; + ConstantStringClassRef = GV; + return GV; } ConstantAddress @@ -2011,7 +1982,8 @@ CGObjCCommonMac::GenerateConstantNSString(const StringLiteral *Literal) { GetConstantStringEntry(NSConstantStringMap, Literal, StringLength); if (auto *C = Entry.second) - return ConstantAddress(C, CharUnits::fromQuantity(C->getAlignment())); + return ConstantAddress( + C, C->getValueType(), CharUnits::fromQuantity(C->getAlignment())); // If we don't already have it, get _NSConstantStringClassReference. llvm::Constant *Class = getNSConstantStringClassRef(); @@ -2019,11 +1991,8 @@ CGObjCCommonMac::GenerateConstantNSString(const StringLiteral *Literal) { // If we don't already have it, construct the type for a constant NSString. if (!NSConstantStringType) { NSConstantStringType = - llvm::StructType::create({ - CGM.Int32Ty->getPointerTo(), - CGM.Int8PtrTy, - CGM.IntTy - }, "struct.__builtin_NSString"); + llvm::StructType::create({CGM.UnqualPtrTy, CGM.Int8PtrTy, CGM.IntTy}, + "struct.__builtin_NSString"); } ConstantInitBuilder Builder(CGM); @@ -2045,7 +2014,7 @@ CGObjCCommonMac::GenerateConstantNSString(const StringLiteral *Literal) { // Don't enforce the target's minimum global alignment, since the only use // of the string is via this class initializer. GV->setAlignment(llvm::Align(1)); - Fields.addBitCast(GV, CGM.Int8PtrTy); + Fields.add(GV); // String length. Fields.addInt(CGM.IntTy, StringLength); @@ -2064,7 +2033,7 @@ CGObjCCommonMac::GenerateConstantNSString(const StringLiteral *Literal) { : NSStringSection); Entry.second = GV; - return ConstantAddress(GV, Alignment); + return ConstantAddress(GV, GV->getValueType(), Alignment); } enum { @@ -2096,6 +2065,7 @@ CGObjCMac::GenerateMessageSendSuper(CodeGen::CodeGenFunction &CGF, CGF.Builder.CreateStructGEP(ObjCSuper, 0)); // If this is a class message the metaclass is passed as the target. + llvm::Type *ClassTyPtr = llvm::PointerType::getUnqual(ObjCTypes.ClassTy); llvm::Value *Target; if (IsClassMessage) { if (isCategoryImpl) { @@ -2107,13 +2077,14 @@ CGObjCMac::GenerateMessageSendSuper(CodeGen::CodeGenFunction &CGF, // isa" is the first ivar in a class (which it must be). Target = EmitClassRef(CGF, Class->getSuperClass()); Target = CGF.Builder.CreateStructGEP(ObjCTypes.ClassTy, Target, 0); - Target = CGF.Builder.CreateAlignedLoad(Target, CGF.getPointerAlign()); + Target = CGF.Builder.CreateAlignedLoad(ClassTyPtr, Target, + CGF.getPointerAlign()); } else { llvm::Constant *MetaClassPtr = EmitMetaClassRef(Class); llvm::Value *SuperPtr = CGF.Builder.CreateStructGEP(ObjCTypes.ClassTy, MetaClassPtr, 1); - llvm::Value *Super = - CGF.Builder.CreateAlignedLoad(SuperPtr, CGF.getPointerAlign()); + llvm::Value *Super = CGF.Builder.CreateAlignedLoad(ClassTyPtr, SuperPtr, + CGF.getPointerAlign()); Target = Super; } } else if (isCategoryImpl) @@ -2121,7 +2092,8 @@ CGObjCMac::GenerateMessageSendSuper(CodeGen::CodeGenFunction &CGF, else { llvm::Value *ClassPtr = EmitSuperClassRef(Class); ClassPtr = CGF.Builder.CreateStructGEP(ObjCTypes.ClassTy, ClassPtr, 1); - Target = CGF.Builder.CreateAlignedLoad(ClassPtr, CGF.getPointerAlign()); + Target = CGF.Builder.CreateAlignedLoad(ClassTyPtr, ClassPtr, + CGF.getPointerAlign()); } // FIXME: We shouldn't need to do this cast, rectify the ASTContext and // ObjCTypes types. @@ -2148,15 +2120,6 @@ CodeGen::RValue CGObjCMac::GenerateMessageSend(CodeGen::CodeGenFunction &CGF, Method, Class, ObjCTypes); } -static bool isWeakLinkedClass(const ObjCInterfaceDecl *ID) { - do { - if (ID->isWeakImported()) - return true; - } while ((ID = ID->getSuperClass())); - - return false; -} - CodeGen::RValue CGObjCCommonMac::EmitMessageSend(CodeGen::CodeGenFunction &CGF, ReturnValueSlot Return, @@ -2171,22 +2134,14 @@ CGObjCCommonMac::EmitMessageSend(CodeGen::CodeGenFunction &CGF, const ObjCCommonTypesHelper &ObjCTypes) { CodeGenTypes &Types = CGM.getTypes(); auto selTy = CGF.getContext().getObjCSelType(); - llvm::Value *SelValue; - - if (Method && Method->isDirectMethod()) { - // Direct methods will synthesize the proper `_cmd` internally, - // so just don't bother with setting the `_cmd` argument. - assert(!IsSuper); - SelValue = llvm::UndefValue::get(Types.ConvertType(selTy)); - } else { - SelValue = GetSelector(CGF, Sel); - } + llvm::Value *SelValue = llvm::UndefValue::get(Types.ConvertType(selTy)); CallArgList ActualArgs; if (!IsSuper) Arg0 = CGF.Builder.CreateBitCast(Arg0, ObjCTypes.ObjectPtrTy); ActualArgs.add(RValue::get(Arg0), Arg0Ty); - ActualArgs.add(RValue::get(SelValue), selTy); + if (!Method || !Method->isDirectMethod()) + ActualArgs.add(RValue::get(SelValue), selTy); ActualArgs.addFrom(CallArgs); // If we're calling a method, use the formal signature. @@ -2197,38 +2152,19 @@ CGObjCCommonMac::EmitMessageSend(CodeGen::CodeGenFunction &CGF, CGM.getContext().getCanonicalType(ResultType) && "Result type mismatch!"); - bool ReceiverCanBeNull = true; - - // Super dispatch assumes that self is non-null; even the messenger - // doesn't have a null check internally. - if (IsSuper) { - ReceiverCanBeNull = false; - - // If this is a direct dispatch of a class method, check whether the class, - // or anything in its hierarchy, was weak-linked. - } else if (ClassReceiver && Method && Method->isClassMethod()) { - ReceiverCanBeNull = isWeakLinkedClass(ClassReceiver); - - // If we're emitting a method, and self is const (meaning just ARC, for now), - // and the receiver is a load of self, then self is a valid object. - } else if (auto CurMethod = - dyn_cast_or_null<ObjCMethodDecl>(CGF.CurCodeDecl)) { - auto Self = CurMethod->getSelfDecl(); - if (Self->getType().isConstQualified()) { - if (auto LI = dyn_cast<llvm::LoadInst>(Arg0->stripPointerCasts())) { - llvm::Value *SelfAddr = CGF.GetAddrOfLocalVar(Self).getPointer(); - if (SelfAddr == LI->getPointerOperand()) { - ReceiverCanBeNull = false; - } - } - } - } + bool ReceiverCanBeNull = + canMessageReceiverBeNull(CGF, Method, IsSuper, ClassReceiver, Arg0); bool RequiresNullCheck = false; + bool RequiresSelValue = true; llvm::FunctionCallee Fn = nullptr; if (Method && Method->isDirectMethod()) { + assert(!IsSuper); Fn = GenerateDirectMethod(Method, Method->getClassInterface()); + // Direct methods will synthesize the proper `_cmd` internally, + // so just don't bother with setting the `_cmd` argument. + RequiresSelValue = false; } else if (CGM.ReturnSlotInterferesWithArgs(MSI.CallInfo)) { if (ReceiverCanBeNull) RequiresNullCheck = true; Fn = (ObjCABI == 2) ? ObjCTypes.getSendStretFn2(IsSuper) @@ -2258,20 +2194,20 @@ CGObjCCommonMac::EmitMessageSend(CodeGen::CodeGenFunction &CGF, RequiresNullCheck = false; // Emit a null-check if there's a consumed argument other than the receiver. - if (!RequiresNullCheck && CGM.getLangOpts().ObjCAutoRefCount && Method) { - for (const auto *ParamDecl : Method->parameters()) { - if (ParamDecl->isDestroyedInCallee()) { - RequiresNullCheck = true; - break; - } - } - } + if (!RequiresNullCheck && Method && Method->hasParamDestroyedInCallee()) + RequiresNullCheck = true; NullReturnState nullReturn; if (RequiresNullCheck) { nullReturn.init(CGF, Arg0); } + // If a selector value needs to be passed, emit the load before the call. + if (RequiresSelValue) { + SelValue = GetSelector(CGF, Sel); + ActualArgs[1] = CallArg(RValue::get(SelValue), selTy); + } + llvm::CallBase *CallSite; CGCallee Callee = CGCallee::forDirect(BitcastFn); RValue rvalue = CGF.EmitCall(MSI.CallInfo, Callee, Return, ActualArgs, @@ -2463,8 +2399,8 @@ void IvarLayoutBuilder::visitBlock(const CGBlockInfo &blockInfo) { Qualifiers::GC GCAttr = GetGCAttrTypeForType(CGM.getContext(), type); if (GCAttr == Qualifiers::Strong) { - assert(CGM.getContext().getTypeSize(type) - == CGM.getTarget().getPointerWidth(0)); + assert(CGM.getContext().getTypeSize(type) == + CGM.getTarget().getPointerWidth(LangAS::Default)); IvarsInfo.push_back(IvarInfo(fieldOffset, /*size in words*/ 1)); } } @@ -2550,7 +2486,7 @@ void CGObjCCommonMac::BuildRCRecordLayout(const llvm::StructLayout *RecLayout, if (FQT->isUnionType()) HasUnion = true; - BuildRCBlockVarRecordLayout(FQT->getAs<RecordType>(), + BuildRCBlockVarRecordLayout(FQT->castAs<RecordType>(), BytePos + FieldOffset, HasUnion); continue; } @@ -2757,7 +2693,7 @@ llvm::Constant *CGObjCCommonMac::getBitmapBlockLayout(bool ComputeByrefLayout) { llvm::Constant *nullPtr = llvm::Constant::getNullValue(CGM.Int8PtrTy); if (RunSkipBlockVars.empty()) return nullPtr; - unsigned WordSizeInBits = CGM.getTarget().getPointerWidth(0); + unsigned WordSizeInBits = CGM.getTarget().getPointerWidth(LangAS::Default); unsigned ByteSizeInBits = CGM.getTarget().getCharWidth(); unsigned WordSizeInBytes = WordSizeInBits/ByteSizeInBits; @@ -2943,7 +2879,7 @@ void CGObjCCommonMac::fillRunSkipBlockVars(CodeGenModule &CGM, RunSkipBlockVars.clear(); bool hasUnion = false; - unsigned WordSizeInBits = CGM.getTarget().getPointerWidth(0); + unsigned WordSizeInBits = CGM.getTarget().getPointerWidth(LangAS::Default); unsigned ByteSizeInBits = CGM.getTarget().getCharWidth(); unsigned WordSizeInBytes = WordSizeInBits/ByteSizeInBits; @@ -2998,8 +2934,7 @@ CGObjCCommonMac::BuildRCBlockLayout(CodeGenModule &CGM, std::string CGObjCCommonMac::getRCBlockLayoutStr(CodeGenModule &CGM, const CGBlockInfo &blockInfo) { fillRunSkipBlockVars(CGM, blockInfo); - return getBlockLayoutInfoString(RunSkipBlockVars, - blockInfo.needsCopyDisposeHelpers()); + return getBlockLayoutInfoString(RunSkipBlockVars, blockInfo.NeedsCopyDispose); } llvm::Constant *CGObjCCommonMac::BuildByrefLayout(CodeGen::CodeGenModule &CGM, @@ -3026,8 +2961,7 @@ llvm::Value *CGObjCMac::GenerateProtocolRef(CodeGenFunction &CGF, // resolved. Investigate. Its also wasteful to look this up over and over. LazySymbols.insert(&CGM.getContext().Idents.get("Protocol")); - return llvm::ConstantExpr::getBitCast(GetProtocolRef(PD), - ObjCTypes.getExternalProtocolPtrTy()); + return GetProtocolRef(PD); } void CGObjCCommonMac::GenerateProtocol(const ObjCProtocolDecl *PD) { @@ -3247,7 +3181,7 @@ CGObjCMac::EmitProtocolList(Twine name, llvm::GlobalVariable *GV = CreateMetadataVar(name, values, section, CGM.getPointerAlign(), false); - return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.ProtocolListPtrTy); + return GV; } static void @@ -3355,7 +3289,7 @@ llvm::Constant *CGObjCCommonMac::EmitPropertyList(Twine Name, llvm::GlobalVariable *GV = CreateMetadataVar(Name, values, Section, CGM.getPointerAlign(), true); - return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.PropertyListPtrTy); + return GV; } llvm::Constant * @@ -3376,7 +3310,7 @@ CGObjCCommonMac::EmitProtocolMethodTypes(Twine Name, llvm::GlobalVariable *GV = CreateMetadataVar(Name, Init, Section, CGM.getPointerAlign(), true); - return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.Int8PtrPtrTy); + return GV; } /* @@ -3386,7 +3320,7 @@ CGObjCCommonMac::EmitProtocolMethodTypes(Twine Name, struct _objc_method_list *instance_methods; struct _objc_method_list *class_methods; struct _objc_protocol_list *protocols; - uint32_t size; // <rdar://4585769> + uint32_t size; // sizeof(struct _objc_category) struct _objc_property_list *instance_properties; struct _objc_property_list *class_properties; }; @@ -3515,7 +3449,7 @@ static bool hasWeakMember(QualType type) { } if (auto recType = type->getAs<RecordType>()) { - for (auto field : recType->getDecl()->fields()) { + for (auto *field : recType->getDecl()->fields()) { if (hasWeakMember(field->getType())) return true; } @@ -3623,8 +3557,7 @@ void CGObjCMac::GenerateClass(const ObjCImplementationDecl *ID) { // Record a reference to the super class. LazySymbols.insert(Super->getIdentifier()); - values.addBitCast(GetClassName(Super->getObjCRuntimeNameAsString()), - ObjCTypes.ClassPtrTy); + values.add(GetClassName(Super->getObjCRuntimeNameAsString())); } else { values.addNullPointer(ObjCTypes.ClassPtrTy); } @@ -3678,14 +3611,12 @@ llvm::Constant *CGObjCMac::EmitMetaClass(const ObjCImplementationDecl *ID, const ObjCInterfaceDecl *Root = ID->getClassInterface(); while (const ObjCInterfaceDecl *Super = Root->getSuperClass()) Root = Super; - values.addBitCast(GetClassName(Root->getObjCRuntimeNameAsString()), - ObjCTypes.ClassPtrTy); + values.add(GetClassName(Root->getObjCRuntimeNameAsString())); // The super class for the metaclass is emitted as the name of the // super class. The runtime fixes this up to point to the // *metaclass* for the super class. if (ObjCInterfaceDecl *Super = ID->getClassInterface()->getSuperClass()) { - values.addBitCast(GetClassName(Super->getObjCRuntimeNameAsString()), - ObjCTypes.ClassPtrTy); + values.add(GetClassName(Super->getObjCRuntimeNameAsString())); } else { values.addNullPointer(ObjCTypes.ClassPtrTy); } @@ -3866,16 +3797,10 @@ llvm::Constant *CGObjCMac::EmitIvarList(const ObjCImplementationDecl *ID, ivarList.fillPlaceholderWithInt(countSlot, ObjCTypes.IntTy, count); llvm::GlobalVariable *GV; - if (ForClass) - GV = - CreateMetadataVar("OBJC_CLASS_VARIABLES_" + ID->getName(), ivarList, - "__OBJC,__class_vars,regular,no_dead_strip", - CGM.getPointerAlign(), true); - else - GV = CreateMetadataVar("OBJC_INSTANCE_VARIABLES_" + ID->getName(), ivarList, - "__OBJC,__instance_vars,regular,no_dead_strip", - CGM.getPointerAlign(), true); - return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.IvarListPtrTy); + GV = CreateMetadataVar("OBJC_INSTANCE_VARIABLES_" + ID->getName(), ivarList, + "__OBJC,__instance_vars,regular,no_dead_strip", + CGM.getPointerAlign(), true); + return GV; } /// Build a struct objc_method_description constant for the given method. @@ -3887,8 +3812,7 @@ llvm::Constant *CGObjCMac::EmitIvarList(const ObjCImplementationDecl *ID, void CGObjCMac::emitMethodDescriptionConstant(ConstantArrayBuilder &builder, const ObjCMethodDecl *MD) { auto description = builder.beginStruct(ObjCTypes.MethodDescriptionTy); - description.addBitCast(GetMethodVarName(MD->getSelector()), - ObjCTypes.SelectorPtrTy); + description.add(GetMethodVarName(MD->getSelector())); description.add(GetMethodVarType(MD)); description.finishAndAddTo(builder); } @@ -3906,10 +3830,9 @@ void CGObjCMac::emitMethodConstant(ConstantArrayBuilder &builder, assert(fn && "no definition registered for method"); auto method = builder.beginStruct(ObjCTypes.MethodTy); - method.addBitCast(GetMethodVarName(MD->getSelector()), - ObjCTypes.SelectorPtrTy); + method.add(GetMethodVarName(MD->getSelector())); method.add(GetMethodVarType(MD)); - method.addBitCast(fn, ObjCTypes.Int8PtrTy); + method.add(fn); method.finishAndAddTo(builder); } @@ -3994,8 +3917,7 @@ llvm::Constant *CGObjCMac::emitMethodList(Twine name, MethodListType MLT, llvm::GlobalVariable *GV = CreateMetadataVar(prefix + name, values, section, CGM.getPointerAlign(), true); - return llvm::ConstantExpr::getBitCast(GV, - ObjCTypes.MethodDescriptionListPtrTy); + return GV; } // Otherwise, it's an objc_method_list. @@ -4012,7 +3934,7 @@ llvm::Constant *CGObjCMac::emitMethodList(Twine name, MethodListType MLT, llvm::GlobalVariable *GV = CreateMetadataVar(prefix + name, values, section, CGM.getPointerAlign(), true); - return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.MethodListPtrTy); + return GV; } llvm::Function *CGObjCCommonMac::GenerateMethod(const ObjCMethodDecl *OMD, @@ -4067,8 +3989,7 @@ CGObjCCommonMac::GenerateDirectMethod(const ObjCMethodDecl *OMD, Fn = llvm::Function::Create(MethodTy, llvm::GlobalValue::ExternalLinkage, "", &CGM.getModule()); Fn->takeName(OldFn); - OldFn->replaceAllUsesWith( - llvm::ConstantExpr::getBitCast(Fn, OldFn->getType())); + OldFn->replaceAllUsesWith(Fn); OldFn->eraseFromParent(); // Replace the cached function in the map. @@ -4164,6 +4085,9 @@ void CGObjCCommonMac::GenerateDirectMethodPrologue( // only synthesize _cmd if it's referenced if (OMD->getCmdDecl()->isUsed()) { + // `_cmd` is not a parameter to direct methods, so storage must be + // explicitly declared for it. + CGF.EmitVarDecl(*OMD->getCmdDecl()); Builder.CreateStore(GetSelector(CGF, OMD), CGF.GetAddrOfLocalVar(OMD->getCmdDecl())); } @@ -4433,7 +4357,11 @@ FragileHazards::FragileHazards(CodeGenFunction &CGF) : CGF(CGF) { void FragileHazards::emitWriteHazard() { if (Locals.empty()) return; - CGF.EmitNounwindRuntimeCall(WriteHazard, Locals); + llvm::CallInst *Call = CGF.EmitNounwindRuntimeCall(WriteHazard, Locals); + for (auto Pair : llvm::enumerate(Locals)) + Call->addParamAttr(Pair.index(), llvm::Attribute::get( + CGF.getLLVMContext(), llvm::Attribute::ElementType, + cast<llvm::AllocaInst>(Pair.value())->getAllocatedType())); } void FragileHazards::emitReadHazard(CGBuilderTy &Builder) { @@ -4441,6 +4369,10 @@ void FragileHazards::emitReadHazard(CGBuilderTy &Builder) { llvm::CallInst *call = Builder.CreateCall(ReadHazard, Locals); call->setDoesNotThrow(); call->setCallingConv(CGF.getRuntimeCC()); + for (auto Pair : llvm::enumerate(Locals)) + call->addParamAttr(Pair.index(), llvm::Attribute::get( + Builder.getContext(), llvm::Attribute::ElementType, + cast<llvm::AllocaInst>(Pair.value())->getAllocatedType())); } /// Emit read hazards in all the protected blocks, i.e. all the blocks @@ -4538,14 +4470,10 @@ llvm::FunctionType *FragileHazards::GetAsmFnType() { want to implement correct ObjC/C++ exception interactions for the fragile ABI. - Note that for this use of setjmp/longjmp to be correct, we may need - to mark some local variables volatile: if a non-volatile local - variable is modified between the setjmp and the longjmp, it has - indeterminate value. For the purposes of LLVM IR, it may be - sufficient to make loads and stores within the @try (to variables - declared outside the @try) volatile. This is necessary for - optimized correctness, but is not currently being done; this is - being tracked as rdar://problem/8160285 + Note that for this use of setjmp/longjmp to be correct in the presence of + optimization, we use inline assembly on the set of local variables to force + flushing locals to memory immediately before any protected calls and to + inhibit optimizing locals across the setjmp->catch edge. The basic framework for a @try-catch-finally is as follows: { @@ -4785,9 +4713,7 @@ void CGObjCMac::EmitTryOrSynchronizedStmt(CodeGen::CodeGenFunction &CGF, // matched and avoid generating code for falling off the end if // so. bool AllMatched = false; - for (unsigned I = 0, N = AtTryStmt->getNumCatchStmts(); I != N; ++I) { - const ObjCAtCatchStmt *CatchStmt = AtTryStmt->getCatchStmt(I); - + for (const ObjCAtCatchStmt *CatchStmt : AtTryStmt->catch_stmts()) { const VarDecl *CatchParam = CatchStmt->getCatchParamDecl(); const ObjCObjectPointerType *OPT = nullptr; @@ -4971,11 +4897,11 @@ void CGObjCMac::EmitThrowStmt(CodeGen::CodeGenFunction &CGF, llvm::Value * CGObjCMac::EmitObjCWeakRead(CodeGen::CodeGenFunction &CGF, Address AddrWeakObj) { llvm::Type* DestTy = AddrWeakObj.getElementType(); - AddrWeakObj = CGF.Builder.CreateBitCast(AddrWeakObj, - ObjCTypes.PtrObjectPtrTy); + llvm::Value *AddrWeakObjVal = CGF.Builder.CreateBitCast( + AddrWeakObj.getPointer(), ObjCTypes.PtrObjectPtrTy); llvm::Value *read_weak = CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcReadWeakFn(), - AddrWeakObj.getPointer(), "weakread"); + AddrWeakObjVal, "weakread"); read_weak = CGF.Builder.CreateBitCast(read_weak, DestTy); return read_weak; } @@ -4994,8 +4920,9 @@ void CGObjCMac::EmitObjCWeakAssign(CodeGen::CodeGenFunction &CGF, src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy); } src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy); - dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy); - llvm::Value *args[] = { src, dst.getPointer() }; + llvm::Value *dstVal = + CGF.Builder.CreateBitCast(dst.getPointer(), ObjCTypes.PtrObjectPtrTy); + llvm::Value *args[] = { src, dstVal }; CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignWeakFn(), args, "weakassign"); } @@ -5015,8 +4942,9 @@ void CGObjCMac::EmitObjCGlobalAssign(CodeGen::CodeGenFunction &CGF, src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy); } src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy); - dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy); - llvm::Value *args[] = { src, dst.getPointer() }; + llvm::Value *dstVal = + CGF.Builder.CreateBitCast(dst.getPointer(), ObjCTypes.PtrObjectPtrTy); + llvm::Value *args[] = {src, dstVal}; if (!threadlocal) CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignGlobalFn(), args, "globalassign"); @@ -5041,8 +4969,9 @@ void CGObjCMac::EmitObjCIvarAssign(CodeGen::CodeGenFunction &CGF, src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy); } src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy); - dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy); - llvm::Value *args[] = { src, dst.getPointer(), ivarOffset }; + llvm::Value *dstVal = + CGF.Builder.CreateBitCast(dst.getPointer(), ObjCTypes.PtrObjectPtrTy); + llvm::Value *args[] = {src, dstVal, ivarOffset}; CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignIvarFn(), args); } @@ -5060,18 +4989,16 @@ void CGObjCMac::EmitObjCStrongCastAssign(CodeGen::CodeGenFunction &CGF, src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy); } src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy); - dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy); - llvm::Value *args[] = { src, dst.getPointer() }; + llvm::Value *dstVal = + CGF.Builder.CreateBitCast(dst.getPointer(), ObjCTypes.PtrObjectPtrTy); + llvm::Value *args[] = {src, dstVal}; CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignStrongCastFn(), args, "strongassign"); } void CGObjCMac::EmitGCMemmoveCollectable(CodeGen::CodeGenFunction &CGF, - Address DestPtr, - Address SrcPtr, + Address DestPtr, Address SrcPtr, llvm::Value *size) { - SrcPtr = CGF.Builder.CreateBitCast(SrcPtr, ObjCTypes.Int8PtrTy); - DestPtr = CGF.Builder.CreateBitCast(DestPtr, ObjCTypes.Int8PtrTy); llvm::Value *args[] = { DestPtr.getPointer(), SrcPtr.getPointer(), size }; CGF.EmitNounwindRuntimeCall(ObjCTypes.GcMemmoveCollectableFn(), args); } @@ -5120,7 +5047,9 @@ std::string CGObjCCommonMac::GetSectionName(StringRef Section, return ("." + Section.substr(2) + "$B").str(); case llvm::Triple::Wasm: case llvm::Triple::GOFF: + case llvm::Triple::SPIRV: case llvm::Triple::XCOFF: + case llvm::Triple::DXContainer: llvm::report_fatal_error( "Objective-C support is unimplemented for object file format"); } @@ -5143,7 +5072,8 @@ enum ImageInfoFlags { eImageInfo_OptimizedByDyld = (1 << 3), // This flag is set by the dyld shared cache. // A flag indicating that the module has no instances of a @synthesize of a - // superclass variable. <rdar://problem/6803242> + // superclass variable. This flag used to be consumed by the runtime to work + // around miscompile by gcc. eImageInfo_CorrectedSynthesize = (1 << 4), // This flag is no longer set by clang. eImageInfo_ImageIsSimulated = (1 << 5), eImageInfo_ClassProperties = (1 << 6) @@ -5256,17 +5186,17 @@ llvm::Constant *CGObjCMac::EmitModuleSymbols() { if (ID->isWeakImported() && !IMP->isWeakImported()) DefinedClasses[i]->setLinkage(llvm::GlobalVariable::ExternalLinkage); - array.addBitCast(DefinedClasses[i], ObjCTypes.Int8PtrTy); + array.add(DefinedClasses[i]); } for (unsigned i=0; i<NumCategories; i++) - array.addBitCast(DefinedCategories[i], ObjCTypes.Int8PtrTy); + array.add(DefinedCategories[i]); array.finishAndAddTo(values); llvm::GlobalVariable *GV = CreateMetadataVar( "OBJC_SYMBOLS", values, "__OBJC,__symbols,regular,no_dead_strip", CGM.getPointerAlign(), true); - return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.SymtabPtrTy); + return GV; } llvm::Value *CGObjCMac::EmitClassRefFromId(CodeGenFunction &CGF, @@ -5276,16 +5206,14 @@ llvm::Value *CGObjCMac::EmitClassRefFromId(CodeGenFunction &CGF, llvm::GlobalVariable *&Entry = ClassReferences[II]; if (!Entry) { - llvm::Constant *Casted = - llvm::ConstantExpr::getBitCast(GetClassName(II->getName()), - ObjCTypes.ClassPtrTy); - Entry = CreateMetadataVar( - "OBJC_CLASS_REFERENCES_", Casted, - "__OBJC,__cls_refs,literal_pointers,no_dead_strip", - CGM.getPointerAlign(), true); + Entry = + CreateMetadataVar("OBJC_CLASS_REFERENCES_", GetClassName(II->getName()), + "__OBJC,__cls_refs,literal_pointers,no_dead_strip", + CGM.getPointerAlign(), true); } - return CGF.Builder.CreateAlignedLoad(Entry, CGF.getPointerAlign()); + return CGF.Builder.CreateAlignedLoad(Entry->getValueType(), Entry, + CGF.getPointerAlign()); } llvm::Value *CGObjCMac::EmitClassRef(CodeGenFunction &CGF, @@ -5314,16 +5242,13 @@ Address CGObjCMac::EmitSelectorAddr(Selector Sel) { llvm::GlobalVariable *&Entry = SelectorReferences[Sel]; if (!Entry) { - llvm::Constant *Casted = - llvm::ConstantExpr::getBitCast(GetMethodVarName(Sel), - ObjCTypes.SelectorPtrTy); Entry = CreateMetadataVar( - "OBJC_SELECTOR_REFERENCES_", Casted, + "OBJC_SELECTOR_REFERENCES_", GetMethodVarName(Sel), "__OBJC,__message_refs,literal_pointers,no_dead_strip", Align, true); Entry->setExternallyInitialized(true); } - return Address(Entry, Align); + return Address(Entry, ObjCTypes.SelectorPtrTy, Align); } llvm::Constant *CGObjCCommonMac::GetClassName(StringRef RuntimeName) { @@ -5334,12 +5259,7 @@ llvm::Constant *CGObjCCommonMac::GetClassName(StringRef RuntimeName) { } llvm::Function *CGObjCCommonMac::GetMethodDefinition(const ObjCMethodDecl *MD) { - llvm::DenseMap<const ObjCMethodDecl*, llvm::Function*>::iterator - I = MethodDefinitions.find(MD); - if (I != MethodDefinitions.end()) - return I->second; - - return nullptr; + return MethodDefinitions.lookup(MD); } /// GetIvarLayoutName - Returns a unique constant for the given @@ -5788,11 +5708,13 @@ ObjCCommonTypesHelper::ObjCCommonTypesHelper(CodeGen::CodeGenModule &cgm) { CodeGen::CodeGenTypes &Types = CGM.getTypes(); ASTContext &Ctx = CGM.getContext(); + unsigned ProgramAS = CGM.getDataLayout().getProgramAddressSpace(); ShortTy = cast<llvm::IntegerType>(Types.ConvertType(Ctx.ShortTy)); IntTy = CGM.IntTy; LongTy = cast<llvm::IntegerType>(Types.ConvertType(Ctx.LongTy)); Int8PtrTy = CGM.Int8PtrTy; + Int8PtrProgramASTy = llvm::PointerType::get(CGM.Int8Ty, ProgramAS); Int8PtrPtrTy = CGM.Int8PtrPtrTy; // arm64 targets use "int" ivar offset variables. All others, @@ -5821,10 +5743,9 @@ ObjCCommonTypesHelper::ObjCCommonTypesHelper(CodeGen::CodeGenModule &cgm) // id self; // Class cls; // } - RecordDecl *RD = RecordDecl::Create(Ctx, TTK_Struct, - Ctx.getTranslationUnitDecl(), - SourceLocation(), SourceLocation(), - &Ctx.Idents.get("_objc_super")); + RecordDecl *RD = RecordDecl::Create( + Ctx, TagTypeKind::Struct, Ctx.getTranslationUnitDecl(), SourceLocation(), + SourceLocation(), &Ctx.Idents.get("_objc_super")); RD->addDecl(FieldDecl::Create(Ctx, RD, SourceLocation(), SourceLocation(), nullptr, Ctx.getObjCIdType(), nullptr, nullptr, false, ICIS_NoInit)); @@ -5861,7 +5782,7 @@ ObjCCommonTypesHelper::ObjCCommonTypesHelper(CodeGen::CodeGenModule &cgm) // char *_imp; // } MethodTy = llvm::StructType::create("struct._objc_method", SelectorPtrTy, - Int8PtrTy, Int8PtrTy); + Int8PtrTy, Int8PtrProgramASTy); // struct _objc_cache * CacheTy = llvm::StructType::create(VMContext, "struct._objc_cache"); @@ -6174,10 +6095,9 @@ ObjCNonFragileABITypesHelper::ObjCNonFragileABITypesHelper(CodeGen::CodeGenModul // }; // First the clang type for struct _message_ref_t - RecordDecl *RD = RecordDecl::Create(Ctx, TTK_Struct, - Ctx.getTranslationUnitDecl(), - SourceLocation(), SourceLocation(), - &Ctx.Idents.get("_message_ref_t")); + RecordDecl *RD = RecordDecl::Create( + Ctx, TagTypeKind::Struct, Ctx.getTranslationUnitDecl(), SourceLocation(), + SourceLocation(), &Ctx.Idents.get("_message_ref_t")); RD->addDecl(FieldDecl::Create(Ctx, RD, SourceLocation(), SourceLocation(), nullptr, Ctx.VoidPtrTy, nullptr, nullptr, false, ICIS_NoInit)); @@ -6232,8 +6152,8 @@ void CGObjCNonFragileABIMac::AddModuleClassList( SmallVector<llvm::Constant*, 8> Symbols(NumClasses); for (unsigned i=0; i<NumClasses; i++) - Symbols[i] = llvm::ConstantExpr::getBitCast(Container[i], - ObjCTypes.Int8PtrTy); + Symbols[i] = Container[i]; + llvm::Constant *Init = llvm::ConstantArray::get(llvm::ArrayType::get(ObjCTypes.Int8PtrTy, Symbols.size()), @@ -6242,13 +6162,12 @@ void CGObjCNonFragileABIMac::AddModuleClassList( // Section name is obtained by calling GetSectionName, which returns // sections in the __DATA segment on MachO. assert((!CGM.getTriple().isOSBinFormatMachO() || - SectionName.startswith("__DATA")) && + SectionName.starts_with("__DATA")) && "SectionName expected to start with __DATA on MachO"); llvm::GlobalVariable *GV = new llvm::GlobalVariable( CGM.getModule(), Init->getType(), false, llvm::GlobalValue::PrivateLinkage, Init, SymbolName); - GV->setAlignment( - llvm::Align(CGM.getDataLayout().getABITypeAlignment(Init->getType()))); + GV->setAlignment(CGM.getDataLayout().getABITypeAlign(Init->getType())); GV->setSection(SectionName); CGM.addCompilerUsedGlobal(GV); } @@ -6480,8 +6399,7 @@ CGObjCNonFragileABIMac::BuildClassObject(const ObjCInterfaceDecl *CI, if (CGM.getTriple().isOSBinFormatMachO()) GV->setSection("__DATA, __objc_data"); - GV->setAlignment(llvm::Align( - CGM.getDataLayout().getABITypeAlignment(ObjCTypes.ClassnfABITy))); + GV->setAlignment(CGM.getDataLayout().getABITypeAlign(ObjCTypes.ClassnfABITy)); if (!CGM.getTriple().isOSBinFormatCOFF()) if (HiddenVisibility) GV->setVisibility(llvm::GlobalValue::HiddenVisibility); @@ -6518,7 +6436,7 @@ static llvm::GlobalValue::DLLStorageClassTypes getStorage(CodeGenModule &CGM, DeclContext *DC = TranslationUnitDecl::castToDeclContext(TUDecl); const VarDecl *VD = nullptr; - for (const auto &Result : DC->lookup(&II)) + for (const auto *Result : DC->lookup(&II)) if ((VD = dyn_cast<VarDecl>(Result))) break; @@ -6671,9 +6589,7 @@ llvm::Value *CGObjCNonFragileABIMac::GenerateProtocolRef(CodeGenFunction &CGF, // of protocol's meta-data (not a reference to it!) assert(!PD->isNonRuntimeProtocol() && "attempting to get a protocol ref to a static protocol."); - llvm::Constant *Init = - llvm::ConstantExpr::getBitCast(GetOrEmitProtocol(PD), - ObjCTypes.getExternalProtocolPtrTy()); + llvm::Constant *Init = GetOrEmitProtocol(PD); std::string ProtocolName("_OBJC_PROTOCOL_REFERENCE_$_"); ProtocolName += PD->getObjCRuntimeNameAsString(); @@ -6682,7 +6598,7 @@ llvm::Value *CGObjCNonFragileABIMac::GenerateProtocolRef(CodeGenFunction &CGF, llvm::GlobalVariable *PTGV = CGM.getModule().getGlobalVariable(ProtocolName); if (PTGV) - return CGF.Builder.CreateAlignedLoad(PTGV, Align); + return CGF.Builder.CreateAlignedLoad(PTGV->getValueType(), PTGV, Align); PTGV = new llvm::GlobalVariable(CGM.getModule(), Init->getType(), false, llvm::GlobalValue::WeakAnyLinkage, Init, ProtocolName); @@ -6693,7 +6609,7 @@ llvm::Value *CGObjCNonFragileABIMac::GenerateProtocolRef(CodeGenFunction &CGF, if (!CGM.getTriple().isOSBinFormatMachO()) PTGV->setComdat(CGM.getModule().getOrInsertComdat(ProtocolName)); CGM.addUsedGlobal(PTGV); - return CGF.Builder.CreateAlignedLoad(PTGV, Align); + return CGF.Builder.CreateAlignedLoad(PTGV->getValueType(), PTGV, Align); } /// GenerateCategory - Build metadata for a category implementation. @@ -6737,33 +6653,53 @@ void CGObjCNonFragileABIMac::GenerateCategory(const ObjCCategoryImplDecl *OCD) { } } - values.add(emitMethodList(listName, MethodListType::CategoryInstanceMethods, - instanceMethods)); - values.add(emitMethodList(listName, MethodListType::CategoryClassMethods, - classMethods)); + auto instanceMethodList = emitMethodList( + listName, MethodListType::CategoryInstanceMethods, instanceMethods); + auto classMethodList = emitMethodList( + listName, MethodListType::CategoryClassMethods, classMethods); + values.add(instanceMethodList); + values.add(classMethodList); + // Keep track of whether we have actual metadata to emit. + bool isEmptyCategory = + instanceMethodList->isNullValue() && classMethodList->isNullValue(); const ObjCCategoryDecl *Category = - Interface->FindCategoryDeclaration(OCD->getIdentifier()); + Interface->FindCategoryDeclaration(OCD->getIdentifier()); if (Category) { SmallString<256> ExtName; - llvm::raw_svector_ostream(ExtName) << Interface->getObjCRuntimeNameAsString() << "_$_" - << OCD->getName(); - values.add(EmitProtocolList("_OBJC_CATEGORY_PROTOCOLS_$_" - + Interface->getObjCRuntimeNameAsString() + "_$_" - + Category->getName(), - Category->protocol_begin(), - Category->protocol_end())); - values.add(EmitPropertyList("_OBJC_$_PROP_LIST_" + ExtName.str(), - OCD, Category, ObjCTypes, false)); - values.add(EmitPropertyList("_OBJC_$_CLASS_PROP_LIST_" + ExtName.str(), - OCD, Category, ObjCTypes, true)); + llvm::raw_svector_ostream(ExtName) + << Interface->getObjCRuntimeNameAsString() << "_$_" << OCD->getName(); + auto protocolList = + EmitProtocolList("_OBJC_CATEGORY_PROTOCOLS_$_" + + Interface->getObjCRuntimeNameAsString() + "_$_" + + Category->getName(), + Category->protocol_begin(), Category->protocol_end()); + auto propertyList = EmitPropertyList("_OBJC_$_PROP_LIST_" + ExtName.str(), + OCD, Category, ObjCTypes, false); + auto classPropertyList = + EmitPropertyList("_OBJC_$_CLASS_PROP_LIST_" + ExtName.str(), OCD, + Category, ObjCTypes, true); + values.add(protocolList); + values.add(propertyList); + values.add(classPropertyList); + isEmptyCategory &= protocolList->isNullValue() && + propertyList->isNullValue() && + classPropertyList->isNullValue(); } else { values.addNullPointer(ObjCTypes.ProtocolListnfABIPtrTy); values.addNullPointer(ObjCTypes.PropertyListPtrTy); values.addNullPointer(ObjCTypes.PropertyListPtrTy); } - unsigned Size = CGM.getDataLayout().getTypeAllocSize(ObjCTypes.CategorynfABITy); + if (isEmptyCategory) { + // Empty category, don't emit any metadata. + values.abandon(); + MethodDefinitions.clear(); + return; + } + + unsigned Size = + CGM.getDataLayout().getTypeAllocSize(ObjCTypes.CategorynfABITy); values.addInt(ObjCTypes.IntTy, Size); llvm::GlobalVariable *GCATV = @@ -6794,17 +6730,16 @@ void CGObjCNonFragileABIMac::emitMethodConstant(ConstantArrayBuilder &builder, const ObjCMethodDecl *MD, bool forProtocol) { auto method = builder.beginStruct(ObjCTypes.MethodTy); - method.addBitCast(GetMethodVarName(MD->getSelector()), - ObjCTypes.SelectorPtrTy); + method.add(GetMethodVarName(MD->getSelector())); method.add(GetMethodVarType(MD)); if (forProtocol) { // Protocol methods have no implementation. So, this entry is always NULL. - method.addNullPointer(ObjCTypes.Int8PtrTy); + method.addNullPointer(ObjCTypes.Int8PtrProgramASTy); } else { llvm::Function *fn = GetMethodDefinition(MD); assert(fn && "no definition for method?"); - method.addBitCast(fn, ObjCTypes.Int8PtrTy); + method.add(fn); } method.finishAndAddTo(builder); @@ -6878,7 +6813,7 @@ CGObjCNonFragileABIMac::emitMethodList(Twine name, MethodListType kind, llvm::GlobalVariable *GV = finishAndCreateGlobal(values, prefix + name, CGM); CGM.addCompilerUsedGlobal(GV); - return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.MethodListnfABIPtrTy); + return GV; } /// ObjCIvarOffsetVariable - Returns the ivar offset variable for @@ -6922,8 +6857,8 @@ CGObjCNonFragileABIMac::EmitIvarOffsetVar(const ObjCInterfaceDecl *ID, llvm::GlobalVariable *IvarOffsetGV = ObjCIvarOffsetVariable(ID, Ivar); IvarOffsetGV->setInitializer( llvm::ConstantInt::get(ObjCTypes.IvarOffsetVarTy, Offset)); - IvarOffsetGV->setAlignment(llvm::Align( - CGM.getDataLayout().getABITypeAlignment(ObjCTypes.IvarOffsetVarTy))); + IvarOffsetGV->setAlignment( + CGM.getDataLayout().getABITypeAlign(ObjCTypes.IvarOffsetVarTy)); if (!CGM.getTriple().isOSBinFormatCOFF()) { // FIXME: This matches gcc, but shouldn't the visibility be set on the use @@ -7020,7 +6955,7 @@ llvm::Constant *CGObjCNonFragileABIMac::EmitIvarList( llvm::GlobalVariable *GV = finishAndCreateGlobal( ivarList, Prefix + OID->getObjCRuntimeNameAsString(), CGM); CGM.addCompilerUsedGlobal(GV); - return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.IvarListnfABIPtrTy); + return GV; } llvm::Constant *CGObjCNonFragileABIMac::GetOrEmitProtocolRef( @@ -7151,8 +7086,8 @@ llvm::Constant *CGObjCNonFragileABIMac::GetOrEmitProtocol( ProtocolRef); if (!CGM.getTriple().isOSBinFormatMachO()) PTGV->setComdat(CGM.getModule().getOrInsertComdat(ProtocolRef)); - PTGV->setAlignment(llvm::Align( - CGM.getDataLayout().getABITypeAlignment(ObjCTypes.ProtocolnfABIPtrTy))); + PTGV->setAlignment( + CGM.getDataLayout().getABITypeAlign(ObjCTypes.ProtocolnfABIPtrTy)); PTGV->setSection(GetSectionName("__objc_protolist", "coalesced,no_dead_strip")); PTGV->setVisibility(llvm::GlobalValue::HiddenVisibility); @@ -7194,7 +7129,7 @@ CGObjCNonFragileABIMac::EmitProtocolList(Twine Name, llvm::GlobalVariable *GV = CGM.getModule().getGlobalVariable(TmpName.str(), true); if (GV) - return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.ProtocolListnfABIPtrTy); + return GV; ConstantInitBuilder builder(CGM); auto values = builder.beginStruct(); @@ -7212,8 +7147,7 @@ CGObjCNonFragileABIMac::EmitProtocolList(Twine Name, GV = finishAndCreateGlobal(values, Name, CGM); CGM.addCompilerUsedGlobal(GV); - return llvm::ConstantExpr::getBitCast(GV, - ObjCTypes.ProtocolListnfABIPtrTy); + return GV; } /// EmitObjCValueForIvar - Code Gen for nonfragile ivar reference. @@ -7246,11 +7180,12 @@ CGObjCNonFragileABIMac::EmitIvarOffset(CodeGen::CodeGenFunction &CGF, } else { llvm::GlobalVariable *GV = ObjCIvarOffsetVariable(Interface, Ivar); IvarOffsetValue = - CGF.Builder.CreateAlignedLoad(GV, CGF.getSizeAlign(), "ivar"); + CGF.Builder.CreateAlignedLoad(GV->getValueType(), GV, + CGF.getSizeAlign(), "ivar"); if (IsIvarOffsetKnownIdempotent(CGF, Ivar)) cast<llvm::LoadInst>(IvarOffsetValue) - ->setMetadata(CGM.getModule().getMDKindID("invariant.load"), - llvm::MDNode::get(VMContext, None)); + ->setMetadata(llvm::LLVMContext::MD_invariant_load, + llvm::MDNode::get(VMContext, std::nullopt)); } // This could be 32bit int or 64bit integer depending on the architecture. @@ -7379,7 +7314,7 @@ CGObjCNonFragileABIMac::EmitVTableMessageSend(CodeGenFunction &CGF, Address mref = Address(CGF.Builder.CreateBitCast(messageRef, ObjCTypes.MessageRefPtrTy), - CGF.getPointerAlign()); + ObjCTypes.MessageRefTy, CGF.getPointerAlign()); // Update the message ref argument. args[1].setRValue(RValue::get(mref.getPointer())); @@ -7438,7 +7373,7 @@ CGObjCNonFragileABIMac::GetClassGlobal(StringRef Name, : llvm::GlobalValue::ExternalLinkage; llvm::GlobalVariable *GV = CGM.getModule().getGlobalVariable(Name); - if (!GV || GV->getType() != ObjCTypes.ClassnfABITy->getPointerTo()) { + if (!GV || GV->getValueType() != ObjCTypes.ClassnfABITy) { auto *NewGV = new llvm::GlobalVariable(ObjCTypes.ClassnfABITy, false, L, nullptr, Name); @@ -7446,12 +7381,11 @@ CGObjCNonFragileABIMac::GetClassGlobal(StringRef Name, NewGV->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass); if (GV) { - GV->replaceAllUsesWith( - llvm::ConstantExpr::getBitCast(NewGV, GV->getType())); + GV->replaceAllUsesWith(NewGV); GV->eraseFromParent(); } GV = NewGV; - CGM.getModule().getGlobalList().push_back(GV); + CGM.getModule().insertGlobalVariable(GV); } assert(GV->getLinkage() == L); @@ -7486,7 +7420,7 @@ CGObjCNonFragileABIMac::EmitLoadOfClassRef(CodeGenFunction &CGF, } CharUnits Align = CGF.getPointerAlign(); - return CGF.Builder.CreateAlignedLoad(Entry, Align); + return CGF.Builder.CreateAlignedLoad(Entry->getValueType(), Entry, Align); } llvm::Value * @@ -7578,7 +7512,7 @@ llvm::Value *CGObjCNonFragileABIMac::EmitMetaClassRef(CodeGenFunction &CGF, CGM.addCompilerUsedGlobal(Entry); } - return CGF.Builder.CreateAlignedLoad(Entry, Align); + return CGF.Builder.CreateAlignedLoad(ObjCTypes.ClassnfABIPtrTy, Entry, Align); } /// GetClass - Return a reference to the class for the given interface @@ -7649,8 +7583,8 @@ llvm::Value *CGObjCNonFragileABIMac::EmitSelector(CodeGenFunction &CGF, Address Addr = EmitSelectorAddr(Sel); llvm::LoadInst* LI = CGF.Builder.CreateLoad(Addr); - LI->setMetadata(CGM.getModule().getMDKindID("invariant.load"), - llvm::MDNode::get(VMContext, None)); + LI->setMetadata(llvm::LLVMContext::MD_invariant_load, + llvm::MDNode::get(VMContext, std::nullopt)); return LI; } @@ -7658,14 +7592,11 @@ Address CGObjCNonFragileABIMac::EmitSelectorAddr(Selector Sel) { llvm::GlobalVariable *&Entry = SelectorReferences[Sel]; CharUnits Align = CGM.getPointerAlign(); if (!Entry) { - llvm::Constant *Casted = - llvm::ConstantExpr::getBitCast(GetMethodVarName(Sel), - ObjCTypes.SelectorPtrTy); std::string SectionName = GetSectionName("__objc_selrefs", "literal_pointers,no_dead_strip"); Entry = new llvm::GlobalVariable( CGM.getModule(), ObjCTypes.SelectorPtrTy, false, - getLinkageTypeForObjCMetadata(CGM, SectionName), Casted, + getLinkageTypeForObjCMetadata(CGM, SectionName), GetMethodVarName(Sel), "OBJC_SELECTOR_REFERENCES_"); Entry->setExternallyInitialized(true); Entry->setSection(SectionName); @@ -7673,7 +7604,7 @@ Address CGObjCNonFragileABIMac::EmitSelectorAddr(Selector Sel) { CGM.addCompilerUsedGlobal(Entry); } - return Address(Entry, Align); + return Address(Entry, ObjCTypes.SelectorPtrTy, Align); } /// EmitObjCIvarAssign - Code gen for assigning to a __strong object. @@ -7692,8 +7623,9 @@ void CGObjCNonFragileABIMac::EmitObjCIvarAssign(CodeGen::CodeGenFunction &CGF, src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy); } src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy); - dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy); - llvm::Value *args[] = { src, dst.getPointer(), ivarOffset }; + llvm::Value *dstVal = + CGF.Builder.CreateBitCast(dst.getPointer(), ObjCTypes.PtrObjectPtrTy); + llvm::Value *args[] = {src, dstVal, ivarOffset}; CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignIvarFn(), args); } @@ -7712,19 +7644,16 @@ void CGObjCNonFragileABIMac::EmitObjCStrongCastAssign( src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy); } src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy); - dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy); - llvm::Value *args[] = { src, dst.getPointer() }; + llvm::Value *dstVal = + CGF.Builder.CreateBitCast(dst.getPointer(), ObjCTypes.PtrObjectPtrTy); + llvm::Value *args[] = {src, dstVal}; CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignStrongCastFn(), args, "weakassign"); } void CGObjCNonFragileABIMac::EmitGCMemmoveCollectable( - CodeGen::CodeGenFunction &CGF, - Address DestPtr, - Address SrcPtr, - llvm::Value *Size) { - SrcPtr = CGF.Builder.CreateBitCast(SrcPtr, ObjCTypes.Int8PtrTy); - DestPtr = CGF.Builder.CreateBitCast(DestPtr, ObjCTypes.Int8PtrTy); + CodeGen::CodeGenFunction &CGF, Address DestPtr, Address SrcPtr, + llvm::Value *Size) { llvm::Value *args[] = { DestPtr.getPointer(), SrcPtr.getPointer(), Size }; CGF.EmitNounwindRuntimeCall(ObjCTypes.GcMemmoveCollectableFn(), args); } @@ -7736,10 +7665,11 @@ llvm::Value * CGObjCNonFragileABIMac::EmitObjCWeakRead( CodeGen::CodeGenFunction &CGF, Address AddrWeakObj) { llvm::Type *DestTy = AddrWeakObj.getElementType(); - AddrWeakObj = CGF.Builder.CreateBitCast(AddrWeakObj, ObjCTypes.PtrObjectPtrTy); + llvm::Value *AddrWeakObjVal = CGF.Builder.CreateBitCast( + AddrWeakObj.getPointer(), ObjCTypes.PtrObjectPtrTy); llvm::Value *read_weak = CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcReadWeakFn(), - AddrWeakObj.getPointer(), "weakread"); + AddrWeakObjVal, "weakread"); read_weak = CGF.Builder.CreateBitCast(read_weak, DestTy); return read_weak; } @@ -7758,8 +7688,9 @@ void CGObjCNonFragileABIMac::EmitObjCWeakAssign(CodeGen::CodeGenFunction &CGF, src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy); } src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy); - dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy); - llvm::Value *args[] = { src, dst.getPointer() }; + llvm::Value *dstVal = + CGF.Builder.CreateBitCast(dst.getPointer(), ObjCTypes.PtrObjectPtrTy); + llvm::Value *args[] = {src, dstVal}; CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignWeakFn(), args, "weakassign"); } @@ -7779,8 +7710,9 @@ void CGObjCNonFragileABIMac::EmitObjCGlobalAssign(CodeGen::CodeGenFunction &CGF, src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy); } src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy); - dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy); - llvm::Value *args[] = { src, dst.getPointer() }; + llvm::Value *dstVal = + CGF.Builder.CreateBitCast(dst.getPointer(), ObjCTypes.PtrObjectPtrTy); + llvm::Value *args[] = {src, dstVal}; if (!threadlocal) CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignGlobalFn(), args, "globalassign"); |