Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 29 Nov 2019 08:16:35 +0100
From:      Michal Meloun <meloun.michal@gmail.com>
To:        Conrad Meyer <cem@FreeBSD.org>, src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   Re: svn commit: r354347 - in head: contrib/compiler-rt/lib/builtins contrib/libunwind/include lib/libcompiler_rt lib/libgcc_s lib/libgcc_s/arm
Message-ID:  <398883fa-121e-9637-77a2-ee34e2b62609@gmail.com>
In-Reply-To: <201911050320.xA53Keqi072895@repo.freebsd.org>
References:  <201911050320.xA53Keqi072895@repo.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help


On 05.11.2019 4:20, Conrad Meyer wrote:
> Author: cem
> Date: Tue Nov  5 03:20:40 2019
> New Revision: 354347
> URL: https://svnweb.freebsd.org/changeset/base/354347
> 
> Log:
>   Fix llvm-libunwind userspace build on ARM
>   
>   GCC's libgcc exports a few ARM-specific symbols for ARM EABI, AEABI, or
>   EHABI or whatever it's called.  Export the same ones from LLVM-libunwind's
>   libgcc_s, on ARM.  As part of this, convert libgcc_s from a direct
>   Version.map to one constructed from component Symbol.map files.  This allows
>   the ARM-specific Symbol.map to be included only on ARM.
>   
>   Fix ARM-only oddities in struct name/aliases in LLVM-libunwind to match
>   non-ARM definitions and ARM-specific expectations in libcxxrt /
>   libcompiler_rt.
>   
>   No functional change intended for non-ARM architectures.
>   
>   This commit does not actually flip the switch for ARM defaults from libgcc
>   to llvm-libunwind, but makes it possible (to compile, anyway).

This broke ABI for arm. Unlike of all other platforms, _Unwind_Backtrace
should be exported with GCC_4.3.0 version. More over  we should also
hold GCC_3.3 version for compatibility with  FBSD11. Please, see r318024
for more details.
Thanks,
Michal

> 
> Added:
>   head/lib/libgcc_s/Symbol.map
>      - copied, changed from r354346, head/lib/libgcc_s/Version.map
>   head/lib/libgcc_s/Versions.def   (contents, props changed)
>   head/lib/libgcc_s/arm/
>   head/lib/libgcc_s/arm/Symbol.map   (contents, props changed)
> Deleted:
>   head/lib/libgcc_s/Version.map
> Modified:
>   head/contrib/compiler-rt/lib/builtins/gcc_personality_v0.c
>   head/contrib/libunwind/include/unwind.h
>   head/lib/libcompiler_rt/Makefile
>   head/lib/libgcc_s/Makefile
> 
> Modified: head/contrib/compiler-rt/lib/builtins/gcc_personality_v0.c
> ==============================================================================
> --- head/contrib/compiler-rt/lib/builtins/gcc_personality_v0.c	Tue Nov  5 02:30:41 2019	(r354346)
> +++ head/contrib/compiler-rt/lib/builtins/gcc_personality_v0.c	Tue Nov  5 03:20:40 2019	(r354347)
> @@ -9,8 +9,23 @@
>  #include "int_lib.h"
>  
>  #include <unwind.h>
> +/*
> + * 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
> 
> Modified: head/contrib/libunwind/include/unwind.h
> ==============================================================================
> --- head/contrib/libunwind/include/unwind.h	Tue Nov  5 02:30:41 2019	(r354346)
> +++ head/contrib/libunwind/include/unwind.h	Tue Nov  5 03:20:40 2019	(r354347)
> @@ -66,12 +66,16 @@ static const _Unwind_State _US_ACTION_MASK            
>  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*);
>  
> 
> Modified: head/lib/libcompiler_rt/Makefile
> ==============================================================================
> --- head/lib/libcompiler_rt/Makefile	Tue Nov  5 02:30:41 2019	(r354346)
> +++ head/lib/libcompiler_rt/Makefile	Tue Nov  5 03:20:40 2019	(r354347)
> @@ -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=
> 
> Modified: head/lib/libgcc_s/Makefile
> ==============================================================================
> --- head/lib/libgcc_s/Makefile	Tue Nov  5 02:30:41 2019	(r354346)
> +++ head/lib/libgcc_s/Makefile	Tue Nov  5 03:20:40 2019	(r354347)
> @@ -4,12 +4,22 @@ PACKAGE=	clibs
>  SHLIB_NAME=	libgcc_s.so.1
>  SHLIBDIR?=	/lib
>  
> +.include <bsd.opts.mk>
> +
>  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"
> 
> Copied and modified: head/lib/libgcc_s/Symbol.map (from r354346, head/lib/libgcc_s/Version.map)
> ==============================================================================
> --- head/lib/libgcc_s/Version.map	Tue Nov  5 02:30:41 2019	(r354346, copy source)
> +++ head/lib/libgcc_s/Symbol.map	Tue Nov  5 03:20:40 2019	(r354347)
> @@ -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;
> +};
> 
> Added: head/lib/libgcc_s/Versions.def
> ==============================================================================
> --- /dev/null	00:00:00 1970	(empty, because file is newly added)
> +++ head/lib/libgcc_s/Versions.def	Tue Nov  5 03:20:40 2019	(r354347)
> @@ -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;
> 
> Added: head/lib/libgcc_s/arm/Symbol.map
> ==============================================================================
> --- /dev/null	00:00:00 1970	(empty, because file is newly added)
> +++ head/lib/libgcc_s/arm/Symbol.map	Tue Nov  5 03:20:40 2019	(r354347)
> @@ -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;
> +};
> 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?398883fa-121e-9637-77a2-ee34e2b62609>