| Index: src/IceTargetLoweringX8632.cpp
|
| diff --git a/src/IceTargetLoweringX8632.cpp b/src/IceTargetLoweringX8632.cpp
|
| index 209db7c7c33c5c0657e0d72ed2d435a61d11fa97..fa5c37a30f30833b9304dace94daec736a639bd6 100644
|
| --- a/src/IceTargetLoweringX8632.cpp
|
| +++ b/src/IceTargetLoweringX8632.cpp
|
| @@ -146,15 +146,15 @@ void TargetX8632::_sub_sp(Operand *Adjustment) {
|
| }
|
|
|
| void TargetX8632::lowerIndirectJump(Variable *JumpTarget) {
|
| + AutoBundle _(this);
|
| +
|
| if (NeedSandboxing) {
|
| - _bundle_lock();
|
| const SizeT BundleSize =
|
| 1 << Func->getAssembler<>()->getBundleAlignLog2Bytes();
|
| _and(JumpTarget, Ctx->getConstantInt32(~(BundleSize - 1)));
|
| }
|
| +
|
| _jmp(JumpTarget);
|
| - if (NeedSandboxing)
|
| - _bundle_unlock();
|
| }
|
|
|
| void TargetX8632::lowerCall(const InstCall *Instr) {
|
| @@ -278,24 +278,29 @@ void TargetX8632::lowerCall(const InstCall *Instr) {
|
| break;
|
| }
|
| }
|
| +
|
| Operand *CallTarget =
|
| legalize(Instr->getCallTarget(), Legal_Reg | Legal_Imm | Legal_AddrAbs);
|
| - if (NeedSandboxing) {
|
| - if (llvm::isa<Constant>(CallTarget)) {
|
| - _bundle_lock(InstBundleLock::Opt_AlignToEnd);
|
| - } else {
|
| - Variable *CallTargetVar = nullptr;
|
| - _mov(CallTargetVar, CallTarget);
|
| - _bundle_lock(InstBundleLock::Opt_AlignToEnd);
|
| - const SizeT BundleSize =
|
| - 1 << Func->getAssembler<>()->getBundleAlignLog2Bytes();
|
| - _and(CallTargetVar, Ctx->getConstantInt32(~(BundleSize - 1)));
|
| - CallTarget = CallTargetVar;
|
| +
|
| + Traits::Insts::Call *NewCall;
|
| + /* AutoBundle scoping */ {
|
| + std::unique_ptr<AutoBundle> Bundle;
|
| + if (NeedSandboxing) {
|
| + if (llvm::isa<Constant>(CallTarget)) {
|
| + Bundle = makeUnique<AutoBundle>(this, InstBundleLock::Opt_AlignToEnd);
|
| + } else {
|
| + Variable *CallTargetVar = nullptr;
|
| + _mov(CallTargetVar, CallTarget);
|
| + Bundle = makeUnique<AutoBundle>(this, InstBundleLock::Opt_AlignToEnd);
|
| + const SizeT BundleSize =
|
| + 1 << Func->getAssembler<>()->getBundleAlignLog2Bytes();
|
| + _and(CallTargetVar, Ctx->getConstantInt32(~(BundleSize - 1)));
|
| + CallTarget = CallTargetVar;
|
| + }
|
| }
|
| + NewCall = Context.insert<Traits::Insts::Call>(ReturnReg, CallTarget);
|
| }
|
| - auto *NewCall = Context.insert<Traits::Insts::Call>(ReturnReg, CallTarget);
|
| - if (NeedSandboxing)
|
| - _bundle_unlock();
|
| +
|
| if (ReturnRegHi)
|
| Context.insert<InstFakeDef>(ReturnRegHi);
|
|
|
| @@ -749,8 +754,10 @@ void TargetX8632::addEpilog(CfgNode *Node) {
|
| }
|
| }
|
|
|
| - if (!NeedSandboxing)
|
| + if (!NeedSandboxing) {
|
| return;
|
| + }
|
| +
|
| // Change the original ret instruction into a sandboxed return sequence.
|
| // t:ecx = pop
|
| // bundle_lock
|
|
|