1sinclude(../config/acx.m4) 2sinclude(../config/no-executables.m4) 3sinclude(../config/override.m4) 4sinclude(../config/warnings.m4) 5 6dnl See whether strncmp reads past the end of its string parameters. 7dnl On some versions of SunOS4 at least, strncmp reads a word at a time 8dnl but erroneously reads past the end of strings. This can cause 9dnl a SEGV in some cases. 10AC_DEFUN(libiberty_AC_FUNC_STRNCMP, 11[AC_REQUIRE([AC_FUNC_MMAP]) 12AC_CACHE_CHECK([for working strncmp], ac_cv_func_strncmp_works, 13[AC_TRY_RUN([ 14/* Test by Jim Wilson and Kaveh Ghazi. 15 Check whether strncmp reads past the end of its string parameters. */ 16#include <sys/types.h> 17 18#ifdef HAVE_FCNTL_H 19#include <fcntl.h> 20#endif 21 22#ifdef HAVE_SYS_MMAN_H 23#include <sys/mman.h> 24#endif 25 26#ifndef MAP_ANON 27#ifdef MAP_ANONYMOUS 28#define MAP_ANON MAP_ANONYMOUS 29#else 30#define MAP_ANON MAP_FILE 31#endif 32#endif 33 34#ifndef MAP_FILE 35#define MAP_FILE 0 36#endif 37#ifndef O_RDONLY 38#define O_RDONLY 0 39#endif 40 41#define MAP_LEN 0x10000 42 43main () 44{ 45#if defined(HAVE_MMAP) || defined(HAVE_MMAP_ANYWHERE) 46 char *p; 47 int dev_zero; 48 49 dev_zero = open ("/dev/zero", O_RDONLY); 50 if (dev_zero < 0) 51 exit (1); 52 53 p = (char *) mmap (0, MAP_LEN, PROT_READ|PROT_WRITE, 54 MAP_ANON|MAP_PRIVATE, dev_zero, 0); 55 if (p == (char *)-1) 56 p = (char *) mmap (0, MAP_LEN, PROT_READ|PROT_WRITE, 57 MAP_ANON|MAP_PRIVATE, -1, 0); 58 if (p == (char *)-1) 59 exit (2); 60 else 61 { 62 char *string = "__si_type_info"; 63 char *q = (char *) p + MAP_LEN - strlen (string) - 2; 64 char *r = (char *) p + 0xe; 65 66 strcpy (q, string); 67 strcpy (r, string); 68 strncmp (r, q, 14); 69 } 70#endif /* HAVE_MMAP || HAVE_MMAP_ANYWHERE */ 71 exit (0); 72} 73], ac_cv_func_strncmp_works=yes, ac_cv_func_strncmp_works=no, 74 ac_cv_func_strncmp_works=no) 75rm -f core core.* *.core]) 76if test $ac_cv_func_strncmp_works = no ; then 77 AC_LIBOBJ([strncmp]) 78fi 79]) 80 81dnl See if errno must be declared even when <errno.h> is included. 82AC_DEFUN(libiberty_AC_DECLARE_ERRNO, 83[AC_CACHE_CHECK(whether errno must be declared, libiberty_cv_declare_errno, 84[AC_TRY_COMPILE( 85[#include <errno.h>], 86[int x = errno;], 87libiberty_cv_declare_errno=no, 88libiberty_cv_declare_errno=yes)]) 89if test $libiberty_cv_declare_errno = yes 90then AC_DEFINE(NEED_DECLARATION_ERRNO, 1, 91 [Define if errno must be declared even when <errno.h> is included.]) 92fi 93]) 94 95dnl See whether we need a declaration for a function. 96AC_DEFUN(libiberty_NEED_DECLARATION, 97[AC_MSG_CHECKING([whether $1 must be declared]) 98AC_CACHE_VAL(libiberty_cv_decl_needed_$1, 99[AC_TRY_COMPILE([ 100#include "confdefs.h" 101#include <stdio.h> 102#ifdef HAVE_STRING_H 103#include <string.h> 104#else 105#ifdef HAVE_STRINGS_H 106#include <strings.h> 107#endif 108#endif 109#ifdef HAVE_STDLIB_H 110#include <stdlib.h> 111#endif 112#ifdef HAVE_UNISTD_H 113#include <unistd.h> 114#endif], 115[char *(*pfn) = (char *(*)) $1], 116libiberty_cv_decl_needed_$1=no, libiberty_cv_decl_needed_$1=yes)]) 117AC_MSG_RESULT($libiberty_cv_decl_needed_$1) 118if test $libiberty_cv_decl_needed_$1 = yes; then 119 AC_DEFINE([NEED_DECLARATION_]translit($1, [a-z], [A-Z]), 1, 120 [Define if $1 is not declared in system header files.]) 121fi 122])dnl 123 124# We always want a C version of alloca() compiled into libiberty, 125# because native-compiler support for the real alloca is so !@#$% 126# unreliable that GCC has decided to use it only when being compiled 127# by GCC. This is the part of AC_FUNC_ALLOCA that calculates the 128# information alloca.c needs. 129AC_DEFUN(libiberty_AC_FUNC_C_ALLOCA, 130[AC_CACHE_CHECK(whether alloca needs Cray hooks, ac_cv_os_cray, 131[AC_EGREP_CPP(webecray, 132[#if defined(CRAY) && ! defined(CRAY2) 133webecray 134#else 135wenotbecray 136#endif 137], ac_cv_os_cray=yes, ac_cv_os_cray=no)]) 138if test $ac_cv_os_cray = yes; then 139 for ac_func in _getb67 GETB67 getb67; do 140 AC_CHECK_FUNC($ac_func, 141 [AC_DEFINE_UNQUOTED(CRAY_STACKSEG_END, $ac_func, 142 [Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP 143 systems. This function is required for alloca.c support on those 144 systems.]) break]) 145 done 146fi 147 148AC_CACHE_CHECK(stack direction for C alloca, ac_cv_c_stack_direction, 149[AC_TRY_RUN([find_stack_direction () 150{ 151 static char *addr = 0; 152 auto char dummy; 153 if (addr == 0) 154 { 155 addr = &dummy; 156 return find_stack_direction (); 157 } 158 else 159 return (&dummy > addr) ? 1 : -1; 160} 161main () 162{ 163 exit (find_stack_direction() < 0); 164}], 165 ac_cv_c_stack_direction=1, 166 ac_cv_c_stack_direction=-1, 167 ac_cv_c_stack_direction=0)]) 168AC_DEFINE_UNQUOTED(STACK_DIRECTION, $ac_cv_c_stack_direction, 169 [Define if you know the direction of stack growth for your system; 170 otherwise it will be automatically deduced at run-time. 171 STACK_DIRECTION > 0 => grows toward higher addresses 172 STACK_DIRECTION < 0 => grows toward lower addresses 173 STACK_DIRECTION = 0 => direction of growth unknown]) 174]) 175 176# AC_LANG_FUNC_LINK_TRY(C)(FUNCTION) 177# ---------------------------------- 178# Don't include <ctype.h> because on OSF/1 3.0 it includes 179# <sys/types.h> which includes <sys/select.h> which contains a 180# prototype for select. Similarly for bzero. 181# 182# This test used to merely assign f=$1 in main(), but that was 183# optimized away by HP unbundled cc A.05.36 for ia64 under +O3, 184# presumably on the basis that there's no need to do that store if the 185# program is about to exit. Conversely, the AIX linker optimizes an 186# unused external declaration that initializes f=$1. So this test 187# program has both an external initialization of f, and a use of f in 188# main that affects the exit status. 189# 190m4_define([AC_LANG_FUNC_LINK_TRY(C)], 191[AC_LANG_PROGRAM( 192[/* System header to define __stub macros and hopefully few prototypes, 193 which can conflict with char $1 (); below. 194 Prefer <limits.h> to <assert.h> if __STDC__ is defined, since 195 <limits.h> exists even on freestanding compilers. Under hpux, 196 including <limits.h> includes <sys/time.h> and causes problems 197 checking for functions defined therein. */ 198#if defined (__STDC__) && !defined (_HPUX_SOURCE) 199# include <limits.h> 200#else 201# include <assert.h> 202#endif 203/* Override any gcc2 internal prototype to avoid an error. */ 204#ifdef __cplusplus 205extern "C" 206{ 207#endif 208/* We use char because int might match the return type of a gcc2 209 builtin and then its argument prototype would still apply. */ 210char $1 (); 211/* The GNU C library defines this for functions which it implements 212 to always fail with ENOSYS. Some functions are actually named 213 something starting with __ and the normal name is an alias. */ 214#if defined (__stub_$1) || defined (__stub___$1) 215choke me 216#else 217char (*f) () = $1; 218#endif 219#ifdef __cplusplus 220} 221#endif 222], [return f != $1;])]) 223 224