* _mingw.h.in (__MINGW_GCC_VERSION): New macro.
* setjmp.h (setjmp): Use mingw_getsp() with gcc < 4.7.2.

merge from trunk r5162:
2012-07-04  Kai Tietz  <ktietz@redhat.com>
	    Tristan Gingold <gingold@adacore.com>
	* setjmp.h (setjmp): Use frame-address builtin.

git-svn-id: svn+ssh://svn.code.sf.net/p/mingw-w64/code/stable/v2.x@5164 4407c894-4637-0410-b4f5-ada5f102cad1
diff --git a/mingw-w64-crt/revstamp.h b/mingw-w64-crt/revstamp.h
index 6776e4d..9253394 100644
--- a/mingw-w64-crt/revstamp.h
+++ b/mingw-w64-crt/revstamp.h
@@ -1,4 +1,4 @@
 /* Do not edit. Autogenerated.  */
-#define __MINGW_W64_REV	"5158"
-#define __MINGW_W64_REV_STAMP "2012-06-29"
+#define __MINGW_W64_REV	"5164"
+#define __MINGW_W64_REV_STAMP "2012-07-04"
 
diff --git a/mingw-w64-headers/crt/ChangeLog b/mingw-w64-headers/crt/ChangeLog
index 70745f8..851e0ba 100644
--- a/mingw-w64-headers/crt/ChangeLog
+++ b/mingw-w64-headers/crt/ChangeLog
@@ -1,3 +1,13 @@
+2012-07-04  Ozkan Sezer  <sezeroz@gmail.com>
+
+	* _mingw.h.in (__MINGW_GCC_VERSION): New macro.
+	* setjmp.h (setjmp): Use mingw_getsp() with gcc < 4.7.2.
+
+2012-07-04  Kai Tietz  <ktietz@redhat.com>
+	    Tristan Gingold <gingold@adacore.com>
+
+	* setjmp.h (setjmp): Use frame-address builtin.
+
 2012-04-03  Ozkan Sezer  <sezeroz@gmail.com>
 
 	Merge from trunk rev. 4927:
diff --git a/mingw-w64-headers/crt/_mingw.h.in b/mingw-w64-headers/crt/_mingw.h.in
index a04ca88..6968ffa 100644
--- a/mingw-w64-headers/crt/_mingw.h.in
+++ b/mingw-w64-headers/crt/_mingw.h.in
@@ -54,6 +54,14 @@
 # endif /* __declspec */
 #endif /* __GNUC__ */
 
+#if __GNUC__
+#define __MINGW_GCC_VERSION	(__GNUC__	* 10000	+ \
+				 __GNUC_MINOR__	* 100	+ \
+				 __GNUC_PATCHLEVEL__)
+#else
+#define __MINGW_GCC_VERSION				0
+#endif
+
 #if defined (__GNUC__) && defined (__GNUC_MINOR__)
 #define __MINGW_GNUC_PREREQ(major, minor) \
   (__GNUC__ > (major) \
diff --git a/mingw-w64-headers/crt/setjmp.h b/mingw-w64-headers/crt/setjmp.h
index 2a68097..131bbfc 100644
--- a/mingw-w64-headers/crt/setjmp.h
+++ b/mingw-w64-headers/crt/setjmp.h
@@ -1,6 +1,6 @@
 /**
  * This file has no copyright assigned and is placed in the Public Domain.
- * This file is part of the w64 mingw-runtime package.
+ * This file is part of the mingw-w64 runtime package.
  * No warranty is given; refer to the file DISCLAIMER.PD within this package.
  */
 #ifndef _INC_SETJMP
@@ -148,34 +148,43 @@
 #define _JMP_BUF_DEFINED
 #endif
 
-  void * __cdecl __attribute__ ((__nothrow__)) mingw_getsp(void);
+void * __cdecl __attribute__ ((__nothrow__)) mingw_getsp (void);
 
 #ifndef USE_NO_MINGW_SETJMP_TWO_ARGS
-#ifndef _INC_SETJMPEX
-#ifdef _WIN64
-#define setjmp(BUF) _setjmp((BUF), mingw_getsp())
-#else
-#define setjmp(BUF) _setjmp3((BUF), NULL)
-#endif
+#  ifndef _INC_SETJMPEX
+#    ifdef _WIN64
+#     if (__MINGW_GCC_VERSION < 40702)
+#      define setjmp(BUF) _setjmp((BUF), mingw_getsp())
+#     else
+#      define setjmp(BUF) _setjmp((BUF), __builtin_frame_address (0))
+#     endif
+#    else
+#      define setjmp(BUF) _setjmp3((BUF), NULL)
+#    endif
   int __cdecl __attribute__ ((__nothrow__,__returns_twice__)) _setjmp(jmp_buf _Buf, void *_Ctx);
   int __cdecl __attribute__ ((__nothrow__,__returns_twice__)) _setjmp3(jmp_buf _Buf, void *_Ctx);
-#else
-#undef setjmp
-#ifdef _WIN64
-#define setjmp(BUF) _setjmpex((BUF), mingw_getsp())
-#define setjmpex(BUF) _setjmpex((BUF), mingw_getsp())
-#else
-#define setjmp(BUF) _setjmpex((BUF), NULL)
-#define setjmpex(BUF) _setjmpex((BUF), NULL)
-#endif
+#  else
+#    undef setjmp
+#    ifdef _WIN64
+#     if (__MINGW_GCC_VERSION < 40702)
+#      define setjmp(BUF) _setjmpex((BUF), mingw_getsp())
+#      define setjmpex(BUF) _setjmpex((BUF), mingw_getsp())
+#     else
+#      define setjmp(BUF) _setjmpex((BUF), __builtin_frame_address (0))
+#      define setjmpex(BUF) _setjmpex((BUF), __builtin_frame_address (0))
+#     endif
+#    else
+#      define setjmp(BUF) _setjmpex((BUF), NULL)
+#      define setjmpex(BUF) _setjmpex((BUF), NULL)
+#    endif
   int __cdecl __attribute__ ((__nothrow__,__returns_twice__)) _setjmpex(jmp_buf _Buf,void *_Ctx);
-#endif
+#  endif
 
 #else
 
-#ifndef _INC_SETJMPEX
-#define setjmp _setjmp
-#endif
+#  ifndef _INC_SETJMPEX
+#    define setjmp _setjmp
+#  endif
 
   int __cdecl __attribute__ ((__nothrow__,__returns_twice__)) setjmp(jmp_buf _Buf);
 #endif