Add support for the sig(set|long)jmp intrinsics


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7951 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Target/CBackend/CBackend.cpp b/lib/Target/CBackend/CBackend.cpp
index 0443c18..4bc354b 100644
--- a/lib/Target/CBackend/CBackend.cpp
+++ b/lib/Target/CBackend/CBackend.cpp
@@ -1139,6 +1139,7 @@
         return;
         
       case LLVMIntrinsic::setjmp:
+      case LLVMIntrinsic::sigsetjmp:
         // This instrinsic should never exist in the program, but until we get
         // setjmp/longjmp transformations going on, we should codegen it to
         // something reasonable.  This will allow code that never calls longjmp
@@ -1146,7 +1147,9 @@
         Out << "0";
         return;
       case LLVMIntrinsic::longjmp:
-        // Treat longjmp the same as setjmp
+      case LLVMIntrinsic::siglongjmp:
+        // Longjmp is not implemented, and never will be.  It would cause an
+        // exception throw.
         Out << "abort()";
         return;
       }
diff --git a/lib/Target/CBackend/Writer.cpp b/lib/Target/CBackend/Writer.cpp
index 0443c18..4bc354b 100644
--- a/lib/Target/CBackend/Writer.cpp
+++ b/lib/Target/CBackend/Writer.cpp
@@ -1139,6 +1139,7 @@
         return;
         
       case LLVMIntrinsic::setjmp:
+      case LLVMIntrinsic::sigsetjmp:
         // This instrinsic should never exist in the program, but until we get
         // setjmp/longjmp transformations going on, we should codegen it to
         // something reasonable.  This will allow code that never calls longjmp
@@ -1146,7 +1147,9 @@
         Out << "0";
         return;
       case LLVMIntrinsic::longjmp:
-        // Treat longjmp the same as setjmp
+      case LLVMIntrinsic::siglongjmp:
+        // Longjmp is not implemented, and never will be.  It would cause an
+        // exception throw.
         Out << "abort()";
         return;
       }
diff --git a/lib/Target/SparcV9/SparcV9InstrSelection.cpp b/lib/Target/SparcV9/SparcV9InstrSelection.cpp
index 970c5fd..ee24333 100644
--- a/lib/Target/SparcV9/SparcV9InstrSelection.cpp
+++ b/lib/Target/SparcV9/SparcV9InstrSelection.cpp
@@ -1433,6 +1433,7 @@
                    addReg(callInstr.getOperand(1)));
     return true;
 
+  case LLVMIntrinsic::sigsetjmp:
   case LLVMIntrinsic::setjmp: {
     // act as if we return 0
     unsigned g0 = target.getRegInfo().getZeroRegNum();
@@ -1441,6 +1442,7 @@
     return true;
   }
 
+  case LLVMIntrinsic::siglongjmp:
   case LLVMIntrinsic::longjmp: {
     // call abort()
     Module* M = callInstr.getParent()->getParent()->getParent();
diff --git a/lib/Target/X86/InstSelectSimple.cpp b/lib/Target/X86/InstSelectSimple.cpp
index 2cc4e83..26e908f 100644
--- a/lib/Target/X86/InstSelectSimple.cpp
+++ b/lib/Target/X86/InstSelectSimple.cpp
@@ -978,10 +978,12 @@
     return;
 
   case LLVMIntrinsic::longjmp:
+  case LLVMIntrinsic::siglongjmp:
     BuildMI(X86::CALLpcrel32, 1).addExternalSymbol("abort", true); 
     return;
 
   case LLVMIntrinsic::setjmp:
+  case LLVMIntrinsic::sigsetjmp:
     // Setjmp always returns zero...
     BuildMI(BB, X86::MOVir32, 1, getReg(CI)).addZImm(0);
     return;
diff --git a/lib/Target/X86/X86ISelSimple.cpp b/lib/Target/X86/X86ISelSimple.cpp
index 2cc4e83..26e908f 100644
--- a/lib/Target/X86/X86ISelSimple.cpp
+++ b/lib/Target/X86/X86ISelSimple.cpp
@@ -978,10 +978,12 @@
     return;
 
   case LLVMIntrinsic::longjmp:
+  case LLVMIntrinsic::siglongjmp:
     BuildMI(X86::CALLpcrel32, 1).addExternalSymbol("abort", true); 
     return;
 
   case LLVMIntrinsic::setjmp:
+  case LLVMIntrinsic::sigsetjmp:
     // Setjmp always returns zero...
     BuildMI(BB, X86::MOVir32, 1, getReg(CI)).addZImm(0);
     return;