- As proposed in RFC and telcon, warn the user about deprecated
functionality (per MPI-2.1). This warning can be toggled using --enable-mpi-interface-warning (default OFF), but can be selectively turned on passing mpicc -DOMPI_WANT_MPI_INTERFACE_WARNING Using icc, gcc < 4.5, warnings (such as in mpi2basic_tests) show: type_vector.c:83: warning: ‘MPI_Type_hvector’ is deprecated (declared at /home/../usr/include/mpi.h:1379) Using gcc-4.5 (gcc-svn) these show up as: type_vector.c:83: warning: ‘MPI_Type_hvector’ is deprecated (declared at /home/../usr/include/mpi.h:1379): MPI_Type_hvector is superseded by MPI_Type_create_hvector in MPI-2.0 Jeff and I propose to turn such warnings on with Open MPI-1.7 by default. - Detection of user-level compiler is handled using the preprocessor checks of GASnet's other/portable_platform.h (thanks to Paul Hargrove and Dan Bonachea) adapted into ompi/include/mpi_portable_platform.h (see comments). The OMPI-build time detection is output (Familyname and Version) with ompi_info. This functionality (actually any upcoming __attribute__) are turned off, if a different compiler (and version) is being detected. - Note, that any warnings regarding (user-compiler!=build-compiler) as discussed in the RFC are _not_ included for now. - Tested on Linux with --enable-mpi-interface-warning on Linux, gcc-4.5 (deprecated w/ specific msg) Linux, gcc-4.3 (deprecated w/o specific msg) Linux, pathscale 3.1 (deprecated w/o specific msg) Linux, icc-11.0 (deprecated w/o specific msg) Linux, PGI-8.0.6 accepts __deprecated__ but does not issue a warning, further investigation needed... This commit was SVN r21262.
Этот коммит содержится в:
родитель
225a1d6d8e
Коммит
916eb1fb1e
@ -10,6 +10,7 @@
|
||||
# University of Stuttgart. All rights reserved.
|
||||
# Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
# All rights reserved.
|
||||
# Copyright (c) 2009 Oak Ridge National Labs. All rights reserved.
|
||||
# $COPYRIGHT$
|
||||
#
|
||||
# Additional copyrights may follow
|
||||
@ -189,6 +190,7 @@ AC_DEFUN([OMPI_CHECK_ATTRIBUTES], [
|
||||
opal_cv___attribute__cold=0
|
||||
opal_cv___attribute__const=0
|
||||
opal_cv___attribute__deprecated=0
|
||||
opal_cv___attribute__deprecated_argument=0
|
||||
opal_cv___attribute__format=0
|
||||
opal_cv___attribute__format_funcptr=0
|
||||
opal_cv___attribute__hot=0
|
||||
@ -236,7 +238,6 @@ AC_DEFUN([OMPI_CHECK_ATTRIBUTES], [
|
||||
[],
|
||||
[])
|
||||
|
||||
|
||||
_OMPI_CHECK_SPECIFIC_ATTRIBUTE([deprecated],
|
||||
[
|
||||
int foo(int arg1, int arg2) __attribute__ ((__deprecated__));
|
||||
@ -245,6 +246,13 @@ AC_DEFUN([OMPI_CHECK_ATTRIBUTES], [
|
||||
[],
|
||||
[])
|
||||
|
||||
_OMPI_CHECK_SPECIFIC_ATTRIBUTE([deprecated_argument],
|
||||
[
|
||||
int foo(int arg1, int arg2) __attribute__ ((__deprecated__("compiler allows argument")));
|
||||
int foo(int arg1, int arg2) { return arg1 * arg2 + arg1; }
|
||||
],
|
||||
[],
|
||||
[])
|
||||
|
||||
ATTRIBUTE_CFLAGS=
|
||||
case "$ompi_c_vendor" in
|
||||
@ -514,6 +522,8 @@ AC_DEFUN([OMPI_CHECK_ATTRIBUTES], [
|
||||
[Whether your compiler has __attribute__ const or not])
|
||||
AC_DEFINE_UNQUOTED(OPAL_HAVE_ATTRIBUTE_DEPRECATED, [$opal_cv___attribute__deprecated],
|
||||
[Whether your compiler has __attribute__ deprecated or not])
|
||||
AC_DEFINE_UNQUOTED(OPAL_HAVE_ATTRIBUTE_DEPRECATED_ARGUMENT, [$opal_cv___attribute__deprecated_argument],
|
||||
[Whether your compiler has __attribute__ deprecated with optional argument])
|
||||
AC_DEFINE_UNQUOTED(OPAL_HAVE_ATTRIBUTE_FORMAT, [$opal_cv___attribute__format],
|
||||
[Whether your compiler has __attribute__ format or not])
|
||||
AC_DEFINE_UNQUOTED(OPAL_HAVE_ATTRIBUTE_FORMAT_FUNCPTR, [$opal_cv___attribute__format_funcptr],
|
||||
|
87
config/opal_check_compiler_version.m4
Обычный файл
87
config/opal_check_compiler_version.m4
Обычный файл
@ -0,0 +1,87 @@
|
||||
dnl -*- shell-script -*-
|
||||
dnl
|
||||
dnl Copyright (c) 2009 Oak Ridge National Labs. All rights reserved.
|
||||
dnl
|
||||
dnl $COPYRIGHT$
|
||||
dnl
|
||||
dnl Additional copyrights may follow
|
||||
dnl
|
||||
dnl $HEADER$
|
||||
dnl
|
||||
|
||||
|
||||
# OPAL_CHECK_COMPILER_VERSION_ID()
|
||||
# ----------------------------------------------------
|
||||
# Try to figure out the compiler's name and version to detect cases,
|
||||
# where users compile Open MPI with one version and compile the application
|
||||
# with a different compiler.
|
||||
#
|
||||
AC_DEFUN([OPAL_CHECK_COMPILER_VERSION_ID],
|
||||
[
|
||||
_OPAL_CHECK_COMPILER(FAMILYID)
|
||||
_OPAL_CHECK_COMPILER_STRINGIFY(FAMILYNAME)
|
||||
_OPAL_CHECK_COMPILER(VERSION)
|
||||
_OPAL_CHECK_COMPILER_STRINGIFY(VERSION_STR)
|
||||
])dnl
|
||||
|
||||
|
||||
AC_DEFUN([_OPAL_CHECK_COMPILER], [
|
||||
lower=m4_tolower($1)
|
||||
AC_CACHE_CHECK([for compiler $lower], opal_cv_compiler_[$1],
|
||||
[
|
||||
CPPFLAGS_orig=$CPPFLAGS
|
||||
CPPFLAGS="-I${top_ompi_srcdir}/ompi/include $CPPFLAGS"
|
||||
AC_TRY_RUN([
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "mpi_portable_platform.h.in" /* Yes, it is supposed to be a .in-file */
|
||||
|
||||
int main (int argc, char * argv[])
|
||||
{
|
||||
FILE * f;
|
||||
f=fopen("conftestval", "w");
|
||||
if (!f) exit(1);
|
||||
fprintf (f, "%d", PLATFORM_COMPILER_$1);
|
||||
return 0;
|
||||
}
|
||||
], [
|
||||
eval opal_cv_compiler_$1=`cat conftestval`;
|
||||
], [
|
||||
eval opal_cv_compiler_$1=0
|
||||
])
|
||||
CPPFLAGS=$CPPFLAGS_orig
|
||||
])
|
||||
AC_DEFINE_UNQUOTED([OPAL_BUILD_PLATFORM_COMPILER_$1], $opal_cv_compiler_[$1],
|
||||
[The compiler $lower which OMPI was built with])
|
||||
])dnl
|
||||
|
||||
|
||||
AC_DEFUN([_OPAL_CHECK_COMPILER_STRINGIFY], [
|
||||
lower=m4_tolower($1)
|
||||
AC_CACHE_CHECK([for compiler $lower], opal_cv_compiler_[$1],
|
||||
[
|
||||
CPPFLAGS_orig=$CPPFLAGS
|
||||
CPPFLAGS="-I${top_ompi_srcdir}/ompi/include $CPPFLAGS"
|
||||
AC_TRY_RUN([
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "mpi_portable_platform.h.in" /* Yes, it is supposed to be a .in-file */
|
||||
|
||||
int main (int argc, char * argv[])
|
||||
{
|
||||
FILE * f;
|
||||
f=fopen("conftestval", "w");
|
||||
if (!f) exit(1);
|
||||
fprintf (f, "%s", _STRINGIFY(PLATFORM_COMPILER_$1));
|
||||
return 0;
|
||||
}
|
||||
], [
|
||||
eval opal_cv_compiler_$1=`cat conftestval`;
|
||||
], [
|
||||
eval opal_cv_compiler_$1=UNKNOWN
|
||||
])
|
||||
CPPFLAGS=$CPPFLAGS_orig
|
||||
])
|
||||
AC_DEFINE_UNQUOTED([OPAL_BUILD_PLATFORM_COMPILER_$1], $opal_cv_compiler_[$1],
|
||||
[The compiler $lower which OMPI was built with])
|
||||
])dnl
|
@ -15,6 +15,7 @@ dnl Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
|
||||
dnl Copyright (c) 2009 IBM Corporation. All rights reserved.
|
||||
dnl Copyright (c) 2009 Los Alamos National Security, LLC. All rights
|
||||
dnl reserved.
|
||||
dnl Copyright (c) 2009 Oak Ridge National Labs. All rights reserved.
|
||||
dnl $COPYRIGHT$
|
||||
dnl
|
||||
dnl Additional copyrights may follow
|
||||
@ -368,6 +369,28 @@ AC_DEFINE_UNQUOTED(MPI_PARAM_CHECK, $mpi_param_check,
|
||||
[Whether we want to check MPI parameters always, never, or decide at run-time])
|
||||
|
||||
|
||||
#
|
||||
# Do we want to enable MPI interface warnings (e.g. deprecated functionality and others)?
|
||||
#
|
||||
# XXX This __disabled__ by default for 1.5, but will be __enabled__ for 1.7 by default
|
||||
# Users should be notified about this proposed change.
|
||||
#
|
||||
|
||||
AC_MSG_CHECKING([if want compile-time warnings inside of mpi.h])
|
||||
AC_ARG_ENABLE(mpi-interface-warning,
|
||||
AC_HELP_STRING([--enable-mpi-interface-warning],
|
||||
[enable warnings in wrong (e.g. deprecated) usage in user-level code (default: disabled)]))
|
||||
if test "$enable_mpi_interface_warning" = "yes"; then
|
||||
AC_MSG_RESULT([yes])
|
||||
OMPI_WANT_MPI_INTERFACE_WARNING=1
|
||||
else
|
||||
AC_MSG_RESULT([no])
|
||||
OMPI_WANT_MPI_INTERFACE_WARNING=0
|
||||
fi
|
||||
AC_DEFINE_UNQUOTED([OMPI_WANT_MPI_INTERFACE_WARNING], [$OMPI_WANT_MPI_INTERFACE_WARNING],
|
||||
[Enable warnings in wrong usage (e.g. deprecated) in user-level code])
|
||||
|
||||
|
||||
#
|
||||
# Do we want to install all of OMPI's header files?
|
||||
#
|
||||
|
@ -10,10 +10,11 @@
|
||||
# University of Stuttgart. All rights reserved.
|
||||
# Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
# All rights reserved.
|
||||
# Copyright (c) 2006-2007 Cisco Systems, Inc. All rights reserved.
|
||||
# Copyright (c) 2006-2009 Cisco Systems, Inc. All rights reserved.
|
||||
# Copyright (c) 2006-2008 Sun Microsystems, Inc. All rights reserved.
|
||||
# Copyright (c) 2006-2007 Los Alamos National Security, LLC. All rights
|
||||
# reserved.
|
||||
# Copyright (c) 2009 Oak Ridge National Labs. All rights reserved.
|
||||
# $COPYRIGHT$
|
||||
#
|
||||
# Additional copyrights may follow
|
||||
@ -73,7 +74,7 @@ OMPI_SAVE_VERSION([ORTE], [Open Run-Time Environment], [$srcdir/VERSION],
|
||||
OMPI_SAVE_VERSION([OPAL], [Open Portable Access Layer], [$srcdir/VERSION],
|
||||
[opal/include/opal/version.h])
|
||||
|
||||
AM_CONFIG_HEADER([opal/include/opal_config.h orte/include/orte_config.h ompi/include/ompi_config.h ompi/include/mpi.h])
|
||||
AM_CONFIG_HEADER([opal/include/opal_config.h orte/include/orte_config.h ompi/include/ompi_config.h ompi/include/mpi.h ompi/include/mpi_portable_platform.h])
|
||||
|
||||
# override/fixup the version numbers set by AC_INIT, since on
|
||||
# developer builds, there's no good way to know what the version is
|
||||
@ -417,6 +418,7 @@ AC_DEFINE_UNQUOTED(OMPI_WANT_CXX_BINDINGS, $WANT_MPI_CXX_SUPPORT,
|
||||
##################################
|
||||
OMPI_CHECK_ATTRIBUTES
|
||||
|
||||
OPAL_CHECK_COMPILER_VERSION_ID
|
||||
|
||||
##################################
|
||||
# Assembler Configuration
|
||||
|
@ -9,7 +9,8 @@
|
||||
# University of Stuttgart. All rights reserved.
|
||||
# Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
# All rights reserved.
|
||||
# Copyright (c) 2006 Cisco Systems, Inc. All rights reserved.
|
||||
# Copyright (c) 2006-2009 Cisco Systems, Inc. All rights reserved.
|
||||
# Copyright (c) 2009 Oak Ridge National Labs. All rights reserved.
|
||||
# $COPYRIGHT$
|
||||
#
|
||||
# Additional copyrights may follow
|
||||
@ -35,11 +36,12 @@ include_HEADERS += \
|
||||
mpif-mpi-io.h
|
||||
endif
|
||||
|
||||
# these three are always installed in $(includedir), but shouldn't be
|
||||
# These files are always installed in $(includedir), but shouldn't be
|
||||
# shipped since they are generated by configure from their .in
|
||||
# counterparts, which AM automatically ships.
|
||||
# counterparts (which AM automatically ships).
|
||||
nodist_include_HEADERS = \
|
||||
mpi.h
|
||||
mpi.h \
|
||||
mpi_portable_platform.h
|
||||
|
||||
if OMPI_WANT_F77_BINDINGS
|
||||
nodist_include_HEADERS += \
|
||||
|
@ -11,6 +11,7 @@
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2007-2009 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2008-2009 Sun Microsystems, Inc. All rights reserved.
|
||||
* Copyright (c) 2009 Oak Ridge National Labs. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
@ -34,9 +35,21 @@
|
||||
ompi_config.h must be included before all other files, so this
|
||||
should be good enough */
|
||||
|
||||
/* The compiler id which OMPI was built with */
|
||||
#undef OPAL_BUILD_PLATFORM_COMPILER_FAMILYID
|
||||
|
||||
/* The compiler version which OMPI was built with */
|
||||
#undef OPAL_BUILD_PLATFORM_COMPILER_VERSION
|
||||
|
||||
/* Define to 1 if you have the ANSI C header files. */
|
||||
#undef OPAL_STDC_HEADERS
|
||||
|
||||
/* Whether your compiler has __attribute__ deprecated or not */
|
||||
#undef OPAL_HAVE_ATTRIBUTE_DEPRECATED
|
||||
|
||||
/* Whether your compiler has __attribute__ deprecated with the optional argument */
|
||||
#undef OPAL_HAVE_ATTRIBUTE_DEPRECATED_ARGUMENT
|
||||
|
||||
/* Define to 1 if you have the <sys/time.h> header file. */
|
||||
#undef OPAL_HAVE_SYS_TIME_H
|
||||
|
||||
@ -112,6 +125,13 @@
|
||||
/* Whether we want the MPI f90 bindings or not */
|
||||
#undef OMPI_WANT_F90_BINDINGS
|
||||
|
||||
/* Enable warnings in wrong usage (e.g. deprecated) in user-level code */
|
||||
/* XXX This __disabled__ by default for Open MPI-1.5, but will be __enabled__ for Open MPI-1.7 by default */
|
||||
/* Users should be notified about this proposed change. */
|
||||
#ifndef OMPI_WANT_MPI_INTERFACE_WARNING
|
||||
#undef OMPI_WANT_MPI_INTERFACE_WARNING
|
||||
#endif
|
||||
|
||||
/* Whether or not we have compiled with C++ exceptions support */
|
||||
#undef OMPI_HAVE_CXX_EXCEPTION_SUPPORT
|
||||
|
||||
@ -148,7 +168,7 @@
|
||||
# define OMPI_DECLSPEC __attribute__((visibility("default")))
|
||||
# else
|
||||
# define OMPI_DECLSPEC
|
||||
# endif
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
@ -182,6 +202,51 @@
|
||||
#define MPI_VERSION 2
|
||||
#define MPI_SUBVERSION 1
|
||||
|
||||
|
||||
/*
|
||||
* Do we want MPI interface deprecated function warnings? This is
|
||||
* only relevant if we're not building Open MPI (i.e., we're compiling an
|
||||
* MPI application).
|
||||
*/
|
||||
#if !(OMPI_BUILDING || \
|
||||
(defined(OMPI_BUILDING_CXX_BINDINGS_LIBRARY) && \
|
||||
OMPI_BUILDING_CXX_BINDINGS_LIBRARY))
|
||||
|
||||
/*
|
||||
* Figure out which compiler is being invoked (in order to compare if
|
||||
* it was different than what OMPI was built with).
|
||||
*/
|
||||
# include "mpi_portable_platform.h"
|
||||
|
||||
/*
|
||||
* If we're currently using the same compiler that was used to
|
||||
* build Open MPI, enable compile-time warning of user-level code
|
||||
* (e.g. usage of deprecated functions).
|
||||
*/
|
||||
# if (OPAL_BUILD_PLATFORM_COMPILER_FAMILYID == PLATFORM_COMPILER_FAMILYID) && \
|
||||
(OPAL_BUILD_PLATFORM_COMPILER_VERSION == PLATFORM_COMPILER_VERSION)
|
||||
|
||||
# if OMPI_WANT_MPI_INTERFACE_WARNING
|
||||
# if OPAL_HAVE_ATTRIBUTE_DEPRECATED
|
||||
# if OPAL_HAVE_ATTRIBUTE_DEPRECATED_ARGUMENT
|
||||
# define __mpi_interface_deprecated__(msg) __attribute__((__deprecated__(msg)))
|
||||
# else
|
||||
# define __mpi_interface_deprecated__(msg) __attribute__((__deprecated__))
|
||||
# endif
|
||||
# endif
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
* If we didn't define __mpi_interface_deprecated__ above, then we
|
||||
* don't want it, so define it to empty (can't use #undef in the logic
|
||||
* above because autoconf will comment it out).
|
||||
*/
|
||||
#if !defined(__mpi_interface_deprecated__)
|
||||
# define __mpi_interface_deprecated__(msg)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* To accomodate programs written for MPI implementations that use a
|
||||
* straight ROMIO import
|
||||
@ -244,6 +309,11 @@ typedef struct ompi_status_public_t ompi_status_public_t;
|
||||
|
||||
/*
|
||||
* User typedefs
|
||||
*
|
||||
* Even though MPI_Copy_function and MPI_Delete_function are
|
||||
* deprecated, we do not use the attributes marking them as such,
|
||||
* because otherwise the compiler will warn for all the functions that
|
||||
* are declared using them (e.g., MPI_Keyval_create).
|
||||
*/
|
||||
typedef int (MPI_Copy_function)(MPI_Comm, int, void *,
|
||||
void *, void *, int *);
|
||||
@ -264,6 +334,9 @@ struct ompi_file_t;
|
||||
typedef void (ompi_file_errhandler_fn)(struct ompi_file_t**, int *, ...);
|
||||
#endif
|
||||
typedef void (MPI_Win_errhandler_fn)(MPI_Win *, int *, ...);
|
||||
/* MPI_Handler_function is deprecated, but we don't mark it as
|
||||
such because otherwise the MPI_Errhandler_create() declaration
|
||||
would cause a warning to be issued */
|
||||
typedef void (MPI_Handler_function)(MPI_Comm *, int *, ...);
|
||||
typedef void (MPI_User_function)(void *, void *, int *, MPI_Datatype *);
|
||||
typedef int (MPI_Comm_copy_attr_function)(MPI_Comm, int, void *,
|
||||
@ -586,17 +659,20 @@ OMPI_DECLSPEC int OMPI_C_MPI_COMM_DUP_FN( MPI_Comm comm, int comm_keyval,
|
||||
int* flag );
|
||||
OMPI_DECLSPEC int OMPI_C_MPI_NULL_DELETE_FN( MPI_Comm comm, int comm_keyval,
|
||||
void* attribute_val_out,
|
||||
void* extra_state );
|
||||
void* extra_state )
|
||||
__mpi_interface_deprecated__("MPI_NULL_DELETE_FN is deprecated in MPI-2.0");
|
||||
OMPI_DECLSPEC int OMPI_C_MPI_NULL_COPY_FN( MPI_Comm comm, int comm_keyval,
|
||||
void* extra_state,
|
||||
void* attribute_val_in,
|
||||
void* attribute_val_out,
|
||||
int* flag );
|
||||
int* flag )
|
||||
__mpi_interface_deprecated__("MPI_NULL_COPY_FN is deprecated in MPI-2.0");
|
||||
OMPI_DECLSPEC int OMPI_C_MPI_DUP_FN( MPI_Comm comm, int comm_keyval,
|
||||
void* extra_state,
|
||||
void* attribute_val_in,
|
||||
void* attribute_val_out,
|
||||
int* flag );
|
||||
int* flag )
|
||||
__mpi_interface_deprecated__("MPI_DUP_FN is deprecated in MPI-2.0");
|
||||
OMPI_DECLSPEC int OMPI_C_MPI_WIN_NULL_DELETE_FN( MPI_Win window,
|
||||
int win_keyval,
|
||||
void* attribute_val_out,
|
||||
@ -653,7 +729,8 @@ OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_unsigned_char;
|
||||
OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_unsigned_short;
|
||||
OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_unsigned, ompi_mpi_datatype_null;
|
||||
OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_unsigned_long, ompi_mpi_ldblcplex;
|
||||
OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_ub, ompi_mpi_lb;
|
||||
OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_lb __mpi_interface_deprecated__("MPI_LB is deprecated in MPI-2.0");
|
||||
OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_ub __mpi_interface_deprecated__("MPI_UB is deprecated in MPI-2.0");
|
||||
OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_float_int, ompi_mpi_double_int;
|
||||
OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_long_int, ompi_mpi_2int;
|
||||
OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_short_int, ompi_mpi_dblcplex;
|
||||
@ -861,7 +938,8 @@ OMPI_DECLSPEC int MPI_Accumulate(void *origin_addr, int origin_count, MPI_Datat
|
||||
OMPI_DECLSPEC int MPI_Add_error_class(int *errorclass);
|
||||
OMPI_DECLSPEC int MPI_Add_error_code(int errorclass, int *errorcode);
|
||||
OMPI_DECLSPEC int MPI_Add_error_string(int errorcode, char *string);
|
||||
OMPI_DECLSPEC int MPI_Address(void *location, MPI_Aint *address);
|
||||
OMPI_DECLSPEC int MPI_Address(void *location, MPI_Aint *address)
|
||||
__mpi_interface_deprecated__("MPI_Address is superseded by MPI_Get_address in MPI-2.0");
|
||||
OMPI_DECLSPEC int MPI_Allgather(void *sendbuf, int sendcount, MPI_Datatype sendtype,
|
||||
void *recvbuf, int recvcount,
|
||||
MPI_Datatype recvtype, MPI_Comm comm);
|
||||
@ -881,9 +959,12 @@ OMPI_DECLSPEC int MPI_Alltoallv(void *sendbuf, int *sendcounts, int *sdispls,
|
||||
OMPI_DECLSPEC int MPI_Alltoallw(void *sendbuf, int *sendcounts, int *sdispls, MPI_Datatype *sendtypes,
|
||||
void *recvbuf, int *recvcounts, int *rdispls, MPI_Datatype *recvtypes,
|
||||
MPI_Comm comm);
|
||||
OMPI_DECLSPEC int MPI_Attr_delete(MPI_Comm comm, int keyval);
|
||||
OMPI_DECLSPEC int MPI_Attr_get(MPI_Comm comm, int keyval, void *attribute_val, int *flag);
|
||||
OMPI_DECLSPEC int MPI_Attr_put(MPI_Comm comm, int keyval, void *attribute_val);
|
||||
OMPI_DECLSPEC int MPI_Attr_delete(MPI_Comm comm, int keyval)
|
||||
__mpi_interface_deprecated__("MPI_Attr_delete is superseded by MPI_Comm_delete_attr in MPI-2.0");
|
||||
OMPI_DECLSPEC int MPI_Attr_get(MPI_Comm comm, int keyval, void *attribute_val, int *flag)
|
||||
__mpi_interface_deprecated__("MPI_Attr_get is superseded by MPI_Comm_get_attr in MPI-2.0");
|
||||
OMPI_DECLSPEC int MPI_Attr_put(MPI_Comm comm, int keyval, void *attribute_val)
|
||||
__mpi_interface_deprecated__("MPI_Attr_put is superseded by MPI_Comm_set_attr in MPI-2.0");
|
||||
OMPI_DECLSPEC int MPI_Barrier(MPI_Comm comm);
|
||||
OMPI_DECLSPEC int MPI_Bcast(void *buffer, int count, MPI_Datatype datatype,
|
||||
int root, MPI_Comm comm);
|
||||
@ -952,11 +1033,14 @@ OMPI_DECLSPEC int MPI_Comm_test_inter(MPI_Comm comm, int *flag);
|
||||
OMPI_DECLSPEC int MPI_Dims_create(int nnodes, int ndims, int *dims);
|
||||
OMPI_DECLSPEC MPI_Fint MPI_Errhandler_c2f(MPI_Errhandler errhandler);
|
||||
OMPI_DECLSPEC int MPI_Errhandler_create(MPI_Handler_function *function,
|
||||
MPI_Errhandler *errhandler);
|
||||
MPI_Errhandler *errhandler)
|
||||
__mpi_interface_deprecated__("MPI_Errhandler_create is superseded by MPI_Comm_create_errhandler in MPI-2.0");
|
||||
OMPI_DECLSPEC MPI_Errhandler MPI_Errhandler_f2c(MPI_Fint errhandler);
|
||||
OMPI_DECLSPEC int MPI_Errhandler_free(MPI_Errhandler *errhandler);
|
||||
OMPI_DECLSPEC int MPI_Errhandler_get(MPI_Comm comm, MPI_Errhandler *errhandler);
|
||||
OMPI_DECLSPEC int MPI_Errhandler_set(MPI_Comm comm, MPI_Errhandler errhandler);
|
||||
OMPI_DECLSPEC int MPI_Errhandler_get(MPI_Comm comm, MPI_Errhandler *errhandler)
|
||||
__mpi_interface_deprecated__("MPI_Errhandler_get is superseded by MPI_Comm_get_errhandler in MPI-2.0");
|
||||
OMPI_DECLSPEC int MPI_Errhandler_set(MPI_Comm comm, MPI_Errhandler errhandler)
|
||||
__mpi_interface_deprecated__("MPI_Errhandler_set is superseded by MPI_Comm_set_errhandler in MPI-2.0");
|
||||
OMPI_DECLSPEC int MPI_Error_class(int errorcode, int *errorclass);
|
||||
OMPI_DECLSPEC int MPI_Error_string(int errorcode, char *string, int *resultlen);
|
||||
OMPI_DECLSPEC int MPI_Exscan(void *sendbuf, void *recvbuf, int count,
|
||||
@ -1143,8 +1227,10 @@ OMPI_DECLSPEC int MPI_Issend(void *buf, int count, MPI_Datatype datatype, int d
|
||||
OMPI_DECLSPEC int MPI_Is_thread_main(int *flag);
|
||||
OMPI_DECLSPEC int MPI_Keyval_create(MPI_Copy_function *copy_fn,
|
||||
MPI_Delete_function *delete_fn,
|
||||
int *keyval, void *extra_state);
|
||||
OMPI_DECLSPEC int MPI_Keyval_free(int *keyval);
|
||||
int *keyval, void *extra_state)
|
||||
__mpi_interface_deprecated__("MPI_Keyval_create is superseded by MPI_Comm_keyval_create in MPI-2.0");
|
||||
OMPI_DECLSPEC int MPI_Keyval_free(int *keyval)
|
||||
__mpi_interface_deprecated__("MPI_Keyval_free is superseded by MPI_Comm_keyval_free in MPI-2.0");
|
||||
OMPI_DECLSPEC int MPI_Lookup_name(char *service_name, MPI_Info info, char *port_name);
|
||||
OMPI_DECLSPEC MPI_Fint MPI_Op_c2f(MPI_Op op);
|
||||
OMPI_DECLSPEC int MPI_Op_create(MPI_User_function *function, int commute, MPI_Op *op);
|
||||
@ -1272,7 +1358,8 @@ OMPI_DECLSPEC int MPI_Type_create_resized(MPI_Datatype oldtype, MPI_Aint lb,
|
||||
MPI_Aint extent, MPI_Datatype *newtype);
|
||||
OMPI_DECLSPEC int MPI_Type_delete_attr(MPI_Datatype type, int type_keyval);
|
||||
OMPI_DECLSPEC int MPI_Type_dup(MPI_Datatype type, MPI_Datatype *newtype);
|
||||
OMPI_DECLSPEC int MPI_Type_extent(MPI_Datatype type, MPI_Aint *extent);
|
||||
OMPI_DECLSPEC int MPI_Type_extent(MPI_Datatype type, MPI_Aint *extent)
|
||||
__mpi_interface_deprecated__("MPI_Type_extent is superseded by MPI_Type_get_extent in MPI-2.0");
|
||||
OMPI_DECLSPEC int MPI_Type_free(MPI_Datatype *type);
|
||||
OMPI_DECLSPEC int MPI_Type_free_keyval(int *type_keyval);
|
||||
OMPI_DECLSPEC MPI_Datatype MPI_Type_f2c(MPI_Fint datatype);
|
||||
@ -1294,13 +1381,16 @@ OMPI_DECLSPEC int MPI_Type_get_true_extent(MPI_Datatype datatype, MPI_Aint *tru
|
||||
MPI_Aint *true_extent);
|
||||
OMPI_DECLSPEC int MPI_Type_hindexed(int count, int array_of_blocklengths[],
|
||||
MPI_Aint array_of_displacements[],
|
||||
MPI_Datatype oldtype, MPI_Datatype *newtype);
|
||||
MPI_Datatype oldtype, MPI_Datatype *newtype)
|
||||
__mpi_interface_deprecated__("MPI_Type_hindexed is superseded by MPI_Type_create_hindexed in MPI-2.0");
|
||||
OMPI_DECLSPEC int MPI_Type_hvector(int count, int blocklength, MPI_Aint stride,
|
||||
MPI_Datatype oldtype, MPI_Datatype *newtype);
|
||||
MPI_Datatype oldtype, MPI_Datatype *newtype)
|
||||
__mpi_interface_deprecated__("MPI_Type_hvector is superseded by MPI_Type_create_hvector in MPI-2.0");
|
||||
OMPI_DECLSPEC int MPI_Type_indexed(int count, int array_of_blocklengths[],
|
||||
int array_of_displacements[],
|
||||
MPI_Datatype oldtype, MPI_Datatype *newtype);
|
||||
OMPI_DECLSPEC int MPI_Type_lb(MPI_Datatype type, MPI_Aint *lb);
|
||||
OMPI_DECLSPEC int MPI_Type_lb(MPI_Datatype type, MPI_Aint *lb)
|
||||
__mpi_interface_deprecated__("MPI_Type_lb is deprecated, use MPI_Type_get_extent in MPI-2.0");
|
||||
OMPI_DECLSPEC int MPI_Type_match_size(int typeclass, int size, MPI_Datatype *type);
|
||||
OMPI_DECLSPEC int MPI_Type_set_attr(MPI_Datatype type, int type_keyval,
|
||||
void *attr_val);
|
||||
@ -1309,8 +1399,10 @@ OMPI_DECLSPEC int MPI_Type_size(MPI_Datatype type, int *size);
|
||||
OMPI_DECLSPEC int MPI_Type_struct(int count, int array_of_blocklengths[],
|
||||
MPI_Aint array_of_displacements[],
|
||||
MPI_Datatype array_of_types[],
|
||||
MPI_Datatype *newtype);
|
||||
OMPI_DECLSPEC int MPI_Type_ub(MPI_Datatype mtype, MPI_Aint *ub);
|
||||
MPI_Datatype *newtype)
|
||||
__mpi_interface_deprecated__("MPI_Type_struct is superseded by MPI_Type_create_struct in MPI-2.0");
|
||||
OMPI_DECLSPEC int MPI_Type_ub(MPI_Datatype mtype, MPI_Aint *ub)
|
||||
__mpi_interface_deprecated__("MPI_Type_ub is deprecated, use MPI_Type_get_extent in MPI-2.0");
|
||||
OMPI_DECLSPEC int MPI_Type_vector(int count, int blocklength, int stride,
|
||||
MPI_Datatype oldtype, MPI_Datatype *newtype);
|
||||
OMPI_DECLSPEC int MPI_Unpack(void *inbuf, int insize, int *position,
|
||||
@ -1371,7 +1463,8 @@ OMPI_DECLSPEC int PMPI_Accumulate(void *origin_addr, int origin_count, MPI_Data
|
||||
OMPI_DECLSPEC int PMPI_Add_error_class(int *errorclass);
|
||||
OMPI_DECLSPEC int PMPI_Add_error_code(int errorclass, int *errorcode);
|
||||
OMPI_DECLSPEC int PMPI_Add_error_string(int errorcode, char *string);
|
||||
OMPI_DECLSPEC int PMPI_Address(void *location, MPI_Aint *address);
|
||||
OMPI_DECLSPEC int PMPI_Address(void *location, MPI_Aint *address)
|
||||
__mpi_interface_deprecated__("MPI_Address is superseded by MPI_Get_address in MPI-2.0");
|
||||
OMPI_DECLSPEC int PMPI_Allgather(void *sendbuf, int sendcount, MPI_Datatype sendtype,
|
||||
void *recvbuf, int recvcount,
|
||||
MPI_Datatype recvtype, MPI_Comm comm);
|
||||
@ -1389,11 +1482,14 @@ OMPI_DECLSPEC int PMPI_Alltoallv(void *sendbuf, int *sendcounts, int *sdispls,
|
||||
MPI_Datatype sendtype, void *recvbuf, int *recvcounts,
|
||||
int *rdispls, MPI_Datatype recvtype, MPI_Comm comm);
|
||||
OMPI_DECLSPEC int PMPI_Alltoallw(void *sendbuf, int *sendcounts, int *sdispls, MPI_Datatype *sendtypes,
|
||||
void *recvbuf, int *recvcounts, int *rdispls, MPI_Datatype *recvtypes,
|
||||
MPI_Comm comm);
|
||||
OMPI_DECLSPEC int PMPI_Attr_delete(MPI_Comm comm, int keyval);
|
||||
OMPI_DECLSPEC int PMPI_Attr_get(MPI_Comm comm, int keyval, void *attribute_val, int *flag);
|
||||
OMPI_DECLSPEC int PMPI_Attr_put(MPI_Comm comm, int keyval, void *attribute_val);
|
||||
void *recvbuf, int *recvcounts, int *rdispls, MPI_Datatype *recvtypes,
|
||||
MPI_Comm comm);
|
||||
OMPI_DECLSPEC int PMPI_Attr_delete(MPI_Comm comm, int keyval)
|
||||
__mpi_interface_deprecated__("MPI_Attr_delete is superseded by MPI_Comm_delete_attr in MPI-2.0");
|
||||
OMPI_DECLSPEC int PMPI_Attr_get(MPI_Comm comm, int keyval, void *attribute_val, int *flag)
|
||||
__mpi_interface_deprecated__("MPI_Attr_get is superseded by MPI_Comm_get_attr in MPI-2.0");
|
||||
OMPI_DECLSPEC int PMPI_Attr_put(MPI_Comm comm, int keyval, void *attribute_val)
|
||||
__mpi_interface_deprecated__("MPI_Attr_put is superseded by MPI_Comm_set_attr in MPI-2.0");
|
||||
OMPI_DECLSPEC int PMPI_Barrier(MPI_Comm comm);
|
||||
OMPI_DECLSPEC int PMPI_Bcast(void *buffer, int count, MPI_Datatype datatype,
|
||||
int root, MPI_Comm comm);
|
||||
@ -1462,11 +1558,14 @@ OMPI_DECLSPEC int PMPI_Comm_test_inter(MPI_Comm comm, int *flag);
|
||||
OMPI_DECLSPEC int PMPI_Dims_create(int nnodes, int ndims, int *dims);
|
||||
OMPI_DECLSPEC MPI_Fint PMPI_Errhandler_c2f(MPI_Errhandler errhandler);
|
||||
OMPI_DECLSPEC int PMPI_Errhandler_create(MPI_Handler_function *function,
|
||||
MPI_Errhandler *errhandler);
|
||||
MPI_Errhandler *errhandler)
|
||||
__mpi_interface_deprecated__("MPI_Errhandler_create is superseded by MPI_Comm_create_errhandler in MPI-2.0");
|
||||
OMPI_DECLSPEC MPI_Errhandler PMPI_Errhandler_f2c(MPI_Fint errhandler);
|
||||
OMPI_DECLSPEC int PMPI_Errhandler_free(MPI_Errhandler *errhandler);
|
||||
OMPI_DECLSPEC int PMPI_Errhandler_get(MPI_Comm comm, MPI_Errhandler *errhandler);
|
||||
OMPI_DECLSPEC int PMPI_Errhandler_set(MPI_Comm comm, MPI_Errhandler errhandler);
|
||||
OMPI_DECLSPEC int PMPI_Errhandler_get(MPI_Comm comm, MPI_Errhandler *errhandler)
|
||||
__mpi_interface_deprecated__("MPI_Errhandler_get is superseded by MPI_Comm_get_errhandler in MPI-2.0");
|
||||
OMPI_DECLSPEC int PMPI_Errhandler_set(MPI_Comm comm, MPI_Errhandler errhandler)
|
||||
__mpi_interface_deprecated__("MPI_Errhandler_set is superseded by MPI_Comm_set_errhandler in MPI-2.0");
|
||||
OMPI_DECLSPEC int PMPI_Error_class(int errorcode, int *errorclass);
|
||||
OMPI_DECLSPEC int PMPI_Error_string(int errorcode, char *string, int *resultlen);
|
||||
OMPI_DECLSPEC int PMPI_Exscan(void *sendbuf, void *recvbuf, int count,
|
||||
@ -1654,12 +1753,13 @@ OMPI_DECLSPEC int PMPI_Issend(void *buf, int count, MPI_Datatype datatype, int
|
||||
OMPI_DECLSPEC int PMPI_Is_thread_main(int *flag);
|
||||
OMPI_DECLSPEC int PMPI_Keyval_create(MPI_Copy_function *copy_fn,
|
||||
MPI_Delete_function *delete_fn,
|
||||
int *keyval, void *extra_state);
|
||||
OMPI_DECLSPEC int PMPI_Keyval_free(int *keyval);
|
||||
int *keyval, void *extra_state)
|
||||
__mpi_interface_deprecated__("MPI_Keyval_create is superseded by MPI_Comm_keyval_create in MPI-2.0");
|
||||
OMPI_DECLSPEC int PMPI_Keyval_free(int *keyval)
|
||||
__mpi_interface_deprecated__("MPI_Keyval_free is superseded by MPI_Comm_keyval_free in MPI-2.0");
|
||||
OMPI_DECLSPEC int PMPI_Lookup_name(char *service_name, MPI_Info info, char *port_name);
|
||||
OMPI_DECLSPEC MPI_Fint PMPI_Op_c2f(MPI_Op op);
|
||||
OMPI_DECLSPEC int PMPI_Op_create(MPI_User_function *function, int commute,
|
||||
MPI_Op *op);
|
||||
OMPI_DECLSPEC int PMPI_Op_create(MPI_User_function *function, int commute, MPI_Op *op);
|
||||
OMPI_DECLSPEC int PMPI_Open_port(MPI_Info info, char *port_name);
|
||||
OMPI_DECLSPEC MPI_Op PMPI_Op_f2c(MPI_Fint op);
|
||||
OMPI_DECLSPEC int PMPI_Op_free(MPI_Op *op);
|
||||
@ -1783,7 +1883,8 @@ OMPI_DECLSPEC int PMPI_Type_create_resized(MPI_Datatype oldtype, MPI_Aint lb,
|
||||
MPI_Aint extent, MPI_Datatype *newtype);
|
||||
OMPI_DECLSPEC int PMPI_Type_delete_attr(MPI_Datatype type, int type_keyval);
|
||||
OMPI_DECLSPEC int PMPI_Type_dup(MPI_Datatype type, MPI_Datatype *newtype);
|
||||
OMPI_DECLSPEC int PMPI_Type_extent(MPI_Datatype type, MPI_Aint *extent);
|
||||
OMPI_DECLSPEC int PMPI_Type_extent(MPI_Datatype type, MPI_Aint *extent)
|
||||
__mpi_interface_deprecated__("MPI_Type_extent is superseded by MPI_Type_get_extent in MPI-2.0");
|
||||
OMPI_DECLSPEC int PMPI_Type_free(MPI_Datatype *type);
|
||||
OMPI_DECLSPEC int PMPI_Type_free_keyval(int *type_keyval);
|
||||
OMPI_DECLSPEC MPI_Datatype PMPI_Type_f2c(MPI_Fint datatype);
|
||||
@ -1805,13 +1906,16 @@ OMPI_DECLSPEC int PMPI_Type_get_true_extent(MPI_Datatype datatype, MPI_Aint *tr
|
||||
MPI_Aint *true_extent);
|
||||
OMPI_DECLSPEC int PMPI_Type_hindexed(int count, int array_of_blocklengths[],
|
||||
MPI_Aint array_of_displacements[],
|
||||
MPI_Datatype oldtype, MPI_Datatype *newtype);
|
||||
MPI_Datatype oldtype, MPI_Datatype *newtype)
|
||||
__mpi_interface_deprecated__("MPI_Type_hindexed is superseded by MPI_Type_create_hindexed in MPI-2.0");
|
||||
OMPI_DECLSPEC int PMPI_Type_hvector(int count, int blocklength, MPI_Aint stride,
|
||||
MPI_Datatype oldtype, MPI_Datatype *newtype);
|
||||
MPI_Datatype oldtype, MPI_Datatype *newtype)
|
||||
__mpi_interface_deprecated__("MPI_Type_hvector is superseded by MPI_Type_create_hvector in MPI-2.0");
|
||||
OMPI_DECLSPEC int PMPI_Type_indexed(int count, int array_of_blocklengths[],
|
||||
int array_of_displacements[],
|
||||
MPI_Datatype oldtype, MPI_Datatype *newtype);
|
||||
OMPI_DECLSPEC int PMPI_Type_lb(MPI_Datatype type, MPI_Aint *lb);
|
||||
OMPI_DECLSPEC int PMPI_Type_lb(MPI_Datatype type, MPI_Aint *lb)
|
||||
__mpi_interface_deprecated__("MPI_Type_lb is deprecated, use MPI_Type_get_extent in MPI-2.0");
|
||||
OMPI_DECLSPEC int PMPI_Type_match_size(int typeclass, int size, MPI_Datatype *type);
|
||||
OMPI_DECLSPEC int PMPI_Type_set_attr(MPI_Datatype type, int type_keyval,
|
||||
void *attr_val);
|
||||
@ -1820,8 +1924,10 @@ OMPI_DECLSPEC int PMPI_Type_size(MPI_Datatype type, int *size);
|
||||
OMPI_DECLSPEC int PMPI_Type_struct(int count, int array_of_blocklengths[],
|
||||
MPI_Aint array_of_displacements[],
|
||||
MPI_Datatype array_of_types[],
|
||||
MPI_Datatype *newtype);
|
||||
OMPI_DECLSPEC int PMPI_Type_ub(MPI_Datatype mtype, MPI_Aint *ub);
|
||||
MPI_Datatype *newtype)
|
||||
__mpi_interface_deprecated__("MPI_Type_struct is superseded by MPI_Type_create_struct in MPI-2.0");
|
||||
OMPI_DECLSPEC int PMPI_Type_ub(MPI_Datatype mtype, MPI_Aint *ub)
|
||||
__mpi_interface_deprecated__("MPI_Type_ub is deprecated, use MPI_Type_get_extent in MPI-2.0");
|
||||
OMPI_DECLSPEC int PMPI_Type_vector(int count, int blocklength, int stride,
|
||||
MPI_Datatype oldtype, MPI_Datatype *newtype);
|
||||
OMPI_DECLSPEC int PMPI_Unpack(void *inbuf, int insize, int *position,
|
||||
|
401
ompi/include/mpi_portable_platform.h.in
Обычный файл
401
ompi/include/mpi_portable_platform.h.in
Обычный файл
@ -0,0 +1,401 @@
|
||||
/*
|
||||
* Header file with preprocessor magic to figure out, which compiler the user has been calling!
|
||||
*
|
||||
* This code is adapted from the file other/portable_platform.h of GASnet-1.12.0:
|
||||
* - Ripping out the required parts.
|
||||
* - Get rid of brackets as it messes up autoconf
|
||||
* - Delete version tests for older PGI versions (#include "omp.h" not acceptabe)
|
||||
* - Indent ('#' should be in column 0)
|
||||
*
|
||||
* External packages (vt, romio) depend on top_build_dir/ompi/include, therefore
|
||||
* although this is not changed in the configure process, this has to be set as
|
||||
* a .in file...
|
||||
* ---------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef MPI_PORTABLE_PLATFORM_H
|
||||
#define MPI_PORTABLE_PLATFORM_H
|
||||
|
||||
/* All files in this directory and all sub-directories (except where otherwise noted)
|
||||
* are subject to the following licensing terms:
|
||||
*
|
||||
* ---------------------------------------------------------------------------
|
||||
* "Copyright (c) 2000-2003 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software and its
|
||||
* documentation for any purpose, without fee, and without written agreement is
|
||||
* hereby granted, provided that the above copyright notice and the following
|
||||
* two paragraphs appear in all copies of this software.
|
||||
*
|
||||
* IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
|
||||
* DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
|
||||
* OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF
|
||||
* CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
|
||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
* AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
|
||||
* ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO
|
||||
* PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS."
|
||||
* ---------------------------------------------------------------------------
|
||||
*
|
||||
* Please see the license.txt files within the gm-conduit, lapi-conduit and
|
||||
* vapi-conduit directories for the licensing terms governing those
|
||||
* contributed components.
|
||||
*
|
||||
* The authors/contributors of GASNet include:
|
||||
*
|
||||
* Dan Bonachea <bonachea@cs.berkeley.edu>:
|
||||
* General infrastructure & documentation
|
||||
* mpi-conduit
|
||||
* elan-conduit
|
||||
* smp-conduit
|
||||
* udp-conduit
|
||||
* extended-ref
|
||||
* template-conduit
|
||||
* Christian Bell <csbell@cs.berkeley.edu>: gm-conduit, shmem-conduit
|
||||
* Mike Welcome <mlwelcome@lbl.gov>: lapi-conduit, portals-conduit
|
||||
* Paul H. Hargrove <phhargrove@lbl.gov>: vapi-conduit, ibv-conduit
|
||||
* Rajesh Nishtala <rajeshn@cs.berkeley.edu>: collectives, dcmf-conduit
|
||||
* Parry Husbands (PJRHusbands@lbl.gov): lapi-conduit
|
||||
*
|
||||
* For more information about GASNet, visit our home page at:
|
||||
* http://gasnet.cs.berkeley.edu/
|
||||
* Or send email to:
|
||||
* <upc@lbl.gov>
|
||||
*
|
||||
* Source code contributions (fixes, patches, extensions etc.) should be
|
||||
* sent to <upc@lbl.gov> to be reviewed for acceptance into the primary
|
||||
* distribution. Contributions are most likely to be accepted if they
|
||||
* are provided as public domain, or under a BSD-style license such as
|
||||
* the one above.
|
||||
*
|
||||
*/
|
||||
#ifndef _STRINGIFY
|
||||
#define _STRINGIFY_HELPER(x) #x
|
||||
#define _STRINGIFY(x) _STRINGIFY_HELPER(x)
|
||||
#endif
|
||||
|
||||
#if defined(__INTEL_COMPILER)
|
||||
# define PLATFORM_COMPILER_FAMILYNAME INTEL
|
||||
# define PLATFORM_COMPILER_FAMILYID 2
|
||||
# ifdef __cplusplus
|
||||
# define PLATFORM_COMPILER_INTEL_CXX 1
|
||||
# else
|
||||
# define PLATFORM_COMPILER_INTEL_C 1
|
||||
# endif
|
||||
# define _PLATFORM_COMPILER_INTEL_MIN_BUILDDATE 19700000 /* year 1970: predates most intel products :) */
|
||||
# ifdef __INTEL_COMPILER_BUILD_DATE
|
||||
# define _PLATFORM_INTEL_COMPILER_BUILD_DATE __INTEL_COMPILER_BUILD_DATE
|
||||
# else
|
||||
# define _PLATFORM_INTEL_COMPILER_BUILD_DATE _PLATFORM_COMPILER_INTEL_MIN_BUILDDATE
|
||||
# endif
|
||||
/* patch number is a decimal build date: YYYYMMDD */
|
||||
# define PLATFORM_COMPILER_VERSION_INT(maj,min,pat) \
|
||||
(((((maj) * 10) | (min)) << 20) | \
|
||||
((pat) < _PLATFORM_COMPILER_INTEL_MIN_BUILDDATE ? \
|
||||
_PLATFORM_COMPILER_INTEL_MIN_BUILDDATE : ((pat)-_PLATFORM_COMPILER_INTEL_MIN_BUILDDATE)))
|
||||
# define PLATFORM_COMPILER_VERSION \
|
||||
PLATFORM_COMPILER_VERSION_INT(__INTEL_COMPILER/10, __INTEL_COMPILER/100, _PLATFORM_INTEL_COMPILER_BUILD_DATE)
|
||||
# define PLATFORM_COMPILER_VERSION_STR \
|
||||
_STRINGIFY(__INTEL_COMPILER)"."_STRINGIFY(_PLATFORM_INTEL_COMPILER_BUILD_DATE)
|
||||
|
||||
#elif defined(__PATHSCALE__)
|
||||
# define PLATFORM_COMPILER_PATHSCALE 1
|
||||
# define PLATFORM_COMPILER_FAMILYNAME PATHSCALE
|
||||
# define PLATFORM_COMPILER_FAMILYID 3
|
||||
# ifdef __cplusplus
|
||||
# define PLATFORM_COMPILER_PATHSCALE_CXX 1
|
||||
# else
|
||||
# define PLATFORM_COMPILER_PATHSCALE_C 1
|
||||
# endif
|
||||
# define PLATFORM_COMPILER_VERSION \
|
||||
PLATFORM_COMPILER_VERSION_INT(__PATHCC__,__PATHCC_MINOR__,__PATHCC_PATCHLEVEL__)
|
||||
# define PLATFORM_COMPILER_VERSION_STR __PATHSCALE__
|
||||
|
||||
#elif defined(__PGI)
|
||||
# define PLATFORM_COMPILER_PGI 1
|
||||
# define PLATFORM_COMPILER_FAMILYNAME PGI
|
||||
# define PLATFORM_COMPILER_FAMILYID 4
|
||||
# ifdef __cplusplus
|
||||
# define PLATFORM_COMPILER_PGI_CXX 1
|
||||
# else
|
||||
# define PLATFORM_COMPILER_PGI_C 1
|
||||
# endif
|
||||
# if __PGIC__ == 99
|
||||
/* bug 2230: PGI versioning was broken for some platforms in 7.0
|
||||
no way to know exact version, but provide something slightly more accurate */
|
||||
# define PLATFORM_COMPILER_VERSION 0x070000
|
||||
# define PLATFORM_COMPILER_VERSION_STR "7.?-?"
|
||||
# elif defined(__PGIC__) && defined(__PGIC_MINOR__) && defined(__PGIC_PATCHLEVEL__)
|
||||
# define PLATFORM_COMPILER_VERSION \
|
||||
PLATFORM_COMPILER_VERSION_INT(__PGIC__,__PGIC_MINOR__,__PGIC_PATCHLEVEL__)
|
||||
# define PLATFORM_COMPILER_VERSION_STR \
|
||||
_STRINGIFY(__PGIC__)"."_STRINGIFY(__PGIC_MINOR__)"-"_STRINGIFY(__PGIC_PATCHLEVEL__)
|
||||
# else
|
||||
/* PGI before 6.1-4 lacks any version ID preprocessor macros - so use this filthy hack */
|
||||
/* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
||||
* We cannot do these within mpi.h.in, as we should not include ompi.h
|
||||
* Hopefully, compilers with integrated preprocessors will not analyse code within the #if 0-block
|
||||
* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
||||
*/
|
||||
#if 0
|
||||
# ifdef PLATFORM_PGI_IS_ANCIENT
|
||||
/* Include below might fail for ancient versions lacking this header, but testing shows it
|
||||
works back to at least 5.1-3 (Nov 2003), and based on docs probably back to 3.2 (Sep 2000) */
|
||||
# define PLATFORM_COMPILER_VERSION 0
|
||||
# elif defined(__x86_64__) /* bug 1753 - 64-bit omp.h upgrade happenned in <6.0-8,6.1-1) */
|
||||
# include "omp.h"
|
||||
# if defined(_PGOMP_H)
|
||||
/* 6.1.1 or newer */
|
||||
# define PLATFORM_COMPILER_VERSION 0x060101
|
||||
# define PLATFORM_COMPILER_VERSION_STR ">=6.1-1"
|
||||
# else
|
||||
/* 6.0.8 or older */
|
||||
# define PLATFORM_COMPILER_VERSION 0
|
||||
# define PLATFORM_COMPILER_VERSION_STR "<=6.0-8"
|
||||
# endif
|
||||
# else /* 32-bit omp.h upgrade happenned in <5.2-4,6.0-8 */
|
||||
# include "omp.h"
|
||||
# if defined(_PGOMP_H)
|
||||
/* 6.0-8 or newer */
|
||||
# define PLATFORM_COMPILER_VERSION 0x060008
|
||||
# define PLATFORM_COMPILER_VERSION_STR ">=6.0-8"
|
||||
# else
|
||||
/* 5.2-4 or older */
|
||||
# define PLATFORM_COMPILER_VERSION 0
|
||||
# define PLATFORM_COMPILER_VERSION_STR "<=5.2-4"
|
||||
# endif
|
||||
# endif
|
||||
#endif /* 0 */
|
||||
/* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX */
|
||||
# endif
|
||||
|
||||
#elif defined(__xlC__)
|
||||
# define PLATFORM_COMPILER_XLC 1
|
||||
# define PLATFORM_COMPILER_FAMILYNAME XLC
|
||||
# define PLATFORM_COMPILER_FAMILYID 5
|
||||
# ifdef __cplusplus
|
||||
# define PLATFORM_COMPILER_XLC_CXX 1
|
||||
# else
|
||||
# define PLATFORM_COMPILER_XLC_C 1
|
||||
# endif
|
||||
# define PLATFORM_COMPILER_VERSION __xlC__
|
||||
# define PLATFORM_COMPILER_VERSION_INT(maj,min,pat) \
|
||||
( ((maj) << 8) | ((min) << 4) | (pat) )
|
||||
|
||||
#elif defined(__DECC) || defined(__DECCXX)
|
||||
# define PLATFORM_COMPILER_COMPAQ 1
|
||||
# define PLATFORM_COMPILER_FAMILYNAME COMPAQ
|
||||
# define PLATFORM_COMPILER_FAMILYID 6
|
||||
# ifdef __cplusplus
|
||||
# define PLATFORM_COMPILER_COMPAQ_CXX 1
|
||||
# else
|
||||
# define PLATFORM_COMPILER_COMPAQ_C 1
|
||||
# endif
|
||||
# if defined(__DECC_VER)
|
||||
# define PLATFORM_COMPILER_VERSION __DECC_VER
|
||||
# elif defined(__DECCXX_VER)
|
||||
# define PLATFORM_COMPILER_VERSION __DECCXX_VER
|
||||
# endif
|
||||
|
||||
# define PLATFORM_COMPILER_VERSION_INT(maj,min,pat) \
|
||||
( ((maj) * 10000000) + ((min) * 100000) + (90000) + (pat) )
|
||||
/* 90000 = official ver, 80000 = customer special ver, 60000 = field test ver */
|
||||
|
||||
#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC)
|
||||
# define PLATFORM_COMPILER_SUN 1
|
||||
# define PLATFORM_COMPILER_FAMILYNAME SUN
|
||||
# define PLATFORM_COMPILER_FAMILYID 7
|
||||
# ifdef __cplusplus
|
||||
# define PLATFORM_COMPILER_SUN_CXX 1
|
||||
# else
|
||||
# define PLATFORM_COMPILER_SUN_C 1
|
||||
# endif
|
||||
# if defined(__SUNPRO_C) && __SUNPRO_C > 0
|
||||
# define PLATFORM_COMPILER_VERSION __SUNPRO_C
|
||||
# elif defined(__SUNPRO_CC) && __SUNPRO_CC > 0
|
||||
# define PLATFORM_COMPILER_VERSION __SUNPRO_CC
|
||||
# endif
|
||||
# define PLATFORM_COMPILER_VERSION_INT(maj,min,pat) \
|
||||
( ((maj) << 8) | ((min) << 4) | (pat) )
|
||||
|
||||
#elif defined(__HP_cc) || defined(__HP_aCC)
|
||||
# define PLATFORM_COMPILER_HP 1
|
||||
# define PLATFORM_COMPILER_FAMILYNAME HP
|
||||
# define PLATFORM_COMPILER_FAMILYID 8
|
||||
# ifdef __cplusplus
|
||||
# define PLATFORM_COMPILER_HP_CXX 1
|
||||
# else
|
||||
# define PLATFORM_COMPILER_HP_C 1
|
||||
# endif
|
||||
# if defined(__HP_cc) && __HP_cc > 0
|
||||
# define PLATFORM_COMPILER_VERSION __HP_cc
|
||||
# elif defined(__HP_aCC) && __HP_aCC > 0
|
||||
# define PLATFORM_COMPILER_VERSION __HP_aCC
|
||||
# endif
|
||||
# define PLATFORM_COMPILER_VERSION_INT(maj,min,pat) \
|
||||
( ((maj) << 16) | ((min) << 8) | (pat) )
|
||||
|
||||
#elif defined(_SGI_COMPILER_VERSION) || \
|
||||
(defined(_COMPILER_VERSION) && defined(__sgi) && !defined(__GNUC__)) /* 7.3.0 and earlier lack _SGI_COMPILER_VERSION */
|
||||
# define PLATFORM_COMPILER_SGI 1
|
||||
# define PLATFORM_COMPILER_FAMILYNAME SGI
|
||||
# define PLATFORM_COMPILER_FAMILYID 9
|
||||
# ifdef __cplusplus
|
||||
# define PLATFORM_COMPILER_SGI_CXX 1
|
||||
# else
|
||||
# define PLATFORM_COMPILER_SGI_C 1
|
||||
# endif
|
||||
# if defined(_SGI_COMPILER_VERSION) && _SGI_COMPILER_VERSION > 0
|
||||
# define PLATFORM_COMPILER_VERSION _SGI_COMPILER_VERSION
|
||||
# elif defined(_COMPILER_VERSION) && _COMPILER_VERSION > 0
|
||||
# define PLATFORM_COMPILER_VERSION _COMPILER_VERSION
|
||||
# endif
|
||||
# define PLATFORM_COMPILER_VERSION_INT(maj,min,pat) \
|
||||
( ((maj) << 8) | ((min) << 4) | (pat) )
|
||||
|
||||
#elif defined(_CRAYC)
|
||||
# define PLATFORM_COMPILER_CRAY 1
|
||||
# define PLATFORM_COMPILER_FAMILYNAME CRAY
|
||||
# define PLATFORM_COMPILER_FAMILYID 10
|
||||
# ifdef __cplusplus
|
||||
# define PLATFORM_COMPILER_CRAY_CXX 1
|
||||
# else
|
||||
# define PLATFORM_COMPILER_CRAY_C 1
|
||||
# endif
|
||||
# if defined(_RELEASE) && defined(_RELEASE_MINOR) /* X1 */
|
||||
# define PLATFORM_COMPILER_VERSION \
|
||||
PLATFORM_COMPILER_VERSION_INT(_RELEASE,_RELEASE_MINOR,0)
|
||||
# elif defined(_RELEASE) /* T3E */
|
||||
# define PLATFORM_COMPILER_VERSION \
|
||||
PLATFORM_COMPILER_VERSION_INT(_RELEASE,0,0)
|
||||
# endif
|
||||
# ifdef _RELEASE_STRING /* X1 */
|
||||
# define PLATFORM_COMPILER_VERSION_STR _RELEASE_STRING
|
||||
# endif
|
||||
|
||||
#elif defined(__KCC)
|
||||
# define PLATFORM_COMPILER_KAI 1
|
||||
# define PLATFORM_COMPILER_FAMILYNAME KAI
|
||||
# define PLATFORM_COMPILER_FAMILYID 11
|
||||
# ifdef __cplusplus
|
||||
# define PLATFORM_COMPILER_KAI_CXX 1
|
||||
# else
|
||||
# define PLATFORM_COMPILER_KAI_C 1
|
||||
# endif
|
||||
|
||||
#elif defined(__MTA__)
|
||||
# define PLATFORM_COMPILER_MTA 1
|
||||
# define PLATFORM_COMPILER_FAMILYNAME MTA
|
||||
# define PLATFORM_COMPILER_FAMILYID 12
|
||||
# ifdef __cplusplus
|
||||
# define PLATFORM_COMPILER_MTA_CXX 1
|
||||
# else
|
||||
# define PLATFORM_COMPILER_MTA_C 1
|
||||
# endif
|
||||
|
||||
#elif defined(_SX)
|
||||
# define PLATFORM_COMPILER_NECSX 1
|
||||
# define PLATFORM_COMPILER_FAMILYNAME NECSX
|
||||
# define PLATFORM_COMPILER_FAMILYID 13
|
||||
# ifdef __cplusplus
|
||||
# define PLATFORM_COMPILER_NECSX_CXX 1
|
||||
# else
|
||||
# define PLATFORM_COMPILER_NECSX_C 1
|
||||
# endif
|
||||
|
||||
#elif defined(_MSC_VER)
|
||||
# define PLATFORM_COMPILER_MICROSOFT 1
|
||||
# define PLATFORM_COMPILER_FAMILYNAME MICROSOFT
|
||||
# define PLATFORM_COMPILER_FAMILYID 14
|
||||
# ifdef __cplusplus
|
||||
# define PLATFORM_COMPILER_MICROSOFT_CXX 1
|
||||
# else
|
||||
# define PLATFORM_COMPILER_MICROSOFT_C 1
|
||||
# endif
|
||||
# define PLATFORM_COMPILER_VERSION _MSC_VER
|
||||
|
||||
#elif defined(__TINYC__)
|
||||
# define PLATFORM_COMPILER_TINY 1
|
||||
# define PLATFORM_COMPILER_FAMILYNAME TINY
|
||||
# define PLATFORM_COMPILER_FAMILYID 15
|
||||
# ifdef __cplusplus
|
||||
# define PLATFORM_COMPILER_TINY_CXX 1
|
||||
# else
|
||||
# define PLATFORM_COMPILER_TINY_C 1
|
||||
# endif
|
||||
|
||||
#elif defined(__LCC__)
|
||||
# define PLATFORM_COMPILER_LCC 1
|
||||
# define PLATFORM_COMPILER_FAMILYNAME LCC
|
||||
# define PLATFORM_COMPILER_FAMILYID 16
|
||||
# ifdef __cplusplus
|
||||
# define PLATFORM_COMPILER_LCC_CXX 1
|
||||
# else
|
||||
# define PLATFORM_COMPILER_LCC_C 1
|
||||
# endif
|
||||
|
||||
#else /* unknown compiler */
|
||||
# define PLATFORM_COMPILER_UNKNOWN 1
|
||||
#endif
|
||||
|
||||
/* this stanza comes last, because many vendor compilers lie and claim
|
||||
to be GNU C for compatibility reasons and/or because they share a frontend */
|
||||
#if defined(__GNUC__)
|
||||
# undef PLATFORM_COMPILER_UNKNOWN
|
||||
# ifndef PLATFORM_COMPILER_FAMILYID
|
||||
# define PLATFORM_COMPILER_GNU 1
|
||||
# define PLATFORM_COMPILER_FAMILYNAME GNU
|
||||
# define PLATFORM_COMPILER_FAMILYID 1
|
||||
# ifdef __cplusplus
|
||||
# define PLATFORM_COMPILER_GNU_CXX 1
|
||||
# else
|
||||
# define PLATFORM_COMPILER_GNU_C 1
|
||||
# endif
|
||||
# if defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__)
|
||||
# define PLATFORM_COMPILER_VERSION \
|
||||
PLATFORM_COMPILER_VERSION_INT(__GNUC__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__)
|
||||
# elif defined(__GNUC_MINOR__) /* older versions of egcs lack __GNUC_PATCHLEVEL__ */
|
||||
# define PLATFORM_COMPILER_VERSION \
|
||||
PLATFORM_COMPILER_VERSION_INT(__GNUC__,__GNUC_MINOR__,0)
|
||||
# else
|
||||
# define PLATFORM_COMPILER_VERSION \
|
||||
PLATFORM_COMPILER_VERSION_INT(__GNUC__,0,0)
|
||||
# endif
|
||||
# define PLATFORM_COMPILER_VERSION_STR __PLATFORM_COMPILER_GNU_VERSION_STR
|
||||
# else
|
||||
# define _PLATFORM_COMPILER_GNU_VERSION_STR __PLATFORM_COMPILER_GNU_VERSION_STR
|
||||
# endif
|
||||
/* gather any advertised GNU version number info, even for non-gcc compilers */
|
||||
# if defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__)
|
||||
# define __PLATFORM_COMPILER_GNU_VERSION_STR \
|
||||
_STRINGIFY(__GNUC__)"."_STRINGIFY(__GNUC_MINOR__)"."_STRINGIFY(__GNUC_PATCHLEVEL__)
|
||||
# elif defined(__GNUC_MINOR__)
|
||||
# define __PLATFORM_COMPILER_GNU_VERSION_STR \
|
||||
_STRINGIFY(__GNUC__)"."_STRINGIFY(__GNUC_MINOR__)".?"
|
||||
# else
|
||||
# define __PLATFORM_COMPILER_GNU_VERSION_STR \
|
||||
_STRINGIFY(__GNUC__)".?.?"
|
||||
# endif
|
||||
#elif defined(PLATFORM_COMPILER_UNKNOWN) /* unknown compiler */
|
||||
# define PLATFORM_COMPILER_FAMILYNAME UNKNOWN
|
||||
# define PLATFORM_COMPILER_FAMILYID 0
|
||||
#endif
|
||||
|
||||
/* Default Values */
|
||||
#ifndef PLATFORM_COMPILER_VERSION
|
||||
# define PLATFORM_COMPILER_VERSION 0 /* don't know */
|
||||
#endif
|
||||
|
||||
#ifndef PLATFORM_COMPILER_VERSION_STR
|
||||
# define PLATFORM_COMPILER_VERSION_STR _STRINGIFY(PLATFORM_COMPILER_VERSION)
|
||||
#endif
|
||||
|
||||
#ifndef PLATFORM_COMPILER_VERSION_INT
|
||||
# define PLATFORM_COMPILER_VERSION_INT(maj,min,pat) \
|
||||
(((maj) << 16) | ((min) << 8) | (pat))
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* MPI_PORTABLE_PLATFORM_H */
|
@ -10,6 +10,7 @@
|
||||
// Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
// All rights reserved.
|
||||
// Copyright (c) 2007-2008 Cisco Systems, Inc. All rights reserved.
|
||||
// Copyright (c) 2009 Oak Ridge National Labs. All rights reserved.
|
||||
// $COPYRIGHT$
|
||||
//
|
||||
// Additional copyrights may follow
|
||||
@ -41,6 +42,7 @@
|
||||
#include "opal/memoryhooks/memory.h"
|
||||
#include "opal/mca/base/mca_base_param.h"
|
||||
#include "ompi/tools/ompi_info/ompi_info.h"
|
||||
#include "ompi/include/mpi_portable_platform.h"
|
||||
|
||||
using namespace std;
|
||||
using namespace ompi_info;
|
||||
@ -494,6 +496,7 @@ void ompi_info::do_config(bool want_all)
|
||||
const string memprofile(OPAL_ENABLE_MEM_PROFILE ? "yes" : "no");
|
||||
const string memdebug(OPAL_ENABLE_MEM_DEBUG ? "yes" : "no");
|
||||
const string debug(OPAL_ENABLE_DEBUG ? "yes" : "no");
|
||||
const string mpi_interface_warning(OMPI_WANT_MPI_INTERFACE_WARNING ? "yes" : "no");
|
||||
const string cprofiling(OMPI_ENABLE_MPI_PROFILING ? "yes" : "no");
|
||||
const string cxxprofiling(OMPI_ENABLE_MPI_PROFILING ? "yes" : "no");
|
||||
const string f77profiling((OMPI_ENABLE_MPI_PROFILING &&
|
||||
@ -567,6 +570,8 @@ void ompi_info::do_config(bool want_all)
|
||||
|
||||
out("C compiler", "compiler:c:command", OPAL_CC);
|
||||
out("C compiler absolute", "compiler:c:absolute", OPAL_CC_ABSOLUTE);
|
||||
out("C compiler family name", "compiler:c:familyname", _STRINGIFY(OPAL_BUILD_PLATFORM_COMPILER_FAMILYNAME));
|
||||
out("C compiler version", "compiler:c:version", _STRINGIFY(OPAL_BUILD_PLATFORM_COMPILER_VERSION_STR));
|
||||
|
||||
if (want_all) {
|
||||
out("C char size", "compiler:c:sizeof:char", sizeof(char));
|
||||
@ -764,6 +769,7 @@ void ompi_info::do_config(bool want_all)
|
||||
}
|
||||
|
||||
out("Internal debug support", "option:debug", debug);
|
||||
out("MPI interface warnings", "option:mpi-interface-warning", mpi_interface_warning);
|
||||
out("MPI parameter check", "option:mpi-param-check", paramcheck);
|
||||
out("Memory profiling support", "option:mem-profile", memprofile);
|
||||
out("Memory debugging support", "option:mem-debug", memdebug);
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user