Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(559)

Unified Diff: lib/Target/X86/X86RegisterInfo.cpp

Issue 939073008: Rebased PNaCl localmods in LLVM to 223109 (Closed)
Patch Set: undo localmod Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « lib/Target/X86/X86RegisterInfo.h ('k') | lib/Target/X86/X86RegisterInfo.td » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: lib/Target/X86/X86RegisterInfo.cpp
diff --git a/lib/Target/X86/X86RegisterInfo.cpp b/lib/Target/X86/X86RegisterInfo.cpp
index a4a366da893c2737a6dd6b5ba796f3ebf682e054..b0cb13de50e8ec4b0b0f7a071ec30acfaf36acb3 100644
--- a/lib/Target/X86/X86RegisterInfo.cpp
+++ b/lib/Target/X86/X86RegisterInfo.cpp
@@ -16,6 +16,7 @@
#include "X86RegisterInfo.h"
#include "X86InstrBuilder.h"
#include "X86MachineFunctionInfo.h"
+#include "X86NaClDecls.h" // @LOCALMOD
#include "X86Subtarget.h"
#include "X86TargetMachine.h"
#include "llvm/ADT/BitVector.h"
@@ -163,11 +164,15 @@ X86RegisterInfo::getPointerRegClass(const MachineFunction &MF,
switch (Kind) {
default: llvm_unreachable("Unexpected Kind in getPointerRegClass!");
case 0: // Normal GPRs.
- if (Subtarget.isTarget64BitLP64())
+ // @LOCALMOD -- NaCl is ILP32, but 32-bit pointers become 64-bit
+ // after sandboxing (clobbers a full 64-bit reg).
+ if (Subtarget.isTarget64BitLP64() || Subtarget.isTargetNaCl64())
return &X86::GR64RegClass;
return &X86::GR32RegClass;
case 1: // Normal GPRs except the stack pointer (for encoding reasons).
- if (Subtarget.isTarget64BitLP64())
+ // @LOCALMOD -- NaCl is ILP32, but 32-bit pointers become 64-bit
+ // after sandboxing (clobbers a full 64-bit reg).
+ if (Subtarget.isTarget64BitLP64() || Subtarget.isTargetNaCl64())
return &X86::GR64_NOSPRegClass;
return &X86::GR32_NOSPRegClass;
case 2: // Available for tailcall (not callee-saved GPRs).
@@ -257,9 +262,17 @@ X86RegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
}
bool CallsEHReturn = MF->getMMI().callsEHReturn();
+ bool IsNaCl = Subtarget.isTargetNaCl(); // @LOCALMOD
if (Is64Bit) {
if (IsWin64)
return CSR_Win64_SaveList;
+ // @LOCALMOD-BEGIN
+ if (IsNaCl) {
+ if (CallsEHReturn)
+ return CSR_NaCl64EHRet_SaveList;
+ return CSR_NaCl64_SaveList;
+ }
+ // @LOCALMOD-END
if (CallsEHReturn)
return CSR_64EHRet_SaveList;
return CSR_64_SaveList;
@@ -397,6 +410,34 @@ BitVector X86RegisterInfo::getReservedRegs(const MachineFunction &MF) const {
}
}
+ // @LOCALMOD-START
+ const X86Subtarget& Subtarget = MF.getTarget().getSubtarget<X86Subtarget>();
+ const bool RestrictR15 = FlagRestrictR15;
+ assert(FlagUseZeroBasedSandbox || RestrictR15);
+ if (Subtarget.isTargetNaCl64()) {
+ if (RestrictR15) {
+ Reserved.set(X86::R15);
+ Reserved.set(X86::R15D);
+ Reserved.set(X86::R15W);
+ Reserved.set(X86::R15B);
+ }
+ Reserved.set(X86::RBP);
+ Reserved.set(X86::EBP);
+ Reserved.set(X86::BP);
+ Reserved.set(X86::BPL);
+ const bool RestrictR11 = FlagHideSandboxBase && !FlagUseZeroBasedSandbox;
+ if (RestrictR11) {
+ // Restrict r11 so that it can be used for indirect jump
+ // sequences that don't leak the sandbox base address onto the
+ // stack.
+ Reserved.set(X86::R11);
+ Reserved.set(X86::R11D);
+ Reserved.set(X86::R11W);
+ Reserved.set(X86::R11B);
+ }
+ }
+ // @LOCALMOD-END
+
return Reserved;
}
@@ -535,6 +576,14 @@ unsigned X86RegisterInfo::getFrameRegister(const MachineFunction &MF) const {
return TFI->hasFP(MF) ? FramePtr : StackPtr;
}
+unsigned X86RegisterInfo::getPtrSizedFrameRegister(
+ const MachineFunction &MF) const {
+ unsigned FrameReg = getFrameRegister(MF);
+ if (Subtarget.isTarget64BitILP32())
+ FrameReg = getX86SubSuperRegister(FrameReg, MVT::i32, false);
+ return FrameReg;
+}
+
namespace llvm {
unsigned getX86SubSuperRegister(unsigned Reg, MVT::SimpleValueType VT,
bool High) {
@@ -669,6 +718,9 @@ unsigned getX86SubSuperRegister(unsigned Reg, MVT::SimpleValueType VT,
return X86::R14D;
case X86::R15B: case X86::R15W: case X86::R15D: case X86::R15:
return X86::R15D;
+ // @LOCALMOD. TODO: possibly revert this after LEA .td fixes
+ case X86::EIP: case X86::RIP:
+ return X86::EIP;
}
case MVT::i64:
switch (Reg) {
@@ -705,6 +757,9 @@ unsigned getX86SubSuperRegister(unsigned Reg, MVT::SimpleValueType VT,
return X86::R14;
case X86::R15B: case X86::R15W: case X86::R15D: case X86::R15:
return X86::R15;
+ // @LOCALMOD. TODO: possibly revert this after LEA .td fixes
+ case X86::EIP: case X86::RIP:
+ return X86::RIP;
}
}
}
« no previous file with comments | « lib/Target/X86/X86RegisterInfo.h ('k') | lib/Target/X86/X86RegisterInfo.td » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698