@@ -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