diff options
author | Conrad Meyer <cem@FreeBSD.org> | 2019-11-05 03:20:40 +0000 |
---|---|---|
committer | Conrad Meyer <cem@FreeBSD.org> | 2019-11-05 03:20:40 +0000 |
commit | c8b5e3de39bcfa6833d4ab2980b0dddd30edbb74 (patch) | |
tree | cb9c33df28d5affbc288afb10e65645d2b64cb2c | |
parent | 6d180b1360b19930587764af836c009419cc3365 (diff) |
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).
Notes
Notes:
svn path=/head/; revision=354347
-rw-r--r-- | contrib/compiler-rt/lib/builtins/gcc_personality_v0.c | 17 | ||||
-rw-r--r-- | contrib/libunwind/include/unwind.h | 14 | ||||
-rw-r--r-- | lib/libcompiler_rt/Makefile | 4 | ||||
-rw-r--r-- | lib/libgcc_s/Makefile | 12 | ||||
-rw-r--r-- | lib/libgcc_s/Symbol.map (renamed from lib/libgcc_s/Version.map) | 19 | ||||
-rw-r--r-- | lib/libgcc_s/Versions.def | 31 | ||||
-rw-r--r-- | lib/libgcc_s/arm/Symbol.map | 12 |
7 files changed, 87 insertions, 22 deletions
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 <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 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 <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" diff --git a/lib/libgcc_s/Version.map b/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; +}; |