diff options
Diffstat (limited to 'clang/lib/CodeGen/CGObjCMac.cpp')
| -rw-r--r-- | clang/lib/CodeGen/CGObjCMac.cpp | 94 |
1 files changed, 70 insertions, 24 deletions
diff --git a/clang/lib/CodeGen/CGObjCMac.cpp b/clang/lib/CodeGen/CGObjCMac.cpp index a52c92cdbc83..8e71a576552d 100644 --- a/clang/lib/CodeGen/CGObjCMac.cpp +++ b/clang/lib/CodeGen/CGObjCMac.cpp @@ -1935,7 +1935,9 @@ CGObjCCommonMac::GenerateConstantNSString(const StringLiteral *Literal) { auto Fields = Builder.beginStruct(NSConstantStringType); // Class pointer. - Fields.add(Class); + Fields.addSignedPointer(Class, + CGM.getCodeGenOpts().PointerAuth.ObjCIsaPointers, + GlobalDecl(), QualType()); // String pointer. llvm::Constant *C = @@ -4975,10 +4977,7 @@ enum ImageInfoFlags { eImageInfo_GCOnly = (1 << 2), 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. 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_SignedClassRO = (1 << 4), // Reused (was _CorrectedSynthesize) eImageInfo_ImageIsSimulated = (1 << 5), eImageInfo_ClassProperties = (1 << 6) }; @@ -5036,6 +5035,17 @@ void CGObjCCommonMac::EmitImageInfo() { // Indicate whether we are generating class properties. Mod.addModuleFlag(llvm::Module::Error, "Objective-C Class Properties", eImageInfo_ClassProperties); + + // Indicate whether we want enforcement of pointer signing for class_ro_t + // pointers. + if (CGM.getLangOpts().PointerAuthObjcClassROPointers) + Mod.addModuleFlag(llvm::Module::Error, + "Objective-C Enforce ClassRO Pointer Signing", + eImageInfo_SignedClassRO); + else + Mod.addModuleFlag(llvm::Module::Error, + "Objective-C Enforce ClassRO Pointer Signing", + llvm::ConstantInt::get(Int8Ty, 0)); } // struct objc_module { @@ -6223,11 +6233,19 @@ llvm::GlobalVariable *CGObjCNonFragileABIMac::BuildClassRoTInitializer( methods.push_back(MD); } - values.add(emitMethodList(ID->getObjCRuntimeNameAsString(), - (flags & NonFragileABI_Class_Meta) - ? MethodListType::ClassMethods - : MethodListType::InstanceMethods, - methods)); + llvm::Constant *MethListPtr = emitMethodList( + ID->getObjCRuntimeNameAsString(), + (flags & NonFragileABI_Class_Meta) ? MethodListType::ClassMethods + : MethodListType::InstanceMethods, + methods); + + const PointerAuthSchema &MethListSchema = + CGM.getCodeGenOpts().PointerAuth.ObjCMethodListPointer; + if (!MethListPtr->isNullValue()) + values.addSignedPointer(MethListPtr, MethListSchema, GlobalDecl(), + QualType()); + else + values.add(MethListPtr); const ObjCInterfaceDecl *OID = ID->getClassInterface(); assert(OID && "CGObjCNonFragileABIMac::BuildClassRoTInitializer"); @@ -6275,15 +6293,20 @@ llvm::GlobalVariable *CGObjCNonFragileABIMac::BuildClassObject( bool HiddenVisibility) { ConstantInitBuilder builder(CGM); auto values = builder.beginStruct(ObjCTypes.ClassnfABITy); - values.add(IsAGV); - if (SuperClassGV) { - values.add(SuperClassGV); - } else { + const PointerAuthOptions &PointerAuthOpts = CGM.getCodeGenOpts().PointerAuth; + values.addSignedPointer(IsAGV, PointerAuthOpts.ObjCIsaPointers, GlobalDecl(), + QualType()); + if (SuperClassGV) + values.addSignedPointer(SuperClassGV, PointerAuthOpts.ObjCSuperPointers, + GlobalDecl(), QualType()); + else values.addNullPointer(ObjCTypes.ClassnfABIPtrTy); - } + values.add(ObjCEmptyCacheVar); values.add(ObjCEmptyVtableVar); - values.add(ClassRoGV); + + values.addSignedPointer(ClassRoGV, PointerAuthOpts.ObjCClassROPointers, + GlobalDecl(), QualType()); llvm::GlobalVariable *GV = cast<llvm::GlobalVariable>( GetClassGlobal(CI, isMetaclass, ForDefinition)); @@ -6543,15 +6566,27 @@ void CGObjCNonFragileABIMac::GenerateCategory(const ObjCCategoryImplDecl *OCD) { } } - auto instanceMethodList = emitMethodList( + llvm::Constant *InstanceMethodList = emitMethodList( listName, MethodListType::CategoryInstanceMethods, instanceMethods); - auto classMethodList = emitMethodList( + const PointerAuthSchema &MethListSchema = + CGM.getCodeGenOpts().PointerAuth.ObjCMethodListPointer; + if (!InstanceMethodList->isNullValue()) + values.addSignedPointer(InstanceMethodList, MethListSchema, GlobalDecl(), + QualType()); + else + values.add(InstanceMethodList); + + llvm::Constant *ClassMethodList = emitMethodList( listName, MethodListType::CategoryClassMethods, classMethods); - values.add(instanceMethodList); - values.add(classMethodList); + if (!ClassMethodList->isNullValue()) + values.addSignedPointer(ClassMethodList, MethListSchema, GlobalDecl(), + QualType()); + else + values.add(ClassMethodList); + // Keep track of whether we have actual metadata to emit. bool isEmptyCategory = - instanceMethodList->isNullValue() && classMethodList->isNullValue(); + InstanceMethodList->isNullValue() && ClassMethodList->isNullValue(); const ObjCCategoryDecl *Category = Interface->FindCategoryDeclaration(OCD->getIdentifier()); @@ -6629,7 +6664,13 @@ void CGObjCNonFragileABIMac::emitMethodConstant(ConstantArrayBuilder &builder, } else { llvm::Function *fn = GetMethodDefinition(MD); assert(fn && "no definition for method?"); - method.add(fn); + if (const PointerAuthSchema &Schema = + CGM.getCodeGenOpts().PointerAuth.ObjCMethodListFunctionPointers) { + llvm::Constant *Bitcast = + llvm::ConstantExpr::getBitCast(fn, ObjCTypes.Int8PtrProgramASTy); + method.addSignedPointer(Bitcast, Schema, GlobalDecl(), QualType()); + } else + method.add(fn); } method.finishAndAddTo(builder); @@ -7672,10 +7713,15 @@ CGObjCNonFragileABIMac::GetInterfaceEHType(const ObjCInterfaceDecl *ID, } llvm::Value *VTableIdx = llvm::ConstantInt::get(CGM.Int32Ty, 2); + llvm::Constant *VTablePtr = llvm::ConstantExpr::getInBoundsGetElementPtr( + VTableGV->getValueType(), VTableGV, VTableIdx); + ConstantInitBuilder builder(CGM); auto values = builder.beginStruct(ObjCTypes.EHTypeTy); - values.add(llvm::ConstantExpr::getInBoundsGetElementPtr( - VTableGV->getValueType(), VTableGV, VTableIdx)); + const PointerAuthSchema &TypeInfoSchema = + CGM.getCodeGenOpts().PointerAuth.CXXTypeInfoVTablePointer; + values.addSignedPointer(VTablePtr, TypeInfoSchema, GlobalDecl(), QualType()); + values.add(GetClassName(ClassName)); values.add(GetClassGlobal(ID, /*metaclass*/ false, NotForDefinition)); |
