@@ -91,21 +91,21 @@ class TrackedRegisters {
91
91
const std::vector<MCPhysReg> Registers;
92
92
std::vector<uint16_t > RegToIndexMapping;
93
93
94
- static size_t getMappingSize (const std::vector <MCPhysReg> & RegsToTrack) {
94
+ static size_t getMappingSize (ArrayRef <MCPhysReg> RegsToTrack) {
95
95
if (RegsToTrack.empty ())
96
96
return 0 ;
97
97
return 1 + *llvm::max_element (RegsToTrack);
98
98
}
99
99
100
100
public:
101
- TrackedRegisters (const std::vector <MCPhysReg> & RegsToTrack)
101
+ TrackedRegisters (ArrayRef <MCPhysReg> RegsToTrack)
102
102
: Registers(RegsToTrack),
103
103
RegToIndexMapping (getMappingSize(RegsToTrack), NoIndex) {
104
104
for (unsigned I = 0 ; I < RegsToTrack.size (); ++I)
105
105
RegToIndexMapping[RegsToTrack[I]] = I;
106
106
}
107
107
108
- const ArrayRef<MCPhysReg> getRegisters () const { return Registers; }
108
+ ArrayRef<MCPhysReg> getRegisters () const { return Registers; }
109
109
110
110
size_t getNumTrackedRegisters () const { return Registers.size (); }
111
111
@@ -232,9 +232,9 @@ struct SrcState {
232
232
bool operator !=(const SrcState &RHS) const { return !((*this ) == RHS); }
233
233
};
234
234
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) {
238
238
OS << " Insts: " ;
239
239
for (unsigned I = 0 ; I < LastInstWritingReg.size (); ++I) {
240
240
auto &Set = LastInstWritingReg[I];
@@ -294,20 +294,18 @@ void SrcStatePrinter::print(raw_ostream &OS, const SrcState &S) const {
294
294
// / version for functions without reconstructed CFG.
295
295
class SrcSafetyAnalysis {
296
296
public:
297
- SrcSafetyAnalysis (BinaryFunction &BF,
298
- const std::vector<MCPhysReg> &RegsToTrackInstsFor)
297
+ SrcSafetyAnalysis (BinaryFunction &BF, ArrayRef<MCPhysReg> RegsToTrackInstsFor)
299
298
: BC(BF.getBinaryContext()), NumRegs(BC.MRI->getNumRegs ()),
300
299
RegsToTrackInstsFor(RegsToTrackInstsFor) {}
301
300
302
301
virtual ~SrcSafetyAnalysis () {}
303
302
304
303
static std::shared_ptr<SrcSafetyAnalysis>
305
304
create (BinaryFunction &BF, MCPlusBuilder::AllocatorIdTy AllocId,
306
- const std::vector <MCPhysReg> & RegsToTrackInstsFor);
305
+ ArrayRef <MCPhysReg> RegsToTrackInstsFor);
307
306
308
307
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;
311
309
312
310
protected:
313
311
BinaryContext &BC;
@@ -347,7 +345,7 @@ class SrcSafetyAnalysis {
347
345
}
348
346
349
347
BitVector getClobberedRegs (const MCInst &Point ) const {
350
- BitVector Clobbered (NumRegs, false );
348
+ BitVector Clobbered (NumRegs);
351
349
// Assume a call can clobber all registers, including callee-saved
352
350
// registers. There's a good chance that callee-saved registers will be
353
351
// saved on the stack at some point during execution of the callee.
@@ -409,8 +407,7 @@ class SrcSafetyAnalysis {
409
407
// FirstCheckerInst should belong to the same basic block (see the
410
408
// assertion in DataflowSrcSafetyAnalysis::run()), meaning it was
411
409
// deterministically processed a few steps before this instruction.
412
- const SrcState &StateBeforeChecker =
413
- getStateBefore (*FirstCheckerInst).get ();
410
+ const SrcState &StateBeforeChecker = getStateBefore (*FirstCheckerInst);
414
411
if (StateBeforeChecker.SafeToDerefRegs [CheckedReg])
415
412
Regs.push_back (CheckedReg);
416
413
}
@@ -520,13 +517,10 @@ class SrcSafetyAnalysis {
520
517
public:
521
518
std::vector<MCInstReference>
522
519
getLastClobberingInsts (const MCInst &Inst, BinaryFunction &BF,
523
- const ArrayRef<MCPhysReg> UsedDirtyRegs) const {
520
+ ArrayRef<MCPhysReg> UsedDirtyRegs) const {
524
521
if (RegsToTrackInstsFor.empty ())
525
522
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);
530
524
// Due to aliasing registers, multiple registers may have been tracked.
531
525
std::set<const MCInst *> LastWritingInsts;
532
526
for (MCPhysReg TrackedReg : UsedDirtyRegs) {
@@ -537,7 +531,7 @@ class SrcSafetyAnalysis {
537
531
for (const MCInst *Inst : LastWritingInsts) {
538
532
MCInstReference Ref = MCInstReference::get (Inst, BF);
539
533
assert (Ref && " Expected Inst to be found" );
540
- Result.push_back (MCInstReference ( Ref) );
534
+ Result.push_back (Ref);
541
535
}
542
536
return Result;
543
537
}
@@ -557,11 +551,11 @@ class DataflowSrcSafetyAnalysis
557
551
public:
558
552
DataflowSrcSafetyAnalysis (BinaryFunction &BF,
559
553
MCPlusBuilder::AllocatorIdTy AllocId,
560
- const std::vector <MCPhysReg> & RegsToTrackInstsFor)
554
+ ArrayRef <MCPhysReg> RegsToTrackInstsFor)
561
555
: SrcSafetyAnalysis(BF, RegsToTrackInstsFor), DFParent(BF, AllocId) {}
562
556
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 () ;
565
559
}
566
560
567
561
void run () override {
@@ -674,7 +668,7 @@ class CFGUnawareSrcSafetyAnalysis : public SrcSafetyAnalysis {
674
668
public:
675
669
CFGUnawareSrcSafetyAnalysis (BinaryFunction &BF,
676
670
MCPlusBuilder::AllocatorIdTy AllocId,
677
- const std::vector <MCPhysReg> & RegsToTrackInstsFor)
671
+ ArrayRef <MCPhysReg> RegsToTrackInstsFor)
678
672
: SrcSafetyAnalysis(BF, RegsToTrackInstsFor), BF(BF), AllocId(AllocId) {
679
673
StateAnnotationIndex =
680
674
BC.MIB ->getOrCreateAnnotationIndex (" CFGUnawareSrcSafetyAnalysis" );
@@ -708,7 +702,7 @@ class CFGUnawareSrcSafetyAnalysis : public SrcSafetyAnalysis {
708
702
}
709
703
}
710
704
711
- ErrorOr< const SrcState &> getStateBefore (const MCInst &Inst) const override {
705
+ const SrcState &getStateBefore (const MCInst &Inst) const override {
712
706
return BC.MIB ->getAnnotationAs <SrcState>(Inst, StateAnnotationIndex);
713
707
}
714
708
@@ -718,7 +712,7 @@ class CFGUnawareSrcSafetyAnalysis : public SrcSafetyAnalysis {
718
712
std::shared_ptr<SrcSafetyAnalysis>
719
713
SrcSafetyAnalysis::create (BinaryFunction &BF,
720
714
MCPlusBuilder::AllocatorIdTy AllocId,
721
- const std::vector <MCPhysReg> & RegsToTrackInstsFor) {
715
+ ArrayRef <MCPhysReg> RegsToTrackInstsFor) {
722
716
if (BF.hasCFG ())
723
717
return std::make_shared<DataflowSrcSafetyAnalysis>(BF, AllocId,
724
718
RegsToTrackInstsFor);
@@ -825,7 +819,7 @@ Analysis::findGadgets(BinaryFunction &BF,
825
819
826
820
BinaryContext &BC = BF.getBinaryContext ();
827
821
iterateOverInstrs (BF, [&](MCInstReference Inst) {
828
- const SrcState &S = * Analysis->getStateBefore (Inst);
822
+ const SrcState &S = Analysis->getStateBefore (Inst);
829
823
830
824
// If non-empty state was never propagated from the entry basic block
831
825
// to Inst, assume it to be unreachable and report a warning.
0 commit comments