@@ -146,8 +146,8 @@ class X86SpeculativeLoadHardeningPass : public MachineFunctionPass {
146
146
147
147
// / Manages the predicate state traced through the program.
148
148
struct PredState {
149
- unsigned InitialReg = 0 ;
150
- unsigned PoisonReg = 0 ;
149
+ Register InitialReg;
150
+ Register PoisonReg;
151
151
152
152
const TargetRegisterClass *RC;
153
153
MachineSSAUpdater SSA;
@@ -177,7 +177,7 @@ class X86SpeculativeLoadHardeningPass : public MachineFunctionPass {
177
177
178
178
void tracePredStateThroughBlocksAndHarden (MachineFunction &MF);
179
179
180
- unsigned saveEFLAGS (MachineBasicBlock &MBB,
180
+ Register saveEFLAGS (MachineBasicBlock &MBB,
181
181
MachineBasicBlock::iterator InsertPt,
182
182
const DebugLoc &Loc);
183
183
void restoreEFLAGS (MachineBasicBlock &MBB,
@@ -186,28 +186,28 @@ class X86SpeculativeLoadHardeningPass : public MachineFunctionPass {
186
186
187
187
void mergePredStateIntoSP (MachineBasicBlock &MBB,
188
188
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,
191
191
MachineBasicBlock::iterator InsertPt,
192
192
const DebugLoc &Loc);
193
193
194
194
void
195
195
hardenLoadAddr (MachineInstr &MI, MachineOperand &BaseMO,
196
196
MachineOperand &IndexMO,
197
- SmallDenseMap<unsigned , unsigned , 32 > &AddrRegToHardenedReg);
197
+ SmallDenseMap<Register, Register , 32 > &AddrRegToHardenedReg);
198
198
MachineInstr *
199
199
sinkPostLoadHardenedInst (MachineInstr &MI,
200
200
SmallPtrSetImpl<MachineInstr *> &HardenedInstrs);
201
201
bool canHardenRegister (Register Reg);
202
- unsigned hardenValueInRegister (Register Reg, MachineBasicBlock &MBB,
202
+ Register hardenValueInRegister (Register Reg, MachineBasicBlock &MBB,
203
203
MachineBasicBlock::iterator InsertPt,
204
204
const DebugLoc &Loc);
205
- unsigned hardenPostLoad (MachineInstr &MI);
205
+ Register hardenPostLoad (MachineInstr &MI);
206
206
void hardenReturnInstr (MachineInstr &MI);
207
207
void tracePredStateThroughCall (MachineInstr &MI);
208
208
void hardenIndirectCallOrJumpInstr (
209
209
MachineInstr &MI,
210
- SmallDenseMap<unsigned , unsigned , 32 > &AddrRegToHardenedReg);
210
+ SmallDenseMap<Register, Register , 32 > &AddrRegToHardenedReg);
211
211
};
212
212
213
213
} // end anonymous namespace
@@ -743,7 +743,7 @@ X86SpeculativeLoadHardeningPass::tracePredStateThroughCFG(
743
743
744
744
// We will wire each cmov to each other, but need to start with the
745
745
// incoming pred state.
746
- unsigned CurStateReg = PS->InitialReg ;
746
+ Register CurStateReg = PS->InitialReg ;
747
747
748
748
for (X86::CondCode Cond : Conds) {
749
749
int PredStateSizeInBytes = TRI->getRegSizeInBits (*PS->RC ) / 8 ;
@@ -986,7 +986,7 @@ X86SpeculativeLoadHardeningPass::tracePredStateThroughIndirectBranches(
986
986
// No terminator or non-branch terminator.
987
987
continue ;
988
988
989
- unsigned TargetReg;
989
+ Register TargetReg;
990
990
991
991
switch (TI.getOpcode ()) {
992
992
default :
@@ -1265,9 +1265,9 @@ void X86SpeculativeLoadHardeningPass::tracePredStateThroughBlocksAndHarden(
1265
1265
SmallPtrSet<MachineInstr *, 16 > HardenPostLoad;
1266
1266
SmallPtrSet<MachineInstr *, 16 > HardenLoadAddr;
1267
1267
1268
- SmallSet<unsigned , 16 > HardenedAddrRegs;
1268
+ SmallSet<Register , 16 > HardenedAddrRegs;
1269
1269
1270
- SmallDenseMap<unsigned , unsigned , 32 > AddrRegToHardenedReg;
1270
+ SmallDenseMap<Register, Register , 32 > AddrRegToHardenedReg;
1271
1271
1272
1272
// Track the set of load-dependent registers through the basic block. Because
1273
1273
// the values of these registers have an existing data dependency on a loaded
@@ -1297,11 +1297,11 @@ void X86SpeculativeLoadHardeningPass::tracePredStateThroughBlocksAndHarden(
1297
1297
// FIXME: Do a more careful analysis of x86 to build a conservative
1298
1298
// model here.
1299
1299
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 () );
1301
1301
}))
1302
1302
for (MachineOperand &Def : MI.defs ())
1303
1303
if (Def.isReg ())
1304
- LoadDepRegs.set (Def.getReg ());
1304
+ LoadDepRegs.set (Def.getReg (). id () );
1305
1305
1306
1306
// Both Intel and AMD are guiding that they will change the semantics of
1307
1307
// LFENCE to be a speculation barrier, so if we see an LFENCE, there is
@@ -1333,11 +1333,11 @@ void X86SpeculativeLoadHardeningPass::tracePredStateThroughBlocksAndHarden(
1333
1333
1334
1334
// If we have at least one (non-frame-index, non-RIP) register operand,
1335
1335
// and neither operand is load-dependent, we need to check the load.
1336
- unsigned BaseReg = 0 , IndexReg = 0 ;
1336
+ Register BaseReg, IndexReg;
1337
1337
if (!BaseMO.isFI () && BaseMO.getReg () != X86::RIP &&
1338
- BaseMO.getReg () != X86::NoRegister )
1338
+ BaseMO.getReg (). isValid () )
1339
1339
BaseReg = BaseMO.getReg ();
1340
- if (IndexMO.getReg () != X86::NoRegister )
1340
+ if (IndexMO.getReg (). isValid () )
1341
1341
IndexReg = IndexMO.getReg ();
1342
1342
1343
1343
if (!BaseReg && !IndexReg)
@@ -1348,8 +1348,8 @@ void X86SpeculativeLoadHardeningPass::tracePredStateThroughBlocksAndHarden(
1348
1348
// needn't check it.
1349
1349
// FIXME: Is this true in the case where we are hardening loads after
1350
1350
// 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 () )))
1353
1353
continue ;
1354
1354
1355
1355
// If post-load hardening is enabled, this load is compatible with
@@ -1378,7 +1378,7 @@ void X86SpeculativeLoadHardeningPass::tracePredStateThroughBlocksAndHarden(
1378
1378
1379
1379
for (MachineOperand &Def : MI.defs ())
1380
1380
if (Def.isReg ())
1381
- LoadDepRegs.set (Def.getReg ());
1381
+ LoadDepRegs.set (Def.getReg (). id () );
1382
1382
}
1383
1383
1384
1384
// Now re-walk the instructions in the basic block, and apply whichever
@@ -1433,7 +1433,7 @@ void X86SpeculativeLoadHardeningPass::tracePredStateThroughBlocksAndHarden(
1433
1433
}
1434
1434
}
1435
1435
1436
- unsigned HardenedReg = hardenPostLoad (MI);
1436
+ Register HardenedReg = hardenPostLoad (MI);
1437
1437
1438
1438
// Mark the resulting hardened register as such so we don't re-harden.
1439
1439
AddrRegToHardenedReg[HardenedReg] = HardenedReg;
@@ -1489,7 +1489,7 @@ void X86SpeculativeLoadHardeningPass::tracePredStateThroughBlocksAndHarden(
1489
1489
// / Note that LLVM can only lower very simple patterns of saved and restored
1490
1490
// / EFLAGS registers. The restore should always be within the same basic block
1491
1491
// / as the save so that no PHI nodes are inserted.
1492
- unsigned X86SpeculativeLoadHardeningPass::saveEFLAGS (
1492
+ Register X86SpeculativeLoadHardeningPass::saveEFLAGS (
1493
1493
MachineBasicBlock &MBB, MachineBasicBlock::iterator InsertPt,
1494
1494
const DebugLoc &Loc) {
1495
1495
// FIXME: Hard coding this to a 32-bit register class seems weird, but matches
@@ -1520,7 +1520,7 @@ void X86SpeculativeLoadHardeningPass::restoreEFLAGS(
1520
1520
// / across normal stack adjustments.
1521
1521
void X86SpeculativeLoadHardeningPass::mergePredStateIntoSP (
1522
1522
MachineBasicBlock &MBB, MachineBasicBlock::iterator InsertPt,
1523
- const DebugLoc &Loc, unsigned PredStateReg) {
1523
+ const DebugLoc &Loc, Register PredStateReg) {
1524
1524
Register TmpReg = MRI->createVirtualRegister (PS->RC );
1525
1525
// FIXME: This hard codes a shift distance based on the number of bits needed
1526
1526
// to stay canonical on 64-bit. We should compute this somehow and support
@@ -1538,7 +1538,7 @@ void X86SpeculativeLoadHardeningPass::mergePredStateIntoSP(
1538
1538
}
1539
1539
1540
1540
// / Extracts the predicate state stored in the high bits of the stack pointer.
1541
- unsigned X86SpeculativeLoadHardeningPass::extractPredStateFromSP (
1541
+ Register X86SpeculativeLoadHardeningPass::extractPredStateFromSP (
1542
1542
MachineBasicBlock &MBB, MachineBasicBlock::iterator InsertPt,
1543
1543
const DebugLoc &Loc) {
1544
1544
Register PredStateReg = MRI->createVirtualRegister (PS->RC );
@@ -1561,7 +1561,7 @@ unsigned X86SpeculativeLoadHardeningPass::extractPredStateFromSP(
1561
1561
1562
1562
void X86SpeculativeLoadHardeningPass::hardenLoadAddr (
1563
1563
MachineInstr &MI, MachineOperand &BaseMO, MachineOperand &IndexMO,
1564
- SmallDenseMap<unsigned , unsigned , 32 > &AddrRegToHardenedReg) {
1564
+ SmallDenseMap<Register, Register , 32 > &AddrRegToHardenedReg) {
1565
1565
MachineBasicBlock &MBB = *MI.getParent ();
1566
1566
const DebugLoc &Loc = MI.getDebugLoc ();
1567
1567
@@ -1640,7 +1640,7 @@ void X86SpeculativeLoadHardeningPass::hardenLoadAddr(
1640
1640
// If EFLAGS are live and we don't have access to instructions that avoid
1641
1641
// clobbering EFLAGS we need to save and restore them. This in turn makes
1642
1642
// the EFLAGS no longer live.
1643
- unsigned FlagsReg = 0 ;
1643
+ Register FlagsReg;
1644
1644
if (EFLAGSLive && !Subtarget->hasBMI2 ()) {
1645
1645
EFLAGSLive = false ;
1646
1646
FlagsReg = saveEFLAGS (MBB, InsertPt, Loc);
@@ -1898,7 +1898,7 @@ bool X86SpeculativeLoadHardeningPass::canHardenRegister(Register Reg) {
1898
1898
// /
1899
1899
// / The new, hardened virtual register is returned. It will have the same
1900
1900
// / register class as `Reg`.
1901
- unsigned X86SpeculativeLoadHardeningPass::hardenValueInRegister (
1901
+ Register X86SpeculativeLoadHardeningPass::hardenValueInRegister (
1902
1902
Register Reg, MachineBasicBlock &MBB, MachineBasicBlock::iterator InsertPt,
1903
1903
const DebugLoc &Loc) {
1904
1904
assert (canHardenRegister (Reg) && " Cannot harden this register!" );
@@ -1919,7 +1919,7 @@ unsigned X86SpeculativeLoadHardeningPass::hardenValueInRegister(
1919
1919
StateReg = NarrowStateReg;
1920
1920
}
1921
1921
1922
- unsigned FlagsReg = 0 ;
1922
+ Register FlagsReg;
1923
1923
if (isEFLAGSLive (MBB, InsertPt, *TRI))
1924
1924
FlagsReg = saveEFLAGS (MBB, InsertPt, Loc);
1925
1925
@@ -1948,7 +1948,7 @@ unsigned X86SpeculativeLoadHardeningPass::hardenValueInRegister(
1948
1948
// / execution and coercing them to one is sufficient.
1949
1949
// /
1950
1950
// / Returns the newly hardened register.
1951
- unsigned X86SpeculativeLoadHardeningPass::hardenPostLoad (MachineInstr &MI) {
1951
+ Register X86SpeculativeLoadHardeningPass::hardenPostLoad (MachineInstr &MI) {
1952
1952
MachineBasicBlock &MBB = *MI.getParent ();
1953
1953
const DebugLoc &Loc = MI.getDebugLoc ();
1954
1954
@@ -1965,7 +1965,7 @@ unsigned X86SpeculativeLoadHardeningPass::hardenPostLoad(MachineInstr &MI) {
1965
1965
// Now harden this register's value, getting a hardened reg that is safe to
1966
1966
// use. Note that we insert the instructions to compute this *after* the
1967
1967
// defining instruction, not before it.
1968
- unsigned HardenedReg = hardenValueInRegister (
1968
+ Register HardenedReg = hardenValueInRegister (
1969
1969
UnhardenedReg, MBB, std::next (MI.getIterator ()), Loc);
1970
1970
1971
1971
// Finally, replace the old register (which now only has the uses of the
@@ -2089,7 +2089,7 @@ void X86SpeculativeLoadHardeningPass::tracePredStateThroughCall(
2089
2089
MI.setPostInstrSymbol (MF, RetSymbol);
2090
2090
2091
2091
const TargetRegisterClass *AddrRC = &X86::GR64RegClass;
2092
- unsigned ExpectedRetAddrReg = 0 ;
2092
+ Register ExpectedRetAddrReg;
2093
2093
2094
2094
// If we have no red zones or if the function returns twice (possibly without
2095
2095
// using the `ret` instruction) like setjmp, we need to save the expected
@@ -2148,7 +2148,7 @@ void X86SpeculativeLoadHardeningPass::tracePredStateThroughCall(
2148
2148
}
2149
2149
2150
2150
// 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);
2152
2152
2153
2153
// Test the expected return address against our actual address. If we can
2154
2154
// form this basic block's address as an immediate, this is easy. Otherwise
@@ -2207,7 +2207,7 @@ void X86SpeculativeLoadHardeningPass::tracePredStateThroughCall(
2207
2207
// / not already flagged and add them.
2208
2208
void X86SpeculativeLoadHardeningPass::hardenIndirectCallOrJumpInstr (
2209
2209
MachineInstr &MI,
2210
- SmallDenseMap<unsigned , unsigned , 32 > &AddrRegToHardenedReg) {
2210
+ SmallDenseMap<Register, Register , 32 > &AddrRegToHardenedReg) {
2211
2211
switch (MI.getOpcode ()) {
2212
2212
case X86::FARCALL16m:
2213
2213
case X86::FARCALL32m:
@@ -2240,7 +2240,7 @@ void X86SpeculativeLoadHardeningPass::hardenIndirectCallOrJumpInstr(
2240
2240
// Try to lookup a hardened version of this register. We retain a reference
2241
2241
// here as we want to update the map to track any newly computed hardened
2242
2242
// register.
2243
- unsigned &HardenedTargetReg = AddrRegToHardenedReg[OldTargetReg];
2243
+ Register &HardenedTargetReg = AddrRegToHardenedReg[OldTargetReg];
2244
2244
2245
2245
// If we don't have a hardened register yet, compute one. Otherwise, just use
2246
2246
// the already hardened register.
0 commit comments