summaryrefslogtreecommitdiff
path: root/contrib/llvm-project
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2020-08-06 19:05:59 +0000
committerDimitry Andric <dim@FreeBSD.org>2020-08-06 19:05:59 +0000
commit998a72c55d958bcc1869628318477532dc6e1ffa (patch)
treee26ad60bd32df9aba678f1c3432b89eadfe717a8 /contrib/llvm-project
parent45e1ec9e241a5d4d5726d16d4c5fd434c4908c0e (diff)
downloadsrc-test-998a72c55d958bcc1869628318477532dc6e1ffa.tar.gz
src-test-998a72c55d958bcc1869628318477532dc6e1ffa.zip
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).
Notes
Notes: svn path=/projects/clang1100-import/; revision=363975
Diffstat (limited to 'contrib/llvm-project')
-rw-r--r--contrib/llvm-project/compiler-rt/lib/builtins/gcc_personality_v0.c17
-rw-r--r--contrib/llvm-project/libunwind/include/unwind.h14
2 files changed, 25 insertions, 6 deletions
diff --git a/contrib/llvm-project/compiler-rt/lib/builtins/gcc_personality_v0.c b/contrib/llvm-project/compiler-rt/lib/builtins/gcc_personality_v0.c
index d12ee03c49feb..b986bd56943ed 100644
--- a/contrib/llvm-project/compiler-rt/lib/builtins/gcc_personality_v0.c
+++ b/contrib/llvm-project/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/llvm-project/libunwind/include/unwind.h b/contrib/llvm-project/libunwind/include/unwind.h
index 1d3444cd83b46..3a6cd116d33ce 100644
--- a/contrib/llvm-project/libunwind/include/unwind.h
+++ b/contrib/llvm-project/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*);