@@ -562,35 +562,56 @@ class MCPlusBuilder {
562562 return {};
563563 }
564564
565- virtual ErrorOr<MCPhysReg> getAuthenticatedReg (const MCInst &Inst) const {
566- llvm_unreachable (" not implemented" );
567- return getNoRegister ();
568- }
569-
570- virtual bool isAuthenticationOfReg (const MCInst &Inst,
571- MCPhysReg AuthenticatedReg) const {
565+ // / Returns the register where an authenticated pointer is written to by Inst,
566+ // / or std::nullopt if not authenticating any register.
567+ // /
568+ // / Sets IsChecked if the instruction always checks authenticated pointer,
569+ // / i.e. it either writes a successfully authenticated pointer or terminates
570+ // / the program abnormally (such as "ldra x0, [x1]!" on AArch64, which crashes
571+ // / on authentication failure even if FEAT_FPAC is not implemented).
572+ virtual std::optional<MCPhysReg>
573+ getWrittenAuthenticatedReg (const MCInst &Inst, bool &IsChecked) const {
572574 llvm_unreachable (" not implemented" );
573- return false ;
575+ return std:: nullopt ;
574576 }
575577
576- virtual MCPhysReg getSignedReg (const MCInst &Inst) const {
578+ // / Returns the register signed by Inst, or std::nullopt if not signing any
579+ // / register.
580+ // /
581+ // / The returned register is assumed to be both input and output operand,
582+ // / as it is done on AArch64.
583+ virtual std::optional<MCPhysReg> getSignedReg (const MCInst &Inst) const {
577584 llvm_unreachable (" not implemented" );
578- return getNoRegister () ;
585+ return std:: nullopt ;
579586 }
580587
581- virtual ErrorOr<MCPhysReg> getRegUsedAsRetDest (const MCInst &Inst) const {
588+ // / Returns the register used as a return address. Returns std::nullopt if
589+ // / not applicable, such as reading the return address from a system register
590+ // / or from the stack.
591+ // /
592+ // / Sets IsAuthenticatedInternally if the instruction accepts a signed
593+ // / pointer as its operand and authenticates it internally.
594+ // /
595+ // / Should only be called when isReturn(Inst) is true.
596+ virtual std::optional<MCPhysReg>
597+ getRegUsedAsRetDest (const MCInst &Inst,
598+ bool &IsAuthenticatedInternally) const {
582599 llvm_unreachable (" not implemented" );
583- return getNoRegister () ;
600+ return std:: nullopt ;
584601 }
585602
586603 // / Returns the register used as the destination of an indirect branch or call
587604 // / instruction. Sets IsAuthenticatedInternally if the instruction accepts
588605 // / a signed pointer as its operand and authenticates it internally.
606+ // /
607+ // / Should only be called if isIndirectCall(Inst) or isIndirectBranch(Inst)
608+ // / returns true.
589609 virtual MCPhysReg
590610 getRegUsedAsIndirectBranchDest (const MCInst &Inst,
591611 bool &IsAuthenticatedInternally) const {
592612 llvm_unreachable (" not implemented" );
593- return getNoRegister ();
613+ return 0 ; // Unreachable. A valid register should be returned by the
614+ // target implementation.
594615 }
595616
596617 // / Returns the register containing an address safely materialized by `Inst`
@@ -602,14 +623,14 @@ class MCPlusBuilder {
602623 // / controlled, under the Pointer Authentication threat model.
603624 // /
604625 // / If the instruction does not write to any register satisfying the above
605- // / two conditions, NoRegister is returned.
626+ // / two conditions, std::nullopt is returned.
606627 // /
607628 // / The Pointer Authentication threat model assumes an attacker is able to
608629 // / modify any writable memory, but not executable code (due to W^X).
609- virtual MCPhysReg
630+ virtual std::optional< MCPhysReg>
610631 getMaterializedAddressRegForPtrAuth (const MCInst &Inst) const {
611632 llvm_unreachable (" not implemented" );
612- return getNoRegister () ;
633+ return std:: nullopt ;
613634 }
614635
615636 // / Analyzes if this instruction can safely perform address arithmetics
@@ -622,10 +643,13 @@ class MCPlusBuilder {
622643 // / controlled, provided InReg and executable code are not. Please note that
623644 // / registers other than InReg as well as the contents of memory which is
624645 // / writable by the process should be considered attacker-controlled.
646+ // /
647+ // / The instruction should not write any values derived from InReg anywhere,
648+ // / except for OutReg.
625649 virtual std::optional<std::pair<MCPhysReg, MCPhysReg>>
626650 analyzeAddressArithmeticsForPtrAuth (const MCInst &Inst) const {
627651 llvm_unreachable (" not implemented" );
628- return std::make_pair ( getNoRegister (), getNoRegister ()) ;
652+ return std::nullopt ;
629653 }
630654
631655 // / Analyzes if a pointer is checked to be authenticated successfully
@@ -670,10 +694,10 @@ class MCPlusBuilder {
670694 // /
671695 // / Use this function for simple, single-instruction patterns instead of
672696 // / its getAuthCheckedReg(BB) counterpart.
673- virtual MCPhysReg getAuthCheckedReg (const MCInst &Inst,
674- bool MayOverwrite) const {
697+ virtual std::optional< MCPhysReg> getAuthCheckedReg (const MCInst &Inst,
698+ bool MayOverwrite) const {
675699 llvm_unreachable (" not implemented" );
676- return getNoRegister () ;
700+ return std:: nullopt ;
677701 }
678702
679703 virtual bool isTerminator (const MCInst &Inst) const ;
0 commit comments