Hello Everyone.

It seems, that setjmp\logjmp support in CBackend is not good, since
codegeneration depends on *build* platform, not target. Attached patch
should solve the problem. 
However, I'm not sure, whether it's correct and won't break nightly
testers on Darwin (that's why, I haven't commited it already).

-- 
With best regards, Anton Korobeynikov.

Faculty of Mathematics & Mechanics, Saint Petersburg State University.

diff -r f7b4f57b400c lib/Target/CBackend/Writer.cpp
--- a/lib/Target/CBackend/Writer.cpp	Wed Dec 06 13:35:10 2006 +0000
+++ b/lib/Target/CBackend/Writer.cpp	Sat Dec 09 12:13:58 2006 +0300
@@ -1138,6 +1138,8 @@ static void generateCompilerSpecificCode
       << "#elif defined(__APPLE__)\n"
       << "extern void *__builtin_alloca(unsigned long);\n"
       << "#define alloca(x) __builtin_alloca(x)\n"
+      << "#define longjmp(x) _longjmp(x)\n"
+      << "#define setjmp(x) _setjmp(x)\n"
       << "#elif defined(__sun__)\n"
       << "#if defined(__sparcv9)\n"
       << "extern void *__builtin_alloca(unsigned long);\n"
@@ -2143,17 +2145,11 @@ void CWriter::visitCallInst(CallInst &I)
         Out << ')';
         return;
       case Intrinsic::setjmp:
-#if defined(HAVE__SETJMP) && defined(HAVE__LONGJMP)
-        Out << "_";  // Use _setjmp on systems that support it!
-#endif
         Out << "setjmp(*(jmp_buf*)";
         writeOperand(I.getOperand(1));
         Out << ')';
         return;
       case Intrinsic::longjmp:
-#if defined(HAVE__SETJMP) && defined(HAVE__LONGJMP)
-        Out << "_";  // Use _longjmp on systems that support it!
-#endif
         Out << "longjmp(*(jmp_buf*)";
         writeOperand(I.getOperand(1));
         Out << ", ";
diff -r f7b4f57b400c lib/Target/X86/X86ISelLowering.cpp
--- a/lib/Target/X86/X86ISelLowering.cpp	Wed Dec 06 13:35:10 2006 +0000
+++ b/lib/Target/X86/X86ISelLowering.cpp	Sat Dec 09 12:21:30 2006 +0300
@@ -54,7 +54,7 @@ X86TargetLowering::X86TargetLowering(Tar
   setShiftAmountFlavor(Mask);   // shl X, 32 == shl X, 0
   setStackPointerRegisterToSaveRestore(X86StackPtr);
 
-  if (!Subtarget->isTargetDarwin())
+  if (!(Subtarget->isTargetDarwin() || Subtarget->isTargetCygwin()))
     // Darwin should use _setjmp/_longjmp instead of setjmp/longjmp.
     setUseUnderscoreSetJmpLongJmp(true);
 
_______________________________________________
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits

Reply via email to