diff options
Diffstat (limited to 'clang/lib/CodeGen/CGObjCMac.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGObjCMac.cpp | 120 |
1 files changed, 72 insertions, 48 deletions
diff --git a/clang/lib/CodeGen/CGObjCMac.cpp b/clang/lib/CodeGen/CGObjCMac.cpp index f36c28a85a68..1d0379afb4b5 100644 --- a/clang/lib/CodeGen/CGObjCMac.cpp +++ b/clang/lib/CodeGen/CGObjCMac.cpp @@ -1107,11 +1107,6 @@ public: void GenerateProtocol(const ObjCProtocolDecl *PD) override; - /// GetOrEmitProtocol - Get the protocol object for the given - /// declaration, emitting it if necessary. The return value has type - /// ProtocolPtrTy. - virtual llvm::Constant *GetOrEmitProtocol(const ObjCProtocolDecl *PD)=0; - /// GetOrEmitProtocolRef - Get a forward reference to the protocol /// object for the given declaration, emitting it if needed. These /// forward references will be filled in with empty bodies if no @@ -2035,7 +2030,7 @@ CGObjCCommonMac::GenerateConstantNSString(const StringLiteral *Literal) { GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global); // 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::None()); + GV->setAlignment(llvm::Align(1)); Fields.addBitCast(GV, CGM.Int8PtrTy); // String length. @@ -2558,9 +2553,8 @@ void CGObjCCommonMac::BuildRCRecordLayout(const llvm::StructLayout *RecLayout, } if (FQT->isRecordType() && ElCount) { int OldIndex = RunSkipBlockVars.size() - 1; - const RecordType *RT = FQT->getAs<RecordType>(); - BuildRCBlockVarRecordLayout(RT, BytePos + FieldOffset, - HasUnion); + auto *RT = FQT->castAs<RecordType>(); + BuildRCBlockVarRecordLayout(RT, BytePos + FieldOffset, HasUnion); // Replicate layout information for each array element. Note that // one element is already done. @@ -3047,9 +3041,10 @@ llvm::Value *CGObjCCommonMac::EmitClassRefViaRuntime( ObjCCommonTypesHelper &ObjCTypes) { llvm::FunctionCallee lookUpClassFn = ObjCTypes.getLookUpClassFn(); - llvm::Value *className = - CGF.CGM.GetAddrOfConstantCString(ID->getObjCRuntimeNameAsString()) - .getPointer(); + llvm::Value *className = CGF.CGM + .GetAddrOfConstantCString(std::string( + ID->getObjCRuntimeNameAsString())) + .getPointer(); ASTContext &ctx = CGF.CGM.getContext(); className = CGF.Builder.CreateBitCast(className, @@ -3291,6 +3286,8 @@ llvm::Constant *CGObjCCommonMac::EmitPropertyList(Twine Name, for (auto *PD : ClassExt->properties()) { if (IsClassProperty != PD->isClassProperty()) continue; + if (PD->isDirectProperty()) + continue; PropertySet.insert(PD->getIdentifier()); Properties.push_back(PD); } @@ -3302,6 +3299,8 @@ llvm::Constant *CGObjCCommonMac::EmitPropertyList(Twine Name, // class extension. if (!PropertySet.insert(PD->getIdentifier()).second) continue; + if (PD->isDirectProperty()) + continue; Properties.push_back(PD); } @@ -3327,8 +3326,6 @@ llvm::Constant *CGObjCCommonMac::EmitPropertyList(Twine Name, values.addInt(ObjCTypes.IntTy, Properties.size()); auto propertiesArray = values.beginArray(ObjCTypes.PropertyTy); for (auto PD : Properties) { - if (PD->isDirectProperty()) - continue; auto property = propertiesArray.beginStruct(ObjCTypes.PropertyTy); property.add(GetPropertyName(PD->getIdentifier())); property.add(GetPropertyTypeString(PD, Container)); @@ -3637,7 +3634,7 @@ void CGObjCMac::GenerateClass(const ObjCImplementationDecl *ID) { // Check for a forward reference. llvm::GlobalVariable *GV = CGM.getModule().getGlobalVariable(Name, true); if (GV) { - assert(GV->getType()->getElementType() == ObjCTypes.ClassTy && + assert(GV->getValueType() == ObjCTypes.ClassTy && "Forward metaclass reference has incorrect type."); values.finishAndSetAsInitializer(GV); GV->setSection(Section); @@ -3700,7 +3697,7 @@ llvm::Constant *CGObjCMac::EmitMetaClass(const ObjCImplementationDecl *ID, // Check for a forward reference. llvm::GlobalVariable *GV = CGM.getModule().getGlobalVariable(Name, true); if (GV) { - assert(GV->getType()->getElementType() == ObjCTypes.ClassTy && + assert(GV->getValueType() == ObjCTypes.ClassTy && "Forward metaclass reference has incorrect type."); values.finishAndSetAsInitializer(GV); } else { @@ -3731,7 +3728,7 @@ llvm::Constant *CGObjCMac::EmitMetaClassRef(const ObjCInterfaceDecl *ID) { llvm::GlobalValue::PrivateLinkage, nullptr, Name); - assert(GV->getType()->getElementType() == ObjCTypes.ClassTy && + assert(GV->getValueType() == ObjCTypes.ClassTy && "Forward metaclass reference has incorrect type."); return GV; } @@ -3745,7 +3742,7 @@ llvm::Value *CGObjCMac::EmitSuperClassRef(const ObjCInterfaceDecl *ID) { llvm::GlobalValue::PrivateLinkage, nullptr, Name); - assert(GV->getType()->getElementType() == ObjCTypes.ClassTy && + assert(GV->getValueType() == ObjCTypes.ClassTy && "Forward class metadata reference has incorrect type."); return GV; } @@ -4029,22 +4026,49 @@ llvm::Function *CGObjCCommonMac::GenerateMethod(const ObjCMethodDecl *OMD, llvm::Function * CGObjCCommonMac::GenerateDirectMethod(const ObjCMethodDecl *OMD, const ObjCContainerDecl *CD) { - auto I = DirectMethodDefinitions.find(OMD->getCanonicalDecl()); - if (I != DirectMethodDefinitions.end()) - return I->second; + auto *COMD = OMD->getCanonicalDecl(); + auto I = DirectMethodDefinitions.find(COMD); + llvm::Function *OldFn = nullptr, *Fn = nullptr; - SmallString<256> Name; - GetNameForMethod(OMD, CD, Name, /*ignoreCategoryNamespace*/true); + if (I != DirectMethodDefinitions.end()) { + // Objective-C allows for the declaration and implementation types + // to differ slightly. + // + // If we're being asked for the Function associated for a method + // implementation, a previous value might have been cached + // based on the type of the canonical declaration. + // + // If these do not match, then we'll replace this function with + // a new one that has the proper type below. + if (!OMD->getBody() || COMD->getReturnType() == OMD->getReturnType()) + return I->second; + OldFn = I->second; + } CodeGenTypes &Types = CGM.getTypes(); llvm::FunctionType *MethodTy = Types.GetFunctionType(Types.arrangeObjCMethodDeclaration(OMD)); - llvm::Function *Method = - llvm::Function::Create(MethodTy, llvm::GlobalValue::ExternalLinkage, - Name.str(), &CGM.getModule()); - DirectMethodDefinitions.insert(std::make_pair(OMD->getCanonicalDecl(), Method)); - return Method; + if (OldFn) { + Fn = llvm::Function::Create(MethodTy, llvm::GlobalValue::ExternalLinkage, + "", &CGM.getModule()); + Fn->takeName(OldFn); + OldFn->replaceAllUsesWith( + llvm::ConstantExpr::getBitCast(Fn, OldFn->getType())); + OldFn->eraseFromParent(); + + // Replace the cached function in the map. + I->second = Fn; + } else { + SmallString<256> Name; + GetNameForMethod(OMD, CD, Name, /*ignoreCategoryNamespace*/ true); + + Fn = llvm::Function::Create(MethodTy, llvm::GlobalValue::ExternalLinkage, + Name.str(), &CGM.getModule()); + DirectMethodDefinitions.insert(std::make_pair(COMD, Fn)); + } + + return Fn; } void CGObjCCommonMac::GenerateDirectMethodPrologue( @@ -4195,7 +4219,8 @@ CGObjCCommonMac::CreateCStringLiteral(StringRef Name, ObjCLabelType Type, : "__TEXT,__cstring,cstring_literals"; break; case ObjCLabelType::PropertyName: - Section = "__TEXT,__cstring,cstring_literals"; + Section = NonFragile ? "__TEXT,__objc_methname,cstring_literals" + : "__TEXT,__cstring,cstring_literals"; break; } @@ -5128,15 +5153,18 @@ void CGObjCCommonMac::EmitImageInfo() { Mod.addModuleFlag(llvm::Module::Error, "Objective-C Image Info Section", llvm::MDString::get(VMContext, Section)); + auto Int8Ty = llvm::Type::getInt8Ty(VMContext); if (CGM.getLangOpts().getGC() == LangOptions::NonGC) { // Non-GC overrides those files which specify GC. - Mod.addModuleFlag(llvm::Module::Override, - "Objective-C Garbage Collection", (uint32_t)0); + Mod.addModuleFlag(llvm::Module::Error, + "Objective-C Garbage Collection", + llvm::ConstantInt::get(Int8Ty,0)); } else { // Add the ObjC garbage collection value. Mod.addModuleFlag(llvm::Module::Error, "Objective-C Garbage Collection", - eImageInfo_GarbageCollected); + llvm::ConstantInt::get(Int8Ty, + (uint8_t)eImageInfo_GarbageCollected)); if (CGM.getLangOpts().getGC() == LangOptions::GCOnly) { // Add the ObjC GC Only value. @@ -5147,7 +5175,7 @@ void CGObjCCommonMac::EmitImageInfo() { llvm::Metadata *Ops[2] = { llvm::MDString::get(VMContext, "Objective-C Garbage Collection"), llvm::ConstantAsMetadata::get(llvm::ConstantInt::get( - llvm::Type::getInt32Ty(VMContext), eImageInfo_GarbageCollected))}; + Int8Ty, eImageInfo_GarbageCollected))}; Mod.addModuleFlag(llvm::Module::Require, "Objective-C GC Only", llvm::MDNode::get(VMContext, Ops)); } @@ -5423,7 +5451,7 @@ llvm::Constant *IvarLayoutBuilder::buildBitmap(CGObjCCommonMac &CGObjC, // This isn't a stable sort, but our algorithm should handle it fine. llvm::array_pod_sort(IvarsInfo.begin(), IvarsInfo.end()); } else { - assert(std::is_sorted(IvarsInfo.begin(), IvarsInfo.end())); + assert(llvm::is_sorted(IvarsInfo)); } assert(IvarsInfo.back().Offset < InstanceEnd); @@ -6217,11 +6245,9 @@ void CGObjCNonFragileABIMac::AddModuleClassList( assert((!CGM.getTriple().isOSBinFormatMachO() || SectionName.startswith("__DATA")) && "SectionName expected to start with __DATA on MachO"); - llvm::GlobalValue::LinkageTypes LT = - getLinkageTypeForObjCMetadata(CGM, SectionName); - llvm::GlobalVariable *GV = - new llvm::GlobalVariable(CGM.getModule(), Init->getType(), false, LT, Init, - SymbolName); + 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->setSection(SectionName); @@ -6350,7 +6376,7 @@ llvm::GlobalVariable * CGObjCNonFragileABIMac::BuildClassRoTInitializer( unsigned InstanceStart, unsigned InstanceSize, const ObjCImplementationDecl *ID) { - std::string ClassName = ID->getObjCRuntimeNameAsString(); + std::string ClassName = std::string(ID->getObjCRuntimeNameAsString()); CharUnits beginInstance = CharUnits::fromQuantity(InstanceStart); CharUnits endInstance = CharUnits::fromQuantity(InstanceSize); @@ -7509,10 +7535,9 @@ CGObjCNonFragileABIMac::EmitSuperClassRef(CodeGenFunction &CGF, llvm::Constant *ClassGV = GetClassGlobalForClassRef(ID); std::string SectionName = GetSectionName("__objc_superrefs", "regular,no_dead_strip"); - Entry = new llvm::GlobalVariable( - CGM.getModule(), ClassGV->getType(), false, - getLinkageTypeForObjCMetadata(CGM, SectionName), ClassGV, - "OBJC_CLASSLIST_SUP_REFS_$_"); + Entry = new llvm::GlobalVariable(CGM.getModule(), ClassGV->getType(), false, + llvm::GlobalValue::PrivateLinkage, ClassGV, + "OBJC_CLASSLIST_SUP_REFS_$_"); Entry->setAlignment(CGF.getPointerAlign().getAsAlign()); Entry->setSection(SectionName); CGM.addCompilerUsedGlobal(Entry); @@ -7533,10 +7558,9 @@ llvm::Value *CGObjCNonFragileABIMac::EmitMetaClassRef(CodeGenFunction &CGF, auto MetaClassGV = GetClassGlobal(ID, /*metaclass*/ true, NotForDefinition); std::string SectionName = GetSectionName("__objc_superrefs", "regular,no_dead_strip"); - Entry = new llvm::GlobalVariable( - CGM.getModule(), ObjCTypes.ClassnfABIPtrTy, false, - getLinkageTypeForObjCMetadata(CGM, SectionName), MetaClassGV, - "OBJC_CLASSLIST_SUP_REFS_$_"); + Entry = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ClassnfABIPtrTy, + false, llvm::GlobalValue::PrivateLinkage, + MetaClassGV, "OBJC_CLASSLIST_SUP_REFS_$_"); Entry->setAlignment(Align.getAsAlign()); Entry->setSection(SectionName); CGM.addCompilerUsedGlobal(Entry); |