@@ -146,8 +146,8 @@ class X86SpeculativeLoadHardeningPass : public MachineFunctionPass {
146146
147147 // / Manages the predicate state traced through the program.
148148 struct PredState {
149- unsigned InitialReg = 0 ;
150- unsigned PoisonReg = 0 ;
149+ Register InitialReg;
150+ Register PoisonReg;
151151
152152 const TargetRegisterClass *RC;
153153 MachineSSAUpdater SSA;
@@ -177,7 +177,7 @@ class X86SpeculativeLoadHardeningPass : public MachineFunctionPass {
177177
178178 void tracePredStateThroughBlocksAndHarden (MachineFunction &MF);
179179
180- unsigned saveEFLAGS (MachineBasicBlock &MBB,
180+ Register saveEFLAGS (MachineBasicBlock &MBB,
181181 MachineBasicBlock::iterator InsertPt,
182182 const DebugLoc &Loc);
183183 void restoreEFLAGS (MachineBasicBlock &MBB,
@@ -186,28 +186,28 @@ class X86SpeculativeLoadHardeningPass : public MachineFunctionPass {
186186
187187 void mergePredStateIntoSP (MachineBasicBlock &MBB,
188188 MachineBasicBlock::iterator InsertPt,
189- const DebugLoc &Loc, unsigned PredStateReg);
190- unsigned extractPredStateFromSP (MachineBasicBlock &MBB,
189+ const DebugLoc &Loc, Register PredStateReg);
190+ Register extractPredStateFromSP (MachineBasicBlock &MBB,
191191 MachineBasicBlock::iterator InsertPt,
192192 const DebugLoc &Loc);
193193
194194 void
195195 hardenLoadAddr (MachineInstr &MI, MachineOperand &BaseMO,
196196 MachineOperand &IndexMO,
197- SmallDenseMap<unsigned , unsigned , 32 > &AddrRegToHardenedReg);
197+ SmallDenseMap<Register, Register , 32 > &AddrRegToHardenedReg);
198198 MachineInstr *
199199 sinkPostLoadHardenedInst (MachineInstr &MI,
200200 SmallPtrSetImpl<MachineInstr *> &HardenedInstrs);
201201 bool canHardenRegister (Register Reg);
202- unsigned hardenValueInRegister (Register Reg, MachineBasicBlock &MBB,
202+ Register hardenValueInRegister (Register Reg, MachineBasicBlock &MBB,
203203 MachineBasicBlock::iterator InsertPt,
204204 const DebugLoc &Loc);
205- unsigned hardenPostLoad (MachineInstr &MI);
205+ Register hardenPostLoad (MachineInstr &MI);
206206 void hardenReturnInstr (MachineInstr &MI);
207207 void tracePredStateThroughCall (MachineInstr &MI);
208208 void hardenIndirectCallOrJumpInstr (
209209 MachineInstr &MI,
210- SmallDenseMap<unsigned , unsigned , 32 > &AddrRegToHardenedReg);
210+ SmallDenseMap<Register, Register , 32 > &AddrRegToHardenedReg);
211211};
212212
213213} // end anonymous namespace
@@ -743,7 +743,7 @@ X86SpeculativeLoadHardeningPass::tracePredStateThroughCFG(
743743
744744 // We will wire each cmov to each other, but need to start with the
745745 // incoming pred state.
746- unsigned CurStateReg = PS->InitialReg ;
746+ Register CurStateReg = PS->InitialReg ;
747747
748748 for (X86::CondCode Cond : Conds) {
749749 int PredStateSizeInBytes = TRI->getRegSizeInBits (*PS->RC ) / 8 ;
@@ -986,7 +986,7 @@ X86SpeculativeLoadHardeningPass::tracePredStateThroughIndirectBranches(
986986 // No terminator or non-branch terminator.
987987 continue ;
988988
989- unsigned TargetReg;
989+ Register TargetReg;
990990
991991 switch (TI.getOpcode ()) {
992992 default :
@@ -1265,9 +1265,9 @@ void X86SpeculativeLoadHardeningPass::tracePredStateThroughBlocksAndHarden(
12651265 SmallPtrSet<MachineInstr *, 16 > HardenPostLoad;
12661266 SmallPtrSet<MachineInstr *, 16 > HardenLoadAddr;
12671267
1268- SmallSet<unsigned , 16 > HardenedAddrRegs;
1268+ SmallSet<Register , 16 > HardenedAddrRegs;
12691269
1270- SmallDenseMap<unsigned , unsigned , 32 > AddrRegToHardenedReg;
1270+ SmallDenseMap<Register, Register , 32 > AddrRegToHardenedReg;
12711271
12721272 // Track the set of load-dependent registers through the basic block. Because
12731273 // the values of these registers have an existing data dependency on a loaded
@@ -1297,11 +1297,11 @@ void X86SpeculativeLoadHardeningPass::tracePredStateThroughBlocksAndHarden(
12971297 // FIXME: Do a more careful analysis of x86 to build a conservative
12981298 // model here.
12991299 if (llvm::any_of (MI.uses (), [&](MachineOperand &Op) {
1300- return Op.isReg () && LoadDepRegs.test (Op.getReg ());
1300+ return Op.isReg () && LoadDepRegs.test (Op.getReg (). id () );
13011301 }))
13021302 for (MachineOperand &Def : MI.defs ())
13031303 if (Def.isReg ())
1304- LoadDepRegs.set (Def.getReg ());
1304+ LoadDepRegs.set (Def.getReg (). id () );
13051305
13061306 // Both Intel and AMD are guiding that they will change the semantics of
13071307 // LFENCE to be a speculation barrier, so if we see an LFENCE, there is
@@ -1333,11 +1333,11 @@ void X86SpeculativeLoadHardeningPass::tracePredStateThroughBlocksAndHarden(
13331333
13341334 // If we have at least one (non-frame-index, non-RIP) register operand,
13351335 // and neither operand is load-dependent, we need to check the load.
1336- unsigned BaseReg = 0 , IndexReg = 0 ;
1336+ Register BaseReg, IndexReg;
13371337 if (!BaseMO.isFI () && BaseMO.getReg () != X86::RIP &&
1338- BaseMO.getReg () != X86::NoRegister )
1338+ BaseMO.getReg (). isValid () )
13391339 BaseReg = BaseMO.getReg ();
1340- if (IndexMO.getReg () != X86::NoRegister )
1340+ if (IndexMO.getReg (). isValid () )
13411341 IndexReg = IndexMO.getReg ();
13421342
13431343 if (!BaseReg && !IndexReg)
@@ -1348,8 +1348,8 @@ void X86SpeculativeLoadHardeningPass::tracePredStateThroughBlocksAndHarden(
13481348 // needn't check it.
13491349 // FIXME: Is this true in the case where we are hardening loads after
13501350 // they complete? Unclear, need to investigate.
1351- if ((BaseReg && LoadDepRegs.test (BaseReg)) ||
1352- (IndexReg && LoadDepRegs.test (IndexReg)))
1351+ if ((BaseReg && LoadDepRegs.test (BaseReg. id () )) ||
1352+ (IndexReg && LoadDepRegs.test (IndexReg. id () )))
13531353 continue ;
13541354
13551355 // If post-load hardening is enabled, this load is compatible with
@@ -1378,7 +1378,7 @@ void X86SpeculativeLoadHardeningPass::tracePredStateThroughBlocksAndHarden(
13781378
13791379 for (MachineOperand &Def : MI.defs ())
13801380 if (Def.isReg ())
1381- LoadDepRegs.set (Def.getReg ());
1381+ LoadDepRegs.set (Def.getReg (). id () );
13821382 }
13831383
13841384 // Now re-walk the instructions in the basic block, and apply whichever
@@ -1433,7 +1433,7 @@ void X86SpeculativeLoadHardeningPass::tracePredStateThroughBlocksAndHarden(
14331433 }
14341434 }
14351435
1436- unsigned HardenedReg = hardenPostLoad (MI);
1436+ Register HardenedReg = hardenPostLoad (MI);
14371437
14381438 // Mark the resulting hardened register as such so we don't re-harden.
14391439 AddrRegToHardenedReg[HardenedReg] = HardenedReg;
@@ -1489,7 +1489,7 @@ void X86SpeculativeLoadHardeningPass::tracePredStateThroughBlocksAndHarden(
14891489// / Note that LLVM can only lower very simple patterns of saved and restored
14901490// / EFLAGS registers. The restore should always be within the same basic block
14911491// / as the save so that no PHI nodes are inserted.
1492- unsigned X86SpeculativeLoadHardeningPass::saveEFLAGS (
1492+ Register X86SpeculativeLoadHardeningPass::saveEFLAGS (
14931493 MachineBasicBlock &MBB, MachineBasicBlock::iterator InsertPt,
14941494 const DebugLoc &Loc) {
14951495 // FIXME: Hard coding this to a 32-bit register class seems weird, but matches
@@ -1520,7 +1520,7 @@ void X86SpeculativeLoadHardeningPass::restoreEFLAGS(
15201520// / across normal stack adjustments.
15211521void X86SpeculativeLoadHardeningPass::mergePredStateIntoSP (
15221522 MachineBasicBlock &MBB, MachineBasicBlock::iterator InsertPt,
1523- const DebugLoc &Loc, unsigned PredStateReg) {
1523+ const DebugLoc &Loc, Register PredStateReg) {
15241524 Register TmpReg = MRI->createVirtualRegister (PS->RC );
15251525 // FIXME: This hard codes a shift distance based on the number of bits needed
15261526 // to stay canonical on 64-bit. We should compute this somehow and support
@@ -1538,7 +1538,7 @@ void X86SpeculativeLoadHardeningPass::mergePredStateIntoSP(
15381538}
15391539
15401540// / Extracts the predicate state stored in the high bits of the stack pointer.
1541- unsigned X86SpeculativeLoadHardeningPass::extractPredStateFromSP (
1541+ Register X86SpeculativeLoadHardeningPass::extractPredStateFromSP (
15421542 MachineBasicBlock &MBB, MachineBasicBlock::iterator InsertPt,
15431543 const DebugLoc &Loc) {
15441544 Register PredStateReg = MRI->createVirtualRegister (PS->RC );
@@ -1561,7 +1561,7 @@ unsigned X86SpeculativeLoadHardeningPass::extractPredStateFromSP(
15611561
15621562void X86SpeculativeLoadHardeningPass::hardenLoadAddr (
15631563 MachineInstr &MI, MachineOperand &BaseMO, MachineOperand &IndexMO,
1564- SmallDenseMap<unsigned , unsigned , 32 > &AddrRegToHardenedReg) {
1564+ SmallDenseMap<Register, Register , 32 > &AddrRegToHardenedReg) {
15651565 MachineBasicBlock &MBB = *MI.getParent ();
15661566 const DebugLoc &Loc = MI.getDebugLoc ();
15671567
@@ -1640,7 +1640,7 @@ void X86SpeculativeLoadHardeningPass::hardenLoadAddr(
16401640 // If EFLAGS are live and we don't have access to instructions that avoid
16411641 // clobbering EFLAGS we need to save and restore them. This in turn makes
16421642 // the EFLAGS no longer live.
1643- unsigned FlagsReg = 0 ;
1643+ Register FlagsReg;
16441644 if (EFLAGSLive && !Subtarget->hasBMI2 ()) {
16451645 EFLAGSLive = false ;
16461646 FlagsReg = saveEFLAGS (MBB, InsertPt, Loc);
@@ -1898,7 +1898,7 @@ bool X86SpeculativeLoadHardeningPass::canHardenRegister(Register Reg) {
18981898// /
18991899// / The new, hardened virtual register is returned. It will have the same
19001900// / register class as `Reg`.
1901- unsigned X86SpeculativeLoadHardeningPass::hardenValueInRegister (
1901+ Register X86SpeculativeLoadHardeningPass::hardenValueInRegister (
19021902 Register Reg, MachineBasicBlock &MBB, MachineBasicBlock::iterator InsertPt,
19031903 const DebugLoc &Loc) {
19041904 assert (canHardenRegister (Reg) && " Cannot harden this register!" );
@@ -1919,7 +1919,7 @@ unsigned X86SpeculativeLoadHardeningPass::hardenValueInRegister(
19191919 StateReg = NarrowStateReg;
19201920 }
19211921
1922- unsigned FlagsReg = 0 ;
1922+ Register FlagsReg;
19231923 if (isEFLAGSLive (MBB, InsertPt, *TRI))
19241924 FlagsReg = saveEFLAGS (MBB, InsertPt, Loc);
19251925
@@ -1948,7 +1948,7 @@ unsigned X86SpeculativeLoadHardeningPass::hardenValueInRegister(
19481948// / execution and coercing them to one is sufficient.
19491949// /
19501950// / Returns the newly hardened register.
1951- unsigned X86SpeculativeLoadHardeningPass::hardenPostLoad (MachineInstr &MI) {
1951+ Register X86SpeculativeLoadHardeningPass::hardenPostLoad (MachineInstr &MI) {
19521952 MachineBasicBlock &MBB = *MI.getParent ();
19531953 const DebugLoc &Loc = MI.getDebugLoc ();
19541954
@@ -1965,7 +1965,7 @@ unsigned X86SpeculativeLoadHardeningPass::hardenPostLoad(MachineInstr &MI) {
19651965 // Now harden this register's value, getting a hardened reg that is safe to
19661966 // use. Note that we insert the instructions to compute this *after* the
19671967 // defining instruction, not before it.
1968- unsigned HardenedReg = hardenValueInRegister (
1968+ Register HardenedReg = hardenValueInRegister (
19691969 UnhardenedReg, MBB, std::next (MI.getIterator ()), Loc);
19701970
19711971 // Finally, replace the old register (which now only has the uses of the
@@ -2089,7 +2089,7 @@ void X86SpeculativeLoadHardeningPass::tracePredStateThroughCall(
20892089 MI.setPostInstrSymbol (MF, RetSymbol);
20902090
20912091 const TargetRegisterClass *AddrRC = &X86::GR64RegClass;
2092- unsigned ExpectedRetAddrReg = 0 ;
2092+ Register ExpectedRetAddrReg;
20932093
20942094 // If we have no red zones or if the function returns twice (possibly without
20952095 // using the `ret` instruction) like setjmp, we need to save the expected
@@ -2148,7 +2148,7 @@ void X86SpeculativeLoadHardeningPass::tracePredStateThroughCall(
21482148 }
21492149
21502150 // Now we extract the callee's predicate state from the stack pointer.
2151- unsigned NewStateReg = extractPredStateFromSP (MBB, InsertPt, Loc);
2151+ Register NewStateReg = extractPredStateFromSP (MBB, InsertPt, Loc);
21522152
21532153 // Test the expected return address against our actual address. If we can
21542154 // form this basic block's address as an immediate, this is easy. Otherwise
@@ -2207,7 +2207,7 @@ void X86SpeculativeLoadHardeningPass::tracePredStateThroughCall(
22072207// / not already flagged and add them.
22082208void X86SpeculativeLoadHardeningPass::hardenIndirectCallOrJumpInstr (
22092209 MachineInstr &MI,
2210- SmallDenseMap<unsigned , unsigned , 32 > &AddrRegToHardenedReg) {
2210+ SmallDenseMap<Register, Register , 32 > &AddrRegToHardenedReg) {
22112211 switch (MI.getOpcode ()) {
22122212 case X86::FARCALL16m:
22132213 case X86::FARCALL32m:
@@ -2240,7 +2240,7 @@ void X86SpeculativeLoadHardeningPass::hardenIndirectCallOrJumpInstr(
22402240 // Try to lookup a hardened version of this register. We retain a reference
22412241 // here as we want to update the map to track any newly computed hardened
22422242 // register.
2243- unsigned &HardenedTargetReg = AddrRegToHardenedReg[OldTargetReg];
2243+ Register &HardenedTargetReg = AddrRegToHardenedReg[OldTargetReg];
22442244
22452245 // If we don't have a hardened register yet, compute one. Otherwise, just use
22462246 // the already hardened register.
0 commit comments