summaryrefslogtreecommitdiff
path: root/clang/lib/CodeGen/CGObjCMac.cpp
diff options
context:
space:
mode:
authorPeter Collingbourne <peter@pcc.me.uk>2025-07-18 13:26:00 -0700
committerPeter Collingbourne <peter@pcc.me.uk>2025-07-18 13:26:00 -0700
commit9bf3524731070cadc6175707314f3b6ca37190d5 (patch)
tree86dcab7604336b01ae938fe81062c29ff69efba8 /clang/lib/CodeGen/CGObjCMac.cpp
parent3a84c15cc13b6daf8e812592898ab6c7f19091a9 (diff)
parent4f43f0606c3d7e1ce6d069583b5e59f036e112ce (diff)
Created using spr 1.3.6-beta.1
Diffstat (limited to 'clang/lib/CodeGen/CGObjCMac.cpp')
-rw-r--r--clang/lib/CodeGen/CGObjCMac.cpp94
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));