aclocal.m4 revision 77298
1dnl See whether strncmp reads past the end of its string parameters.
2dnl On some versions of SunOS4 at least, strncmp reads a word at a time
3dnl but erroneously reads past the end of strings.  This can cause
4dnl a SEGV in some cases.
5AC_DEFUN(libiberty_AC_FUNC_STRNCMP,
6[AC_REQUIRE([AC_FUNC_MMAP])
7AC_CACHE_CHECK([for working strncmp], ac_cv_func_strncmp_works,
8[AC_TRY_RUN([
9/* Test by Jim Wilson and Kaveh Ghazi.
10   Check whether strncmp reads past the end of its string parameters. */
11#include <sys/types.h>
12
13#ifdef HAVE_FCNTL_H
14#include <fcntl.h>
15#endif
16
17#ifdef HAVE_SYS_MMAN_H
18#include <sys/mman.h>
19#endif
20
21#ifndef MAP_ANON
22#ifdef MAP_ANONYMOUS
23#define MAP_ANON MAP_ANONYMOUS
24#else
25#define MAP_ANON MAP_FILE
26#endif
27#endif
28
29#ifndef MAP_FILE
30#define MAP_FILE 0
31#endif
32#ifndef O_RDONLY
33#define O_RDONLY 0
34#endif
35
36#define MAP_LEN 0x10000
37
38main ()
39{
40#if defined(HAVE_MMAP) || defined(HAVE_MMAP_ANYWHERE)
41  char *p;
42  int dev_zero;
43
44  dev_zero = open ("/dev/zero", O_RDONLY);
45  if (dev_zero < 0)
46    exit (1);
47  
48  p = (char *) mmap (0, MAP_LEN, PROT_READ|PROT_WRITE,
49		     MAP_ANON|MAP_PRIVATE, dev_zero, 0);
50  if (p == (char *)-1)
51    exit (2);
52  else
53    {
54      char *string = "__si_type_info";
55      char *q = (char *) p + MAP_LEN - strlen (string) - 2;
56      char *r = (char *) p + 0xe;
57
58      strcpy (q, string);
59      strcpy (r, string);
60      strncmp (r, q, 14);
61    }
62#endif /* HAVE_MMAP || HAVE_MMAP_ANYWHERE */
63  exit (0);
64}
65], ac_cv_func_strncmp_works=yes, ac_cv_func_strncmp_works=no,
66  ac_cv_func_strncmp_works=no)
67rm -f core core.* *.core])
68if test $ac_cv_func_strncmp_works = no ; then
69  LIBOBJS="$LIBOBJS strncmp.o"
70fi
71])
72
73dnl See if errno must be declared even when <errno.h> is included.
74AC_DEFUN(libiberty_AC_DECLARE_ERRNO,
75[AC_CACHE_CHECK(whether errno must be declared, libiberty_cv_declare_errno,
76[AC_TRY_COMPILE(
77[#include <errno.h>],
78[int x = errno;],
79libiberty_cv_declare_errno=no,
80libiberty_cv_declare_errno=yes)])
81if test $libiberty_cv_declare_errno = yes
82then AC_DEFINE(NEED_DECLARATION_ERRNO, 1,
83  [Define if errno must be declared even when <errno.h> is included.])
84fi
85])
86
87# FIXME: We temporarily define our own version of AC_PROG_CC.  This is
88# copied from autoconf 2.12, but does not call AC_PROG_CC_WORKS.  We
89# are probably using a cross compiler, which will not be able to fully
90# link an executable.  This should really be fixed in autoconf
91# itself.
92
93AC_DEFUN(LIB_AC_PROG_CC,
94[AC_BEFORE([$0], [AC_PROG_CPP])dnl
95AC_PROVIDE([AC_PROG_CC])
96AC_CHECK_PROG(CC, gcc, gcc)
97if test -z "$CC"; then
98  AC_CHECK_PROG(CC, cc, cc, , , /usr/ucb/cc)
99  test -z "$CC" && AC_MSG_ERROR([no acceptable cc found in \$PATH])
100fi
101
102AC_PROG_CC_GNU
103
104if test $ac_cv_prog_gcc = yes; then
105  GCC=yes
106  ac_libiberty_warn_cflags='-W -Wall -Wtraditional -pedantic'
107dnl Check whether -g works, even if CFLAGS is set, in case the package
108dnl plays around with CFLAGS (such as to build both debugging and
109dnl normal versions of a library), tasteless as that idea is.
110  ac_test_CFLAGS="${CFLAGS+set}"
111  ac_save_CFLAGS="$CFLAGS"
112  CFLAGS=
113  AC_PROG_CC_G
114  if test "$ac_test_CFLAGS" = set; then
115    CFLAGS="$ac_save_CFLAGS"
116  elif test $ac_cv_prog_cc_g = yes; then
117    CFLAGS="-g -O2"
118  else
119    CFLAGS="-O2"
120  fi
121else
122  GCC=
123  ac_libiberty_warn_cflags=
124  test "${CFLAGS+set}" = set || CFLAGS="-g"
125fi
126AC_SUBST(ac_libiberty_warn_cflags)
127])
128
129# Work around a bug in autoheader.  This can go away when we switch to
130# autoconf >2.50.  The use of define instead of AC_DEFUN is
131# deliberate.
132define(AC_DEFINE_NOAUTOHEADER,
133[cat >> confdefs.h <<\EOF
134[#define] $1 ifelse($#, 2, [$2], $#, 3, [$2], 1)
135EOF
136])
137