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

Unified Diff: src/IceTargetLoweringX8664Traits.h

Issue 1559243002: Suzero. X8664. NaCl Sandboxing. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Adds lit tests for the sandboxed call/ret sequences; add lit tests for the new pad_to_end bundle lo… Created 4 years, 11 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
Index: src/IceTargetLoweringX8664Traits.h
diff --git a/src/IceTargetLoweringX8664Traits.h b/src/IceTargetLoweringX8664Traits.h
index bab08a181c41f2908ed3481f6741953c4b36db0a..330f6481b05824b7275b55020794860d1802c99c 100644
--- a/src/IceTargetLoweringX8664Traits.h
+++ b/src/IceTargetLoweringX8664Traits.h
@@ -301,8 +301,8 @@ struct TargetX8664Traits {
static IceString getRegName(int32_t RegNum) {
static const char *const RegNames[RegisterSet::Reg_NUM] = {
#define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \
- isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \
- isTrunc8Rcvr, isAhRcvr, aliases) \
+ zeroptr, isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, \
+ is16To8, isTrunc8Rcvr, isAhRcvr, aliases) \
name,
REGX8664_TABLE
#undef X
@@ -315,8 +315,8 @@ struct TargetX8664Traits {
static GPRRegister getEncodedGPR(int32_t RegNum) {
static const GPRRegister GPRRegs[RegisterSet::Reg_NUM] = {
#define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \
- isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \
- isTrunc8Rcvr, isAhRcvr, aliases) \
+ zeroptr, isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, \
+ is16To8, isTrunc8Rcvr, isAhRcvr, aliases) \
GPRRegister(isGPR ? encode : GPRRegister::Encoded_Not_GPR),
REGX8664_TABLE
#undef X
@@ -330,8 +330,8 @@ struct TargetX8664Traits {
static ByteRegister getEncodedByteReg(int32_t RegNum) {
static const ByteRegister ByteRegs[RegisterSet::Reg_NUM] = {
#define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \
- isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \
- isTrunc8Rcvr, isAhRcvr, aliases) \
+ zeroptr, isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, \
+ is16To8, isTrunc8Rcvr, isAhRcvr, aliases) \
ByteRegister(is8 ? encode : ByteRegister::Encoded_Not_ByteReg),
REGX8664_TABLE
#undef X
@@ -345,8 +345,8 @@ struct TargetX8664Traits {
static XmmRegister getEncodedXmm(int32_t RegNum) {
static const XmmRegister XmmRegs[RegisterSet::Reg_NUM] = {
#define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \
- isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \
- isTrunc8Rcvr, isAhRcvr, aliases) \
+ zeroptr, isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, \
+ is16To8, isTrunc8Rcvr, isAhRcvr, aliases) \
XmmRegister(isXmm ? encode : XmmRegister::Encoded_Not_Xmm),
REGX8664_TABLE
#undef X
@@ -360,8 +360,8 @@ struct TargetX8664Traits {
static uint32_t getEncoding(int32_t RegNum) {
static const uint32_t Encoding[RegisterSet::Reg_NUM] = {
#define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \
- isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \
- isTrunc8Rcvr, isAhRcvr, aliases) \
+ zeroptr, isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, \
+ is16To8, isTrunc8Rcvr, isAhRcvr, aliases) \
encode,
REGX8664_TABLE
#undef X
@@ -374,9 +374,9 @@ struct TargetX8664Traits {
static inline int32_t getBaseReg(int32_t RegNum) {
static const int32_t BaseRegs[RegisterSet::Reg_NUM] = {
#define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \
- isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \
- isTrunc8Rcvr, isAhRcvr, aliases) \
- RegisterSet::base,
+ zeroptr, isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, \
+ is16To8, isTrunc8Rcvr, isAhRcvr, aliases) \
+ encode,
REGX8664_TABLE
#undef X
};
@@ -428,18 +428,23 @@ public:
default:
llvm::report_fatal_error("Unknown register.");
#define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \
- isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \
- isTrunc8Rcvr, isAhRcvr, aliases) \
+ zeroptr, isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, \
+ is16To8, isTrunc8Rcvr, isAhRcvr, aliases) \
case RegisterSet::val: { \
- assert(isGPR); \
+ if (!isGPR) \
+ return RegisterSet::val; \
assert((is64) || (is32) || (is16) || (is8) || \
- getBaseReg(RegisterSet::val) == RegisterSet::Reg_rsp); \
+ getBaseReg(RegisterSet::val) == RegisterSet::Reg_rsp || \
+ getBaseReg(RegisterSet::val) == RegisterSet::Reg_rbp); \
constexpr int32_t FirstGprWithRegNumSize = \
- ((is64) || RegisterSet::val == RegisterSet::Reg_rsp) \
+ ((is64) || RegisterSet::val == RegisterSet::Reg_rsp || \
+ RegisterSet::val == RegisterSet::Reg_rbp) \
? RegisterSet::Reg_rax \
- : (((is32) || RegisterSet::val == RegisterSet::Reg_esp) \
+ : (((is32) || RegisterSet::val == RegisterSet::Reg_esp || \
+ RegisterSet::val == RegisterSet::Reg_ebp) \
? RegisterSet::Reg_eax \
- : (((is16) || RegisterSet::val == RegisterSet::Reg_sp) \
+ : (((is16) || RegisterSet::val == RegisterSet::Reg_sp || \
+ RegisterSet::val == RegisterSet::Reg_bp) \
? RegisterSet::Reg_ax \
: RegisterSet::Reg_al)); \
const int32_t NewRegNum = \
@@ -465,15 +470,15 @@ private:
constexpr SizeOf() : Size(0) {}
template <typename... T>
explicit constexpr SizeOf(T...)
- : Size(__length<T...>::value) {}
+ : Size(length<T...>::value) {}
constexpr SizeT size() const { return Size; }
private:
- template <typename T, typename... U> struct __length {
- static constexpr std::size_t value = 1 + __length<U...>::value;
+ template <typename T, typename... U> struct length {
+ static constexpr std::size_t value = 1 + length<U...>::value;
};
- template <typename T> struct __length<T> {
+ template <typename T> struct length<T> {
static constexpr std::size_t value = 1;
};
@@ -482,6 +487,7 @@ private:
public:
static void initRegisterSet(
+ const ::Ice::ClFlags &Flags,
std::array<llvm::SmallBitVector, RCX86_NUM> *TypeToRegisterSet,
std::array<llvm::SmallBitVector, RegisterSet::Reg_NUM> *RegisterAliases,
llvm::SmallBitVector *ScratchRegs) {
@@ -501,6 +507,7 @@ public:
static constexpr struct {
uint16_t Val;
+ unsigned IsZeroPtr : 1;
unsigned Is64 : 1;
unsigned Is32 : 1;
unsigned Is16 : 1;
@@ -518,19 +525,25 @@ public:
#undef NUM_ALIASES_BITS
} X8664RegTable[RegisterSet::Reg_NUM] = {
#define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \
- isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \
- isTrunc8Rcvr, isAhRcvr, aliases) \
+ zeroptr, isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, \
+ is16To8, isTrunc8Rcvr, isAhRcvr, aliases) \
{ \
- RegisterSet::val, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \
- isTrunc8Rcvr, isAhRcvr, scratch, (SizeOf aliases).size(), aliases, \
+ RegisterSet::val, zeroptr, is64, is32, is16, is8, isXmm, is64To8, is32To8, \
+ is16To8, isTrunc8Rcvr, isAhRcvr, scratch, (SizeOf aliases).size(), \
+ aliases, \
} \
,
REGX8664_TABLE
#undef X
};
+ const bool NeedSandboxing = Flags.getUseSandboxing();
for (SizeT ii = 0; ii < llvm::array_lengthof(X8664RegTable); ++ii) {
const auto &Entry = X8664RegTable[ii];
+ const bool DisabledRegister = NeedSandboxing && Entry.IsZeroPtr;
+ if (DisabledRegister) {
+ continue;
+ }
(IntegerRegistersI64)[Entry.Val] = Entry.Is64;
(IntegerRegistersI32)[Entry.Val] = Entry.Is32;
(IntegerRegistersI16)[Entry.Val] = Entry.Is16;
@@ -575,29 +588,33 @@ public:
}
static llvm::SmallBitVector
- getRegisterSet(TargetLowering::RegSetMask Include,
+ getRegisterSet(const ::Ice::ClFlags &Flags,
+ TargetLowering::RegSetMask Include,
TargetLowering::RegSetMask Exclude) {
llvm::SmallBitVector Registers(RegisterSet::Reg_NUM);
+ const bool NeedSandboxing = Flags.getUseSandboxing();
#define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \
- isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \
- isTrunc8Rcvr, isAhRcvr, aliases) \
- if (scratch && (Include & ::Ice::TargetLowering::RegSet_CallerSave)) \
- Registers[RegisterSet::val] = true; \
- if (preserved && (Include & ::Ice::TargetLowering::RegSet_CalleeSave)) \
- Registers[RegisterSet::val] = true; \
- if (stackptr && (Include & ::Ice::TargetLowering::RegSet_StackPointer)) \
- Registers[RegisterSet::val] = true; \
- if (frameptr && (Include & ::Ice::TargetLowering::RegSet_FramePointer)) \
- Registers[RegisterSet::val] = true; \
- if (scratch && (Exclude & ::Ice::TargetLowering::RegSet_CallerSave)) \
- Registers[RegisterSet::val] = false; \
- if (preserved && (Exclude & ::Ice::TargetLowering::RegSet_CalleeSave)) \
- Registers[RegisterSet::val] = false; \
- if (stackptr && (Exclude & ::Ice::TargetLowering::RegSet_StackPointer)) \
- Registers[RegisterSet::val] = false; \
- if (frameptr && (Exclude & ::Ice::TargetLowering::RegSet_FramePointer)) \
- Registers[RegisterSet::val] = false;
+ zeroptr, isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, \
+ is16To8, isTrunc8Rcvr, isAhRcvr, aliases) \
+ if (!NeedSandboxing || !(zeroptr)) { \
+ if (scratch && (Include & ::Ice::TargetLowering::RegSet_CallerSave)) \
+ Registers[RegisterSet::val] = true; \
+ if (preserved && (Include & ::Ice::TargetLowering::RegSet_CalleeSave)) \
+ Registers[RegisterSet::val] = true; \
+ if (stackptr && (Include & ::Ice::TargetLowering::RegSet_StackPointer)) \
+ Registers[RegisterSet::val] = true; \
+ if (frameptr && (Include & ::Ice::TargetLowering::RegSet_FramePointer)) \
+ Registers[RegisterSet::val] = true; \
+ if (scratch && (Exclude & ::Ice::TargetLowering::RegSet_CallerSave)) \
+ Registers[RegisterSet::val] = false; \
+ if (preserved && (Exclude & ::Ice::TargetLowering::RegSet_CalleeSave)) \
+ Registers[RegisterSet::val] = false; \
+ if (stackptr && (Exclude & ::Ice::TargetLowering::RegSet_StackPointer)) \
+ Registers[RegisterSet::val] = false; \
+ if (frameptr && (Exclude & ::Ice::TargetLowering::RegSet_FramePointer)) \
+ Registers[RegisterSet::val] = false; \
+ }
REGX8664_TABLE
@@ -627,8 +644,8 @@ public:
// properties as well as whether the registers should be explicitly excluded
// from shuffling.
#define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \
- isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \
- isTrunc8Rcvr, isAhRcvr, aliases) \
+ zeroptr, isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, \
+ is16To8, isTrunc8Rcvr, isAhRcvr, aliases) \
if (ExcludeRegisters[RegisterSet::val]) { \
/* val stays the same in the resulting permutation. */ \
Permutation[RegisterSet::val] = RegisterSet::val; \
@@ -842,11 +859,18 @@ public:
create(Cfg *Func, Type Ty, Variable *Base, Constant *Offset,
Variable *Index = nullptr, uint16_t Shift = 0,
SegmentRegisters SegmentRegister = DefaultSegment,
- bool IsPIC = false) {
+ bool IsRebased = false) {
assert(SegmentRegister == DefaultSegment);
(void)SegmentRegister;
return new (Func->allocate<X86OperandMem>())
- X86OperandMem(Func, Ty, Base, Offset, Index, Shift, IsPIC);
+ X86OperandMem(Func, Ty, Base, Offset, Index, Shift, IsRebased);
+ }
+ static X86OperandMem *create(Cfg *Func, Type Ty, Variable *Base,
+ Constant *Offset, bool IsRebased) {
+ constexpr Variable *NoIndex = nullptr;
+ constexpr uint16_t NoShift = 0;
+ return new (Func->allocate<X86OperandMem>())
+ X86OperandMem(Func, Ty, Base, Offset, NoIndex, NoShift, IsRebased);
}
Variable *getBase() const { return Base; }
Constant *getOffset() const { return Offset; }
@@ -854,10 +878,9 @@ public:
uint16_t getShift() const { return Shift; }
SegmentRegisters getSegmentRegister() const { return DefaultSegment; }
void emitSegmentOverride(Assembler *) const {}
- void setIsPIC() { IsPIC = true; }
- bool getIsPIC() const { return IsPIC; }
- Address toAsmAddress(Assembler *Asm,
- const Ice::TargetLowering *Target) const;
+ bool getIsRebased() const { return IsRebased; }
+ Address toAsmAddress(Assembler *Asm, const Ice::TargetLowering *Target,
+ bool LeaAddr = false) const;
void emit(const Cfg *Func) const override;
using X86Operand::dump;
@@ -873,13 +896,13 @@ public:
private:
X86OperandMem(Cfg *Func, Type Ty, Variable *Base, Constant *Offset,
- Variable *Index, uint16_t Shift, bool IsPIC);
+ Variable *Index, uint16_t Shift, bool IsRebased);
- Variable *Base;
- Constant *Offset;
- Variable *Index;
- uint16_t Shift;
- bool IsPIC;
+ Variable *const Base;
+ Constant *const Offset;
+ Variable *const Index;
+ const uint16_t Shift;
+ const bool IsRebased;
/// A flag to show if this memory operand is a randomized one. Randomized
/// memory operands are generated in
/// TargetX86Base::randomizeOrPoolImmediate()

Powered by Google App Engine
This is Rietveld 408576698