| 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()
|
|
|