Implement LLVM intrinsics `llvm.setjmp' and `llvm.longjmp' as follows:
authorMisha Brukman <brukman+llvm@gmail.com>
Thu, 7 Aug 2003 15:43:46 +0000 (15:43 +0000)
committerMisha Brukman <brukman+llvm@gmail.com>
Thu, 7 Aug 2003 15:43:46 +0000 (15:43 +0000)
* setjmp() simply returns 0
* longjmp() simply calls abort()

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

lib/Target/SparcV9/SparcV9InstrSelection.cpp

index 1654c5592c0a191b93aa234fdd6cc9ab670a9a90..e35024b45dfdd0a4bb54860849f5e0366198ff38 100644 (file)
 #include "llvm/CodeGen/MachineFunctionInfo.h"
 #include "llvm/CodeGen/MachineCodeForInstruction.h"
 #include "llvm/DerivedTypes.h"
-#include "llvm/iTerminators.h"
-#include "llvm/iMemory.h"
-#include "llvm/iOther.h"
-#include "llvm/Function.h"
+#include "llvm/Instructions.h"
+#include "llvm/Module.h"
 #include "llvm/Constants.h"
 #include "llvm/ConstantHandling.h"
 #include "llvm/Intrinsics.h"
@@ -1435,6 +1433,22 @@ bool CodeGenIntrinsic(LLVMIntrinsic::ID iid, CallInst &callInstr,
                    addReg(callInstr.getOperand(1)));
     return true;
 
+  case LLVMIntrinsic::setjmp: {
+    // act as if we return 0
+    unsigned g0 = target.getRegInfo().getZeroRegNum();
+    mvec.push_back(BuildMI(V9::ORr,3).addMReg(g0).addMReg(g0)
+                   .addReg(&callInstr, MOTy::Def));
+    return true;
+  }
+
+  case LLVMIntrinsic::longjmp: {
+    // call abort()
+    Module* M = callInstr.getParent()->getParent()->getParent();
+    Function *F = M->getNamedFunction("abort");
+    mvec.push_back(BuildMI(V9::CALL, 1).addReg(F));
+    return true;
+  }
+
   default:
     return false;
   }