[go: up one dir, main page]

Menu

[r999]: / libmona / m4 / cxxhandling.m4  Maximize  Restore  History

Download this file

279 lines (255 with data), 8.9 kB

# Check for some compiler version and options, Marc Tittgemeyer 04-04-03
# adapted from
# acinclude.m4 distributed with FFT-3.0, http://www.fftw.org

AC_DEFUN([ACX_CHECK_CXX_FLAGS],
[
AC_REQUIRE([AC_PROG_CXX])
ac_save_CXXFLAGS=$CXXFLAGS
CXXFLAGS="$1"
AC_CACHE_CHECK(whether $CXX accepts $1, ac_$2,
               [AC_COMPILE_IFELSE([AC_LANG_PROGRAM()], [ac_$2=yes], 
						       [ac_$2=no])])
CXXFLAGS=$ac_save_CXXFLAGS
if test "$ac_$2" = yes; then
	:
	$3
else
	:
	$4
fi
])

AC_DEFUN([ACX_PROG_GXX_VERSION],
[
AC_REQUIRE([AC_PROG_CXX])
AC_LANG_PUSH(C++)
AC_CACHE_CHECK(whether we are using g++ $1.$2 or later, ac_cv_prog_cxx_$1_$2,
[
dnl The semicolon after "yes" below is to pacify NeXT's syntax-checking cxxcpp.
cat > conftest.cc <<EOF
#ifdef __GNUC__ && define __cplusplus
#  if (__GNUC__ > $1) || (__GNUC__ == $1 && __GNUC_MINOR__ >= $2)
     yes;
#  endif
#endif
EOF
if AC_TRY_COMMAND(${CXX-c++} -E conftest.cc) | egrep yes >/dev/null 2>&1; then
  ac_cv_prog_cxx_$1_$2=yes
else
  ac_cv_prog_cxx_$1_$2=no
fi
])
AC_LANG_POP(C++)
if test "$ac_cv_prog_cxx_$1_$2" = yes; then
	:
	$3
else
	:
	$4
fi
])

AC_DEFUN([ACX_PROG_CXX_EGCS],
[ACX_PROG_GXX_VERSION(2,90,acx_prog_egcs=yes,acx_prog_egcs=no)])

# Check to see if we are using a version of g++ that aligns the stack
# (true in g++-2.95+, which have the -mpreferred-stack-boundary flag).
# Also check for stack alignment bug in g++-2.95.x
# (see http://egcs.cygnus.com/ml/g++-bugs/1999-11/msg00259.html), and
# whether main() is correctly aligned by the OS/libc/loader.
AC_DEFUN([ACX_GXX_ALIGNS_STACK],
[
AC_REQUIRE([AC_PROG_CXX])
acx_gxx_aligns_stack=no
if test "$GXX" = "yes"; then
ACX_CHECK_CXX_FLAGS(-mpreferred-stack-boundary=4, m_pref_stack_boundary_4)
if test "$ac_m_pref_stack_boundary_4" = "yes"; then
	AC_MSG_CHECKING([whether the stack is correctly aligned by g++])
	save_CXXFLAGS="$CXXFLAGS"
	CXXFLAGS="-O -malign-double"
	AC_LANG_PUSH(C++)
	AC_TRY_RUN([#include <stdlib.h>
#       include <stdio.h>
	struct yuck { int blechh; };
	int one(void) { return 1; }
	struct yuck ick(void) { struct yuck y; y.blechh = 3; return y; }
#       define CHK_ALIGN(x) if ((((long) &(x)) & 0x7)) { fprintf(stderr, "bad alignment of " #x "\n"); exit(1); }
	void blah(int foo) { double foobar; CHK_ALIGN(foobar); }
	int main2(void) {double ok1; struct yuck y; double ok2; CHK_ALIGN(ok1);
                         CHK_ALIGN(ok2); y = ick(); blah(one()); return 0;}
	int main(void) { if ((((long) (__builtin_alloca(0))) & 0x7)) __builtin_alloca(4); return main2(); }
	], [acx_gxx_aligns_stack=yes; acx_gxx_stack_align_bug=no], 
	acx_gxx_stack_align_bug=yes, acx_gxx_stack_align_bug=yes)
	AC_LANG_POP(C++)
	CXXFLAGS="$save_CXXFLAGS"
	AC_MSG_RESULT($acx_gxx_aligns_stack)
fi
fi
if test "$acx_gxx_aligns_stack" = yes; then
	:
	$1
else
	:
	$2
fi
])


