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 |
} |