fc311a6ca5
If the default value of `ofc_type_size` is `$ac_cv_sizeof_int`, `OMPI_SIZEOF_FORTRAN_*` of all unavailable types become `sizeof(int)`. This leads `OMPI_SIZEOF_FORTRAN_REAL2 == OMPI_SIZEOF_FORTRAN_REAL` to become true unintentionally and `OMPI_DATATYPE_MPI_REAL2` has a wrong value in `ompi/datatype/ompi_datatype_internal.h`. This is not an actual bug because datatypes for unavailable types are not used. However it is confusing. I looked the source tree and the history but could find any basis of `$ac_cv_sizeof_int`. If we don't use `implicit none` in `OMPI_FORTRAN_GET_KIND_VALUE`, and if a Fortran compiler does not support `ISO_C_BINDING` completely, a random value is set in `value` and the fallback route is not used. It is not our intention. Signed-off-by: KAWASHIMA Takahiro <t-kawashima@jp.fujitsu.com>
104 строки
4.0 KiB
Bash
104 строки
4.0 KiB
Bash
dnl -*- shell-script -*-
|
|
dnl
|
|
dnl Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana
|
|
dnl University Research and Technology
|
|
dnl Corporation. All rights reserved.
|
|
dnl Copyright (c) 2004-2005 The University of Tennessee and The University
|
|
dnl of Tennessee Research Foundation. All rights
|
|
dnl reserved.
|
|
dnl Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
|
dnl University of Stuttgart. All rights reserved.
|
|
dnl Copyright (c) 2004-2005 The Regents of the University of California.
|
|
dnl All rights reserved.
|
|
dnl Copyright (c) 2010-2012 Cisco Systems, Inc. All rights reserved.
|
|
dnl Copyright (c) 2015 Research Organization for Information Science
|
|
dnl and Technology (RIST). All rights reserved.
|
|
dnl Copyright (c) 2018 FUJITSU LIMITED. All rights reserved.
|
|
dnl $COPYRIGHT$
|
|
dnl
|
|
dnl Additional copyrights may follow
|
|
dnl
|
|
dnl $HEADER$
|
|
dnl
|
|
|
|
# OMPI_FORTRAN_GET_KIND_VALUE(kind, decimal range, variable to set)
|
|
# -----------------------------------------------------------------
|
|
AC_DEFUN([OMPI_FORTRAN_GET_KIND_VALUE],[
|
|
# Use of m4_translit suggested by Eric Blake:
|
|
# http://lists.gnu.org/archive/html/bug-autoconf/2010-10/msg00016.html
|
|
AS_VAR_PUSHDEF([kind_value_var],
|
|
m4_translit([[ompi_cv_fortran_kind_value_$1]], [*], [p]))
|
|
|
|
rm -f conftest.out
|
|
AC_CACHE_CHECK([KIND value of Fortran $1], kind_value_var,
|
|
[if test $OMPI_TRY_FORTRAN_BINDINGS -eq $OMPI_FORTRAN_NO_BINDINGS || \
|
|
test $ompi_fortran_happy -eq 0; then
|
|
value=skipped
|
|
else
|
|
AC_LANG_PUSH([Fortran])
|
|
value=
|
|
AC_RUN_IFELSE(AC_LANG_PROGRAM(, [[
|
|
use, intrinsic :: ISO_C_BINDING
|
|
implicit none
|
|
open(unit = 7, file = "conftest.out")
|
|
write(7, *) $1
|
|
close(7)
|
|
]]), [value=`cat conftest.out | awk '{print [$]1}'`], [value=no], [value=cross])
|
|
rm -f conftest.out
|
|
fi
|
|
|
|
# If the compiler is ancient enough to not support the
|
|
# ISO_C_BINDING stuff, then we have to fall back to older
|
|
# tests. Yuck.
|
|
AS_IF([test "$value" = "no"],
|
|
[AC_MSG_RESULT([no ISO_C_BINDING -- fallback])
|
|
_OMPI_FORTRAN_SELECTED_INT_KIND($2, value)])
|
|
|
|
AS_IF([test "$value" = "no"],
|
|
[AC_MSG_WARN([Could not determine KIND value of $1])
|
|
AC_MSG_WARN([See config.log for more details])
|
|
AC_MSG_ERROR([Cannot continue])])
|
|
|
|
AS_IF([test "$value" = "cross"],
|
|
[AC_MSG_ERROR([Can not determine KIND value of $1 when cross-compiling])])
|
|
|
|
AS_VAR_SET(kind_value_var, [$value])
|
|
AC_LANG_POP([Fortran])
|
|
unset value
|
|
])
|
|
|
|
AS_VAR_COPY([$3], [kind_value_var])
|
|
AS_VAR_POPDEF([kind_value_var])
|
|
])dnl
|
|
|
|
# _OMPI_FORTRAN_SELECTED_INT_KIND(decimal range, variable to set)
|
|
# -----------------------------------------------------------------
|
|
AC_DEFUN([_OMPI_FORTRAN_SELECTED_INT_KIND],[
|
|
AS_VAR_PUSHDEF([sel_int_kind_var], [ompi_cv_fortran_int_kind_$1])
|
|
AC_CACHE_CHECK([Fortran value of selected_int_kind($1)], sel_int_kind_var,
|
|
[outval=no
|
|
|
|
AS_IF([test $OMPI_TRY_FORTRAN_BINDINGS -gt $OMPI_FORTRAN_NO_BINDINGS && \
|
|
test $ompi_fortran_happy -eq 1],
|
|
[rm -f conftest.out
|
|
AC_LANG_PUSH([Fortran])
|
|
AC_RUN_IFELSE(AC_LANG_PROGRAM(, [[
|
|
open(8, file="conftest.out")
|
|
write(8, fmt="(I5)") selected_int_kind($1)
|
|
close(8)
|
|
]]), [outval=`cat conftest.out | awk '{print [$]1}'`], [outval=no], [outval=cross])
|
|
rm -f conftest.out
|
|
AC_LANG_POP([Fortran])
|
|
])
|
|
|
|
AS_VAR_SET(sel_int_kind_var, [$outval])
|
|
unset outval
|
|
])
|
|
|
|
# All analysis of $value is done in the upper-level / calling
|
|
# macro
|
|
|
|
AS_VAR_COPY([$2], [sel_int_kind_var])
|
|
AS_VAR_POPDEF([sel_int_kind_var])dnl
|
|
])
|