@@ -367,17 +367,15 @@ class SrcSafetyAnalysis {
367367 SmallVector<MCPhysReg> getRegsMadeSafeToDeref (const MCInst &Point,
368368 const SrcState &Cur) const {
369369 SmallVector<MCPhysReg> Regs;
370- const MCPhysReg NoReg = BC.MIB ->getNoRegister ();
371370
372371 // A signed pointer can be authenticated, or
373- ErrorOr<MCPhysReg> AutReg = BC. MIB -> getAuthenticatedReg (Point) ;
374- if (AutReg && * AutReg != NoReg )
372+ bool Dummy = false ;
373+ if (auto AutReg = BC. MIB -> getWrittenAuthenticatedReg (Point, Dummy) )
375374 Regs.push_back (*AutReg);
376375
377376 // ... a safe address can be materialized, or
378- MCPhysReg NewAddrReg = BC.MIB ->getMaterializedAddressRegForPtrAuth (Point);
379- if (NewAddrReg != NoReg)
380- Regs.push_back (NewAddrReg);
377+ if (auto NewAddrReg = BC.MIB ->getMaterializedAddressRegForPtrAuth (Point))
378+ Regs.push_back (*NewAddrReg);
381379
382380 // ... an address can be updated in a safe manner, producing the result
383381 // which is as trusted as the input address.
@@ -393,13 +391,20 @@ class SrcSafetyAnalysis {
393391 SmallVector<MCPhysReg> getRegsMadeTrusted (const MCInst &Point,
394392 const SrcState &Cur) const {
395393 SmallVector<MCPhysReg> Regs;
396- const MCPhysReg NoReg = BC.MIB ->getNoRegister ();
397394
398395 // An authenticated pointer can be checked, or
399- MCPhysReg CheckedReg =
396+ std::optional< MCPhysReg> CheckedReg =
400397 BC.MIB ->getAuthCheckedReg (Point, /* MayOverwrite=*/ false );
401- if (CheckedReg != NoReg && Cur.SafeToDerefRegs [CheckedReg])
402- Regs.push_back (CheckedReg);
398+ if (CheckedReg && Cur.SafeToDerefRegs [*CheckedReg])
399+ Regs.push_back (*CheckedReg);
400+
401+ // ... a pointer can be authenticated by an instruction that always checks
402+ // the pointer, or
403+ bool IsChecked = false ;
404+ std::optional<MCPhysReg> AutReg =
405+ BC.MIB ->getWrittenAuthenticatedReg (Point, IsChecked);
406+ if (AutReg && IsChecked)
407+ Regs.push_back (*AutReg);
403408
404409 if (CheckerSequenceInfo.contains (&Point)) {
405410 MCPhysReg CheckedReg;
@@ -414,9 +419,8 @@ class SrcSafetyAnalysis {
414419 }
415420
416421 // ... a safe address can be materialized, or
417- MCPhysReg NewAddrReg = BC.MIB ->getMaterializedAddressRegForPtrAuth (Point);
418- if (NewAddrReg != NoReg)
419- Regs.push_back (NewAddrReg);
422+ if (auto NewAddrReg = BC.MIB ->getMaterializedAddressRegForPtrAuth (Point))
423+ Regs.push_back (*NewAddrReg);
420424
421425 // ... an address can be updated in a safe manner, producing the result
422426 // which is as trusted as the input address.
@@ -731,25 +735,28 @@ shouldReportReturnGadget(const BinaryContext &BC, const MCInstReference &Inst,
731735 if (!BC.MIB ->isReturn (Inst))
732736 return std::nullopt ;
733737
734- ErrorOr<MCPhysReg> MaybeRetReg = BC.MIB ->getRegUsedAsRetDest (Inst);
735- if (MaybeRetReg.getError ()) {
738+ bool IsAuthenticated = false ;
739+ std::optional<MCPhysReg> RetReg =
740+ BC.MIB ->getRegUsedAsRetDest (Inst, IsAuthenticated);
741+ if (!RetReg) {
736742 return make_generic_report (
737743 Inst, " Warning: pac-ret analysis could not analyze this return "
738744 " instruction" );
739745 }
740- MCPhysReg RetReg = *MaybeRetReg;
746+ if (IsAuthenticated)
747+ return std::nullopt ;
748+
749+ assert (*RetReg != BC.MIB ->getNoRegister ());
741750 LLVM_DEBUG ({
742751 traceInst (BC, " Found RET inst" , Inst);
743- traceReg (BC, " RetReg" , RetReg);
744- traceReg (BC, " Authenticated reg " , BC. MIB -> getAuthenticatedReg (Inst) );
752+ traceReg (BC, " RetReg" , * RetReg);
753+ traceRegMask (BC, " SafeToDerefRegs " , S. SafeToDerefRegs );
745754 });
746- if (BC.MIB ->isAuthenticationOfReg (Inst, RetReg))
747- return std::nullopt ;
748- LLVM_DEBUG ({ traceRegMask (BC, " SafeToDerefRegs" , S.SafeToDerefRegs ); });
749- if (S.SafeToDerefRegs [RetReg])
755+
756+ if (S.SafeToDerefRegs [*RetReg])
750757 return std::nullopt ;
751758
752- return make_report (RetKind, Inst, RetReg);
759+ return make_report (RetKind, Inst, * RetReg);
753760}
754761
755762static std::optional<BriefReport<MCPhysReg>>
@@ -782,19 +789,20 @@ shouldReportSigningOracle(const BinaryContext &BC, const MCInstReference &Inst,
782789 const SrcState &S) {
783790 static const GadgetKind SigningOracleKind (" signing oracle found" );
784791
785- MCPhysReg SignedReg = BC.MIB ->getSignedReg (Inst);
786- if (SignedReg == BC. MIB -> getNoRegister () )
792+ std::optional< MCPhysReg> SignedReg = BC.MIB ->getSignedReg (Inst);
793+ if (! SignedReg)
787794 return std::nullopt ;
788795
796+ assert (*SignedReg != BC.MIB ->getNoRegister ());
789797 LLVM_DEBUG ({
790798 traceInst (BC, " Found sign inst" , Inst);
791- traceReg (BC, " Signed reg" , SignedReg);
799+ traceReg (BC, " Signed reg" , * SignedReg);
792800 traceRegMask (BC, " TrustedRegs" , S.TrustedRegs );
793801 });
794- if (S.TrustedRegs [SignedReg])
802+ if (S.TrustedRegs [* SignedReg])
795803 return std::nullopt ;
796804
797- return make_report (SigningOracleKind, Inst, SignedReg);
805+ return make_report (SigningOracleKind, Inst, * SignedReg);
798806}
799807
800808template <typename T> static void iterateOverInstrs (BinaryFunction &BF, T Fn) {
0 commit comments