@@ -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.
@@ -733,25 +737,28 @@ shouldReportReturnGadget(const BinaryContext &BC, const MCInstReference &Inst,
733737 if (!BC.MIB ->isReturn (Inst))
734738 return std::nullopt ;
735739
736- ErrorOr<MCPhysReg> MaybeRetReg = BC.MIB ->getRegUsedAsRetDest (Inst);
737- if (MaybeRetReg.getError ()) {
740+ bool IsAuthenticated = false ;
741+ std::optional<MCPhysReg> RetReg =
742+ BC.MIB ->getRegUsedAsRetDest (Inst, IsAuthenticated);
743+ if (!RetReg) {
738744 return make_generic_report (
739745 Inst, " Warning: pac-ret analysis could not analyze this return "
740746 " instruction" );
741747 }
742- MCPhysReg RetReg = *MaybeRetReg;
748+ if (IsAuthenticated)
749+ return std::nullopt ;
750+
751+ assert (*RetReg != BC.MIB ->getNoRegister ());
743752 LLVM_DEBUG ({
744753 traceInst (BC, " Found RET inst" , Inst);
745- traceReg (BC, " RetReg" , RetReg);
746- traceReg (BC, " Authenticated reg " , BC. MIB -> getAuthenticatedReg (Inst) );
754+ traceReg (BC, " RetReg" , * RetReg);
755+ traceRegMask (BC, " SafeToDerefRegs " , S. SafeToDerefRegs );
747756 });
748- if (BC.MIB ->isAuthenticationOfReg (Inst, RetReg))
749- return std::nullopt ;
750- LLVM_DEBUG ({ traceRegMask (BC, " SafeToDerefRegs" , S.SafeToDerefRegs ); });
751- if (S.SafeToDerefRegs [RetReg])
757+
758+ if (S.SafeToDerefRegs [*RetReg])
752759 return std::nullopt ;
753760
754- return make_report (RetKind, Inst, RetReg);
761+ return make_report (RetKind, Inst, * RetReg);
755762}
756763
757764static std::optional<BriefReport<MCPhysReg>>
@@ -784,19 +791,20 @@ shouldReportSigningOracle(const BinaryContext &BC, const MCInstReference &Inst,
784791 const SrcState &S) {
785792 static const GadgetKind SigningOracleKind (" signing oracle found" );
786793
787- MCPhysReg SignedReg = BC.MIB ->getSignedReg (Inst);
788- if (SignedReg == BC. MIB -> getNoRegister () )
794+ std::optional< MCPhysReg> SignedReg = BC.MIB ->getSignedReg (Inst);
795+ if (! SignedReg)
789796 return std::nullopt ;
790797
798+ assert (*SignedReg != BC.MIB ->getNoRegister ());
791799 LLVM_DEBUG ({
792800 traceInst (BC, " Found sign inst" , Inst);
793- traceReg (BC, " Signed reg" , SignedReg);
801+ traceReg (BC, " Signed reg" , * SignedReg);
794802 traceRegMask (BC, " TrustedRegs" , S.TrustedRegs );
795803 });
796- if (S.TrustedRegs [SignedReg])
804+ if (S.TrustedRegs [* SignedReg])
797805 return std::nullopt ;
798806
799- return make_report (SigningOracleKind, Inst, SignedReg);
807+ return make_report (SigningOracleKind, Inst, * SignedReg);
800808}
801809
802810template <typename T> static void iterateOverInstrs (BinaryFunction &BF, T Fn) {
0 commit comments