Blame src/openpa/confdb/aclocal_attr_alias.m4

Packit Service c5cf8c
dnl
Packit Service c5cf8c
dnl Check for BSD or POSIZ style global symbol lister, nm.
Packit Service c5cf8c
dnl If found, pac_path_NM_G contains the absolute athname of nm + options
Packit Service c5cf8c
dnl pac_path_NM_G_type will be either POSIX or BSD.  NM_G will be
Packit Service c5cf8c
dnl pac_path_NM_G without the absolute path.  Preference is BSD style.
Packit Service c5cf8c
dnl
Packit Service c5cf8c
dnl The test checks if nm accepts the known options and also if nm produces
Packit Service c5cf8c
dnl the expected BSD or POSIX output format.
Packit Service c5cf8c
dnl
Packit Service c5cf8c
AC_DEFUN([PAC_PATH_NM_G],[
Packit Service c5cf8c
AC_MSG_CHECKING([for BSD/POSIX style global symbol lister])
Packit Service c5cf8c
AC_LANG_PUSH(C)
Packit Service c5cf8c
AC_PATH_PROGS_FEATURE_CHECK(NM_G, nm, [
Packit Service c5cf8c
    # Check if nm accepts -g and BSD or POSIX compatible flag.
Packit Service c5cf8c
    # Use the `sed 1q' to avoid HP-UX's unknown option message:
Packit Service c5cf8c
    #   nm: unknown option "B" ignored
Packit Service c5cf8c
    # Tru64's nm complains that /dev/null is an invalid object file
Packit Service c5cf8c
    #
Packit Service c5cf8c
    # AIX's sed does not accept \+, 1) instead of doing 's|a\+||', do 's|aa*||'
Packit Service c5cf8c
    # or 2) instead of 's|A \+B|AB|g', do 's|A  *B|AB|g' 
Packit Service c5cf8c
Packit Service c5cf8c
    # Check if nm accepts -g
Packit Service c5cf8c
    case `${ac_path_NM_G} -g /dev/null 2>&1 | sed '1q'` in
Packit Service c5cf8c
    */dev/null* | *'Invalid file or object type'*)
Packit Service c5cf8c
        ac_path_NM_G="${ac_path_NM_G} -g"
Packit Service c5cf8c
        # Check if nm accepts -B
Packit Service c5cf8c
        case `${ac_path_NM_G} -B /dev/null 2>&1 | sed '1q'` in
Packit Service c5cf8c
        */dev/null* | *'Invalid file or object type'*)
Packit Service c5cf8c
            AC_COMPILE_IFELSE([
Packit Service c5cf8c
                AC_LANG_SOURCE([int iglobal;])
Packit Service c5cf8c
            ],[
Packit Service c5cf8c
                changequote(,)
Packit Service c5cf8c
                case `${ac_path_NM_G} -B conftest.$OBJEXT | sed -e 's|[0-9][0-9]*  *[A-Z]  *iglobal|XXXX|g'` in
Packit Service c5cf8c
                *XXXX*)
Packit Service c5cf8c
                    pac_path_NM_G="${ac_path_NM_G} -B"
Packit Service c5cf8c
                    pac_path_NM_G_type="BSD"
Packit Service c5cf8c
                    ;;
Packit Service c5cf8c
                esac
Packit Service c5cf8c
                changequote([,])
Packit Service c5cf8c
            ])
Packit Service c5cf8c
            ;;
Packit Service c5cf8c
        *)
Packit Service c5cf8c
            # Check if nm accepts -P
Packit Service c5cf8c
            case `${ac_path_NM_G} -P /dev/null 2>&1 | sed '1q'` in
Packit Service c5cf8c
            */dev/null* | *'Invalid file or object type'*)
Packit Service c5cf8c
                AC_COMPILE_IFELSE([
Packit Service c5cf8c
                    AC_LANG_SOURCE([int iglobal;])
Packit Service c5cf8c
                ],[
Packit Service c5cf8c
                    changequote(,)
Packit Service c5cf8c
                    case `${ac_path_NM_G} -P conftest.$OBJEXT | sed -e 's|iglobal  *[A-Z]  *[0-9][0-9]*|XXXX|g'` in
Packit Service c5cf8c
                    *XXXX*)
Packit Service c5cf8c
                        pac_path_NM_G="${ac_path_NM_G} -P"
Packit Service c5cf8c
                        pac_path_NM_G_type="POSIX"
Packit Service c5cf8c
                        ;;
Packit Service c5cf8c
                    esac
Packit Service c5cf8c
                    changequote([,])
Packit Service c5cf8c
                ])
Packit Service c5cf8c
                ;;
Packit Service c5cf8c
            esac  # Endof case `${ac_path_NM_G} -P
Packit Service c5cf8c
            ;;
Packit Service c5cf8c
        esac   # Endof case `${ac_path_NM_G} -B
