diff options
Diffstat (limited to 'llvm/lib/Target')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 1 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.h | 5 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86InstrCompiler.td | 20 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86InstrInfo.td | 5 | 
4 files changed, 31 insertions, 0 deletions
| diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 2041c3c9625..a885699297e 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -10636,6 +10636,7 @@ const char *X86TargetLowering::getTargetNodeName(unsigned Opcode) const {    case X86ISD::VAARG_64:           return "X86ISD::VAARG_64";    case X86ISD::WIN_ALLOCA:         return "X86ISD::WIN_ALLOCA";    case X86ISD::MEMBARRIER:         return "X86ISD::MEMBARRIER"; +  case X86ISD::SEG_ALLOCA:         return "X86ISD::SEG_ALLOCA";    }  } diff --git a/llvm/lib/Target/X86/X86ISelLowering.h b/llvm/lib/Target/X86/X86ISelLowering.h index 6419879529a..9a9093ce7eb 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.h +++ b/llvm/lib/Target/X86/X86ISelLowering.h @@ -286,6 +286,11 @@ namespace llvm {        // WIN_ALLOCA - Windows's _chkstk call to do stack probing.        WIN_ALLOCA, +      // SEG_ALLOCA - For allocating variable amounts of stack space when using +      // segmented stacks. Check if the current stacklet has enough space, and +      // defects to heap allocation if not. +      SEG_ALLOCA, +        // Memory barrier        MEMBARRIER,        MFENCE, diff --git a/llvm/lib/Target/X86/X86InstrCompiler.td b/llvm/lib/Target/X86/X86InstrCompiler.td index 829ea279201..9b39bdc00b5 100644 --- a/llvm/lib/Target/X86/X86InstrCompiler.td +++ b/llvm/lib/Target/X86/X86InstrCompiler.td @@ -106,6 +106,26 @@ let Defs = [EAX, ESP, EFLAGS], Uses = [ESP] in    def WIN_ALLOCA : I<0, Pseudo, (outs), (ins),                       "# dynamic stack allocation",                       [(X86WinAlloca)]>; + +// When using segmented stacks these are lowered into instructions which first +// check if the current stacklet has enough free memory. If it does, memory is +// allocated by bumping the stack pointer. Otherwise memory is allocated from  +// the heap. + +let Defs = [EAX, ESP, EFLAGS], Uses = [ESP, EAX] in +def SEG_ALLOCA_32 : I<0, Pseudo, (outs GR32:$dst), (ins GR32:$size), +                      "# variable sized alloca for segmented stacks", +                      [(set GR32:$dst, +                         (X86SegAlloca GR32:$size))]>, +                    Requires<[In32BitMode]>; + +let Defs = [RAX, RSP, EFLAGS], Uses = [RSP, RAX] in +def SEG_ALLOCA_64 : I<0, Pseudo, (outs GR64:$dst), (ins GR64:$size), +                      "# variable sized alloca for segmented stacks", +                      [(set GR64:$dst, +                         (X86SegAlloca GR64:$size))]>, +                    Requires<[In64BitMode]>; +  } diff --git a/llvm/lib/Target/X86/X86InstrInfo.td b/llvm/lib/Target/X86/X86InstrInfo.td index a09edd4747a..903d1b2d6ec 100644 --- a/llvm/lib/Target/X86/X86InstrInfo.td +++ b/llvm/lib/Target/X86/X86InstrInfo.td @@ -97,6 +97,8 @@ def SDT_X86TLSADDR : SDTypeProfile<0, 1, [SDTCisInt<0>]>;  def SDT_X86TLSCALL : SDTypeProfile<0, 1, [SDTCisInt<0>]>; +def SDT_X86SEG_ALLOCA : SDTypeProfile<1, 1, [SDTCisVT<0, iPTR>, SDTCisVT<1, iPTR>]>; +  def SDT_X86EHRET : SDTypeProfile<0, 1, [SDTCisInt<0>]>;  def SDT_X86TCRET : SDTypeProfile<0, 2, [SDTCisPtrTy<0>, SDTCisVT<1, i32>]>; @@ -228,6 +230,9 @@ def X86mul_imm : SDNode<"X86ISD::MUL_IMM", SDTIntBinOp>;  def X86WinAlloca : SDNode<"X86ISD::WIN_ALLOCA", SDTX86Void,                            [SDNPHasChain, SDNPInGlue, SDNPOutGlue]>; +def X86SegAlloca : SDNode<"X86ISD::SEG_ALLOCA", SDT_X86SEG_ALLOCA, +                          [SDNPHasChain]>; +  def X86TLSCall : SDNode<"X86ISD::TLSCALL", SDT_X86TLSCALL,                          [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue]>; | 

