| # |
| # Contains macros to detect OS features. |
| # |
| |
| |
| # DRUNTIME_OS_THREAD_MODEL |
| # ------------------------ |
| # Detect thread model and substitute DCFG_THREAD_MODEL |
| AC_DEFUN([DRUNTIME_OS_THREAD_MODEL], |
| [ |
| AC_REQUIRE([AC_PROG_GDC]) |
| AC_MSG_CHECKING([for thread model used by GDC]) |
| d_thread_model=`$GDC -v 2>&1 | sed -n 's/^Thread model: //p'` |
| AC_MSG_RESULT([$d_thread_model]) |
| |
| # Map from thread model to thread interface. |
| DRUNTIME_CONFIGURE_THREADS([$d_thread_model]) |
| ]) |
| |
| |
| # DRUNTIME_CONFIGURE_THREADS(thread_model) |
| # ---------------------------------------- |
| # Map target os to D version identifier |
| AC_DEFUN([DRUNTIME_CONFIGURE_THREADS], |
| [ |
| case $1 in |
| aix) DCFG_THREAD_MODEL="Posix" ;; |
| lynx) DCFG_THREAD_MODEL="Posix" ;; |
| posix) DCFG_THREAD_MODEL="Posix" ;; |
| single) DCFG_THREAD_MODEL="Single" ;; |
| win32) DCFG_THREAD_MODEL="Win32" ;; |
| # TODO: These targets need porting. |
| dce|mipssde|rtems|tpf|vxworks) |
| DCFG_THREAD_MODEL="Single" ;; |
| *) as_fn_error "Thread implementation '$1' not recognised" "$LINENO" 5 ;; |
| esac |
| AC_SUBST(DCFG_THREAD_MODEL) |
| ]) |
| |
| |
| # DRUNTIME_OS_DETECT |
| # ------------------ |
| # Set the druntime_cv_target_os variable |
| AC_DEFUN([DRUNTIME_OS_DETECT], |
| [ |
| AC_CACHE_CHECK([[for target OS]], |
| [[druntime_cv_target_os]], |
| [[druntime_cv_target_os=`echo $target_os | sed 's/^\([A-Za-z_]+\)/\1/'`]]) |
| AS_IF([[test -z "$druntime_cv_target_os"]], |
| [AC_MSG_ERROR([[can't detect target OS]])], |
| []) |
| ]) |
| |
| |
| # DRUNTIME_OS_SOURCES |
| # ------------------- |
| # Detect target OS and add DRUNTIME_OS_AIX DRUNTIME_OS_ANDROID |
| # DRUNTIME_OS_DARWIN DRUNTIME_OS_DRAGONFLYBSD DRUNTIME_OS_FREEBSD |
| # DRUNTIME_OS_LINUX DRUNTIME_OS_MINGW DRUNTIME_OS_NETBSD |
| # DRUNTIME_OS_OPENBSD DRUNTIME_OS_SOLARIS conditionals. |
| # If the system is posix, add DRUNTIME_OS_POSIX conditional. |
| AC_DEFUN([DRUNTIME_OS_SOURCES], |
| [ |
| AC_REQUIRE([DRUNTIME_OS_DETECT]) |
| |
| druntime_target_os_parsed="" |
| case "$druntime_cv_target_os" in |
| aix*) druntime_target_os_parsed="aix" |
| ;; |
| *android*) |
| druntime_target_os_parsed="android" |
| ;; |
| darwin*) druntime_target_os_parsed="darwin" |
| ;; |
| dragonfly*) |
| druntime_target_os_parsed="dragonflybsd" |
| ;; |
| freebsd*|k*bsd*-gnu) |
| druntime_target_os_parsed="freebsd" |
| ;; |
| openbsd*) |
| druntime_target_os_parsed="openbsd" |
| ;; |
| netbsd*) |
| druntime_target_os_parsed="netbsd" |
| ;; |
| linux*) druntime_target_os_parsed="linux" |
| ;; |
| mingw*) druntime_target_os_parsed="mingw" |
| ;; |
| *solaris*) druntime_target_os_parsed="solaris" |
| esac |
| AM_CONDITIONAL([DRUNTIME_OS_AIX], |
| [test "$druntime_target_os_parsed" = "aix"]) |
| AM_CONDITIONAL([DRUNTIME_OS_ANDROID], |
| [test "$druntime_target_os_parsed" = "android"]) |
| AM_CONDITIONAL([DRUNTIME_OS_DARWIN], |
| [test "$druntime_target_os_parsed" = "darwin"]) |
| AM_CONDITIONAL([DRUNTIME_OS_DRAGONFLYBSD], |
| [test "$druntime_target_os_parsed" = "dragonflybsd"]) |
| AM_CONDITIONAL([DRUNTIME_OS_FREEBSD], |
| [test "$druntime_target_os_parsed" = "freebsd"]) |
| AM_CONDITIONAL([DRUNTIME_OS_NETBSD], |
| [test "$druntime_target_os_parsed" = "netbsd"]) |
| AM_CONDITIONAL([DRUNTIME_OS_OPENBSD], |
| [test "$druntime_target_os_parsed" = "openbsd"]) |
| AM_CONDITIONAL([DRUNTIME_OS_LINUX], |
| [test "$druntime_target_os_parsed" = "linux"]) |
| AM_CONDITIONAL([DRUNTIME_OS_MINGW], |
| [test "$druntime_target_os_parsed" = "mingw"]) |
| AM_CONDITIONAL([DRUNTIME_OS_SOLARIS], |
| [test "$druntime_target_os_parsed" = "solaris"]) |
| |
| druntime_target_posix="no" |
| case "$druntime_cv_target_os" in |
| aix*|*bsd*|cygwin*|darwin*|dragonfly*|gnu*|linux*|skyos*|*solaris*|sysv*) |
| druntime_target_posix="yes" |
| ;; |
| esac |
| AM_CONDITIONAL([DRUNTIME_OS_POSIX], [test "$druntime_target_posix" = "yes"]) |
| ]) |
| |
| |
| # DRUNTIME_OS_ARM_EABI_UNWINDER |
| # ------------------------ |
| # Check if using ARM unwinder and substitute DCFG_ARM_EABI_UNWINDER |
| # and set DRUNTIME_OS_ARM_EABI_UNWINDER conditional. |
| AC_DEFUN([DRUNTIME_OS_ARM_EABI_UNWINDER], |
| [ |
| AC_LANG_PUSH([C]) |
| AC_MSG_CHECKING([for ARM unwinder]) |
| AC_TRY_COMPILE([#include <unwind.h>],[ |
| #if __ARM_EABI_UNWINDER__ |
| #error Yes, it is. |
| #endif |
| ], |
| [AC_MSG_RESULT([no]) |
| DCFG_ARM_EABI_UNWINDER=false], |
| [AC_MSG_RESULT([yes]) |
| DCFG_ARM_EABI_UNWINDER=true]) |
| AC_SUBST(DCFG_ARM_EABI_UNWINDER) |
| AM_CONDITIONAL([DRUNTIME_OS_ARM_EABI_UNWINDER], [test "$DCFG_ARM_EABI_UNWINDER" = "true"]) |
| AC_LANG_POP([C]) |
| ]) |
| |
| |
| # DRUNTIME_OS_MINFO_BRACKETING |
| # ---------------------------- |
| # Check if the linker provides __start_minfo and __stop_minfo symbols and |
| # substitute DCFG_MINFO_BRACKETING. |
| AC_DEFUN([DRUNTIME_OS_MINFO_BRACKETING], |
| [ |
| AC_REQUIRE([DRUNTIME_OS_DETECT]) |
| |
| AC_LANG_PUSH([C]) |
| AC_MSG_CHECKING([for minfo section bracketing]) |
| case "$druntime_cv_target_os" in |
| darwin*) |
| section="__DATA,__minfodata" |
| start="section\$start\$__DATA\$__minfodata" |
| stop="section\$end\$__DATA\$__minfodata" |
| ;; |
| *) |
| section="minfo" |
| start="__start_minfo" |
| stop="__stop_minfo" |
| ;; |
| esac |
| AC_LINK_IFELSE([AC_LANG_SOURCE([ |
| void* module_info_ptr __attribute__((section ("$section"))); |
| extern void* start_minfo __asm__("$start") __attribute__((visibility ("hidden"))); |
| extern void* stop_minfo __asm__("$stop") __attribute__((visibility ("hidden"))); |
| |
| int main() |
| { |
| // Never run, just to prevent compiler from optimizing access |
| return (int)(&stop_minfo - &start_minfo); |
| } |
| ])], |
| [AC_MSG_RESULT([yes]) |
| DCFG_MINFO_BRACKETING=true], |
| [AC_MSG_RESULT([no]) |
| DCFG_MINFO_BRACKETING=false]) |
| AC_SUBST(DCFG_MINFO_BRACKETING) |
| AM_CONDITIONAL([DRUNTIME_OS_MINFO_BRACKETING], [test "$DCFG_MINFO_BRACKETING" = "true"]) |
| AC_LANG_POP([C]) |
| ]) |
| |
| # DRUNTIME_OS_DLPI_TLS_MODID |
| # ---------------------------- |
| # Check if struct dl_phdr_info includes the dlpi_tls_modid member and |
| # substitute DCFG_DLPI_TLS_MODID. |
| AC_DEFUN([DRUNTIME_OS_DLPI_TLS_MODID], |
| [ |
| AC_LANG_PUSH([C]) |
| AC_CHECK_MEMBER([struct dl_phdr_info.dlpi_tls_modid], |
| [DCFG_DLPI_TLS_MODID=true], [DCFG_DLPI_TLS_MODID=false], |
| [[#include <link.h>]]) |
| AC_SUBST(DCFG_DLPI_TLS_MODID) |
| AC_LANG_POP([C]) |
| ]) |
| |
| # DRUNTIME_OS_LINK_SPEC |
| # --------------------- |
| # Add target-specific link options to link_spec. |
| AC_DEFUN([DRUNTIME_OS_LINK_SPEC], |
| [ |
| case $target in |
| i?86-*-solaris2.* | x86_64-*-solaris2.*) |
| # 64-bit Solaris/x86 ld breaks calls to __tls_get_addr with non-TLS |
| # relocs. Work around by disabling TLS transitions. Not necessary |
| # on 32-bit x86, but cannot be distinguished reliably in specs. |
| druntime_ld_prog=`$CC -print-prog-name=ld` |
| druntime_ld_gld=no |
| druntime_ld_relax_transtls=no |
| if test -n "$druntime_ld_prog" \ |
| && $druntime_ld_prog -v 2>&1 | grep GNU > /dev/null 2>&1; then |
| druntime_ld_gld=yes |
| else |
| echo 'int main (void) { return 0; }' > conftest.c |
| save_LDFLAGS="$LDFLAGS" |
| LDFLAGS="$LDFLAGS -Wl,-z,relax=transtls" |
| if $CC $CFLAGS $LDFLAGS -o conftest conftest.c > /dev/null 2>&1; then |
| druntime_ld_relax_transtls=yes |
| fi |
| LDFLAGS="$save_LDFLAGS" |
| rm -f conftest.c conftest |
| fi |
| if test "$druntime_ld_relax_transtls" = "yes"; then |
| OS_LINK_SPEC='-z relax=transtls' |
| fi |
| ;; |
| esac |
| AC_SUBST(OS_LINK_SPEC) |
| ]) |