[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