| Index: lib/Target/X86/X86InstrControl.td
|
| diff --git a/lib/Target/X86/X86InstrControl.td b/lib/Target/X86/X86InstrControl.td
|
| index 39ad3954af79e88ca96e0cce14052f3a83a02c88..88ba2b9712528af9f620c93f516e81a3659964c7 100644
|
| --- a/lib/Target/X86/X86InstrControl.td
|
| +++ b/lib/Target/X86/X86InstrControl.td
|
| @@ -136,7 +136,7 @@ let isBranch = 1, isTerminator = 1, isBarrier = 1, isIndirectBranch = 1 in {
|
| OpSize32, Sched<[WriteJump]>;
|
| def JMP32m : I<0xFF, MRM4m, (outs), (ins i32mem:$dst), "jmp{l}\t{*}$dst",
|
| [(brind (loadi32 addr:$dst))], IIC_JMP_MEM>,
|
| - Requires<[Not64BitMode]>, OpSize32, Sched<[WriteJumpLd]>;
|
| + Requires<[Not64BitMode,IsNotNaCl]>, OpSize32, Sched<[WriteJumpLd]>;
|
|
|
| def JMP64r : I<0xFF, MRM4r, (outs), (ins GR64:$dst), "jmp{q}\t{*}$dst",
|
| [(brind GR64:$dst)], IIC_JMP_REG>, Requires<[In64BitMode]>,
|
| @@ -154,7 +154,7 @@ let isBranch = 1, isTerminator = 1, isBarrier = 1, isIndirectBranch = 1 in {
|
| "ljmp{l}\t{$seg, $off|$off, $seg}", [],
|
| IIC_JMP_FAR_PTR>, OpSize32, Sched<[WriteJump]>;
|
| def FARJMP64 : RI<0xFF, MRM5m, (outs), (ins opaque80mem:$dst),
|
| - "ljmp{q}\t{*}$dst", [], IIC_JMP_FAR_MEM>,
|
| + "ljmp{q}\t{*}$dst", [], IIC_JMP_FAR_MEM>, Requires<[IsNotNaCl]>,
|
| Sched<[WriteJump]>;
|
|
|
| def FARJMP16m : I<0xFF, MRM5m, (outs), (ins opaque32mem:$dst),
|
| @@ -189,6 +189,7 @@ let isCall = 1 in
|
| def CALLpcrel16 : Ii16PCRel<0xE8, RawFrm,
|
| (outs), (ins i16imm_pcrel:$dst),
|
| "call{w}\t$dst", [], IIC_CALL_RI>, OpSize16,
|
| + Requires<[IsNotNaCl]>, // @LOCALMOD
|
| Sched<[WriteJump]>;
|
| def CALL16r : I<0xFF, MRM2r, (outs), (ins GR16:$dst),
|
| "call{w}\t{*}$dst", [(X86call GR16:$dst)], IIC_CALL_RI>,
|
| @@ -201,10 +202,12 @@ let isCall = 1 in
|
| def CALL32r : I<0xFF, MRM2r, (outs), (ins GR32:$dst),
|
| "call{l}\t{*}$dst", [(X86call GR32:$dst)], IIC_CALL_RI>,
|
| OpSize32, Requires<[Not64BitMode]>, Sched<[WriteJump]>;
|
| + // @LOCALMOD to disallow load-folded calls in NaCl (need to sandbox
|
| + // the destination address first).
|
| def CALL32m : I<0xFF, MRM2m, (outs), (ins i32mem:$dst),
|
| "call{l}\t{*}$dst", [(X86call (loadi32 addr:$dst))],
|
| IIC_CALL_MEM>, OpSize32,
|
| - Requires<[Not64BitMode,FavorMemIndirectCall]>,
|
| + Requires<[Not64BitMode,IsNotNaCl,FavorMemIndirectCall]>,
|
| Sched<[WriteJumpLd]>;
|
|
|
| def FARCALL16i : Iseg16<0x9A, RawFrmImm16, (outs),
|
| @@ -224,7 +227,6 @@ let isCall = 1 in
|
| Sched<[WriteJumpLd]>;
|
| }
|
|
|
| -
|
| // Tail call stuff.
|
|
|
| let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1,
|
| @@ -248,7 +250,7 @@ let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1,
|
| "", [], IIC_JMP_REG>; // FIXME: Remove encoding when JIT is dead.
|
| let mayLoad = 1 in
|
| def TAILJMPm : I<0xFF, MRM4m, (outs), (ins i32mem_TC:$dst),
|
| - "jmp{l}\t{*}$dst # TAILCALL", [], IIC_JMP_MEM>;
|
| + "jmp{l}\t{*}$dst # TAILCALL", [], IIC_JMP_MEM>, Requires<[IsNotNaCl]>; // @LOCALMOD
|
| }
|
|
|
|
|
| @@ -266,18 +268,18 @@ let isCall = 1, Uses = [RSP], SchedRW = [WriteJump] in {
|
| def CALL64pcrel32 : Ii32PCRel<0xE8, RawFrm,
|
| (outs), (ins i64i32imm_pcrel:$dst),
|
| "call{q}\t$dst", [], IIC_CALL_RI>, OpSize32,
|
| - Requires<[In64BitMode]>;
|
| + Requires<[In64BitMode, IsNotNaCl]>; // @LOCALMOD
|
| def CALL64r : I<0xFF, MRM2r, (outs), (ins GR64:$dst),
|
| "call{q}\t{*}$dst", [(X86call GR64:$dst)],
|
| IIC_CALL_RI>,
|
| - Requires<[In64BitMode]>;
|
| + Requires<[In64BitMode]>;
|
| def CALL64m : I<0xFF, MRM2m, (outs), (ins i64mem:$dst),
|
| "call{q}\t{*}$dst", [(X86call (loadi64 addr:$dst))],
|
| IIC_CALL_MEM>,
|
| - Requires<[In64BitMode,FavorMemIndirectCall]>;
|
| + Requires<[In64BitMode, IsNotNaCl, FavorMemIndirectCall]>;
|
|
|
| def FARCALL64 : RI<0xFF, MRM3m, (outs), (ins opaque80mem:$dst),
|
| - "lcall{q}\t{*}$dst", [], IIC_CALL_FAR_MEM>;
|
| + "lcall{q}\t{*}$dst", [], IIC_CALL_FAR_MEM>, Requires<[IsNotNaCl]>; // @LOCALMOD
|
| }
|
|
|
| let isCall = 1, isCodeGenOnly = 1 in
|
| @@ -311,5 +313,6 @@ let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1,
|
|
|
| let mayLoad = 1 in
|
| def TAILJMPm64 : I<0xFF, MRM4m, (outs), (ins i64mem_TC:$dst),
|
| - "jmp{q}\t{*}$dst # TAILCALL", [], IIC_JMP_MEM>;
|
| + "jmp{q}\t{*}$dst # TAILCALL", [], IIC_JMP_MEM>,
|
| + Requires<[IsNotNaCl]>; // @LOCALMOD
|
| }
|
|
|