@@ -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" 
745-     traceReg (BC, " 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" 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" 
793-     traceReg (BC, " Signed reg" 
801+     traceReg (BC, " Signed reg" * SignedReg);
794802    traceRegMask (BC, " TrustedRegs" 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