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
9AC_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
24AC_DEFUN([DRUNTIME_CONFIGURE_THREADS],
25[
26case $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 ;;
36esac
37AC_SUBST(DCFG_THREAD_MODEL)
38])
39
40
41# DRUNTIME_OS_DETECT
42# ------------------
43# Set the druntime_cv_target_os variable
44AC_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_UNIX
56# ----------------
57# Add --enable-unix option or autodetects if system is unix
58# and create the DRUNTIME_OS_UNIX conditional.
59AC_DEFUN([DRUNTIME_OS_UNIX],
60[
61  AC_REQUIRE([DRUNTIME_OS_DETECT])
62  AC_ARG_ENABLE(unix,
63    AC_HELP_STRING([--enable-unix],
64                   [enables Unix runtime (default: yes, for Unix targets)]),
65    :,[enable_unix=auto])
66
67  case "$druntime_cv_target_os" in
68    aix*|*bsd*|cygwin*|darwin*|gnu*|linux*|skyos*|*solaris*|sysv*) d_have_unix=1 ;;
69  esac
70  if test -n "$d_have_unix" && test "$enable_unix" = auto ; then
71    enable_unix=yes
72  fi
73  AM_CONDITIONAL([DRUNTIME_OS_UNIX], [test "$enable_unix" = "yes"])
74])
75
76
77# DRUNTIME_OS_SOURCES
78# -------------------
79# Detect target OS and add DRUNTIME_OS_AIX DRUNTIME_OS_DARWIN
80# DRUNTIME_OS_FREEBSD DRUNTIME_OS_LINUX DRUNTIME_OS_MINGW
81# DRUNTIME_OS_SOLARIS DRUNTIME_OS_OPENBSD conditionals.
82AC_DEFUN([DRUNTIME_OS_SOURCES],
83[
84  AC_REQUIRE([DRUNTIME_OS_DETECT])
85
86  druntime_target_os_parsed=""
87  case "$druntime_cv_target_os" in
88      aix*)    druntime_target_os_parsed="aix"
89               ;;
90      *android*)
91               druntime_target_os_parsed="android"
92               ;;
93      darwin*) druntime_target_os_parsed="darwin"
94               ;;
95      dragonfly*)
96               druntime_target_os_parsed="dragonflybsd"
97               ;;
98      freebsd*|k*bsd*-gnu)
99               druntime_target_os_parsed="freebsd"
100               ;;
101      openbsd*)
102               druntime_target_os_parsed="openbsd"
103               ;;
104      netbsd*)
105               druntime_target_os_parsed="netbsd"
106               ;;
107      linux*)  druntime_target_os_parsed="linux"
108               ;;
109      mingw*)  druntime_target_os_parsed="mingw"
110             ;;
111      *solaris*) druntime_target_os_parsed="solaris"
112  esac
113  AM_CONDITIONAL([DRUNTIME_OS_AIX],
114                 [test "$druntime_target_os_parsed" = "aix"])
115  AM_CONDITIONAL([DRUNTIME_OS_ANDROID],
116                 [test "$druntime_target_os_parsed" = "android"])
117  AM_CONDITIONAL([DRUNTIME_OS_DARWIN],
118                 [test "$druntime_target_os_parsed" = "darwin"])
119  AM_CONDITIONAL([DRUNTIME_OS_DRAGONFLYBSD],
120                 [test "$druntime_target_os_parsed" = "dragonflybsd"])
121  AM_CONDITIONAL([DRUNTIME_OS_FREEBSD],
122                 [test "$druntime_target_os_parsed" = "freebsd"])
123  AM_CONDITIONAL([DRUNTIME_OS_NETBSD],
124                 [test "$druntime_target_os_parsed" = "netbsd"])
125  AM_CONDITIONAL([DRUNTIME_OS_OPENBSD],
126                 [test "$druntime_target_os_parsed" = "openbsd"])
127  AM_CONDITIONAL([DRUNTIME_OS_LINUX],
128                 [test "$druntime_target_os_parsed" = "linux"])
129  AM_CONDITIONAL([DRUNTIME_OS_MINGW],
130                 [test "$druntime_target_os_parsed" = "mingw"])
131  AM_CONDITIONAL([DRUNTIME_OS_SOLARIS],
132                 [test "$druntime_target_os_parsed" = "solaris"])
133])
134
135
136# DRUNTIME_OS_ARM_EABI_UNWINDER
137# ------------------------
138# Check if using ARM unwinder and substitute DCFG_ARM_EABI_UNWINDER
139# and set DRUNTIME_OS_ARM_EABI_UNWINDER conditional.
140AC_DEFUN([DRUNTIME_OS_ARM_EABI_UNWINDER],
141[
142  AC_LANG_PUSH([C])
143  AC_MSG_CHECKING([for ARM unwinder])
144  AC_TRY_COMPILE([#include <unwind.h>],[
145  #if __ARM_EABI_UNWINDER__
146  #error Yes, it is.
147  #endif
148  ],
149    [AC_MSG_RESULT([no])
150     DCFG_ARM_EABI_UNWINDER=false],
151    [AC_MSG_RESULT([yes])
152     DCFG_ARM_EABI_UNWINDER=true])
153  AC_SUBST(DCFG_ARM_EABI_UNWINDER)
154  AM_CONDITIONAL([DRUNTIME_OS_ARM_EABI_UNWINDER], [test "$DCFG_ARM_EABI_UNWINDER" = "true"])
155  AC_LANG_POP([C])
156])
157
158
159# DRUNTIME_OS_MINFO_BRACKETING
160# ----------------------------
161# Check if the linker provides __start_minfo and __stop_minfo symbols and
162# substitute DCFG_MINFO_BRACKETING.
163AC_DEFUN([DRUNTIME_OS_MINFO_BRACKETING],
164[
165  AC_LANG_PUSH([C])
166  AC_MSG_CHECKING([for minfo section bracketing])
167  AC_LINK_IFELSE([AC_LANG_SOURCE([
168    void* module_info_ptr __attribute__((section ("minfo")));
169    extern void* __start_minfo __attribute__((visibility ("hidden")));
170    extern void* __stop_minfo __attribute__((visibility ("hidden")));
171
172    int main()
173    {
174        // Never run, just to prevent compiler from optimizing access
175        return &__start_minfo == &__stop_minfo;
176    }
177  ])],
178    [AC_MSG_RESULT([yes])
179     DCFG_MINFO_BRACKETING=true],
180    [AC_MSG_RESULT([no])
181     DCFG_MINFO_BRACKETING=false])
182  AC_SUBST(DCFG_MINFO_BRACKETING)
183  AM_CONDITIONAL([DRUNTIME_OS_MINFO_BRACKETING], [test "$DCFG_MINFO_BRACKETING" = "true"])
184  AC_LANG_POP([C])
185])
186
187# DRUNTIME_OS_DLPI_TLS_MODID
188# ----------------------------
189# Check if struct dl_phdr_info includes the dlpi_tls_modid member and
190# substitute DCFG_DLPI_TLS_MODID.
191AC_DEFUN([DRUNTIME_OS_DLPI_TLS_MODID],
192[
193  AC_LANG_PUSH([C])
194  AC_CHECK_MEMBER([struct dl_phdr_info.dlpi_tls_modid],
195		  [DCFG_DLPI_TLS_MODID=true], [DCFG_DLPI_TLS_MODID=false],
196		  [[#include <link.h>]])
197  AC_SUBST(DCFG_DLPI_TLS_MODID)
198  AC_LANG_POP([C])
199])
200
201# DRUNTIME_OS_LINK_SPEC
202# ---------------------
203# Add target-specific link options to link_spec.
204AC_DEFUN([DRUNTIME_OS_LINK_SPEC],
205[
206  case $target in
207    i?86-*-solaris2.* | x86_64-*-solaris2.*)
208      # 64-bit Solaris/x86 ld breaks calls to __tls_get_addr with non-TLS
209      # relocs.  Work around by disabling TLS transitions.  Not necessary
210      # on 32-bit x86, but cannot be distinguished reliably in specs.
211      druntime_ld_prog=`$CC -print-prog-name=ld`
212      if test -n "$druntime_ld_prog" \
213         && $druntime_ld_prog -v 2>&1 | grep GNU > /dev/null 2>&1; then
214        :
215      else
216        OS_LINK_SPEC='-z relax=transtls'
217      fi
218      ;;
219  esac
220  AC_SUBST(OS_LINK_SPEC)
221])
222