Packit Service c5cf8c
        ;;
Packit Service c5cf8c
    esac  # Endof case `${ac_path_NM_G} -g
Packit Service c5cf8c
    if test "X$pac_path_NM_G" != "X" ; then
Packit Service c5cf8c
        AC_MSG_RESULT([$pac_path_NM_G_type style,$pac_path_NM_G])
Packit Service c5cf8c
        NM_G="`echo $pac_path_NM_G | sed -e 's|^.*nm |nm |g'`"
Packit Service c5cf8c
    else
Packit Service c5cf8c
        AC_MSG_RESULT(no)
Packit Service c5cf8c
    fi
Packit Service c5cf8c
    ac_cv_path_NM_G=${ac_path_NM_G}
Packit Service c5cf8c
    ac_path_NM_G_found=:
Packit Service c5cf8c
], [AC_MSG_RESULT(no)],
Packit Service c5cf8c
[$PATH$PATH_SEPARATOR/usr/ccs/bin/elf$PATH_SEPARATOR/usr/ccs/bin$PATH_SEPARATOR/usr/ucb$PATH_SEPARATOR/bin])
Packit Service c5cf8c
AC_LANG_POP(C)
Packit Service c5cf8c
]) dnl Endof AC_DEFUN([PAC_PATH_NM_G]
Packit Service c5cf8c
dnl
Packit Service c5cf8c
dnl PAC_C_MULTI_ATTR_ALIAS()
Packit Service c5cf8c
dnl
Packit Service c5cf8c
dnl The checks if multiple __attribute__((alias)) is available
Packit Service c5cf8c
dnl If the multiple __attribute((alias)) support is found,
Packit Service c5cf8c
dnl pac_c_multi_attr_alias=yes is set.
Packit Service c5cf8c
dnl
Packit Service c5cf8c
dnl The default is to do a runtime test.  When cross_compiling=yes,
Packit Service c5cf8c
dnl pac_path_NM_G will be used to determine the test result.
Packit Service c5cf8c
dnl If CFLAGS(or CPPFLAGS) contains ATTR_ALIAS_DEBUG, the runtime will print
Packit Service c5cf8c
dnl out addresses of struct(s) for debugging purpose.
Packit Service c5cf8c
dnl
Packit Service c5cf8c
dnl
Packit Service c5cf8c
AC_DEFUN([PAC_C_MULTI_ATTR_ALIAS],[
Packit Service c5cf8c
AC_REQUIRE([PAC_PATH_NM_G])
Packit Service c5cf8c
AC_LANG_PUSH(C)
Packit Service c5cf8c
AC_CHECK_HEADERS([stdio.h])
Packit Service c5cf8c
AC_MSG_CHECKING([for multiple __attribute__((alias)) support])
Packit Service c5cf8c
Packit Service c5cf8c
#Compile the "other" __attribute__ object file.
Packit Service c5cf8c
AC_COMPILE_IFELSE([
Packit Service c5cf8c
    AC_LANG_SOURCE([
Packit Service c5cf8c
#if defined(HAVE_STDIO_H) || defined(STDC_HEADERS)
Packit Service c5cf8c
#include <stdio.h>
Packit Service c5cf8c
#endif
Packit Service c5cf8c
Packit Service c5cf8c
struct mpif_cmblk_t_ { int imember; };
Packit Service c5cf8c
typedef struct mpif_cmblk_t_ mpif_cmblk_t;
Packit Service c5cf8c
Packit Service c5cf8c
/* NOT initialize these structure so it appears in BSS or as COMMON symbols */
Packit Service c5cf8c
mpif_cmblk_t mpifcmb;
Packit Service c5cf8c
mpif_cmblk_t MPIFCMB;
Packit Service c5cf8c
Packit Service c5cf8c
/*
Packit Service c5cf8c
   Do the test in this file instead in the file
Packit Service c5cf8c
   where __attribute__((alias)) is used. 
Packit Service c5cf8c
   This is needed for pgcc since pgcc seems to
Packit Service c5cf8c
   define aliased symbols if they are in the same file.
Packit Service c5cf8c
*/
Packit Service c5cf8c
/*
Packit Service c5cf8c
    We can't do the following comparision in one test:
Packit Service c5cf8c
Packit Service c5cf8c
    ilogical = (( &mpifcmb == ptr && &MPIFCMB == ptr ) ? TRUE : FALSE) ;
Packit Service c5cf8c
Packit Service c5cf8c
    because some compiler, like gcc 4.4.2's -O* optimizes the code
Packit Service c5cf8c
    such that the ilogical expression is FALSE. The likely reason is that
Packit Service c5cf8c
    mpifcmb and MPIFCMB are defined in the same scope in which C optimizer
Packit Service c5cf8c
    may have treated them as different objects (with different addresses),
Packit Service c5cf8c
    &mpifcmb != &MPIFCMB, before actually running the test and hence the
Packit Service c5cf8c
    illogical expression is assumed to be always FALSE.  The solution taken
Packit Service c5cf8c
    here is to prevent the optimizer the opportunity to equate &mpifcmb and
Packit Service c5cf8c
    &MPIFCMB (in same scope), e.g. using 2 separate tests and combine the
Packit Service c5cf8c
    test results in a different scope.
Packit Service c5cf8c
*/
Packit Service c5cf8c
int same_addrs1( void *ptr );
Packit Service c5cf8c
int same_addrs1( void *ptr )
Packit Service c5cf8c
{
Packit Service c5cf8c
#if defined(ATTR_ALIAS_DEBUG)
Packit Service c5cf8c
    printf( "others: addr(mpifcmb)=%p, addr(input ptr)=%p\n", &mpifcmb, ptr );
Packit Service c5cf8c
#endif
Packit Service c5cf8c
    return ( &mpifcmb == ptr ? 1 : 0 );
Packit Service c5cf8c
}
Packit Service c5cf8c
Packit Service c5cf8c
int same_addrs2( void *ptr );
Packit Service c5cf8c
int same_addrs2( void *ptr )
Packit Service c5cf8c
{
Packit Service c5cf8c
#if defined(ATTR_ALIAS_DEBUG)
Packit Service c5cf8c
    printf( "others: addr(MPIFCMB)=%p, addr(input ptr)=%p\n", &MPIFCMB, ptr );
Packit Service c5cf8c
#endif
Packit Service c5cf8c
    return ( &MPIFCMB == ptr ? 1 : 0 );
Packit Service c5cf8c
}
Packit Service c5cf8c
Packit Service c5cf8c
    ])
Packit Service c5cf8c
],[
Packit Service c5cf8c
    rm -f pac_conftest_other.$OBJEXT
Packit Service c5cf8c
    PAC_RUNLOG([cp conftest.$OBJEXT pac_conftest_other.$OBJEXT])
Packit Service c5cf8c
    test -s pac_conftest_other.$OBJEXT && pac_c_attr_alias_other=yes
Packit Service c5cf8c
dnl     cp conftest.$ac_ext pac_conftest_other.$ac_ext
Packit Service c5cf8c
dnl     echo
Packit Service c5cf8c
dnl     echo "pac_conftest_other.$OBJEXT"
Packit Service c5cf8c
dnl     nm -P -g pac_conftest_other.$OBJEXT | grep -i "mpifcmb"
Packit Service c5cf8c
],[
Packit Service c5cf8c
    pac_c_attr_alias_other=no
Packit Service c5cf8c
])  dnl Endof AC_COMPILE_IFELSE
Packit Service c5cf8c
Packit Service c5cf8c
pac_c_attr_alias_main=no
Packit Service c5cf8c
if test "$pac_c_attr_alias_other" = "yes" ; then
Packit Service c5cf8c
Packit Service c5cf8c
#   Push LIBS for later restoration.
Packit Service c5cf8c
    PAC_PUSH_FLAG([LIBS])
Packit Service c5cf8c
    LIBS="pac_conftest_other.$OBJEXT $LIBS"
Packit Service c5cf8c
Packit Service c5cf8c
#   Link the "other" __attribute__ object file.
Packit Service c5cf8c
    AC_LINK_IFELSE([
Packit Service c5cf8c
        AC_LANG_PROGRAM([
Packit Service c5cf8c
#if defined(HAVE_STDIO_H) || defined(STDC_HEADERS)
Packit Service c5cf8c
#include <stdio.h>
Packit Service c5cf8c
#endif
Packit Service c5cf8c
 
Packit Service c5cf8c
struct mpif_cmblk_t_ { int imember; };
Packit Service c5cf8c
typedef struct mpif_cmblk_t_ mpif_cmblk_t;
Packit Service c5cf8c
Packit Service c5cf8c
mpif_cmblk_t mpifcmbr = {0};
Packit Service c5cf8c
extern mpif_cmblk_t MPIFCMB __attribute__ ((alias("mpifcmbr")));
Packit Service c5cf8c
extern mpif_cmblk_t mpifcmb __attribute__ ((alias("mpifcmbr")));
Packit Service c5cf8c
Packit Service c5cf8c
extern int same_addrs1( void *ptr );
Packit Service c5cf8c
extern int same_addrs2( void *ptr );
Packit Service c5cf8c
Packit Service c5cf8c
        ],[
Packit Service c5cf8c
    int iaddr = 0;
Packit Service c5cf8c
#if defined(ATTR_ALIAS_DEBUG)
Packit Service c5cf8c
    printf( "main: addr(mpifcmbr) = %p\n", &mpifcmbr );
Packit Service c5cf8c
    printf( "main: addr(mpifcmb) = %p\n", &mpifcmb );
Packit Service c5cf8c
    printf( "main: addr(MPIFCMB) = %p\n", &MPIFCMB );
Packit Service c5cf8c
#endif
Packit Service c5cf8c
    iaddr = same_addrs1( &mpifcmbr ) && same_addrs2( &mpifcmbr );
Packit Service c5cf8c
    FILE *file = fopen( "pac_conftestval", "w" );
Packit Service c5cf8c
    if (!file) return 1;
Packit Service c5cf8c
    fprintf( file, "%d\n", iaddr );
Packit Service c5cf8c
        ])
Packit Service c5cf8c
    ],[
Packit Service c5cf8c
        rm -f pac_conftest_main$EXEEXT
Packit Service c5cf8c
        PAC_RUNLOG([cp conftest$EXEEXT pac_conftest_main$EXEEXT])
Packit Service c5cf8c
        test -x pac_conftest_main$EXEEXT && pac_c_attr_alias_main=yes
Packit Service c5cf8c
dnl         cp conftest.$ac_ext pac_conftest_main.$ac_ext
Packit Service c5cf8c
dnl         echo
Packit Service c5cf8c
dnl         echo "pac_conftest_main$EXEEXT"
Packit Service c5cf8c
dnl         nm -P -g pac_conftest_main$EXEEXT | grep -i "mpifcmb"
Packit Service c5cf8c
    ],[
Packit Service c5cf8c
        pac_c_attr_alias_main=no
Packit Service c5cf8c
dnl         cp conftest.$ac_ext pac_conftest_main.$ac_ext
Packit Service c5cf8c
    ])  dnl Endof AC_LINK_IFELSE
Packit Service c5cf8c
Packit Service c5cf8c
# Restore the previously pushed LIBS
Packit Service c5cf8c
    PAC_POP_FLAG([LIBS])
Packit Service c5cf8c
    rm -f pac_conftest_other.$OBJEXT
Packit Service c5cf8c
fi dnl Endof if test "$pac_c_attr_alias_other" = "yes"
Packit Service c5cf8c
Packit Service c5cf8c
if test "$pac_c_attr_alias_main" = "yes" ; then
Packit Service c5cf8c
    if test "$cross_compiling" = "yes" ; then
Packit Service c5cf8c
        changequote(,)
Packit Service c5cf8c
        # echo "PAC CROSS-COMPILING" dnl
Packit Service c5cf8c
        # POSIX NM = nm -P format dnl
Packit Service c5cf8c
        if test "$pac_path_NM_G_type" = "POSIX" ; then
Packit Service c5cf8c
            addrs=`${pac_path_NM_G} ./pac_conftest_main$EXEEXT | grep -i mpifcmb | sed -e 's% *[a-zA-Z][a-zA-Z]*  *[a-zA-Z]  *\([0-9abcdef][0-9abcdef]*\).*%\1%g'`
Packit Service c5cf8c
        fi
Packit Service c5cf8c
Packit Service c5cf8c
        # BSD NM = nm -B format dnl
Packit Service c5cf8c
        if test "$pac_path_NM_G_type" = "BSD" ; then
Packit Service c5cf8c
            addrs=`${pac_path_NM_G} -g ./pac_conftest_main$EXEEXT | grep -i mpifcmb | sed -e "s% *\([0-9abcdef][0-9abcdef]*\)  *[a-zA-Z]  *[a-zA-Z][a-zA-A]*.*%\1%g"`
Packit Service c5cf8c
        fi
Packit Service c5cf8c
        changequote([,])
Packit Service c5cf8c
Packit Service c5cf8c
        cmp_addr=""
Packit Service c5cf8c
        diff_addrs=no
Packit Service c5cf8c
        for addr in ${addrs} ; do
Packit Service c5cf8c
            if test "X${cmp_addr}" != "X" ; then
Packit Service c5cf8c
                if test "${cmp_addr}" != "${addr}" ; then
Packit Service c5cf8c
                    diff_addrs=yes
Packit Service c5cf8c
                    break
Packit Service c5cf8c
                fi
Packit Service c5cf8c
            else
Packit Service c5cf8c
                cmp_addr=${addr}
Packit Service c5cf8c
            fi
Packit Service c5cf8c
        done
Packit Service c5cf8c
        
Packit Service c5cf8c
        if test "$diff_addrs" != "yes" ; then
Packit Service c5cf8c
            dnl echo "Same addresses. Multiple aliases support"
Packit Service c5cf8c
            AC_MSG_RESULT([${NM_G} says yes])
Packit Service c5cf8c
            pac_c_multi_attr_alias=yes
Packit Service c5cf8c
        else
Packit Service c5cf8c
            dnl echo "Different addresses. No multiple aliases support."
Packit Service c5cf8c
            AC_MSG_RESULT([${NM_G} says no])
Packit Service c5cf8c
            pac_c_multi_attr_alias=no
Packit Service c5cf8c
        fi
Packit Service c5cf8c
Packit Service c5cf8c
    else # if test "$cross_compiling" != "yes"
Packit Service c5cf8c
        rm -f pac_conftestval
Packit Service c5cf8c
        ac_try="./pac_conftest_main$EXEEXT"
Packit Service c5cf8c
        if AC_TRY_EVAL(ac_try) ; then
Packit Service c5cf8c
            pac_c_attr_alias_val=0
Packit Service c5cf8c
            if test -s pac_conftestval ; then
Packit Service c5cf8c
                eval pac_c_attr_alias_val=`cat pac_conftestval`
Packit Service c5cf8c
            fi
Packit Service c5cf8c
            if test "$pac_c_attr_alias_val" -eq 1 ; then
Packit Service c5cf8c
                AC_MSG_RESULT(yes)
Packit Service c5cf8c
                pac_c_multi_attr_alias=yes
Packit Service c5cf8c
            else
Packit Service c5cf8c
                AC_MSG_RESULT(no)
Packit Service c5cf8c
                pac_c_multi_attr_alias=no
Packit Service c5cf8c
            fi
Packit Service c5cf8c
            rm -f pac_conftestval
Packit Service c5cf8c
        fi
Packit Service c5cf8c
    fi
Packit Service c5cf8c
    dnl Endof if test "$cross_compiling" = "yes"
Packit Service c5cf8c
    rm -f pac_conftest_main$EXEEXT
Packit Service c5cf8c
else
Packit Service c5cf8c
    AC_MSG_RESULT(no! link failure)
Packit Service c5cf8c
    pac_c_multi_attr_alias=no
Packit Service c5cf8c
fi dnl Endof if test "$pac_c_attr_alias_main" = "yes"
Packit Service c5cf8c
Packit Service c5cf8c
AC_LANG_POP(C)
Packit Service c5cf8c
Packit Service c5cf8c
]) dnl  Endof AC_DEFUN([PAC_C_MULTI_ATTR_ALIAS]
Packit Service c5cf8c
dnl
Packit Service c5cf8c
dnl PAC_C_ATTR_ALIGNED()
Packit Service c5cf8c
dnl
Packit Service c5cf8c
dnl Check if __attribute__((aligned)) support is there.
Packit Service c5cf8c
dnl If so, set pac_c_attr_aligned=yes.
Packit Service c5cf8c
dnl
Packit Service c5cf8c
dnl Do a link test instead of compile test to check if the linker
Packit Service c5cf8c
dnl would emit an error.
Packit Service c5cf8c
dnl
Packit Service c5cf8c
AC_DEFUN([PAC_C_ATTR_ALIGNED],[
Packit Service c5cf8c
AC_LANG_PUSH(C)
Packit Service c5cf8c
AC_MSG_CHECKING([for __attribute__((aligned)) support])
Packit Service c5cf8c
#Link the __attribute__ object file.
Packit Service c5cf8c
AC_LINK_IFELSE([
Packit Service c5cf8c
    AC_LANG_PROGRAM([
Packit Service c5cf8c
struct mpif_cmblk_t_ { int imembers[5]; };
Packit Service c5cf8c
typedef struct mpif_cmblk_t_ mpif_cmblk_t;
Packit Service c5cf8c
mpif_cmblk_t mpifcmbr __attribute__((aligned)) = {0};
Packit Service c5cf8c
    ],[])
Packit Service c5cf8c
],[pac_c_attr_aligned=yes], [pac_c_attr_aligned=no])
Packit Service c5cf8c
AC_MSG_RESULT([$pac_c_attr_aligned])
Packit Service c5cf8c
AC_LANG_POP(C)
Packit Service c5cf8c
])
Packit Service c5cf8c
dnl
Packit Service c5cf8c
dnl PAC_F2C_ATTR_ALIGNED_SIZE(ARRAY_SIZE, [OUTPUT_VAR], [MIN_ALIGNMENT])
Packit Service c5cf8c
dnl
Packit Service c5cf8c
dnl ARRAY_SIZE    : Size of the integer array within the fortran commmon block.
Packit Service c5cf8c
dnl OUTPUT_VAR    : Optional variable to be set.
Packit Service c5cf8c
dnl                 if test succeeds, set OUTPUT_VAR=$pac_f2c_attr_aligned_str.
Packit Service c5cf8c
dnl                 if test fails, set OUTPUT_VAR="unknown".
Packit Service c5cf8c
dnl MIN_ALIGNMENT : Optional value.
Packit Service c5cf8c
dnl                 Minimum alignment size to be used in OUTPUT_VAR.
Packit Service c5cf8c
dnl                 pac_f2c_attr_aligned_str won't be modified.
Packit Service c5cf8c
dnl
Packit Service c5cf8c
dnl "pac_f2c_attr_aligned_str" will be set with
Packit Service c5cf8c
dnl 1) __attribute__((aligned(ALIGNMENT_SIZE))),
Packit Service c5cf8c
dnl 2) __attribute__((aligned)).
Packit Service c5cf8c
dnl 3) "", i.e. empty string.
Packit Service c5cf8c
dnl
Packit Service c5cf8c
dnl 2) means the test can't find a good alignment value, but both the Fortran
Packit Service c5cf8c
dnl    and C compilers are OK with "aligned" which in principle means the C
Packit Service c5cf8c
dnl    compiler will pick the maximum useful alignment supported by the
Packit Service c5cf8c
dnl    architecture.
Packit Service c5cf8c
dnl 3) means that the test has failed to find the alignment.
Packit Service c5cf8c
dnl
Packit Service c5cf8c
AC_DEFUN([PAC_F2C_ATTR_ALIGNED_SIZE],[
Packit Service c5cf8c
cmblksize=$1
Packit Service c5cf8c
AC_MSG_CHECKING([the minimum alignment of Fortran common block of $cmblksize integers])
Packit Service c5cf8c
dnl To find the minmium alignment of Fortran common block (of integer array)
Packit Service c5cf8c
dnl as seen by C object file, C object files of various (typical) alignments
Packit Service c5cf8c
dnl are linked to the Fortran code using the common block of integer array.
Packit Service c5cf8c
#
Packit Service c5cf8c
dnl Since the incorrect alignment results only a warning messages from the
Packit Service c5cf8c
dnl fortran compiler(or linker), so we use "diff" to compare the fortran
Packit Service c5cf8c
dnl compiler/linker output.  We cannot use AC_LANG_WERROR,
Packit Service c5cf8c
dnl i.e. ac_fc_werror_flag=yes, because compiler like pgf77 at version 10.x)
Packit Service c5cf8c
dnl has non-zero stderr output if a fortran program is used in the linking.
Packit Service c5cf8c
dnl The stderr contains the name of fortran program even if the linking is
Packit Service c5cf8c
dnl successful.  We could avoid the non-zero stderr output in pgf77 by
Packit Service c5cf8c
dnl compiling everthing into object files and linking all the object files
Packit Service c5cf8c
dnl with pgf77.  Doing that would need us to use AC_TRY_EVAL instead of
Packit Service c5cf8c
dnl AC_LINK_IFELSE, so "diff" approach is used instead.
Packit Service c5cf8c
#
Packit Service c5cf8c
dnl Using diff of compiler(linker) output requires a reference output file
Packit Service c5cf8c
dnl as the base of diff.  The process of creating this reference output file
Packit Service c5cf8c
dnl has to be exactly the same as the testing process, because pgf77 has
Packit Service c5cf8c
dnl the following weird behavour
Packit Service c5cf8c
dnl pgf77 -o ftest ftest.f         => when $?=0 with zero stderr output
Packit Service c5cf8c
dnl pgf77 -o ftest ftest.f dummy.o => when $?=0 with non-zero stderr output.
Packit Service c5cf8c
dnl                                   stderr has "ftest.f:".
Packit Service c5cf8c
dnl 
Packit Service c5cf8c
# First create a fortran CONFTEST which will be used repeatedly.
Packit Service c5cf8c
AC_LANG_PUSH([Fortran]) dnl AC_LANG_PUSH([Fortran 77])
Packit Service c5cf8c
AC_LANG_CONFTEST([
Packit Service c5cf8c
    AC_LANG_SOURCE([
Packit Service c5cf8c
        program fconftest
Packit Service c5cf8c
        integer isize
Packit Service c5cf8c
        parameter (isize=$cmblksize)
Packit Service c5cf8c
        integer status_array(isize)
Packit Service c5cf8c
        common /mpifcmb/ status_array
Packit Service c5cf8c
        save /mpifcmb/
Packit Service c5cf8c
        end
Packit Service c5cf8c
    ])
Packit Service c5cf8c
])
Packit Service c5cf8c
AC_LANG_POP([Fortran]) dnl AC_LANG_POP([Fortran 77])
Packit Service c5cf8c
dnl
Packit Service c5cf8c
dnl
Packit Service c5cf8c
dnl
Packit Service c5cf8c
# Compile a C dummy.$OBJEXT and link with Fortran test program to create
Packit Service c5cf8c
# a reference linker output file, pac_align0.log, as the base of "diff".
Packit Service c5cf8c
AC_LANG_PUSH([C])
Packit Service c5cf8c
AC_COMPILE_IFELSE([AC_LANG_SOURCE([])],[
Packit Service c5cf8c
    cp conftest.$ac_ext pac_conftest.c
Packit Service c5cf8c
    PAC_RUNLOG([mv conftest.$OBJEXT pac_conftest.$OBJEXT])
Packit Service c5cf8c
    PAC_PUSH_FLAG([LIBS])
Packit Service c5cf8c
    LIBS="pac_conftest.$OBJEXT $LIBS"
Packit Service c5cf8c
    AC_LANG_PUSH([Fortran]) dnl AC_LANG_PUSH([Fortran 77])
Packit Service c5cf8c
    PAC_PUSH_FLAG([ac_link])
Packit Service c5cf8c
    ac_link="`echo $ac_link | sed -e 's|>.*$|> $pac_logfile 2>\&1|g'`"
Packit Service c5cf8c
    pac_logfile="pac_align0.log"
Packit Service c5cf8c
    rm -f $pac_logfile
Packit Service c5cf8c
    AC_LINK_IFELSE([],[
Packit Service c5cf8c
        pac_f2c_alignedn_diffbase=yes
Packit Service c5cf8c
    ],[
Packit Service c5cf8c
        pac_f2c_alignedn_diffbase=no
Packit Service c5cf8c
    ])
Packit Service c5cf8c
    # Be sure NOT to remove the conftest.f which is still needed for later use.
Packit Service c5cf8c
    # rm -f conftest.$ac_ext 
Packit Service c5cf8c
    # Restore everything in autoconf that has been overwritten
Packit Service c5cf8c
    PAC_POP_FLAG([ac_link])
Packit Service c5cf8c
    # restore previously pushed LIBS
Packit Service c5cf8c
    PAC_POP_FLAG([LIBS])
Packit Service c5cf8c
    AC_LANG_POP([Fortran]) dnl AC_LANG_POP([Fortran 77])
Packit Service c5cf8c
],[
Packit Service c5cf8c
    pac_f2c_alignedn_diffbase=no
Packit Service c5cf8c
])
Packit Service c5cf8c
AC_LANG_POP([C])
Packit Service c5cf8c
dnl
Packit Service c5cf8c
dnl
Packit Service c5cf8c
if test "$pac_f2c_alignedn_diffbase" = "yes" ; then
Packit Service c5cf8c
    # Initialize pac_result_str to empty string since part of the test
Packit Service c5cf8c
    # depends on pac_result_str is empty or non-empty string.
Packit Service c5cf8c
    pac_result_str=""
Packit Service c5cf8c
    # Initialize pac_f2c_attr_aligned_str to empty string and
Packit Service c5cf8c
    # it will remain as empty string if the following test fails.
Packit Service c5cf8c
    pac_f2c_attr_aligned_str=""
Packit Service c5cf8c
    for asize in 4 8 16 32 64 128 max ; do
Packit Service c5cf8c
        if test "$asize" != "max" ; then
Packit Service c5cf8c
            pac_attr_aligned_str="__attribute__((aligned($asize)))"
Packit Service c5cf8c
        else
Packit Service c5cf8c
            pac_attr_aligned_str="__attribute__((aligned))"
Packit Service c5cf8c
        fi
Packit Service c5cf8c
        AC_LANG_PUSH([C])
Packit Service c5cf8c
        #Compile the __attribute__ object file.
Packit Service c5cf8c
        AC_COMPILE_IFELSE([
Packit Service c5cf8c
            AC_LANG_SOURCE([
Packit Service c5cf8c
changequote(,)
Packit Service c5cf8c
struct mpif_cmblk_t_ { $MPI_FINT imembers[$cmblksize]; };
Packit Service c5cf8c
changequote([,])
Packit Service c5cf8c
typedef struct mpif_cmblk_t_ mpif_cmblk_t;
Packit Service c5cf8c
mpif_cmblk_t mpifcmbr $pac_attr_aligned_str = {0};
Packit Service c5cf8c
Packit Service c5cf8c
extern mpif_cmblk_t _CMPIFCMB  __attribute__ ((alias("mpifcmbr")));
Packit Service c5cf8c
extern mpif_cmblk_t   MPIFCMB  __attribute__ ((alias("mpifcmbr")));
Packit Service c5cf8c
extern mpif_cmblk_t   MPIFCMB_ __attribute__ ((alias("mpifcmbr")));
Packit Service c5cf8c
extern mpif_cmblk_t _Cmpifcmb  __attribute__ ((alias("mpifcmbr")));
Packit Service c5cf8c
extern mpif_cmblk_t   mpifcmb  __attribute__ ((alias("mpifcmbr")));
Packit Service c5cf8c
extern mpif_cmblk_t   mpifcmb_ __attribute__ ((alias("mpifcmbr")));
Packit Service c5cf8c
            ])
Packit Service c5cf8c
        ],[
Packit Service c5cf8c
            cp conftest.$ac_ext pac_conftest.c
Packit Service c5cf8c
            PAC_RUNLOG([mv conftest.$OBJEXT pac_conftest.$OBJEXT])
Packit Service c5cf8c
	    PAC_PUSH_FLAG([LIBS])
Packit Service c5cf8c
            LIBS="pac_conftest.$OBJEXT $LIBS"
Packit Service c5cf8c
            AC_LANG_PUSH([Fortran]) dnl AC_LANG_PUSH([Fortran 77])
Packit Service c5cf8c
	    PAC_PUSH_FLAG([ac_link])
Packit Service c5cf8c
            ac_link="`echo $ac_link | sed -e 's|>.*$|> $pac_logfile 2>\&1|g'`"
Packit Service c5cf8c
            pac_logfile="pac_align1.log"
Packit Service c5cf8c
            rm -f $pac_logfile
Packit Service c5cf8c
            # Use conftest.f created in CONFTEST.
Packit Service c5cf8c
            AC_LINK_IFELSE([],[
Packit Service c5cf8c
                PAC_RUNLOG_IFELSE([diff -b pac_align0.log pac_align1.log],[
Packit Service c5cf8c
                    pac_attr_alignedn=yes
Packit Service c5cf8c
                ],[
Packit Service c5cf8c
                    pac_attr_alignedn=no
Packit Service c5cf8c
                    cat $pac_logfile >&AS_MESSAGE_LOG_FD
Packit Service c5cf8c
                    echo "failed C program was:" >&AS_MESSAGE_LOG_FD
Packit Service c5cf8c
                    cat pac_conftest.c >&AS_MESSAGE_LOG_FD
Packit Service c5cf8c
                    echo "failed Fortran program was:" >&AS_MESSAGE_LOG_FD
Packit Service c5cf8c
                    cat conftest.$ac_ext >&AS_MESSAGE_LOG_FD
Packit Service c5cf8c
                ])
Packit Service c5cf8c
            ],[
Packit Service c5cf8c
                pac_attr_alignedn=no
Packit Service c5cf8c
            ])
Packit Service c5cf8c
            # Restore everything in autoconf that has been overwritten
Packit Service c5cf8c
	    PAC_POP_FLAG([ac_link])
Packit Service c5cf8c
            # restore previously pushed LIBS
Packit Service c5cf8c
	    PAC_POP_FLAG([LIBS])
Packit Service c5cf8c
            AC_LANG_POP([Fortran]) dnl AC_LANG_POP([Fortran 77])
Packit Service c5cf8c
            # remove previously generated object file and C file.
Packit Service c5cf8c
            rm -f pac_conftest.$OBJEXT pac_conftest.c
Packit Service c5cf8c
            rm -f $pac_logfile
Packit Service c5cf8c
            if test "$pac_attr_alignedn" = yes ; then
Packit Service c5cf8c
                ifelse([$3],[],[
Packit Service c5cf8c
                    pac_result_str="$asize"
Packit Service c5cf8c
                    pac_f2c_attr_aligned_str="$pac_attr_aligned_str"
Packit Service c5cf8c
                    break
Packit Service c5cf8c
                ],[
Packit Service c5cf8c
                    if test "$asize" != "max" -a "$asize" -lt "$3" ; then
Packit Service c5cf8c
                        if test "X$pac_result_str" = "X" ; then
Packit Service c5cf8c
                            pac_result_str="$asize"
Packit Service c5cf8c
                            pac_f2c_attr_aligned_str="$pac_attr_aligned_str"
Packit Service c5cf8c
                        fi
Packit Service c5cf8c
                        continue
Packit Service c5cf8c
                    else
Packit Service c5cf8c
                        pac_f2c_attr_aligned_str="$pac_attr_aligned_str"
Packit Service c5cf8c
                        if test "X$pac_result_str" != "X" ; then
Packit Service c5cf8c
                            pac_result_str="$pac_result_str, too small! reset to $asize"
Packit Service c5cf8c
                        else
Packit Service c5cf8c
                            pac_result_str="$asize"
Packit Service c5cf8c
                        fi
Packit Service c5cf8c
                        break
Packit Service c5cf8c
                    fi
Packit Service c5cf8c
                ])
Packit Service c5cf8c
            fi
Packit Service c5cf8c
        ], [
Packit Service c5cf8c
            pac_attr_alignedn=no
Packit Service c5cf8c
        ])
Packit Service c5cf8c
        AC_LANG_POP([C])
Packit Service c5cf8c
    done
Packit Service c5cf8c
    ifelse([$2],[],[],[$2="$pac_f2c_attr_aligned_str"])
Packit Service c5cf8c
else
Packit Service c5cf8c
    pac_result_str=""
Packit Service c5cf8c
    # Since the test fails, set pac_f2c_attr_aligned_str to empty string.
Packit Service c5cf8c
    pac_f2c_attr_aligned_str=""
Packit Service c5cf8c
fi
Packit Service c5cf8c
if test "X$pac_result_str" != "X" ; then
Packit Service c5cf8c
    AC_MSG_RESULT([$pac_result_str])
Packit Service c5cf8c
else
Packit Service c5cf8c
    AC_MSG_RESULT([unknown])
Packit Service c5cf8c
fi
Packit Service c5cf8c
rm -f pac_align0.log
Packit Service c5cf8c
])
Packit Service c5cf8c
dnl