Fix build issues for *-linux-android and add aarch64-linux-android support. [PR101785, PR99499]
Commit Message
I have add aarch64-linux-android target support and fix build issues with libstdc++ for android.
Several small issues like no libpthread.a (since android does not need libpthread.a) + 'ifunc' is not supported on this target, i will leave other people to fix.
---
gcc/config.gcc | 3 +-
gcc/config/aarch64/aarch64-linux.h | 48 ++++++++++++++++++++--
libstdc++-v3/config/os/bionic/ctype_base.h | 38 +++++++++++------
3 files changed, 72 insertions(+), 17 deletions(-)
@@ -1129,10 +1129,11 @@ aarch64*-*-netbsd*)
extra_options="${extra_options} netbsd.opt netbsd-elf.opt"
;;
aarch64*-*-linux*)
- tm_file="${tm_file} dbxelf.h elfos.h gnu-user.h linux.h glibc-stdint.h"
+ tm_file="${tm_file} dbxelf.h elfos.h gnu-user.h linux.h linux-android.h glibc-stdint.h"
tm_file="${tm_file} aarch64/aarch64-elf.h aarch64/aarch64-errata.h aarch64/aarch64-linux.h"
tmake_file="${tmake_file} aarch64/t-aarch64 aarch64/t-aarch64-linux"
tm_defines="${tm_defines} TARGET_DEFAULT_ASYNC_UNWIND_TABLES=1"
+ extra_options="${extra_options} linux-android.opt"
case $target in
aarch64_be-*)
tm_defines="${tm_defines} TARGET_BIG_ENDIAN_DEFAULT=1"
@@ -26,6 +26,9 @@
#undef MUSL_DYNAMIC_LINKER
#define MUSL_DYNAMIC_LINKER "/lib/ld-musl-aarch64%{mbig-endian:_be}%{mabi=ilp32:_ilp32}.so.1"
+#undef BIONIC_DYNAMIC_LINKER
+#define BIONIC_DYNAMIC_LINKER "/system/bin/linker64"
+
#undef ASAN_CC1_SPEC
#define ASAN_CC1_SPEC "%{%:sanitize(address):-funwind-tables}"
@@ -46,11 +49,48 @@
%{mbig-endian:-EB} %{mlittle-endian:-EL} \
-maarch64linux%{mabi=ilp32:32}%{mbig-endian:b}"
-
-#define LINK_SPEC LINUX_TARGET_LINK_SPEC AARCH64_ERRATA_LINK_SPEC
-
#define GNU_USER_TARGET_MATHFILE_SPEC \
"%{Ofast|ffast-math|funsafe-math-optimizations:crtfastmath.o%s}"
+
+#if defined(TARGET_ANDROID)
+
+#define EXTRA_TARGET_D_OS_VERSIONS() \
+ ANDROID_TARGET_D_OS_VERSIONS();
+
+#define LINK_SPEC LINUX_TARGET_LINK_SPEC AARCH64_ERRATA_LINK_SPEC ANDROID_LINK_SPEC
+
+#undef SUBTARGET_CC1_SPEC
+#define SUBTARGET_CC1_SPEC \
+ LINUX_OR_ANDROID_CC (GNU_USER_TARGET_CC1_SPEC, \
+ GNU_USER_TARGET_CC1_SPEC " " ANDROID_CC1_SPEC)
+
+#undef LIB_SPEC
+#define LIB_SPEC \
+ LINUX_OR_ANDROID_LD (GNU_USER_TARGET_LIB_SPEC, \
+ GNU_USER_TARGET_NO_PTHREADS_LIB_SPEC " " ANDROID_LIB_SPEC)
+
+#undef STARTFILE_SPEC
+#define STARTFILE_SPEC \
+ LINUX_OR_ANDROID_LD (GNU_USER_TARGET_STARTFILE_SPEC, ANDROID_STARTFILE_SPEC)
+
+#undef ENDFILE_SPEC
+#define ENDFILE_SPEC \
+ LINUX_OR_ANDROID_LD (GNU_USER_TARGET_MATHFILE_SPEC " " \
+ GNU_USER_TARGET_ENDFILE_SPEC, \
+ GNU_USER_TARGET_MATHFILE_SPEC " " \
+ ANDROID_ENDFILE_SPEC)
+
+#define TARGET_OS_CPP_BUILTINS() \
+ do \
+ { \
+ GNU_USER_TARGET_OS_CPP_BUILTINS(); \
+ ANDROID_TARGET_OS_CPP_BUILTINS(); \
+ } \
+ while (0)
+
+#else
+
+#define LINK_SPEC LINUX_TARGET_LINK_SPEC AARCH64_ERRATA_LINK_SPEC
#undef ENDFILE_SPEC
#define ENDFILE_SPEC \
@@ -64,6 +104,8 @@
} \
while (0)
+#endif
+
#define TARGET_ASM_FILE_END aarch64_file_end_indicate_exec_stack
/* Uninitialized common symbols in non-PIE executables, even with
@@ -27,6 +27,19 @@
//
// Information as gleaned from /usr/include/ctype.h
+// Define macros by ourselves so we do not get into more troubles.
+#define _GLIBCXX_U 0x01
+#define _GLIBCXX_L 0x02
+#define _GLIBCXX_D 0x04
+#define _GLIBCXX_S 0x08
+#define _GLIBCXX_P 0x10
+#define _GLIBCXX_C 0x20
+#define _GLIBCXX_X 0x40
+#define _GLIBCXX_B 0x80
+#define _GLIBCXX_R (_GLIBCXX_P|_GLIBCXX_U|\
+ _GLIBCXX_L|_GLIBCXX_D|_GLIBCXX_B)
+#define _GLIBCXX_A (_GLIBCXX_L|_GLIBCXX_U)
+#define _GLIBCXX_N _GLIBCXX_D
namespace std _GLIBCXX_VISIBILITY(default)
{
@@ -41,20 +54,19 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
// NB: Offsets into ctype<char>::_M_table force a particular size
// on the mask type. Because of this, we don't use an enum.
typedef char mask;
- static const mask upper = _U;
- static const mask lower = _L;
- static const mask alpha = _U | _L;
- static const mask digit = _N;
- static const mask xdigit = _X | _N;
- static const mask space = _S;
- static const mask print = _P | _U | _L | _N | _B;
- static const mask graph = _P | _U | _L | _N;
- static const mask cntrl = _C;
- static const mask punct = _P;
- static const mask alnum = _U | _L | _N;
-#if __cplusplus >= 201103L
+ static const mask upper = _GLIBCXX_U;
+ static const mask lower = _GLIBCXX_L;
+ static const mask alpha = _GLIBCXX_A;
+ static const mask digit = _GLIBCXX_N;
+ static const mask xdigit = _GLIBCXX_X | _GLIBCXX_N;
+ static const mask space = _GLIBCXX_S;
+ static const mask print = _GLIBCXX_R;
+ static const mask graph = _GLIBCXX_P | _GLIBCXX_U |
+ _GLIBCXX_L | _GLIBCXX_N;
+ static const mask cntrl = _GLIBCXX_C;
+ static const mask punct = _GLIBCXX_P;
+ static const mask alnum = _GLIBCXX_A | _GLIBCXX_N;
static const mask blank = space;
-#endif
};
_GLIBCXX_END_NAMESPACE_VERSION