| Index: src/IceTargetLoweringX86Base.h
|
| diff --git a/src/IceTargetLoweringX86Base.h b/src/IceTargetLoweringX86Base.h
|
| index 2a4a728ccd3782f638610fa42f5d5b02a0fce694..d50d7212a2ee82a272e650129ce894cb3d0e24dd 100644
|
| --- a/src/IceTargetLoweringX86Base.h
|
| +++ b/src/IceTargetLoweringX86Base.h
|
| @@ -194,7 +194,17 @@ protected:
|
|
|
| void postLower() override;
|
|
|
| + /// Initializes the RebasePtr member variable -- if so required by
|
| + /// SandboxingType for the concrete Target.
|
| + void initRebasePtr() {
|
| + assert(SandboxingType != ST_None);
|
| + dispatchToConcrete(&Traits::ConcreteTarget::initRebasePtr);
|
| + }
|
| +
|
| + /// Emit code that initializes the value of the RebasePtr 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);
|
| }
|
|
|
| @@ -225,6 +235,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 {
|
| + 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;
|
| @@ -318,7 +347,7 @@ 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 RebasePtr
|
| Legal_Default = ~(Legal_Rematerializable | Legal_AddrAbs)
|
| // TODO(stichnot): Figure out whether this default works for x86-64.
|
| };
|
| @@ -406,11 +435,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);
|
| @@ -928,9 +955,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;
|
| + // RebasePtr is a Variable that holds the Rebasing pointer (if any) for the
|
| + // current sandboxing type.
|
| + Variable *RebasePtr = nullptr;
|
|
|
| /// Randomize a given immediate operand
|
| Operand *randomizeOrPoolImmediate(Constant *Immediate,
|
| @@ -998,10 +1025,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>
|
|
|