Hello, Everyone.
Prev. patch should be considered as obsolete: MS runtime is weird: it
uses underscore version of setjump() but non-underscore for
longjump() :)
Updated patch attached. Please note, that it will update .h file, so,
it's recommended to rebuild the whole LLVM tree (well, at least Codegen,
Target & backends).
--
With best regards, Anton Korobeynikov.
Faculty of Mathematics & Mechanics, Saint Petersburg State University.
diff -r f7b4f57b400c include/llvm/Target/TargetLowering.h
--- a/include/llvm/Target/TargetLowering.h Wed Dec 06 13:35:10 2006 +0000
+++ b/include/llvm/Target/TargetLowering.h Sat Dec 09 23:46:52 2006 +0300
@@ -379,12 +379,18 @@ public:
return allowUnalignedMemoryAccesses;
}
- /// usesUnderscoreSetJmpLongJmp - Determine if we should use _setjmp or setjmp
+ /// usesUnderscoreSetJmp - Determine if we should use _setjmp or setjmp
/// to implement llvm.setjmp.
- bool usesUnderscoreSetJmpLongJmp() const {
- return UseUnderscoreSetJmpLongJmp;
- }
-
+ bool usesUnderscoreSetJmp() const {
+ return UseUnderscoreSetJmp;
+ }
+
+ /// usesUnderscoreLongJmp - Determine if we should use _longjmp or longjmp
+ /// to implement llvm.longjmp.
+ bool usesUnderscoreLongJmp() const {
+ return UseUnderscoreLongJmp;
+ }
+
/// getStackPointerRegisterToSaveRestore - If a physical register, this
/// specifies the register that llvm.savestack/llvm.restorestack should save
/// and restore.
@@ -564,13 +570,20 @@ protected:
ShiftAmtHandling = OORSA;
}
- /// setUseUnderscoreSetJmpLongJmp - Indicate whether this target prefers to
- /// use _setjmp and _longjmp to or implement llvm.setjmp/llvm.longjmp or
- /// the non _ versions. Defaults to false.
- void setUseUnderscoreSetJmpLongJmp(bool Val) {
- UseUnderscoreSetJmpLongJmp = Val;
- }
-
+ /// setUseUnderscoreSetJmp - Indicate whether this target prefers to
+ /// use _setjmp to implement llvm.setjmp or the non _ version.
+ /// Defaults to false.
+ void setUseUnderscoreSetJmp(bool Val) {
+ UseUnderscoreSetJmp = Val;
+ }
+
+ /// setUseUnderscoreLongJmp - Indicate whether this target prefers to
+ /// use _longjmp to implement llvm.longjmp or the non _ version.
+ /// Defaults to false.
+ void setUseUnderscoreLongJmp(bool Val) {
+ UseUnderscoreLongJmp = Val;
+ }
+
/// setStackPointerRegisterToSaveRestore - If set to a physical register, this
/// specifies the register that llvm.savestack/llvm.restorestack should save
/// and restore.
@@ -883,10 +896,14 @@ private:
/// total cycles or lowest register usage.
SchedPreference SchedPreferenceInfo;
- /// UseUnderscoreSetJmpLongJmp - This target prefers to use _setjmp and
- /// _longjmp to implement llvm.setjmp/llvm.longjmp. Defaults to false.
- bool UseUnderscoreSetJmpLongJmp;
-
+ /// UseUnderscoreSetJmp - This target prefers to use _setjmp to implement
+ /// llvm.setjmp. Defaults to false.
+ bool UseUnderscoreSetJmp;
+
+ /// UseUnderscoreLongJmp - This target prefers to use _longjmp to implement
+ /// llvm.longjmp. Defaults to false.
+ bool UseUnderscoreLongJmp;
+
/// JumpBufSize - The size, in bytes, of the target's jmp_buf buffers
unsigned JumpBufSize;
diff -r f7b4f57b400c lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
--- a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Wed Dec 06 13:35:10 2006 +0000
+++ b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Sat Dec 09 23:53:05 2006 +0300
@@ -1975,10 +1975,10 @@ SelectionDAGLowering::visitIntrinsicCall
case Intrinsic::returnaddress: visitFrameReturnAddress(I, false); return 0;
case Intrinsic::frameaddress: visitFrameReturnAddress(I, true); return 0;
case Intrinsic::setjmp:
- return "_setjmp"+!TLI.usesUnderscoreSetJmpLongJmp();
+ return "_setjmp"+!TLI.usesUnderscoreSetJmp();
break;
case Intrinsic::longjmp:
- return "_longjmp"+!TLI.usesUnderscoreSetJmpLongJmp();
+ return "_longjmp"+!TLI.usesUnderscoreLongJmp();
break;
case Intrinsic::memcpy_i32:
case Intrinsic::memcpy_i64:
diff -r f7b4f57b400c lib/CodeGen/SelectionDAG/TargetLowering.cpp
--- a/lib/CodeGen/SelectionDAG/TargetLowering.cpp Wed Dec 06 13:35:10 2006 +0000
+++ b/lib/CodeGen/SelectionDAG/TargetLowering.cpp Sun Dec 10 00:40:31 2006 +0300
@@ -47,7 +47,8 @@ TargetLowering::TargetLowering(TargetMac
sizeof(TargetDAGCombineArray)/sizeof(TargetDAGCombineArray[0]));
maxStoresPerMemset = maxStoresPerMemcpy = maxStoresPerMemmove = 8;
allowUnalignedMemoryAccesses = false;
- UseUnderscoreSetJmpLongJmp = false;
+ UseUnderscoreSetJmp = false;
+ UseUnderscoreLongJmp = false;
IntDivIsCheap = false;
Pow2DivIsCheap = false;
StackPointerRegisterToSaveRestore = 0;
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/PowerPC/PPCISelLowering.cpp
--- a/lib/Target/PowerPC/PPCISelLowering.cpp Wed Dec 06 13:35:10 2006 +0000
+++ b/lib/Target/PowerPC/PPCISelLowering.cpp Sat Dec 09 23:47:32 2006 +0300
@@ -41,7 +41,8 @@ PPCTargetLowering::PPCTargetLowering(PPC
setPow2DivIsCheap();
// Use _setjmp/_longjmp instead of setjmp/longjmp.
- setUseUnderscoreSetJmpLongJmp(true);
+ setUseUnderscoreSetJmp(true);
+ setUseUnderscoreLongJmp(true);
// Set up the register classes.
addRegisterClass(MVT::i32, PPC::GPRCRegisterClass);
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 23:50:44 2006 +0300
@@ -54,10 +54,19 @@ X86TargetLowering::X86TargetLowering(Tar
setShiftAmountFlavor(Mask); // shl X, 32 == shl X, 0
setStackPointerRegisterToSaveRestore(X86StackPtr);
- if (!Subtarget->isTargetDarwin())
+ if (Subtarget->isTargetDarwin()) {
// Darwin should use _setjmp/_longjmp instead of setjmp/longjmp.
- setUseUnderscoreSetJmpLongJmp(true);
-
+ setUseUnderscoreSetJmp(false);
+ setUseUnderscoreLongJmp(false);
+ } else if (Subtarget->isTargetCygwin()) {
+ // MS runtime is weird: it exports _setjmp, but longjmp!
+ setUseUnderscoreSetJmp(true);
+ setUseUnderscoreLongJmp(false);
+ } else {
+ setUseUnderscoreSetJmp(true);
+ setUseUnderscoreLongJmp(true);
+ }
+
// Add legal addressing mode scale values.
addLegalAddressScale(8);
addLegalAddressScale(4);
_______________________________________________
llvm-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits