@@ -365,17 +365,15 @@ class SrcSafetyAnalysis {
365365 SmallVector<MCPhysReg> getRegsMadeSafeToDeref (const MCInst &Point,
366366 const SrcState &Cur) const {
367367 SmallVector<MCPhysReg> Regs;
368- const MCPhysReg NoReg = BC.MIB ->getNoRegister ();
369368
370369 // A signed pointer can be authenticated, or
371- ErrorOr<MCPhysReg> AutReg = BC. MIB -> getAuthenticatedReg (Point) ;
372- if (AutReg && * AutReg != NoReg )
370+ bool Dummy = false ;
371+ if (auto AutReg = BC. MIB -> getWrittenAuthenticatedReg (Point, Dummy) )
373372 Regs.push_back (*AutReg);
374373
375374 // ... a safe address can be materialized, or
376- MCPhysReg NewAddrReg = BC.MIB ->getMaterializedAddressRegForPtrAuth (Point);
377- if (NewAddrReg != NoReg)
378- Regs.push_back (NewAddrReg);
375+ if (auto NewAddrReg = BC.MIB ->getMaterializedAddressRegForPtrAuth (Point))
376+ Regs.push_back (*NewAddrReg);
379377
380378 // ... an address can be updated in a safe manner, producing the result
381379 // which is as trusted as the input address.
@@ -391,13 +389,20 @@ class SrcSafetyAnalysis {
391389 SmallVector<MCPhysReg> getRegsMadeTrusted (const MCInst &Point,
392390 const SrcState &Cur) const {
393391 SmallVector<MCPhysReg> Regs;
394- const MCPhysReg NoReg = BC.MIB ->getNoRegister ();
395392
396393 // An authenticated pointer can be checked, or
397- MCPhysReg CheckedReg =
394+ std::optional< MCPhysReg> CheckedReg =
398395 BC.MIB ->getAuthCheckedReg (Point, /* MayOverwrite=*/ false );
399- if (CheckedReg != NoReg && Cur.SafeToDerefRegs [CheckedReg])
400- Regs.push_back (CheckedReg);
396+ if (CheckedReg && Cur.SafeToDerefRegs [*CheckedReg])
397+ Regs.push_back (*CheckedReg);
398+
399+ // ... a pointer can be authenticated by an instruction that always checks
400+ // the pointer, or
401+ bool IsChecked = false ;
402+ std::optional<MCPhysReg> AutReg =
403+ BC.MIB ->getWrittenAuthenticatedReg (Point, IsChecked);
404+ if (AutReg && IsChecked)
405+ Regs.push_back (*AutReg);
401406
402407 if (CheckerSequenceInfo.contains (&Point)) {
403408 MCPhysReg CheckedReg;
@@ -413,9 +418,8 @@ class SrcSafetyAnalysis {
413418 }
414419
415420 // ... a safe address can be materialized, or
416- MCPhysReg NewAddrReg = BC.MIB ->getMaterializedAddressRegForPtrAuth (Point);
417- if (NewAddrReg != NoReg)
418- Regs.push_back (NewAddrReg);
421+ if (auto NewAddrReg = BC.MIB ->getMaterializedAddressRegForPtrAuth (Point))
422+ Regs.push_back (*NewAddrReg);
419423
420424 // ... an address can be updated in a safe manner, producing the result
421425 // which is as trusted as the input address.
@@ -736,25 +740,28 @@ shouldReportReturnGadget(const BinaryContext &BC, const MCInstReference &Inst,
736740 if (!BC.MIB ->isReturn (Inst))
737741 return std::nullopt ;
738742
739- ErrorOr<MCPhysReg> MaybeRetReg = BC.MIB ->getRegUsedAsRetDest (Inst);
740- if (MaybeRetReg.getError ()) {
743+ bool IsAuthenticated = false ;
744+ std::optional<MCPhysReg> RetReg =
745+ BC.MIB ->getRegUsedAsRetDest (Inst, IsAuthenticated);
746+ if (!RetReg) {
741747 return make_generic_report (
742748 Inst, " Warning: pac-ret analysis could not analyze this return "
743749 " instruction" );
744750 }
745- MCPhysReg RetReg = *MaybeRetReg;
751+ if (IsAuthenticated)
752+ return std::nullopt ;
753+
754+ assert (*RetReg != BC.MIB ->getNoRegister ());
746755 LLVM_DEBUG ({
747756 traceInst (BC, " Found RET inst" , Inst);
748- traceReg (BC, " RetReg" , RetReg);
749- traceReg (BC, " Authenticated reg " , BC. MIB -> getAuthenticatedReg (Inst) );
757+ traceReg (BC, " RetReg" , * RetReg);
758+ traceRegMask (BC, " SafeToDerefRegs " , S. SafeToDerefRegs );
750759 });
751- if (BC.MIB ->isAuthenticationOfReg (Inst, RetReg))
752- return std::nullopt ;
753- LLVM_DEBUG ({ traceRegMask (BC, " SafeToDerefRegs" , S.SafeToDerefRegs ); });
754- if (S.SafeToDerefRegs [RetReg])
760+
761+ if (S.SafeToDerefRegs [*RetReg])
755762 return std::nullopt ;
756763
757- return make_gadget_report (RetKind, Inst, RetReg);
764+ return make_gadget_report (RetKind, Inst, * RetReg);
758765}
759766
760767static std::optional<PartialReport<MCPhysReg>>
@@ -787,19 +794,20 @@ shouldReportSigningOracle(const BinaryContext &BC, const MCInstReference &Inst,
787794 const SrcState &S) {
788795 static const GadgetKind SigningOracleKind (" signing oracle found" );
789796
790- MCPhysReg SignedReg = BC.MIB ->getSignedReg (Inst);
791- if (SignedReg == BC. MIB -> getNoRegister () )
797+ std::optional< MCPhysReg> SignedReg = BC.MIB ->getSignedReg (Inst);
798+ if (! SignedReg)
792799 return std::nullopt ;
793800
801+ assert (*SignedReg != BC.MIB ->getNoRegister ());
794802 LLVM_DEBUG ({
795803 traceInst (BC, " Found sign inst" , Inst);
796- traceReg (BC, " Signed reg" , SignedReg);
804+ traceReg (BC, " Signed reg" , * SignedReg);
797805 traceRegMask (BC, " TrustedRegs" , S.TrustedRegs );
798806 });
799- if (S.TrustedRegs [SignedReg])
807+ if (S.TrustedRegs [* SignedReg])
800808 return std::nullopt ;
801809
802- return make_gadget_report (SigningOracleKind, Inst, SignedReg);
810+ return make_gadget_report (SigningOracleKind, Inst, * SignedReg);
803811}
804812
805813template <typename T> static void iterateOverInstrs (BinaryFunction &BF, T Fn) {
0 commit comments