diff --git a/racket/src/ChezScheme/README.md b/racket/src/ChezScheme/README.md index 5821dd3495..fac65a93c4 100644 --- a/racket/src/ChezScheme/README.md +++ b/racket/src/ChezScheme/README.md @@ -12,6 +12,8 @@ Supported platforms: * OpenBSD: x86, x86_64 * NetBSD: x86, x86_64 * Solaris: x86, x86_64 + * Android: ARMv7, AArch64 + * iOS: AArch64 As a superset of the language described in the [Revised6 Report on the Algorithmic Language Scheme](http://www.r6rs.org) diff --git a/racket/src/ChezScheme/c/Mf-base b/racket/src/ChezScheme/c/Mf-base index 2dddc636a7..65b16b93be 100644 --- a/racket/src/ChezScheme/c/Mf-base +++ b/racket/src/ChezScheme/c/Mf-base @@ -22,7 +22,7 @@ Main=../boot/$m/main.$o Scheme=../bin/$m/scheme # CFLAGS is propagated separately: -SetConfigEnv = CC="${CC}" CPPFLAGS="${CPPFLAGS}" AR="${AR}" ARFLAGS="${ARFLAGS}" +SetConfigEnv = CC="${CC}" CPPFLAGS="${CPPFLAGS}" AR="${AR}" ARFLAGS="${ARFLAGS}" RANLIB="${RANLIB}" # One of these sets is referenced in Mf-config to select between # linking with kernel.o or libkernel.a diff --git a/racket/src/ChezScheme/c/atomic.h b/racket/src/ChezScheme/c/atomic.h index 854de274b5..8610394748 100644 --- a/racket/src/ChezScheme/c/atomic.h +++ b/racket/src/ChezScheme/c/atomic.h @@ -5,7 +5,7 @@ # define ACQUIRE_FENCE() __asm__ __volatile__ ("dmb ish" : : : "memory") # define RELEASE_FENCE() ACQUIRE_FENCE() #elif defined(__arm__) -# if arm_isa_version == 7 +# if (arm_isa_version >= 7) || (__ARM_ARCH >= 7) # define STORE_FENCE() __asm__ __volatile__ ("dmb ishst" : : : "memory") # define ACQUIRE_FENCE() __asm__ __volatile__ ("dmb ish" : : : "memory") # define RELEASE_FENCE() ACQUIRE_FENCE() @@ -72,15 +72,18 @@ FORCEINLINE int CAS_STORE_RELEASE(volatile void *addr, void *old_val, void *new_ return ret; } #elif defined(__arm__) -FORCEINLINE int S_cas_any_fence(volatile void *addr, void *old_val, void *new_val) { +FORCEINLINE int S_cas_any_fence(int load_acquire, volatile void *addr, void *old_val, void *new_val) { int ret; - __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5\n\t" - "mov %0, #0\n\t" + if (load_acquire) + ACQUIRE_FENCE(); + else + RELEASE_FENCE(); + __asm__ __volatile__ ("mov %0, #0\n\t" "0:\n\t" - "ldrex r12, [%1, #0]\n\t" + "ldrex r12, [%1]\n\t" "cmp r12, %2\n\t" "bne 1f\n\t" - "strex r7, %3, [%1, #0]\n\t" + "strex r7, %3, [%1]\n\t" "cmp r7, #0\n\t" "bne 1f\n\t" "it eq\n\t" @@ -91,7 +94,8 @@ FORCEINLINE int S_cas_any_fence(volatile void *addr, void *old_val, void *new_va : "cc", "memory", "r12", "r7"); return ret; } -# define CAS_ANY_FENCE(a, old, new) S_cas_any_fence(a, old, new) +# define CAS_LOAD_ACQUIRE(a, old, new) S_cas_any_fence(1, a, old, new) +# define CAS_STORE_RELEASE(a, old, new) S_cas_any_fence(0, a, old, new) #elif (__GNUC__ >= 5) || defined(__clang__) # define CAS_ANY_FENCE(a, old, new) __sync_bool_compare_and_swap(a, old, new) #elif defined(_MSC_VER) diff --git a/racket/src/ChezScheme/c/prim5.c b/racket/src/ChezScheme/c/prim5.c index 905d3859fc..f718afeb79 100644 --- a/racket/src/ChezScheme/c/prim5.c +++ b/racket/src/ChezScheme/c/prim5.c @@ -2088,7 +2088,12 @@ static void s_free(uptr addr) { } #ifdef FEATURE_ICONV -#ifdef WIN32 +#ifdef DISABLE_ICONV +# define iconv_t int +#define ICONV_OPEN(to, from) -1 +#define ICONV(cd, in, inb, out, outb) -1 +#define ICONV_CLOSE(cd) -1 +#elif defined(WIN32) typedef void *iconv_t; typedef iconv_t (*iconv_open_ft)(const char *tocode, const char *fromcode); typedef size_t (*iconv_ft)(iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft); diff --git a/racket/src/ChezScheme/c/version.h b/racket/src/ChezScheme/c/version.h index 7adcbed8b0..0d8ddcece6 100644 --- a/racket/src/ChezScheme/c/version.h +++ b/racket/src/ChezScheme/c/version.h @@ -134,7 +134,9 @@ typedef char *memcpy_t; #define MAKE_NAN(x) { x = 0.0; x = x / x; } #define GETWD(x) getcwd((x),PATH_MAX) typedef int tputsputcchar; -#define LOCKF +#ifndef __ANDROID__ +# define LOCKF +#endif #define DIRMARKERP(c) ((c) == '/') #ifndef DISABLE_X11 # define LIBX11 "libX11.so" @@ -149,6 +151,10 @@ typedef int tputsputcchar; #define NSECCTIME(sb) (sb).st_ctim.tv_nsec #define NSECMTIME(sb) (sb).st_mtim.tv_nsec #define ICONV_INBUF_TYPE char ** +#ifdef __ANDROID__ +# define NOFILE 256 +# define NO_USELOCALE +#endif #define UNUSED __attribute__((__unused__)) #endif @@ -175,7 +181,7 @@ typedef int tputsputcchar; #define SECMTIME(sb) (sb).st_mtimespec.tv_sec #define NSECATIME(sb) (sb).st_atimespec.tv_nsec #define NSECCTIME(sb) (sb).st_ctimespec.tv_nsec -#define NSECMTIME(sb) (sb).st_mtimespec.tv_nsec +#define NSECM>confdefs.h + extra_scheme_config_args="${extra_scheme_config_args} --disable-iconv" + add_iconv_lib= fi if test "${enable_iconv}" = "yes" ; then @@ -5373,6 +5384,10 @@ rm -f core conftest.err conftest.$ac_objext \ $as_echo "$have_codeset" >&6; } fi +if test "${add_iconv_lib}" != "" ; then + LIBS="${LIBS} ${add_iconv_lib}" +fi + ############### pthread ################### if test "${enable_pthread}" = "yes" ; then diff --git a/racket/src/cs/c/configure-parent.ac b/racket/src/cs/c/configure-parent.ac index 4c3f82c198..6b00eb6d46 100644 --- a/racket/src/cs/c/configure-parent.ac +++ b/racket/src/cs/c/configure-parent.ac @@ -30,6 +30,7 @@ if test "${enable_racket}" = "auto" ; then fi RUN_LOCAL_RACKET="local/cs/c/racketcs" CONFIGURE_LOCAL_RACKET=--enable-cs +LOCAL_RACKET_TARGET=cs # If BC is the default, then we rely on BC configure-parent # being used instead of this one: @@ -46,6 +47,7 @@ AC_SUBST(RUN_RACKET) AC_SUBST(MAKE_LOCAL_RACKET) AC_SUBST(RUN_LOCAL_RACKET) AC_SUBST(CONFIGURE_LOCAL_RACKET) +AC_SUBST(LOCAL_RACKET_TARGET) makefiles="Makefile" diff --git a/racket/src/cs/c/configure.ac b/racket/src/cs/c/configure.ac index c5305c425e..56262a27cc 100644 --- a/racket/src/cs/c/configure.ac +++ b/racket/src/cs/c/configure.ac @@ -220,7 +220,8 @@ case "$host_os" in MACH_OS=fb CFLAGS="${CFLAGS} -I/usr/local/include" LDFLAGS="${LDFLAGS} -L/usr/local/lib" - LIBS="${LIBS} -liconv -lm -lpthread" + LIBS="${LIBS} -lm -lpthread" + add_iconv_lib="-liconv" CPPFLAGS="${CPPFLAGS} -DELF_FIND_BOOT_SECTION" ELF_COMP="--expect-elf" ;; @@ -228,7 +229,8 @@ case "$host_os" in MACH_OS=ob CFLAGS="${CFLAGS} -I/usr/local/include" LDFLAGS="${LDFLAGS} -L/usr/local/lib" - LIBS="${LIBS} -liconv -lm -lpthread" + LIBS="${LIBS} -lm -lpthread" + add_iconv_lib="-liconv" LDFLAGS="${LDFLAGS} -Wl,-zwxneeded" CPPFLAGS="${CPPFLAGS} -DELF_FIND_BOOT_SECTION" ELF_COMP="--expect-elf" @@ -239,7 +241,8 @@ case "$host_os" in ;; netbsd*) MACH_OS=nb - LIBS="${LIBS} /usr/lib/i18n/libiconv_std.a -lm -lpthread" + LIBS="${LIBS} -lm -lpthread" + add_iconv_lib="/usr/lib/i18n/libiconv_std.a" CPPFLAGS="${CPPFLAGS} -DELF_FIND_BOOT_SECTION" ELF_COMP="--expect-elf" POST_LINKER="paxctl +m" @@ -248,7 +251,13 @@ case "$host_os" in ;; linux*) MACH_OS=le - LIBS="${LIBS} -lrt" + case "$host_os" in + *linux-android*) + ;; + *) + LIBS="${LIBS} -lrt" + ;; + esac CPPFLAGS="${CPPFLAGS} -DELF_FIND_BOOT_SECTION" ELF_COMP="--expect-elf" ;; @@ -529,6 +538,8 @@ AC_LANG_C m4_include(../ac/iconv.m4) if test "${enable_iconv}" = "no" ; then AC_DEFINE(RKTIO_NO_ICONV,1,[Do not use iconv]) + extra_scheme_config_args="${extra_scheme_config_args} --disable-iconv" + add_iconv_lib= fi if test "${enable_iconv}" = "yes" ; then @@ -541,6 +552,10 @@ if test "${enable_iconv}" = "yes" ; then AC_MSG_RESULT($have_codeset) fi +if test "${add_iconv_lib}" != "" ; then + LIBS="${LIBS} ${add_iconv_lib}" +fi + ############### pthread ################### if test "${enable_pthread}" = "yes" ; then diff --git a/racket/src/rktio/configure b/racket/src/rktio/configure index 9e718f57fc..da6931ea1b 100755 --- a/racket/src/rktio/configure +++ b/racket/src/rktio/configure @@ -4231,7 +4231,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_link "$LINENO"; then : $as_echo "#define RKTIO_USE_XLOCALE 1" >>confdefs.h @@ -4239,7 +4239,8 @@ $as_echo "#define RKTIO_USE_XLOCALE 1" >>confdefs.h else xlocaleon=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $xlocaleon" >&5 $as_echo "$xlocaleon" >&6; } CFLAGS="$SAVE_CFLAGS" diff --git a/racket/src/rktio/configure.ac b/racket/src/rktio/configure.ac index bee78e0361..830d7fbe1f 100644 --- a/racket/src/rktio/configure.ac +++ b/racket/src/rktio/configure.ac @@ -175,7 +175,7 @@ if test "${xlocalehon}" = "yes" ; then fi [ msg="for xlocale functions" ] AC_MSG_CHECKING($msg) -AC_COMPILE_IFELSE([AC_LANG_SOURCE([ +AC_LINK_IFELSE([AC_LANG_SOURCE([ #ifdef RKTIO_USE_XLOCALE_HEADER # include #endif diff --git a/racket/src/rktio/rktio_platform.h b/racket/src/rktio/rktio_platform.h index 52538a9bb5..cbbe1818c4 100644 --- a/racket/src/rktio/rktio_platform.h +++ b/racket/src/rktio/rktio_platform.h @@ -50,6 +50,7 @@ # ifdef __ANDROID__ # define PROTOENT_IS_INT IPPROTO_TCP +# define NO_PTHREAD_CANCEL # endif #endif @@ -342,3 +343,7 @@ standalone Racket. Used only if NO_SLEEP is undefined. */ /* NO_STRERROR_AVAILABLE means that strerror() is not available. */ + + /* NO_PTHREAD_CANCEL means that pthread_setcanceltype() is + not available, which means it can't be used to implement + non-blocking open(). */ diff --git a/racket/src/rktio/rktio_private.h b/racket/src/rktio/rktio_private.h index e4bccc6830..f81cb41523 100644 --- a/racket/src/rktio/rktio_private.h +++ b/racket/src/rktio/rktio_private.h @@ -360,7 +360,7 @@ void rktio_close_fds_after_fork(int len, int skip1, int skip2, int skip3); int rktio_system_fd_is_terminal(rktio_t *rktio, intptr_t fd); -#ifdef RKTIO_USE_PTHREADS +#if defined(RKTIO_USE_PTHREADS) && !defined(NO_PTHREAD_CANCEL) # define RKTIO_USE_PENDING_OPEN #endif