@@ -91,21 +91,21 @@ class TrackedRegisters {
9191  const  std::vector<MCPhysReg> Registers;
9292  std::vector<uint16_t > RegToIndexMapping;
9393
94-   static  size_t  getMappingSize (const  std::vector <MCPhysReg> & RegsToTrack) {
94+   static  size_t  getMappingSize (ArrayRef <MCPhysReg> RegsToTrack) {
9595    if  (RegsToTrack.empty ())
9696      return  0 ;
9797    return  1  + *llvm::max_element (RegsToTrack);
9898  }
9999
100100public: 
101-   TrackedRegisters (const  std::vector <MCPhysReg> & RegsToTrack)
101+   TrackedRegisters (ArrayRef <MCPhysReg> RegsToTrack)
102102      : Registers(RegsToTrack),
103103        RegToIndexMapping (getMappingSize(RegsToTrack), NoIndex) {
104104    for  (unsigned  I = 0 ; I < RegsToTrack.size (); ++I)
105105      RegToIndexMapping[RegsToTrack[I]] = I;
106106  }
107107
108-   const   ArrayRef<MCPhysReg> getRegisters () const  { return  Registers; }
108+   ArrayRef<MCPhysReg> getRegisters () const  { return  Registers; }
109109
110110  size_t  getNumTrackedRegisters () const  { return  Registers.size (); }
111111
@@ -232,9 +232,9 @@ struct SrcState {
232232  bool  operator !=(const  SrcState &RHS) const  { return  !((*this ) == RHS); }
233233};
234234
235- static  void   printLastInsts ( 
236-      raw_ostream &OS,
237-     const  std::vector <SmallPtrSet<const  MCInst *, 4 >> & LastInstWritingReg) {
235+ static  void 
236+ printLastInsts ( raw_ostream &OS,
237+                ArrayRef <SmallPtrSet<const  MCInst *, 4 >> LastInstWritingReg) {
238238  OS << " Insts: " 
239239  for  (unsigned  I = 0 ; I < LastInstWritingReg.size (); ++I) {
240240    auto  &Set = LastInstWritingReg[I];
@@ -294,20 +294,18 @@ void SrcStatePrinter::print(raw_ostream &OS, const SrcState &S) const {
294294// / version for functions without reconstructed CFG.
295295class  SrcSafetyAnalysis  {
296296public: 
297-   SrcSafetyAnalysis (BinaryFunction &BF,
298-                     const  std::vector<MCPhysReg> &RegsToTrackInstsFor)
297+   SrcSafetyAnalysis (BinaryFunction &BF, ArrayRef<MCPhysReg> RegsToTrackInstsFor)
299298      : BC(BF.getBinaryContext()), NumRegs(BC.MRI->getNumRegs ()),
300299        RegsToTrackInstsFor(RegsToTrackInstsFor) {}
301300
302301  virtual  ~SrcSafetyAnalysis () {}
303302
304303  static  std::shared_ptr<SrcSafetyAnalysis>
305304  create (BinaryFunction &BF, MCPlusBuilder::AllocatorIdTy AllocId,
306-          const  std::vector <MCPhysReg> & RegsToTrackInstsFor);
305+          ArrayRef <MCPhysReg> RegsToTrackInstsFor);
307306
308307  virtual  void  run () = 0;
309-   virtual  ErrorOr<const  SrcState &>
310-   getStateBefore (const  MCInst &Inst) const  = 0 ;
308+   virtual  const  SrcState &getStateBefore (const  MCInst &Inst) const  = 0;
311309
312310protected: 
313311  BinaryContext &BC;
@@ -347,7 +345,7 @@ class SrcSafetyAnalysis {
347345  }
348346
349347  BitVector getClobberedRegs (const  MCInst &Point) const  {
350-     BitVector Clobbered (NumRegs,  false );
348+     BitVector Clobbered (NumRegs);
351349    //  Assume a call can clobber all registers, including callee-saved
352350    //  registers. There's a good chance that callee-saved registers will be
353351    //  saved on the stack at some point during execution of the callee.
@@ -409,8 +407,7 @@ class SrcSafetyAnalysis {
409407      //  FirstCheckerInst should belong to the same basic block (see the
410408      //  assertion in DataflowSrcSafetyAnalysis::run()), meaning it was
411409      //  deterministically processed a few steps before this instruction.
412-       const  SrcState &StateBeforeChecker =
413-           getStateBefore (*FirstCheckerInst).get ();
410+       const  SrcState &StateBeforeChecker = getStateBefore (*FirstCheckerInst);
414411      if  (StateBeforeChecker.SafeToDerefRegs [CheckedReg])
415412        Regs.push_back (CheckedReg);
416413    }
@@ -520,13 +517,10 @@ class SrcSafetyAnalysis {
520517public: 
521518  std::vector<MCInstReference>
522519  getLastClobberingInsts (const  MCInst &Inst, BinaryFunction &BF,
523-                          const   ArrayRef<MCPhysReg> UsedDirtyRegs) const  {
520+                          ArrayRef<MCPhysReg> UsedDirtyRegs) const  {
524521    if  (RegsToTrackInstsFor.empty ())
525522      return  {};
526-     auto  MaybeState = getStateBefore (Inst);
527-     if  (!MaybeState)
528-       llvm_unreachable (" Expected state to be present" 
529-     const  SrcState &S = *MaybeState;
523+     const  SrcState &S = getStateBefore (Inst);
530524    //  Due to aliasing registers, multiple registers may have been tracked.
531525    std::set<const  MCInst *> LastWritingInsts;
532526    for  (MCPhysReg TrackedReg : UsedDirtyRegs) {
@@ -537,7 +531,7 @@ class SrcSafetyAnalysis {
537531    for  (const  MCInst *Inst : LastWritingInsts) {
538532      MCInstReference Ref = MCInstReference::get (Inst, BF);
539533      assert (Ref && " Expected Inst to be found" 
540-       Result.push_back (MCInstReference ( Ref) );
534+       Result.push_back (Ref);
541535    }
542536    return  Result;
543537  }
@@ -557,11 +551,11 @@ class DataflowSrcSafetyAnalysis
557551public: 
558552  DataflowSrcSafetyAnalysis (BinaryFunction &BF,
559553                            MCPlusBuilder::AllocatorIdTy AllocId,
560-                             const  std::vector <MCPhysReg> & RegsToTrackInstsFor)
554+                             ArrayRef <MCPhysReg> RegsToTrackInstsFor)
561555      : SrcSafetyAnalysis(BF, RegsToTrackInstsFor), DFParent(BF, AllocId) {}
562556
563-   ErrorOr< const  SrcState &>  getStateBefore (const  MCInst &Inst) const  override  {
564-     return  DFParent::getStateBefore (Inst);
557+   const  SrcState &getStateBefore (const  MCInst &Inst) const  override  {
558+     return  DFParent::getStateBefore (Inst). get () ;
565559  }
566560
567561  void  run () override  {
@@ -674,7 +668,7 @@ class CFGUnawareSrcSafetyAnalysis : public SrcSafetyAnalysis {
674668public: 
675669  CFGUnawareSrcSafetyAnalysis (BinaryFunction &BF,
676670                              MCPlusBuilder::AllocatorIdTy AllocId,
677-                               const  std::vector <MCPhysReg> & RegsToTrackInstsFor)
671+                               ArrayRef <MCPhysReg> RegsToTrackInstsFor)
678672      : SrcSafetyAnalysis(BF, RegsToTrackInstsFor), BF(BF), AllocId(AllocId) {
679673    StateAnnotationIndex =
680674        BC.MIB ->getOrCreateAnnotationIndex (" CFGUnawareSrcSafetyAnalysis" 
@@ -708,7 +702,7 @@ class CFGUnawareSrcSafetyAnalysis : public SrcSafetyAnalysis {
708702    }
709703  }
710704
711-   ErrorOr< const  SrcState &>  getStateBefore (const  MCInst &Inst) const  override  {
705+   const  SrcState &getStateBefore (const  MCInst &Inst) const  override  {
712706    return  BC.MIB ->getAnnotationAs <SrcState>(Inst, StateAnnotationIndex);
713707  }
714708
@@ -718,7 +712,7 @@ class CFGUnawareSrcSafetyAnalysis : public SrcSafetyAnalysis {
718712std::shared_ptr<SrcSafetyAnalysis>
719713SrcSafetyAnalysis::create (BinaryFunction &BF,
720714                          MCPlusBuilder::AllocatorIdTy AllocId,
721-                           const  std::vector <MCPhysReg> & RegsToTrackInstsFor) {
715+                           ArrayRef <MCPhysReg> RegsToTrackInstsFor) {
722716  if  (BF.hasCFG ())
723717    return  std::make_shared<DataflowSrcSafetyAnalysis>(BF, AllocId,
724718                                                       RegsToTrackInstsFor);
@@ -825,7 +819,7 @@ Analysis::findGadgets(BinaryFunction &BF,
825819
826820  BinaryContext &BC = BF.getBinaryContext ();
827821  iterateOverInstrs (BF, [&](MCInstReference Inst) {
828-     const  SrcState &S = * Analysis->getStateBefore (Inst);
822+     const  SrcState &S = Analysis->getStateBefore (Inst);
829823
830824    //  If non-empty state was never propagated from the entry basic block
831825    //  to Inst, assume it to be unreachable and report a warning.
0 commit comments