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 commit is contained in:
parent
6d180b1360
commit
c8b5e3de39
@ -9,8 +9,23 @@
|
|||||||
#include "int_lib.h"
|
#include "int_lib.h"
|
||||||
|
|
||||||
#include <unwind.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__) && \
|
#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
|
// 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
|
// 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
|
// which are quired for the C personality to conform to the specification. In
|
||||||
|
@ -66,12 +66,16 @@ static const _Unwind_State _US_ACTION_MASK = 3;
|
|||||||
static const _Unwind_State _US_FORCE_UNWIND = 8;
|
static const _Unwind_State _US_FORCE_UNWIND = 8;
|
||||||
|
|
||||||
typedef uint32_t _Unwind_EHT_Header;
|
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;
|
struct _Unwind_Exception {
|
||||||
typedef struct _Unwind_Control_Block _Unwind_Control_Block;
|
|
||||||
typedef struct _Unwind_Control_Block _Unwind_Exception; /* Alias */
|
|
||||||
|
|
||||||
struct _Unwind_Control_Block {
|
|
||||||
uint64_t exception_class;
|
uint64_t exception_class;
|
||||||
void (*exception_cleanup)(_Unwind_Reason_Code, _Unwind_Control_Block*);
|
void (*exception_cleanup)(_Unwind_Reason_Code, _Unwind_Control_Block*);
|
||||||
|
|
||||||
|
@ -12,10 +12,6 @@ CFLAGS+= -fvisibility=hidden
|
|||||||
CFLAGS+= -DVISIBILITY_HIDDEN
|
CFLAGS+= -DVISIBILITY_HIDDEN
|
||||||
CFLAGS+= -I${SRCTOP}/contrib/libcxxrt
|
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
|
# gcc has incompatible internal declarations for __divtc3 and __multc3, but has
|
||||||
# no option to silence its warning, so make warnings non-fatal.
|
# no option to silence its warning, so make warnings non-fatal.
|
||||||
NO_WERROR.gcc=
|
NO_WERROR.gcc=
|
||||||
|
@ -4,12 +4,22 @@ PACKAGE= clibs
|
|||||||
SHLIB_NAME= libgcc_s.so.1
|
SHLIB_NAME= libgcc_s.so.1
|
||||||
SHLIBDIR?= /lib
|
SHLIBDIR?= /lib
|
||||||
|
|
||||||
|
.include <bsd.opts.mk>
|
||||||
|
|
||||||
MK_SSP= no
|
MK_SSP= no
|
||||||
WARNS?= 2
|
WARNS?= 2
|
||||||
|
|
||||||
LDFLAGS+= -nodefaultlibs
|
LDFLAGS+= -nodefaultlibs
|
||||||
LIBADD+= c
|
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 "../libcompiler_rt/Makefile.inc"
|
||||||
.include "../libgcc_eh/Makefile.inc"
|
.include "../libgcc_eh/Makefile.inc"
|
||||||
|
@ -3,7 +3,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
GCC_3.0 {
|
GCC_3.0 {
|
||||||
global:
|
|
||||||
__absvdi2;
|
__absvdi2;
|
||||||
__absvsi2;
|
__absvsi2;
|
||||||
__addvdi3;
|
__addvdi3;
|
||||||
@ -84,8 +83,6 @@ global:
|
|||||||
_Unwind_Resume;
|
_Unwind_Resume;
|
||||||
_Unwind_SetGR;
|
_Unwind_SetGR;
|
||||||
_Unwind_SetIP;
|
_Unwind_SetIP;
|
||||||
local:
|
|
||||||
*;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
GCC_3.3 {
|
GCC_3.3 {
|
||||||
@ -93,11 +90,11 @@ GCC_3.3 {
|
|||||||
_Unwind_FindEnclosingFunction;
|
_Unwind_FindEnclosingFunction;
|
||||||
_Unwind_GetCFA;
|
_Unwind_GetCFA;
|
||||||
_Unwind_Resume_or_Rethrow;
|
_Unwind_Resume_or_Rethrow;
|
||||||
} GCC_3.0;
|
};
|
||||||
|
|
||||||
GCC_3.3.1 {
|
GCC_3.3.1 {
|
||||||
__gcc_personality_v0;
|
__gcc_personality_v0;
|
||||||
} GCC_3.3;
|
};
|
||||||
|
|
||||||
GCC_3.4 {
|
GCC_3.4 {
|
||||||
__clzdi2;
|
__clzdi2;
|
||||||
@ -112,11 +109,11 @@ GCC_3.4 {
|
|||||||
__popcountdi2;
|
__popcountdi2;
|
||||||
__popcountsi2;
|
__popcountsi2;
|
||||||
__popcountti2;
|
__popcountti2;
|
||||||
} GCC_3.3.1;
|
};
|
||||||
|
|
||||||
GCC_3.4.2 {
|
GCC_3.4.2 {
|
||||||
__enable_execute_stack;
|
__enable_execute_stack;
|
||||||
} GCC_3.4;
|
};
|
||||||
|
|
||||||
GCC_3.4.4 {
|
GCC_3.4.4 {
|
||||||
__absvti2;
|
__absvti2;
|
||||||
@ -124,7 +121,7 @@ GCC_3.4.4 {
|
|||||||
__mulvti3;
|
__mulvti3;
|
||||||
__negvti2;
|
__negvti2;
|
||||||
__subvti3;
|
__subvti3;
|
||||||
} GCC_3.4.2;
|
};
|
||||||
|
|
||||||
GCC_4.0.0 {
|
GCC_4.0.0 {
|
||||||
__divdc3;
|
__divdc3;
|
||||||
@ -136,7 +133,7 @@ GCC_4.0.0 {
|
|||||||
__powidf2;
|
__powidf2;
|
||||||
__powisf2;
|
__powisf2;
|
||||||
__powixf2;
|
__powixf2;
|
||||||
} GCC_3.4.4;
|
};
|
||||||
|
|
||||||
GCC_4.2.0 {
|
GCC_4.2.0 {
|
||||||
__floatundidf;
|
__floatundidf;
|
||||||
@ -146,9 +143,9 @@ GCC_4.2.0 {
|
|||||||
__floatuntisf;
|
__floatuntisf;
|
||||||
__floatuntixf;
|
__floatuntixf;
|
||||||
_Unwind_GetIPInfo;
|
_Unwind_GetIPInfo;
|
||||||
} GCC_4.0.0;
|
};
|
||||||
|
|
||||||
GCC_4.3.0 {
|
GCC_4.3.0 {
|
||||||
__bswapdi2;
|
__bswapdi2;
|
||||||
__bswapsi2;
|
__bswapsi2;
|
||||||
} GCC_4.2.0;
|
};
|
31
lib/libgcc_s/Versions.def
Normal file
31
lib/libgcc_s/Versions.def
Normal file
@ -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;
|
12
lib/libgcc_s/arm/Symbol.map
Normal file
12
lib/libgcc_s/arm/Symbol.map
Normal file
@ -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;
|
||||||
|
};
|
Loading…
x
Reference in New Issue
Block a user