1*f22f0ef4Schristosdnl Copyright (C) 2000-2022 Free Software Foundation, Inc. 2*f22f0ef4Schristosdnl 3*f22f0ef4Schristosdnl GCC is free software; you can redistribute it and/or modify 4*f22f0ef4Schristosdnl it under the terms of the GNU General Public License as published by 5*f22f0ef4Schristosdnl the Free Software Foundation; either version 3, or (at your option) 6*f22f0ef4Schristosdnl any later version. 7*f22f0ef4Schristosdnl 8*f22f0ef4Schristosdnl GCC is distributed in the hope that it will be useful, 9*f22f0ef4Schristosdnl but WITHOUT ANY WARRANTY; without even the implied warranty of 10*f22f0ef4Schristosdnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11*f22f0ef4Schristosdnl GNU General Public License for more details. 12*f22f0ef4Schristosdnl 13*f22f0ef4Schristosdnl You should have received a copy of the GNU General Public License 14*f22f0ef4Schristosdnl along with GCC; see the file COPYING3. If not see 15*f22f0ef4Schristosdnl <http://www.gnu.org/licenses/>. 16*f22f0ef4Schristos 17*f22f0ef4Schristosdnl See whether strncmp reads past the end of its string parameters. 18*f22f0ef4Schristosdnl On some versions of SunOS4 at least, strncmp reads a word at a time 19*f22f0ef4Schristosdnl but erroneously reads past the end of strings. This can cause 20*f22f0ef4Schristosdnl a SEGV in some cases. 21*f22f0ef4SchristosAC_DEFUN([libiberty_AC_FUNC_STRNCMP], 22*f22f0ef4Schristos[AC_REQUIRE([AC_FUNC_MMAP]) 23*f22f0ef4SchristosAC_CACHE_CHECK([for working strncmp], ac_cv_func_strncmp_works, 24*f22f0ef4Schristos[AC_TRY_RUN([ 25*f22f0ef4Schristos/* Test by Jim Wilson and Kaveh Ghazi. 26*f22f0ef4Schristos Check whether strncmp reads past the end of its string parameters. */ 27*f22f0ef4Schristos#include <sys/types.h> 28*f22f0ef4Schristos 29*f22f0ef4Schristos#ifdef HAVE_FCNTL_H 30*f22f0ef4Schristos#include <fcntl.h> 31*f22f0ef4Schristos#endif 32*f22f0ef4Schristos 33*f22f0ef4Schristos#ifdef HAVE_SYS_MMAN_H 34*f22f0ef4Schristos#include <sys/mman.h> 35*f22f0ef4Schristos#endif 36*f22f0ef4Schristos 37*f22f0ef4Schristos#ifndef MAP_ANON 38*f22f0ef4Schristos#ifdef MAP_ANONYMOUS 39*f22f0ef4Schristos#define MAP_ANON MAP_ANONYMOUS 40*f22f0ef4Schristos#else 41*f22f0ef4Schristos#define MAP_ANON MAP_FILE 42*f22f0ef4Schristos#endif 43*f22f0ef4Schristos#endif 44*f22f0ef4Schristos 45*f22f0ef4Schristos#ifndef MAP_FILE 46*f22f0ef4Schristos#define MAP_FILE 0 47*f22f0ef4Schristos#endif 48*f22f0ef4Schristos#ifndef O_RDONLY 49*f22f0ef4Schristos#define O_RDONLY 0 50*f22f0ef4Schristos#endif 51*f22f0ef4Schristos 52*f22f0ef4Schristos#define MAP_LEN 0x10000 53*f22f0ef4Schristos 54*f22f0ef4Schristosmain () 55*f22f0ef4Schristos{ 56*f22f0ef4Schristos#if defined(HAVE_MMAP) || defined(HAVE_MMAP_ANYWHERE) 57*f22f0ef4Schristos char *p; 58*f22f0ef4Schristos int dev_zero; 59*f22f0ef4Schristos 60*f22f0ef4Schristos dev_zero = open ("/dev/zero", O_RDONLY); 61*f22f0ef4Schristos if (dev_zero < 0) 62*f22f0ef4Schristos exit (1); 63*f22f0ef4Schristos 64*f22f0ef4Schristos p = (char *) mmap (0, MAP_LEN, PROT_READ|PROT_WRITE, 65*f22f0ef4Schristos MAP_ANON|MAP_PRIVATE, dev_zero, 0); 66*f22f0ef4Schristos if (p == (char *)-1) 67*f22f0ef4Schristos p = (char *) mmap (0, MAP_LEN, PROT_READ|PROT_WRITE, 68*f22f0ef4Schristos MAP_ANON|MAP_PRIVATE, -1, 0); 69*f22f0ef4Schristos if (p == (char *)-1) 70*f22f0ef4Schristos exit (2); 71*f22f0ef4Schristos else 72*f22f0ef4Schristos { 73*f22f0ef4Schristos char *string = "__si_type_info"; 74*f22f0ef4Schristos char *q = (char *) p + MAP_LEN - strlen (string) - 2; 75*f22f0ef4Schristos char *r = (char *) p + 0xe; 76*f22f0ef4Schristos 77*f22f0ef4Schristos strcpy (q, string); 78*f22f0ef4Schristos strcpy (r, string); 79*f22f0ef4Schristos strncmp (r, q, 14); 80*f22f0ef4Schristos } 81*f22f0ef4Schristos#endif /* HAVE_MMAP || HAVE_MMAP_ANYWHERE */ 82*f22f0ef4Schristos exit (0); 83*f22f0ef4Schristos} 84*f22f0ef4Schristos], ac_cv_func_strncmp_works=yes, ac_cv_func_strncmp_works=no, 85*f22f0ef4Schristos ac_cv_func_strncmp_works=yes) 86*f22f0ef4Schristosrm -f core core.* *.core]) 87*f22f0ef4Schristosif test $ac_cv_func_strncmp_works = no ; then 88*f22f0ef4Schristos AC_LIBOBJ([strncmp]) 89*f22f0ef4Schristosfi 90*f22f0ef4Schristos]) 91*f22f0ef4Schristos 92*f22f0ef4Schristosdnl See if errno must be declared even when <errno.h> is included. 93*f22f0ef4SchristosAC_DEFUN([libiberty_AC_DECLARE_ERRNO], 94*f22f0ef4Schristos[AC_CACHE_CHECK(whether errno must be declared, libiberty_cv_declare_errno, 95*f22f0ef4Schristos[AC_TRY_COMPILE( 96*f22f0ef4Schristos[#include <errno.h>], 97*f22f0ef4Schristos[int x = errno;], 98*f22f0ef4Schristoslibiberty_cv_declare_errno=no, 99*f22f0ef4Schristoslibiberty_cv_declare_errno=yes)]) 100*f22f0ef4Schristosif test $libiberty_cv_declare_errno = yes 101*f22f0ef4Schristosthen AC_DEFINE(NEED_DECLARATION_ERRNO, 1, 102*f22f0ef4Schristos [Define if errno must be declared even when <errno.h> is included.]) 103*f22f0ef4Schristosfi 104*f22f0ef4Schristos]) 105*f22f0ef4Schristos 106*f22f0ef4Schristosdnl See whether we need a declaration for a function. 107*f22f0ef4SchristosAC_DEFUN([libiberty_NEED_DECLARATION], 108*f22f0ef4Schristos[AC_MSG_CHECKING([whether $1 must be declared]) 109*f22f0ef4SchristosAC_CACHE_VAL(libiberty_cv_decl_needed_$1, 110*f22f0ef4Schristos[AC_TRY_COMPILE([ 111*f22f0ef4Schristos#include "confdefs.h" 112*f22f0ef4Schristos#include <stdio.h> 113*f22f0ef4Schristos#ifdef HAVE_STRING_H 114*f22f0ef4Schristos#include <string.h> 115*f22f0ef4Schristos#else 116*f22f0ef4Schristos#ifdef HAVE_STRINGS_H 117*f22f0ef4Schristos#include <strings.h> 118*f22f0ef4Schristos#endif 119*f22f0ef4Schristos#endif 120*f22f0ef4Schristos#ifdef HAVE_STDLIB_H 121*f22f0ef4Schristos#include <stdlib.h> 122*f22f0ef4Schristos#endif 123*f22f0ef4Schristos#ifdef HAVE_UNISTD_H 124*f22f0ef4Schristos#include <unistd.h> 125*f22f0ef4Schristos#endif], 126*f22f0ef4Schristos[char *(*pfn) = (char *(*)) $1], 127*f22f0ef4Schristoslibiberty_cv_decl_needed_$1=no, libiberty_cv_decl_needed_$1=yes)]) 128*f22f0ef4SchristosAC_MSG_RESULT($libiberty_cv_decl_needed_$1) 129*f22f0ef4Schristosif test $libiberty_cv_decl_needed_$1 = yes; then 130*f22f0ef4Schristos AC_DEFINE([NEED_DECLARATION_]translit($1, [a-z], [A-Z]), 1, 131*f22f0ef4Schristos [Define if $1 is not declared in system header files.]) 132*f22f0ef4Schristosfi 133*f22f0ef4Schristos])dnl 134*f22f0ef4Schristos 135*f22f0ef4Schristos# We always want a C version of alloca() compiled into libiberty, 136*f22f0ef4Schristos# because native-compiler support for the real alloca is so !@#$% 137*f22f0ef4Schristos# unreliable that GCC has decided to use it only when being compiled 138*f22f0ef4Schristos# by GCC. This is the part of AC_FUNC_ALLOCA that calculates the 139*f22f0ef4Schristos# information alloca.c needs. 140*f22f0ef4SchristosAC_DEFUN([libiberty_AC_FUNC_C_ALLOCA], 141*f22f0ef4Schristos[AC_CACHE_CHECK(whether alloca needs Cray hooks, ac_cv_os_cray, 142*f22f0ef4Schristos[AC_EGREP_CPP(webecray, 143*f22f0ef4Schristos[#if defined(CRAY) && ! defined(CRAY2) 144*f22f0ef4Schristoswebecray 145*f22f0ef4Schristos#else 146*f22f0ef4Schristoswenotbecray 147*f22f0ef4Schristos#endif 148*f22f0ef4Schristos], ac_cv_os_cray=yes, ac_cv_os_cray=no)]) 149*f22f0ef4Schristosif test $ac_cv_os_cray = yes; then 150*f22f0ef4Schristos for ac_func in _getb67 GETB67 getb67; do 151*f22f0ef4Schristos AC_CHECK_FUNC($ac_func, 152*f22f0ef4Schristos [AC_DEFINE_UNQUOTED(CRAY_STACKSEG_END, $ac_func, 153*f22f0ef4Schristos [Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP 154*f22f0ef4Schristos systems. This function is required for alloca.c support on those 155*f22f0ef4Schristos systems.]) break]) 156*f22f0ef4Schristos done 157*f22f0ef4Schristosfi 158*f22f0ef4Schristos 159*f22f0ef4SchristosAC_CACHE_CHECK(stack direction for C alloca, ac_cv_c_stack_direction, 160*f22f0ef4Schristos[AC_TRY_RUN([find_stack_direction () 161*f22f0ef4Schristos{ 162*f22f0ef4Schristos static char *addr = 0; 163*f22f0ef4Schristos auto char dummy; 164*f22f0ef4Schristos if (addr == 0) 165*f22f0ef4Schristos { 166*f22f0ef4Schristos addr = &dummy; 167*f22f0ef4Schristos return find_stack_direction (); 168*f22f0ef4Schristos } 169*f22f0ef4Schristos else 170*f22f0ef4Schristos return (&dummy > addr) ? 1 : -1; 171*f22f0ef4Schristos} 172*f22f0ef4Schristosmain () 173*f22f0ef4Schristos{ 174*f22f0ef4Schristos exit (find_stack_direction() < 0); 175*f22f0ef4Schristos}], 176*f22f0ef4Schristos ac_cv_c_stack_direction=1, 177*f22f0ef4Schristos ac_cv_c_stack_direction=-1, 178*f22f0ef4Schristos ac_cv_c_stack_direction=0)]) 179*f22f0ef4SchristosAC_DEFINE_UNQUOTED(STACK_DIRECTION, $ac_cv_c_stack_direction, 180*f22f0ef4Schristos [Define if you know the direction of stack growth for your system; 181*f22f0ef4Schristos otherwise it will be automatically deduced at run-time. 182*f22f0ef4Schristos STACK_DIRECTION > 0 => grows toward higher addresses 183*f22f0ef4Schristos STACK_DIRECTION < 0 => grows toward lower addresses 184*f22f0ef4Schristos STACK_DIRECTION = 0 => direction of growth unknown]) 185*f22f0ef4Schristos]) 186