Skip to content

Commit 5edfb3a

Browse files
author
git apple-llvm automerger
committed
Merge commit '14706d6cdebf' from llvm.org/main into next
2 parents 0bfd56c + 14706d6 commit 5edfb3a

File tree

2 files changed

+27
-37
lines changed

2 files changed

+27
-37
lines changed

bolt/include/bolt/Passes/PAuthGadgetScanner.h

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
#include "bolt/Core/BinaryContext.h"
1313
#include "bolt/Core/BinaryFunction.h"
1414
#include "bolt/Passes/BinaryPasses.h"
15-
#include "llvm/ADT/SmallSet.h"
1615
#include "llvm/Support/raw_ostream.h"
1716
#include <memory>
1817

@@ -197,9 +196,6 @@ raw_ostream &operator<<(raw_ostream &OS, const MCInstReference &);
197196

198197
namespace PAuthGadgetScanner {
199198

200-
class SrcSafetyAnalysis;
201-
struct SrcState;
202-
203199
/// Description of a gadget kind that can be detected. Intended to be
204200
/// statically allocated to be attached to reports by reference.
205201
class GadgetKind {
@@ -208,7 +204,7 @@ class GadgetKind {
208204
public:
209205
GadgetKind(const char *Description) : Description(Description) {}
210206

211-
const StringRef getDescription() const { return Description; }
207+
StringRef getDescription() const { return Description; }
212208
};
213209

214210
/// Base report located at some instruction, without any additional information.
@@ -223,8 +219,8 @@ struct Report {
223219

224220
// The two methods below are called by Analysis::computeDetailedInfo when
225221
// iterating over the reports.
226-
virtual const ArrayRef<MCPhysReg> getAffectedRegisters() const { return {}; }
227-
virtual void setOverwritingInstrs(const ArrayRef<MCInstReference> Instrs) {}
222+
virtual ArrayRef<MCPhysReg> getAffectedRegisters() const { return {}; }
223+
virtual void setOverwritingInstrs(ArrayRef<MCInstReference> Instrs) {}
228224

229225
void printBasicInfo(raw_ostream &OS, const BinaryContext &BC,
230226
StringRef IssueKind) const;
@@ -247,19 +243,19 @@ struct GadgetReport : public Report {
247243

248244
void generateReport(raw_ostream &OS, const BinaryContext &BC) const override;
249245

250-
const ArrayRef<MCPhysReg> getAffectedRegisters() const override {
246+
ArrayRef<MCPhysReg> getAffectedRegisters() const override {
251247
return AffectedRegisters;
252248
}
253249

254-
void setOverwritingInstrs(const ArrayRef<MCInstReference> Instrs) override {
250+
void setOverwritingInstrs(ArrayRef<MCInstReference> Instrs) override {
255251
OverwritingInstrs.assign(Instrs.begin(), Instrs.end());
256252
}
257253
};
258254

259255
/// Report with a free-form message attached.
260256
struct GenericReport : public Report {
261257
std::string Text;
262-
GenericReport(MCInstReference Location, const std::string &Text)
258+
GenericReport(MCInstReference Location, StringRef Text)
263259
: Report(Location), Text(Text) {}
264260
virtual void generateReport(raw_ostream &OS,
265261
const BinaryContext &BC) const override;

bolt/lib/Passes/PAuthGadgetScanner.cpp

Lines changed: 21 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -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

100100
public:
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.
295295
class SrcSafetyAnalysis {
296296
public:
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

312310
protected:
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 {
520517
public:
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
557551
public:
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 {
674668
public:
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 {
718712
std::shared_ptr<SrcSafetyAnalysis>
719713
SrcSafetyAnalysis::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

Comments
 (0)