diff --git a/contrib/compiler-rt/lib/builtins/gcc_personality_v0.c b/contrib/compiler-rt/lib/builtins/gcc_personality_v0.c index d12ee03c49fe..b986bd56943e 100644 --- a/contrib/compiler-rt/lib/builtins/gcc_personality_v0.c +++ b/contrib/compiler-rt/lib/builtins/gcc_personality_v0.c @@ -9,8 +9,23 @@ #include "int_lib.h" #include +/* + * XXX On FreeBSD, this file is compiled into three libraries: + * - libcompiler_rt + * - libgcc_eh + * - libgcc_s + * + * In the former, the include path points to the contrib/libcxxrt/unwind-arm.h + * copy of unwind.h. In the latter, the include path points to the + * contrib/libunwind/include/unwind.h header (LLVM libunwind). + * + * Neither (seemingly redundant) variant of unwind.h needs the redefinitions + * provided in the "helpful" header below, and libcxxrt's unwind-arm.h provides + * *no* useful distinguishing macros, so just forcibly disable the helper + * header on FreeBSD. + */ #if defined(__arm__) && !defined(__ARM_DWARF_EH__) && \ - !defined(__USING_SJLJ_EXCEPTIONS__) + !defined(__USING_SJLJ_EXCEPTIONS__) && !defined(__FreeBSD__) // When building with older compilers (e.g. clang <3.9), it is possible that we // have a version of unwind.h which does not provide the EHABI declarations // which are quired for the C personality to conform to the specification. In diff --git a/contrib/libunwind/include/unwind.h b/contrib/libunwind/include/unwind.h index b6cc70498b37..34a1f1e77c64 100644 --- a/contrib/libunwind/include/unwind.h +++ b/contrib/libunwind/include/unwind.h @@ -66,12 +66,16 @@ static const _Unwind_State _US_ACTION_MASK = 3; static const _Unwind_State _US_FORCE_UNWIND = 8; typedef uint32_t _Unwind_EHT_Header; +/* + * gcc_personality_v0 references 'struct _Unwind_Exception' all over the place. + * Nothing in libunwind cares about 'struct _Unwind_Control_Block,' so make it + * the alias of struct _Unwind_Exception, instead of the other way around. + */ +struct _Unwind_Exception; +typedef struct _Unwind_Exception _Unwind_Exception; +typedef struct _Unwind_Exception _Unwind_Control_Block; /* Alias */ -struct _Unwind_Control_Block; -typedef struct _Unwind_Control_Block _Unwind_Control_Block; -typedef struct _Unwind_Control_Block _Unwind_Exception; /* Alias */ - -struct _Unwind_Control_Block { +struct _Unwind_Exception { uint64_t exception_class; void (*exception_cleanup)(_Unwind_Reason_Code, _Unwind_Control_Block*); diff --git a/lib/libcompiler_rt/Makefile b/lib/libcompiler_rt/Makefile index 5c2d38e8c4ec..9ec4e896e7a5 100644 --- a/lib/libcompiler_rt/Makefile +++ b/lib/libcompiler_rt/Makefile @@ -12,10 +12,6 @@ CFLAGS+= -fvisibility=hidden CFLAGS+= -DVISIBILITY_HIDDEN CFLAGS+= -I${SRCTOP}/contrib/libcxxrt -.if ${COMPILER_TYPE} == "clang" -CWARNFLAGS.gcc_personality_v0.c+= -Wno-typedef-redefinition -.endif - # gcc has incompatible internal declarations for __divtc3 and __multc3, but has # no option to silence its warning, so make warnings non-fatal. NO_WERROR.gcc= diff --git a/lib/libgcc_s/Makefile b/lib/libgcc_s/Makefile index e3a6c3959a05..ef309421032f 100644 --- a/lib/libgcc_s/Makefile +++ b/lib/libgcc_s/Makefile @@ -4,12 +4,22 @@ PACKAGE= clibs SHLIB_NAME= libgcc_s.so.1 SHLIBDIR?= /lib +.include + MK_SSP= no WARNS?= 2 LDFLAGS+= -nodefaultlibs LIBADD+= c -VERSION_MAP= ${.CURDIR}/Version.map + +.if ${MK_SYMVER} == "yes" +VERSION_DEF= ${.CURDIR}/Versions.def +SYMBOL_MAPS= ${.CURDIR}/Symbol.map +# Export ARM AEABI unwind routines needed by libc and libthr. +.if exists(${.CURDIR}/${MACHINE_CPUARCH}/Symbol.map) +SYMBOL_MAPS+= ${.CURDIR}/${MACHINE_CPUARCH}/Symbol.map +.endif +.endif .include "../libcompiler_rt/Makefile.inc" .include "../libgcc_eh/Makefile.inc" diff --git a/lib/libgcc_s/Version.map b/lib/libgcc_s/Symbol.map similarity index 94% rename from lib/libgcc_s/Version.map rename to lib/libgcc_s/Symbol.map index 622732edb447..065629d44cd8 100644 --- a/lib/libgcc_s/Version.map +++ b/lib/libgcc_s/Symbol.map @@ -3,7 +3,6 @@ */ GCC_3.0 { -global: __absvdi2; __absvsi2; __addvdi3; @@ -84,8 +83,6 @@ global: _Unwind_Resume; _Unwind_SetGR; _Unwind_SetIP; -local: - *; }; GCC_3.3 { @@ -93,11 +90,11 @@ GCC_3.3 { _Unwind_FindEnclosingFunction; _Unwind_GetCFA; _Unwind_Resume_or_Rethrow; -} GCC_3.0; +}; GCC_3.3.1 { __gcc_personality_v0; -} GCC_3.3; +}; GCC_3.4 { __clzdi2; @@ -112,11 +109,11 @@ GCC_3.4 { __popcountdi2; __popcountsi2; __popcountti2; -} GCC_3.3.1; +}; GCC_3.4.2 { __enable_execute_stack; -} GCC_3.4; +}; GCC_3.4.4 { __absvti2; @@ -124,7 +121,7 @@ GCC_3.4.4 { __mulvti3; __negvti2; __subvti3; -} GCC_3.4.2; +}; GCC_4.0.0 { __divdc3; @@ -136,7 +133,7 @@ GCC_4.0.0 { __powidf2; __powisf2; __powixf2; -} GCC_3.4.4; +}; GCC_4.2.0 { __floatundidf; @@ -146,9 +143,9 @@ GCC_4.2.0 { __floatuntisf; __floatuntixf; _Unwind_GetIPInfo; -} GCC_4.0.0; +}; GCC_4.3.0 { __bswapdi2; __bswapsi2; -} GCC_4.2.0; +}; diff --git a/lib/libgcc_s/Versions.def b/lib/libgcc_s/Versions.def new file mode 100644 index 000000000000..2c9fdc00e3b5 --- /dev/null +++ b/lib/libgcc_s/Versions.def @@ -0,0 +1,31 @@ +# $FreeBSD$ + +GCC_3.0 { +}; + +GCC_3.3 { +} GCC_3.0; + +GCC_3.3.1 { +} GCC_3.3; + +GCC_3.4 { +} GCC_3.3.1; + +GCC_3.4.2 { +} GCC_3.4; + +GCC_3.4.4 { +} GCC_3.4.2; + +GCC_3.5 { +} GCC_3.4.4; + +GCC_4.0.0 { +} GCC_3.5; + +GCC_4.2.0 { +} GCC_4.0.0; + +GCC_4.3.0 { +} GCC_4.2.0; diff --git a/lib/libgcc_s/arm/Symbol.map b/lib/libgcc_s/arm/Symbol.map new file mode 100644 index 000000000000..447ba923ccbd --- /dev/null +++ b/lib/libgcc_s/arm/Symbol.map @@ -0,0 +1,12 @@ +/* + * $FreeBSD$ + */ + +GCC_3.5 { + _Unwind_VRS_Get; + _Unwind_VRS_Set; + __aeabi_unwind_cpp_pr0; + __aeabi_unwind_cpp_pr1; + __aeabi_unwind_cpp_pr2; + __gnu_unwind_frame; +};