aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Target/ARM/ARMNaClRewritePass.cpp74
1 files changed, 39 insertions, 35 deletions
diff --git a/lib/Target/ARM/ARMNaClRewritePass.cpp b/lib/Target/ARM/ARMNaClRewritePass.cpp
index d38cc8886c..89ce479a90 100644
--- a/lib/Target/ARM/ARMNaClRewritePass.cpp
+++ b/lib/Target/ARM/ARMNaClRewritePass.cpp
@@ -190,6 +190,10 @@ bool IsSandboxedStackChange(const MachineInstr &MI) {
switch (opcode) {
default: break;
+ // Our mask instructions correctly update the stack pointer.
+ case ARM::SFI_DATA_MASK:
+ return true;
+
// These just bump SP by a little (and access the stack),
// so that is okay due to guard pages.
case ARM::STMIA_UPD:
@@ -342,7 +346,8 @@ void ARMNaClRewritePass::SandboxStackChange(MachineBasicBlock &MBB,
MachineInstr &MI = *MBBI;
// Use same predicate as current instruction.
- ARMCC::CondCodes Pred = TII->getPredicate(&MI);
+ unsigned PredReg = 0;
+ ARMCC::CondCodes Pred = llvm::getInstrPredicate(&MI, PredReg);
BuildMI(MBB, MBBI, MI.getDebugLoc(),
TII->get(ARM::SFI_NOP_IF_AT_BUNDLE_END));
@@ -353,12 +358,10 @@ void ARMNaClRewritePass::SandboxStackChange(MachineBasicBlock &MBB,
BuildMI(MBB, MBBINext2, MI.getDebugLoc(),
TII->get(ARM::SFI_DATA_MASK))
- .addReg(ARM::SP) // modify SP (as dst)
- .addReg(ARM::SP) // start with SP (as src)
- .addImm((int64_t) Pred) // predicate condition
- .addReg(ARM::CPSR); // predicate source register (CPSR)
-
- return;
+ .addReg(ARM::SP, RegState::Define) // modify SP (as dst)
+ .addReg(ARM::SP, RegState::Kill) // start with SP (as src)
+ .addImm((int64_t) Pred) // predicate condition
+ .addReg(PredReg); // predicate source register (CPSR)
}
bool ARMNaClRewritePass::SandboxStackChangesInBlock(MachineBasicBlock &MBB) {
@@ -382,46 +385,45 @@ bool ARMNaClRewritePass::SandboxBranchesInBlock(MachineBasicBlock &MBB) {
MBBI != E;
++MBBI) {
MachineInstr &MI = *MBBI;
+ // Use same predicate as current instruction.
+ unsigned PredReg = 0;
+ ARMCC::CondCodes Pred = llvm::getInstrPredicate(&MI, PredReg);
if (IsReturn(MI)) {
- ARMCC::CondCodes Pred = TII->getPredicate(&MI);
BuildMI(MBB, MBBI, MI.getDebugLoc(),
TII->get(ARM::SFI_GUARD_RETURN))
.addImm((int64_t) Pred) // predicate condition
- .addReg(ARM::CPSR); // predicate source register (CPSR)
+ .addReg(PredReg); // predicate source register (CPSR)
Modified = true;
}
if (IsIndirectJump(MI)) {
- MachineOperand &Addr = MI.getOperand(0);
- ARMCC::CondCodes Pred = TII->getPredicate(&MI);
+ unsigned Addr = MI.getOperand(0).getReg();
BuildMI(MBB, MBBI, MI.getDebugLoc(),
TII->get(ARM::SFI_GUARD_INDIRECT_JMP))
- .addOperand(Addr) // rD
- .addReg(0) // apparently unused source register?
- .addImm((int64_t) Pred) // predicate condition
- .addReg(ARM::CPSR); // predicate source register (CPSR)
+ .addReg(Addr, RegState::Define) // Destination definition (as dst)
+ .addReg(Addr, RegState::Kill) // Destination read (as src)
+ .addImm((int64_t) Pred) // predicate condition
+ .addReg(PredReg); // predicate source register (CPSR)
Modified = true;
}
if (IsDirectCall(MI)) {
- ARMCC::CondCodes Pred = TII->getPredicate(&MI);
BuildMI(MBB, MBBI, MI.getDebugLoc(),
TII->get(ARM::SFI_GUARD_CALL))
.addImm((int64_t) Pred) // predicate condition
- .addReg(ARM::CPSR); // predicate source register (CPSR)
+ .addReg(PredReg); // predicate source register (CPSR)
Modified = true;
}
if (IsIndirectCall(MI)) {
- MachineOperand &Addr = MI.getOperand(0);
- ARMCC::CondCodes Pred = TII->getPredicate(&MI);
+ unsigned Addr = MI.getOperand(0).getReg();
BuildMI(MBB, MBBI, MI.getDebugLoc(),
TII->get(ARM::SFI_GUARD_INDIRECT_CALL))
- .addOperand(Addr) // rD
- .addReg(0) // apparently unused source register?
- .addImm((int64_t) Pred) // predicate condition
- .addReg(ARM::CPSR); // predicate source register (CPSR)
+ .addReg(Addr, RegState::Define) // Destination definition (as dst)
+ .addReg(Addr, RegState::Kill) // Destination read (as src)
+ .addImm((int64_t) Pred) // predicate condition
+ .addReg(PredReg); // predicate source register (CPSR)
Modified = true;
}
}
@@ -529,9 +531,9 @@ void ARMNaClRewritePass::SandboxMemory(MachineBasicBlock &MBB,
int AddrIdx,
bool CPSRLive,
bool IsLoad) {
- MachineOperand &Addr = MI.getOperand(AddrIdx);
+ unsigned Addr = MI.getOperand(AddrIdx).getReg();
- if (Addr.getReg() == ARM::R9) {
+ if (Addr == ARM::R9) {
// R9-relative loads are no longer sandboxed.
assert(IsLoad && "There should be no r9-relative stores");
} else if (!CPSRLive && TryPredicating(MI, ARMCC::EQ)) {
@@ -545,8 +547,8 @@ void ARMNaClRewritePass::SandboxMemory(MachineBasicBlock &MBB,
// Instruction can be predicated -- use the new sandbox.
BuildMI(MBB, MBBI, MI.getDebugLoc(),
TII->get(ARM::SFI_GUARD_LOADSTORE_TST))
- .addOperand(Addr) // rD
- .addReg(0); // apparently unused source register?
+ .addReg(Addr, RegState::Define) // Address definition (as dst)
+ .addReg(Addr, RegState::Kill); // Address read (as src)
} else {
unsigned Opcode;
if (IsLoad && (MI.getOperand(0).getReg() == ARM::SP)) {
@@ -554,13 +556,15 @@ void ARMNaClRewritePass::SandboxMemory(MachineBasicBlock &MBB,
} else {
Opcode = ARM::SFI_GUARD_LOADSTORE;
}
+ // Use same predicate as current instruction.
+ unsigned PredReg = 0;
+ ARMCC::CondCodes Pred = llvm::getInstrPredicate(&MI, PredReg);
// Use the older BIC sandbox, which is universal, but incurs a stall.
- ARMCC::CondCodes Pred = TII->getPredicate(&MI);
BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(Opcode))
- .addOperand(Addr) // rD
- .addReg(0) // apparently unused source register?
- .addImm((int64_t) Pred) // predicate condition
- .addReg(ARM::CPSR); // predicate source register (CPSR)
+ .addReg(Addr, RegState::Define) // Address definition (as dst).
+ .addReg(Addr, RegState::Kill) // Address read (as src).
+ .addImm((int64_t) Pred) // predicate condition
+ .addReg(PredReg); // predicate source register (CPSR)
/*
* This pseudo-instruction is intended to generate something resembling the
@@ -570,11 +574,11 @@ void ARMNaClRewritePass::SandboxMemory(MachineBasicBlock &MBB,
* // bic<cc> Addr, Addr, #0xC0000000
* BuildMI(MBB, MBBI, MI.getDebugLoc(),
* TII->get(ARM::BICri))
- * .addOperand(Addr) // rD
- * .addOperand(Addr) // rN
+ * .addReg(Addr) // rD
+ * .addReg(Addr) // rN
* .addImm(0xC0000000) // imm
* .addImm((int64_t) Pred) // predicate condition
- * .addReg(ARM::CPSR) // predicate source register (CPSR)
+ * .addReg(PredReg) // predicate source register (CPSR)
* .addReg(0); // flag output register (0 == no flags)
*/
}