ports/lang/gcc6/files/patch-arm-unwind-cxx-support
Gerald Pfeifer 8d6d07c36d Welcome to the GCC 6.1 release, the first release of the GCC 6 series.
The default mode for C++ is now -std=gnu++14 instead of -std=gnu++98.

Type-based alias analysis now disambiguates accesses to different pointers.
This improves precision of the alias oracle by about 20-30% on higher-level
C++ programs. Programs doing invalid type punning of pointer types may now
need -fno-strict-aliasing to work correctly.

Value range propagation now assumes that the this pointer of C++ member
functions is non-null. This eliminates common null pointer checks but also
breaks some non-conforming code-bases (such as Qt-5, Chromium, KDevelop).
As a temporary work-around -fno-delete-null-pointer-checks can be used.
Wrong code can be identified by using -fsanitize=undefined.

There have been significant improvements around link-time optimization
and inter-procedural optimization and some support for OpenACC (though
probably not tested on FreeBSD) and version 4.5 of the OpenMP specification.

Source locations for the C and C++ compilers are now tracked as ranges
and diagnostics can now contain "fix-it hints".

New command-line options include -Wshift-negative-value, -Wshift-overflow,
-Wtautological-compare, -Wnull-dereference, -Wduplicated-cond, and
-Wmisleading-indentation.

C++ Concepts are now supported when compiling with -fconcepts, and there
are several other improvements around support for newer C++ features as
well as in the libstdc++ library.

Fortran now features Fortran 2008 SUBMODULE support, Fortran 2015 EVENT_TYPE,
EVENT_POST, EVENT_WAIT, and EVENT_QUERY support, and improved support for
OpenMP and OpenACC.

A lot has happened on the AArch64 and ARM fronts, on x86-64 there is now
Skylake with AVX-512 support, AMD instructions monitorx and mwaitx, and
support for address spaces __seg_fs, __seg_gs, and __seg_tl, as well as
AMD Zen (family 17h) processors, and basic support has been added for POWER9.

https://gcc.gnu.org/gcc-6/changes.html has a more extensive set of
changes and https://gcc.gnu.org/gcc-6/porting_to.html has a solid
overview of issue you may encountering porting to this new version.
2016-06-10 09:04:15 +00:00

106 lines
3.4 KiB
Text

--- UTC
Index: gcc/ginclude/unwind-arm-common.h
===================================================================
--- gcc/ginclude/unwind-arm-common.h (revision 219113)
+++ gcc/ginclude/unwind-arm-common.h (working copy)
@@ -82,7 +82,11 @@
struct _Unwind_Control_Block
{
+#ifdef __FreeBSD__
+ unsigned exception_class __attribute__((__mode__(__DI__)));
+#else
char exception_class[8];
+#endif
void (*exception_cleanup)(_Unwind_Reason_Code, _Unwind_Control_Block *);
/* Unwinder cache, private fields for the unwinder's use */
struct
@@ -181,7 +185,11 @@
/* Support functions for the PR. */
#define _Unwind_Exception _Unwind_Control_Block
+#ifdef __FreeBSD__
+ typedef unsigned _Unwind_Exception_Class __attribute__((__mode__(__DI__)));
+#else
typedef char _Unwind_Exception_Class[8];
+#endif
void * _Unwind_GetLanguageSpecificData (_Unwind_Context *);
_Unwind_Ptr _Unwind_GetRegionStart (_Unwind_Context *);
Index: libstdc++-v3/libsupc++/unwind-cxx.h
===================================================================
--- libstdc++-v3/libsupc++/unwind-cxx.h (revision 219147)
+++ libstdc++-v3/libsupc++/unwind-cxx.h (working copy)
@@ -235,7 +235,7 @@
return reinterpret_cast<__cxa_dependent_exception *>(exc + 1) - 1;
}
-#ifdef __ARM_EABI_UNWINDER__
+#if defined(__ARM_EABI_UNWINDER__) && !defined(__FreeBSD__)
static inline bool
__is_gxx_exception_class(_Unwind_Exception_Class c)
{
@@ -309,13 +309,7 @@
c[6] = 'R';
c[7] = '\0';
}
-
-static inline void*
-__gxx_caught_object(_Unwind_Exception* eo)
-{
- return (void*)eo->barrier_cache.bitpattern[0];
-}
-#else // !__ARM_EABI_UNWINDER__
+#else // !__ARM_EABI_UNWINDER__ || __FreeBSD__
// This is the primary exception class we report -- "GNUCC++\0".
const _Unwind_Exception_Class __gxx_primary_exception_class
= ((((((((_Unwind_Exception_Class) 'G'
@@ -339,6 +333,16 @@
<< 8 | (_Unwind_Exception_Class) '+')
<< 8 | (_Unwind_Exception_Class) '\x01');
+const _Unwind_Exception_Class __gxx_forced_unwind_class
+= ((((((((_Unwind_Exception_Class) 'G'
+ << 8 | (_Unwind_Exception_Class) 'N')
+ << 8 | (_Unwind_Exception_Class) 'U')
+ << 8 | (_Unwind_Exception_Class) 'C')
+ << 8 | (_Unwind_Exception_Class) 'F')
+ << 8 | (_Unwind_Exception_Class) 'O')
+ << 8 | (_Unwind_Exception_Class) 'R')
+ << 8 | (_Unwind_Exception_Class) '\0');
+
static inline bool
__is_gxx_exception_class(_Unwind_Exception_Class c)
{
@@ -346,6 +350,12 @@
|| c == __gxx_dependent_exception_class;
}
+static inline bool
+__is_gxx_forced_unwind_class(_Unwind_Exception_Class c)
+{
+ return c == __gxx_forced_unwind_class;
+}
+
// Only checks for primary or dependent, but not that it is a C++ exception at
// all.
static inline bool
@@ -357,7 +367,18 @@
#define __GXX_INIT_PRIMARY_EXCEPTION_CLASS(c) c = __gxx_primary_exception_class
#define __GXX_INIT_DEPENDENT_EXCEPTION_CLASS(c) \
c = __gxx_dependent_exception_class
+#define __GXX_INIT_FORCED_UNWIND_CLASS(c) c = __gxx_forced_unwind_class
+#endif // __ARM_EABI_UNWINDER__ && !__FreeBSD__
+#ifdef __ARM_EABI_UNWINDER__
+static inline void*
+__gxx_caught_object(_Unwind_Exception* eo)
+{
+ return (void*)eo->barrier_cache.bitpattern[0];
+}
+
+#else // !__ARM_EABI_UNWINDER__
+
// GNU C++ personality routine, Version 0.
extern "C" _Unwind_Reason_Code __gxx_personality_v0
(int, _Unwind_Action, _Unwind_Exception_Class,