Chromium Code Reviews| Index: src/IceTargetLoweringX86Base.h |
| diff --git a/src/IceTargetLoweringX86Base.h b/src/IceTargetLoweringX86Base.h |
| index 72e4f20fb42f5d29ef340d8a039b4a835a09c1d1..d582a0dfc8884b89f4ee16120b0427ef28460e65 100644 |
| --- a/src/IceTargetLoweringX86Base.h |
| +++ b/src/IceTargetLoweringX86Base.h |
| @@ -192,7 +192,17 @@ protected: |
| void postLower() override; |
| + /// Initializes the SandboxPtr member variable -- if so required by |
| + /// SandboxingType for the concrete Target. |
| + void initSandboxPtr() { |
| + assert(SandboxingType != ST_None); |
| + dispatchToConcrete(&Traits::ConcreteTarget::initSandboxPtr); |
| + } |
| + |
| + /// Emit code that initializes the value of the SandboxPtr near the start of |
| + /// the function -- if so required by SandboxingType for the concrete type. |
| void initSandbox() { |
| + assert(SandboxingType != ST_None); |
| dispatchToConcrete(&Traits::ConcreteTarget::initSandbox); |
| } |
| @@ -223,6 +233,25 @@ protected: |
| Type ReturnType); |
| uint32_t getCallStackArgumentsSizeBytes(const InstCall *Instr) override; |
| void genTargetHelperCallFor(Inst *Instr) override; |
| + |
| + /// OptAddr wraps all the possible operands that an x86 address might have. |
| + struct OptAddr { |
|
Jim Stichnoth
2016/01/22 02:44:10
For better or worse, I *think* we go ahead and cal
John
2016/01/22 02:56:21
But this has no methods, and it has a quasi-dumb,
Jim Stichnoth
2016/01/22 03:08:55
On further thought, I take this back. If you make
John
2016/01/22 04:18:07
Not really. In theory, that should be done for str
|
| + Variable *Base = nullptr; |
| + Variable *Index = nullptr; |
| + uint16_t Shift = 0; |
| + int32_t Offset = 0; |
| + ConstantRelocatable *Relocatable = nullptr; |
| + }; |
| + /// Legalizes Addr w.r.t. SandboxingType. The exact type of legalization |
| + /// varies for different <Target, SandboxingType> tuples. |
| + bool legalizeOptAddrForSandbox(OptAddr *Addr) { |
| + return dispatchToConcrete( |
| + &Traits::ConcreteTarget::legalizeOptAddrForSandbox, std::move(Addr)); |
| + } |
| + // Builds information for a canonical address expresion: |
| + // <Relocatable + Offset>(Base, Index, Shift) |
| + X86OperandMem *computeAddressOpt(const Inst *Instr, Type MemType, |
| + Operand *Addr); |
| void doAddressOptLoad() override; |
| void doAddressOptStore() override; |
| void doMockBoundsCheck(Operand *Opnd) override; |
| @@ -309,7 +338,8 @@ protected: |
| Legal_Imm = 1 << 1, |
| Legal_Mem = 1 << 2, // includes [eax+4*ecx] as well as [esp+12] |
| Legal_Rematerializable = 1 << 3, |
| - Legal_AddrAbs = 1 << 4, // ConstantRelocatable doesn't have to add GotVar |
| + Legal_AddrAbs = |
| + 1 << 4, // ConstantRelocatable doesn't have to add SandboxPtr |
| Legal_Default = ~(Legal_Rematerializable | Legal_AddrAbs) |
| // TODO(stichnot): Figure out whether this default works for x86-64. |
| }; |
| @@ -397,11 +427,9 @@ protected: |
| template <typename... T> |
| AutoMemorySandboxer(typename Traits::TargetLowering *Target, T... Args) |
| - : Target(Target), |
| - MemOperand( |
| - (!Traits::Is64Bit || !Target->Ctx->getFlags().getUseSandboxing()) |
| - ? nullptr |
| - : findMemoryReference(Args...)) { |
| + : Target(Target), MemOperand(Target->SandboxingType == ST_None |
| + ? nullptr |
| + : findMemoryReference(Args...)) { |
| if (MemOperand != nullptr) { |
| Bundler = makeUnique<AutoBundle>(Target, BundleLockOpt); |
| *MemOperand = Target->_sandbox_mem_reference(*MemOperand); |
| @@ -914,9 +942,9 @@ protected: |
| RegisterAliases; |
| llvm::SmallBitVector RegsUsed; |
| std::array<VarList, IceType_NUM> PhysicalRegisters; |
| - // GotVar is a Variable that holds the GlobalOffsetTable address for Non-SFI |
| - // mode. |
| - Variable *GotVar = nullptr; |
| + // SandboxPtr is a Variable that holds the GlobalOffsetTable address for |
|
Jim Stichnoth
2016/01/22 02:44:10
This comment should also reflect its use in sandbo
John
2016/01/22 04:18:07
Done.
|
| + // Non-SFI mode. |
| + Variable *SandboxPtr = nullptr; |
|
Jim Stichnoth
2016/01/22 02:44:10
I have to say, I'm not thrilled with the various u
John
2016/01/22 02:56:21
How about RebasingPtr? RebasePtr?
|
| /// Randomize a given immediate operand |
| Operand *randomizeOrPoolImmediate(Constant *Immediate, |
| @@ -984,10 +1012,6 @@ private: |
| /// Optimizations for idiom recognition. |
| bool lowerOptimizeFcmpSelect(const InstFcmp *Fcmp, const InstSelect *Select); |
| - /// Emit code that initializes the value of the GotVar near the start of the |
| - /// function. (This code is emitted only in Non-SFI mode.) |
| - void initGotVarIfNeeded(); |
| - |
| /// Complains loudly if invoked because the cpu can handle 64-bit types |
| /// natively. |
| template <typename T = Traits> |