Home | History | Annotate | Line # | Download | only in druntime
      1 #
      2 # Contains macros to detect OS features.
      3 #
      4 
      5 
      6 # DRUNTIME_OS_THREAD_MODEL
      7 # ------------------------
      8 # Detect thread model and substitute DCFG_THREAD_MODEL
      9 AC_DEFUN([DRUNTIME_OS_THREAD_MODEL],
     10 [
     11   AC_REQUIRE([AC_PROG_GDC])
     12   AC_MSG_CHECKING([for thread model used by GDC])
     13   d_thread_model=`$GDC -v 2>&1 | sed -n 's/^Thread model: //p'`
     14   AC_MSG_RESULT([$d_thread_model])
     15 
     16   # Map from thread model to thread interface.
     17   DRUNTIME_CONFIGURE_THREADS([$d_thread_model])
     18 ])
     19 
     20 
     21 # DRUNTIME_CONFIGURE_THREADS(thread_model)
     22 # ----------------------------------------
     23 # Map target os to D version identifier
     24 AC_DEFUN([DRUNTIME_CONFIGURE_THREADS],
     25 [
     26 case $1 in
     27     aix)    DCFG_THREAD_MODEL="Posix" ;;
     28     lynx)   DCFG_THREAD_MODEL="Posix" ;;
     29     posix)  DCFG_THREAD_MODEL="Posix" ;;
     30     single) DCFG_THREAD_MODEL="Single" ;;
     31     win32)  DCFG_THREAD_MODEL="Win32" ;;
     32     # TODO: These targets need porting.
     33     dce|mipssde|rtems|tpf|vxworks)
     34 	    DCFG_THREAD_MODEL="Single" ;;
     35     *)	    as_fn_error "Thread implementation '$1' not recognised" "$LINENO" 5 ;;
     36 esac
     37 AC_SUBST(DCFG_THREAD_MODEL)
     38 ])
     39 
     40 
     41 # DRUNTIME_OS_DETECT
     42 # ------------------
     43 # Set the druntime_cv_target_os variable
     44 AC_DEFUN([DRUNTIME_OS_DETECT],
     45 [
     46   AC_CACHE_CHECK([[for target OS]],
     47     [[druntime_cv_target_os]],
     48     [[druntime_cv_target_os=`echo $target_os | sed 's/^\([A-Za-z_]+\)/\1/'`]])
     49     AS_IF([[test -z "$druntime_cv_target_os"]],
     50       [AC_MSG_ERROR([[can't detect target OS]])],
     51       [])
     52 ])
     53 
     54 
     55 # DRUNTIME_OS_SOURCES
     56 # -------------------
     57 # Detect target OS and add DRUNTIME_OS_AIX DRUNTIME_OS_ANDROID
     58 # DRUNTIME_OS_DARWIN DRUNTIME_OS_DRAGONFLYBSD DRUNTIME_OS_FREEBSD
     59 # DRUNTIME_OS_LINUX DRUNTIME_OS_MINGW DRUNTIME_OS_NETBSD
     60 # DRUNTIME_OS_OPENBSD DRUNTIME_OS_SOLARIS conditionals.
     61 # If the system is posix, add DRUNTIME_OS_POSIX conditional.
     62 AC_DEFUN([DRUNTIME_OS_SOURCES],
     63 [
     64   AC_REQUIRE([DRUNTIME_OS_DETECT])
     65 
     66   druntime_target_os_parsed=""
     67   case "$druntime_cv_target_os" in
     68       aix*)    druntime_target_os_parsed="aix"
     69                ;;
     70       *android*)
     71                druntime_target_os_parsed="android"
     72                ;;
     73       darwin*) druntime_target_os_parsed="darwin"
     74                ;;
     75       dragonfly*)
     76                druntime_target_os_parsed="dragonflybsd"
     77                ;;
     78       freebsd*|k*bsd*-gnu)
     79                druntime_target_os_parsed="freebsd"
     80                ;;
     81       openbsd*)
     82                druntime_target_os_parsed="openbsd"
     83                ;;
     84       netbsd*)
     85                druntime_target_os_parsed="netbsd"
     86                ;;
     87       linux*)  druntime_target_os_parsed="linux"
     88                ;;
     89       mingw*)  druntime_target_os_parsed="mingw"
     90              ;;
     91       *solaris*) druntime_target_os_parsed="solaris"
     92   esac
     93   AM_CONDITIONAL([DRUNTIME_OS_AIX],
     94                  [test "$druntime_target_os_parsed" = "aix"])
     95   AM_CONDITIONAL([DRUNTIME_OS_ANDROID],
     96                  [test "$druntime_target_os_parsed" = "android"])
     97   AM_CONDITIONAL([DRUNTIME_OS_DARWIN],
     98                  [test "$druntime_target_os_parsed" = "darwin"])
     99   AM_CONDITIONAL([DRUNTIME_OS_DRAGONFLYBSD],
    100                  [test "$druntime_target_os_parsed" = "dragonflybsd"])
    101   AM_CONDITIONAL([DRUNTIME_OS_FREEBSD],
    102                  [test "$druntime_target_os_parsed" = "freebsd"])
    103   AM_CONDITIONAL([DRUNTIME_OS_NETBSD],
    104                  [test "$druntime_target_os_parsed" = "netbsd"])
    105   AM_CONDITIONAL([DRUNTIME_OS_OPENBSD],
    106                  [test "$druntime_target_os_parsed" = "openbsd"])
    107   AM_CONDITIONAL([DRUNTIME_OS_LINUX],
    108                  [test "$druntime_target_os_parsed" = "linux"])
    109   AM_CONDITIONAL([DRUNTIME_OS_MINGW],
    110                  [test "$druntime_target_os_parsed" = "mingw"])
    111   AM_CONDITIONAL([DRUNTIME_OS_SOLARIS],
    112                  [test "$druntime_target_os_parsed" = "solaris"])
    113 
    114   druntime_target_posix="no"
    115   case "$druntime_cv_target_os" in
    116     aix*|*bsd*|cygwin*|darwin*|dragonfly*|gnu*|linux*|skyos*|*solaris*|sysv*)
    117       druntime_target_posix="yes"
    118       ;;
    119   esac
    120   AM_CONDITIONAL([DRUNTIME_OS_POSIX], [test "$druntime_target_posix" = "yes"])
    121 ])
    122 
    123 
    124 # DRUNTIME_OS_ARM_EABI_UNWINDER
    125 # ------------------------
    126 # Check if using ARM unwinder and substitute DCFG_ARM_EABI_UNWINDER
    127 # and set DRUNTIME_OS_ARM_EABI_UNWINDER conditional.
    128 AC_DEFUN([DRUNTIME_OS_ARM_EABI_UNWINDER],
    129 [
    130   AC_LANG_PUSH([C])
    131   AC_MSG_CHECKING([for ARM unwinder])
    132   AC_TRY_COMPILE([#include <unwind.h>],[
    133   #if __ARM_EABI_UNWINDER__
    134   #error Yes, it is.
    135   #endif
    136   ],
    137     [AC_MSG_RESULT([no])
    138      DCFG_ARM_EABI_UNWINDER=false],
    139     [AC_MSG_RESULT([yes])
    140      DCFG_ARM_EABI_UNWINDER=true])
    141   AC_SUBST(DCFG_ARM_EABI_UNWINDER)
    142   AM_CONDITIONAL([DRUNTIME_OS_ARM_EABI_UNWINDER], [test "$DCFG_ARM_EABI_UNWINDER" = "true"])
    143   AC_LANG_POP([C])
    144 ])
    145 
    146 
    147 # DRUNTIME_OS_MINFO_BRACKETING
    148 # ----------------------------
    149 # Check if the linker provides __start_minfo and __stop_minfo symbols and
    150 # substitute DCFG_MINFO_BRACKETING.
    151 AC_DEFUN([DRUNTIME_OS_MINFO_BRACKETING],
    152 [
    153   AC_REQUIRE([DRUNTIME_OS_DETECT])
    154 
    155   AC_LANG_PUSH([C])
    156   AC_MSG_CHECKING([for minfo section bracketing])
    157   case "$druntime_cv_target_os" in
    158       darwin*)
    159 	section="__DATA,__minfodata"
    160 	start="section\$start\$__DATA\$__minfodata"
    161 	stop="section\$end\$__DATA\$__minfodata"
    162 	;;
    163       *)
    164 	section="minfo"
    165 	start="__start_minfo"
    166 	stop="__stop_minfo"
    167 	;;
    168   esac
    169   AC_LINK_IFELSE([AC_LANG_SOURCE([
    170     void* module_info_ptr __attribute__((section ("$section")));
    171     extern void* start_minfo __asm__("$start") __attribute__((visibility ("hidden")));
    172     extern void* stop_minfo __asm__("$stop") __attribute__((visibility ("hidden")));
    173 
    174     int main()
    175     {
    176         // Never run, just to prevent compiler from optimizing access
    177         return (int)(&stop_minfo - &start_minfo);
    178     }
    179   ])],
    180     [AC_MSG_RESULT([yes])
    181      DCFG_MINFO_BRACKETING=true],
    182     [AC_MSG_RESULT([no])
    183      DCFG_MINFO_BRACKETING=false])
    184   AC_SUBST(DCFG_MINFO_BRACKETING)
    185   AM_CONDITIONAL([DRUNTIME_OS_MINFO_BRACKETING], [test "$DCFG_MINFO_BRACKETING" = "true"])
    186   AC_LANG_POP([C])
    187 ])
    188 
    189 # DRUNTIME_OS_DLPI_TLS_MODID
    190 # ----------------------------
    191 # Check if struct dl_phdr_info includes the dlpi_tls_modid member and  
    192 # substitute DCFG_DLPI_TLS_MODID.
    193 AC_DEFUN([DRUNTIME_OS_DLPI_TLS_MODID],
    194 [
    195   AC_LANG_PUSH([C])
    196   AC_CHECK_MEMBER([struct dl_phdr_info.dlpi_tls_modid],
    197 		  [DCFG_DLPI_TLS_MODID=true], [DCFG_DLPI_TLS_MODID=false],
    198 		  [[#include <link.h>]])
    199   AC_SUBST(DCFG_DLPI_TLS_MODID)
    200   AC_LANG_POP([C])
    201 ])
    202 
    203 # DRUNTIME_OS_LINK_SPEC
    204 # ---------------------
    205 # Add target-specific link options to link_spec.
    206 AC_DEFUN([DRUNTIME_OS_LINK_SPEC],
    207 [
    208   case $target in
    209     i?86-*-solaris2.* | x86_64-*-solaris2.*)
    210       # 64-bit Solaris/x86 ld breaks calls to __tls_get_addr with non-TLS
    211       # relocs.  Work around by disabling TLS transitions.  Not necessary
    212       # on 32-bit x86, but cannot be distinguished reliably in specs.
    213       druntime_ld_prog=`$CC -print-prog-name=ld`
    214       druntime_ld_gld=no
    215       druntime_ld_relax_transtls=no
    216       if test -n "$druntime_ld_prog" \
    217          && $druntime_ld_prog -v 2>&1 | grep GNU > /dev/null 2>&1; then
    218         druntime_ld_gld=yes
    219       else
    220         echo 'int main (void) { return 0; }' > conftest.c
    221         save_LDFLAGS="$LDFLAGS"
    222         LDFLAGS="$LDFLAGS -Wl,-z,relax=transtls"
    223         if $CC $CFLAGS $LDFLAGS -o conftest conftest.c > /dev/null 2>&1; then
    224           druntime_ld_relax_transtls=yes
    225         fi
    226         LDFLAGS="$save_LDFLAGS"
    227         rm -f conftest.c conftest
    228       fi
    229       if test "$druntime_ld_relax_transtls" = "yes"; then
    230         OS_LINK_SPEC='-z relax=transtls'
    231       fi
    232       ;;
    233   esac
    234   AC_SUBST(OS_LINK_SPEC)
    235 ])
    236