summaryrefslogtreecommitdiff
path: root/lib/libgcc_s
diff options
context:
space:
mode:
authorConrad Meyer <cem@FreeBSD.org>2019-11-05 03:20:40 +0000
committerConrad Meyer <cem@FreeBSD.org>2019-11-05 03:20:40 +0000
commitc8b5e3de39bcfa6833d4ab2980b0dddd30edbb74 (patch)
treecb9c33df28d5affbc288afb10e65645d2b64cb2c /lib/libgcc_s
parent6d180b1360b19930587764af836c009419cc3365 (diff)
downloadsrc-test-c8b5e3de39bcfa6833d4ab2980b0dddd30edbb74.tar.gz
src-test-c8b5e3de39bcfa6833d4ab2980b0dddd30edbb74.zip
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
Diffstat (limited to 'lib/libgcc_s')
-rw-r--r--lib/libgcc_s/Makefile12
-rw-r--r--lib/libgcc_s/Symbol.map (renamed from lib/libgcc_s/Version.map)19
-rw-r--r--lib/libgcc_s/Versions.def31
-rw-r--r--lib/libgcc_s/arm/Symbol.map12
4 files changed, 62 insertions, 12 deletions
diff --git a/lib/libgcc_s/Makefile b/lib/libgcc_s/Makefile
index e3a6c3959a05c..ef309421032f4 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 622732edb4475..065629d44cd8e 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 0000000000000..2c9fdc00e3b53
--- /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 0000000000000..447ba923ccbdb
--- /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;
+};