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:
parent
45e1ec9e24
commit
998a72c55d
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/projects/clang1100-import/; revision=363975
@ -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
|
||||
|
@ -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*);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user