Reapply r354347 (by cem):

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:
Dimitry Andric 2020-08-06 19:05:59 +00:00
parent 45e1ec9e24
commit 998a72c55d
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/projects/clang1100-import/; revision=363975
2 changed files with 25 additions and 6 deletions

View File

@ -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

View File

@ -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*);