Now that the lowerinvoke pass inserts calls to llvm.setjmp/llvm.longjmp, some
authorChris Lattner <sabre@nondot.org>
Sun, 15 Feb 2004 22:51:47 +0000 (22:51 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 15 Feb 2004 22:51:47 +0000 (22:51 +0000)
hacks can be banished.  Also, this gives us the opportunity to emit special code
for the setjmp/longjmps which alows the elimination of one GCC warning for every
setjmp/longjmp site (which is often THOUSANDS in C++ programs).  Yaay!

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

lib/Target/CBackend/CBackend.cpp
lib/Target/CBackend/Writer.cpp

index 0d36ea73c3209805b08b3ec7f2a8e09c82806e3c..b52db0346a9a60f0752ffc06ce98524e2853a6b2 100644 (file)
@@ -686,8 +686,7 @@ bool CWriter::doInitialization(Module &M) {
     Out << "\n/* Function Declarations */\n";
     for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) {
       // Don't print declarations for intrinsic functions.
-      if (!I->getIntrinsicID() &&
-          I->getName() != "setjmp" && I->getName() != "longjmp") {
+      if (!I->getIntrinsicID()) {
         printFunctionSignature(I, true);
         if (I->hasWeakLinkage()) Out << " __ATTRIBUTE_WEAK__";
         Out << ";\n";
@@ -1187,6 +1186,8 @@ void CWriter::lowerIntrinsics(Module &M) {
             case Intrinsic::va_end:
             case Intrinsic::returnaddress:
             case Intrinsic::frameaddress:
+            case Intrinsic::setjmp:
+            case Intrinsic::longjmp:
               // We directly implement these intrinsics
               break;
             default:
@@ -1245,6 +1246,18 @@ void CWriter::visitCallInst(CallInst &I) {
         writeOperand(I.getOperand(1));
         Out << ")";
         return;
+      case Intrinsic::setjmp:
+        Out << "setjmp(*(jmp_buf*)";
+        writeOperand(I.getOperand(1));
+        Out << ")";
+        return;
+      case Intrinsic::longjmp:
+        Out << "longjmp(*(jmp_buf*)";
+        writeOperand(I.getOperand(1));
+        Out << ", ";
+        writeOperand(I.getOperand(2));
+        Out << ")";
+        return;
       }
     }
   visitCallSite(&I);
index 0d36ea73c3209805b08b3ec7f2a8e09c82806e3c..b52db0346a9a60f0752ffc06ce98524e2853a6b2 100644 (file)
@@ -686,8 +686,7 @@ bool CWriter::doInitialization(Module &M) {
     Out << "\n/* Function Declarations */\n";
     for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) {
       // Don't print declarations for intrinsic functions.
-      if (!I->getIntrinsicID() &&
-          I->getName() != "setjmp" && I->getName() != "longjmp") {
+      if (!I->getIntrinsicID()) {
         printFunctionSignature(I, true);
         if (I->hasWeakLinkage()) Out << " __ATTRIBUTE_WEAK__";
         Out << ";\n";
@@ -1187,6 +1186,8 @@ void CWriter::lowerIntrinsics(Module &M) {
             case Intrinsic::va_end:
             case Intrinsic::returnaddress:
             case Intrinsic::frameaddress:
+            case Intrinsic::setjmp:
+            case Intrinsic::longjmp:
               // We directly implement these intrinsics
               break;
             default:
@@ -1245,6 +1246,18 @@ void CWriter::visitCallInst(CallInst &I) {
         writeOperand(I.getOperand(1));
         Out << ")";
         return;
+      case Intrinsic::setjmp:
+        Out << "setjmp(*(jmp_buf*)";
+        writeOperand(I.getOperand(1));
+        Out << ")";
+        return;
+      case Intrinsic::longjmp:
+        Out << "longjmp(*(jmp_buf*)";
+        writeOperand(I.getOperand(1));
+        Out << ", ";
+        writeOperand(I.getOperand(2));
+        Out << ")";
+        return;
       }
     }
   visitCallSite(&I);