[llvm-branch-commits] [clang] [Clang] Add pointer field protection feature. (PR #172119)
Peter Collingbourne via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Thu Jan 15 18:58:17 PST 2026
================
@@ -2232,6 +2233,45 @@ static void emitNonZeroVLAInit(CodeGenFunction &CGF, QualType baseType,
CGF.EmitBlock(contBB);
}
+Address CodeGenFunction::EmitAddressOfPFPField(Address RecordPtr,
+ const PFPField &Field) {
+ return EmitAddressOfPFPField(
+ RecordPtr,
+ Builder.CreateConstInBoundsByteGEP(RecordPtr.withElementType(Int8Ty),
+ Field.offset),
+ Field.field);
+}
+
+Address CodeGenFunction::EmitAddressOfPFPField(Address RecordPtr,
+ Address PtrPtr,
+ const FieldDecl *Field) {
+ llvm::Value *Disc;
+ bool IsPAuthSupported = getContext().getTargetInfo().getTriple().getArch() ==
+ llvm::Triple::aarch64;
+ if (!IsPAuthSupported ||
+ CGM.getContext().arePFPFieldsTriviallyCopyable(Field->getParent())) {
+ uint64_t FieldSignature =
+ llvm::getPointerAuthStableSipHash(CGM.getPFPFieldName(Field));
+ if (!IsPAuthSupported)
+ FieldSignature &= 0xff;
+ Disc = llvm::ConstantInt::get(CGM.Int64Ty, FieldSignature);
+ } else {
+ Disc = Builder.CreatePtrToInt(RecordPtr.getBasePointer(), CGM.Int64Ty);
+ }
+
+ llvm::GlobalValue *DS = CGM.getPFPDeactivationSymbol(Field);
+ llvm::OperandBundleDef DSBundle("deactivation-symbol", DS);
+
+ return Address(
+ Builder.CreateCall(
+ CGM.getIntrinsic(llvm::Intrinsic::protected_field_ptr,
+ PtrPtr.getType()),
+ {PtrPtr.getBasePointer(), Disc,
----------------
pcc wrote:
Done
https://github.com/llvm/llvm-project/pull/172119
More information about the llvm-branch-commits
mailing list