add ISD::STACKADDR to get the current stack pointer. Will be used by sjlj EH
authorJim Grosbach <grosbach@apple.com>
Thu, 27 May 2010 18:23:48 +0000 (18:23 +0000)
committerJim Grosbach <grosbach@apple.com>
Thu, 27 May 2010 18:23:48 +0000 (18:23 +0000)
to update the jmpbuf in the presence of VLAs.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@104862 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/ISDOpcodes.h
lib/Target/ARM/ARMISelLowering.cpp
lib/Target/ARM/ARMISelLowering.h

index a5e9dd5fe84a2b9442bfad7b6c33602b92cd60fd..fdb9bfd6554a3cdbccd3797385366c9543a770c9 100644 (file)
@@ -72,6 +72,9 @@ namespace ISD {
     // parent's frame or return address, and so on.
     FRAMEADDR, RETURNADDR,
 
+    // STACKADDR - The current stack pointer address.
+    STACKADDR,
+
     // FRAME_TO_ARGS_OFFSET - This node represents offset from frame pointer to
     // first (possible) on-stack argument. This is needed for correct stack
     // adjustment during unwind.
index b8126a3c5d1801196cb17d3e3124954fbc843df2..f6037c0c83922036e3ccc677af06a07be92db4d0 100644 (file)
@@ -2183,6 +2183,13 @@ SDValue ARMTargetLowering::LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const {
   return FrameAddr;
 }
 
+SDValue ARMTargetLowering::LowerSTACKADDR(SDValue Op, SelectionDAG &DAG) const {
+  EVT VT = Op.getValueType();
+  DebugLoc dl = Op.getDebugLoc();  // FIXME probably not meaningful
+  SDValue StackAddr = DAG.getCopyFromReg(DAG.getEntryNode(), dl, ARM::SP, VT);
+  return StackAddr;
+}
+
 /// ExpandBIT_CONVERT - If the target supports VFP, this function is called to
 /// expand a bit convert where either the source or destination type is i64 to
 /// use a VMOVDRR or VMOVRRD node.  This should not be done when the non-i64
@@ -3187,6 +3194,7 @@ SDValue ARMTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
   case ISD::FCOPYSIGN:     return LowerFCOPYSIGN(Op, DAG);
   case ISD::RETURNADDR:    return LowerRETURNADDR(Op, DAG);
   case ISD::FRAMEADDR:     return LowerFRAMEADDR(Op, DAG);
+  case ISD::STACKADDR:     return LowerSTACKADDR(Op, DAG);
   case ISD::GLOBAL_OFFSET_TABLE: return LowerGLOBAL_OFFSET_TABLE(Op, DAG);
   case ISD::EH_SJLJ_SETJMP: return LowerEH_SJLJ_SETJMP(Op, DAG);
   case ISD::EH_SJLJ_LONGJMP: return LowerEH_SJLJ_LONGJMP(Op, DAG);
index 9c7517c88195e49fe85fa4d7b7550bb1b8a8d3a3..29b3be13da03e11b8530e5f5b813abfc5fd997bc 100644 (file)
@@ -305,6 +305,7 @@ namespace llvm {
     SDValue LowerBR_CC(SDValue Op, SelectionDAG &DAG) const;
     SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
     SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
+    SDValue LowerSTACKADDR(SDValue Op, SelectionDAG &DAG) const;
     SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const;
     SDValue LowerShiftRightParts(SDValue Op, SelectionDAG &DAG) const;
     SDValue LowerShiftLeftParts(SDValue Op, SelectionDAG &DAG) const;