Daily bump.
[official-gcc.git] / libphobos / m4 / druntime / os.m4
blob15cde3b04b8d47a66f83fa6ae56057359b66adac
2 # Contains macros to detect OS features.
6 # DRUNTIME_OS_THREAD_MODEL
7 # ------------------------
8 # Detect thread model and substitute DCFG_THREAD_MODEL
9 AC_DEFUN([DRUNTIME_OS_THREAD_MODEL],
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])
16   # Map from thread model to thread interface.
17   DRUNTIME_CONFIGURE_THREADS([$d_thread_model])
21 # DRUNTIME_CONFIGURE_THREADS(thread_model)
22 # ----------------------------------------
23 # Map target os to D version identifier
24 AC_DEFUN([DRUNTIME_CONFIGURE_THREADS],
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)
41 # DRUNTIME_OS_DETECT
42 # ------------------
43 # Set the druntime_cv_target_os variable
44 AC_DEFUN([DRUNTIME_OS_DETECT],
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       [])
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],
64   AC_REQUIRE([DRUNTIME_OS_DETECT])
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"])
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"])
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],
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])
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],
153   AC_REQUIRE([DRUNTIME_OS_DETECT])
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")));
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])
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],
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])
203 # DRUNTIME_OS_LINK_SPEC
204 # ---------------------
205 # Add target-specific link options to link_spec.
206 AC_DEFUN([DRUNTIME_OS_LINK_SPEC],
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)