AC_DEFUN([ACX_PROG_CXX_MAXOPT],
[
AC_REQUIRE([AC_PROG_CXX])
AC_REQUIRE([ACX_PROG_CXX_EGCS])
AC_REQUIRE([AC_CANONICAL_HOST])

# Try to determine "good" native compiler flags if none specified on command
# line
if test "$ac_test_CXXFLAGS" != "set"; then
  CXXFLAGS=""
  case "${host_cpu}-${host_os}" in

  *linux*)
	;;
  sparc-solaris2*) if test `basename "$CXX"` = c++; then
                    CXXFLAGS="-native -fast -xO5 -dalign"
                 fi;;

  alpha*-osf*)  if test "$CXX" = c++; then
                    CXXFLAGS="-newc -w0 -O5 -ansi_alias -ansi_args -fp_reorder -tune host -arch host"
                fi;;

  hppa*-hpux*)  if test "$ac_compiler_gnu" != yes; then
                    CXXFLAGS="+O3 +Oall +Ofltac++"
                fi;;

   *-aix*)
	if test "$CXX" = c++ -o "$CXX" = xlc; then
                ACX_CHECK_CXX_FLAGS(-qarch=auto -qtune=auto, qarch_auto,
                        CXXFLAGS="-O3 -qansialias -w -qarch=auto -qtune=auto",
                        [CXXFLAGS="-O3 -qansialias -w"
                echo "*******************************************************"
                echo "*  You seem to have AIX and the IBM compiler.  It is  *"
                echo "*  recommended for best performance that you use:     *"
                echo "*                                                     *"
                echo "*  CXXFLAGS=-O3 -qarch=xxx -qtune=xxx -qansialias -w  *"
                echo "*                      ^^^        ^^^                 *"
                echo "*  where xxx is pwr2, pwr3, 604, or whatever kind of  *"
                echo "*  CPU you have.  (Set the CXXFLAGS environment var.  *"
                echo "*  and re-run configure.)  For more info, man c++.    *"
                echo "*******************************************************"])
        fi;;
  esac

  # use default flags for g++ on all systems
  if test $ac_cv_prog_cxx_g = yes; then
     CXXFLAGS="-fomit-frame-pointer"
  fi

  # the egcs scheduler is too smart and destroys our own schedule.
  # Disable the first instruction scheduling pass.  The second
  # scheduling pass (after register reload) is ok.
  if test "$acx_prog_egcs" = yes; then
     if test "$1" = libmona; then
        CXXFLAGS="$CXXFLAGS -fno-schedule-insns"
     fi
  fi

  # test for g++-specific flags:
  if test $ac_cv_prog_cxx_g = yes; then
    # -malign-double for x86 systems
    ACX_CHECK_CXX_FLAGS(-malign-double,align_double,
	CXXFLAGS="$CXXFLAGS -malign-double")
    # -fstrict-aliasing for g++-2.95+
    ACX_CHECK_CXX_FLAGS(-fstrict-aliasing,fstrict_aliasing,
	CXXFLAGS="$CXXFLAGS -fstrict-aliasing")
    ACX_CHECK_CXX_FLAGS(-mpreferred-stack-boundary=4, m_psb_4,
        CXXFLAGS="$CXXFLAGS -mpreferred-stack-boundary=4")
  fi

  CPU_FLAGS=""
  CPU_OPTIM=""
  CODELET_OPTIM=""
  if test "$GXX" = "yes"; then
	  CPU_OPTIM=-O3
	  CODELET_OPTIM=-O3
	  dnl try to guess correct CPU flags, at least for linux
	  case "${host_cpu}" in
	  i586*)  ACX_CHECK_CXX_FLAGS(-mcpu=i585,cpu_i586,
			[CPU_FLAGS=-mcpu=i586],
			[ACX_CHECK_CXX_FLAGS(-mpentium,pentium,
				[CPU_FLAGS=-mpentium])])
		  if test "$1" = libmona; then
	            CODELET_OPTIM=-O
                  fi
		  if test "$1" = benchlibmona; then
	            CPU_OPTIM=-O2
                  fi
		  ;;
	  i686*)  ACX_CHECK_CXX_FLAGS(-mcpu=i686,cpu_i686,
			[CPU_FLAGS=-mcpu=i686],
			[ACX_CHECK_CXX_FLAGS(-mpentiumpro,pentiumpro,
				[CPU_FLAGS=-mpentiumpro])])
		  if test "$1" = libmona; then
	            CODELET_OPTIM=-O
                  fi
		  if test "$1" = benchlibmona; then
	            CPU_OPTIM=-O2
                  fi
		  ;;
	  sparc*)  ACX_CHECK_CXX_FLAGS(-mcpu=ultrasparc,cpu_ultrasparc,
			[CPU_FLAGS=-mcpu=ultrasparc])
		  ;;
	  alphaev67)  ACX_CHECK_CXX_FLAGS(-mcpu=ev67,cpu_ev67,
			[CPU_FLAGS=-mcpu=ev67])
		  ;;
	  alphaev6)  ACX_CHECK_CXX_FLAGS(-mcpu=ev6,cpu_ev6,
			[CPU_FLAGS=-mcpu=ev6])
		  ;;
	  alphaev56)  ACX_CHECK_CXX_FLAGS(-mcpu=ev56,cpu_ev56,
			[CPU_FLAGS=-mcpu=ev56],
			[ACX_CHECK_CXX_FLAGS(-mcpu=ev5,cpu_ev5,
				[CPU_FLAGS=-mcpu=ev5])])
		  ;;
	  alphaev5)  ACX_CHECK_CXX_FLAGS(-mcpu=ev5,cpu_ev5,
			[CPU_FLAGS=-mcpu=ev5])
		  ;;

	  powerpc*)
		cputype=`((grep cpu /proc/cpuinfo | head -1 | cut -d: -f2 | sed 's/ //g') ; /usr/bin/machine ; /bin/machine) 2> /dev/null`
		cputype=`echo $cputype | sed -e s/ppc//g`
		is60x=`echo $cputype | egrep "^60[[0-9]]e?$"`
		is750=`echo $cputype | grep "750"`
		is74xx=`echo $cputype | egrep "^74[[0-9]][[0-9]]$"`
		if test -n "$is60x"; then
			ACX_CHECK_CXX_FLAGS(-mcpu=$cputype,m_cpu_60x,
				CPU_FLAGS=-mcpu=$cputype)
		elif test -n "$is750"; then
			ACX_CHECK_CXX_FLAGS(-mcpu=750,m_cpu_750,
				CPU_FLAGS=-mcpu=750)
		elif test -n "$is74xx"; then
			ACX_CHECK_CXX_FLAGS(-mcpu=$cputype,m_cpu_74xx,
				CPU_FLAGS=-mcpu=$cputype)
		fi
		if test -z "$CPU_FLAGS"; then
		        ACX_CHECK_CXX_FLAGS(-mcpu=powerpc,m_cpu_powerpc,
				CPU_FLAGS=-mcpu=powerpc)
		fi
		if test -z "$CPU_FLAGS"; then
			ACX_CHECK_CXX_FLAGS(-mpowerpc,m_powerpc,
				CPU_FLAGS=-mpowerpc)
		fi
	  esac
  fi


  if test -n "$CPU_OPTIM"; then
        CXXFLAGS="$CPU_OPTIM $CXXFLAGS"
  fi

  if test -n "$CPU_FLAGS"; then
        CXXFLAGS="$CXXFLAGS $CPU_FLAGS"
  fi

  AC_SUBST(CODELET_OPTIM)

  if test -z "$CXXFLAGS"; then
	echo ""
	echo "**********************************************************"
        echo "* WARNING: Don't know the best CXXFLAGS for this system  *"
        echo "* Use  make CXXFLAGS=..., or edit the top level Makefile *"
	echo "* (otherwise, a default of CXXFLAGS=-O3 will be used)    *"
	echo "**********************************************************"
	echo ""
        CXXFLAGS="-O3"
  fi

  ACX_CHECK_CXX_FLAGS(${CXXFLAGS}, guessed_cflags, , [
	echo ""
        echo "**********************************************************"
        echo "* WARNING: The guessed CXXFLAGS don't seem to work with  *"
        echo "* your compiler.                                         *"
        echo "* Use  make CXXFLAGS=..., or edit the top level Makefile *"
        echo "**********************************************************"
        echo ""
        CXXFLAGS=""
  ])

fi
])