Skip to content

Commit 9c77c6b

Browse files
committed
fortran: fix f08 bindings
only define the unique fortran symbol depending on - CAPS - PLAIN - SINGLE_UNDERSCORE - DOUBLE_UNDERSCORE and bind the f08 symbol to the uniquely defined C symbol. Use real data structures to make the code simpler. (perl script written by Jeff)
1 parent 318a1a4 commit 9c77c6b

File tree

10 files changed

+261
-206
lines changed

10 files changed

+261
-206
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,9 +140,12 @@ ompi/debuggers/predefined_pad_test
140140
ompi/include/mpi.h
141141
ompi/include/mpif-config.h
142142
ompi/include/mpif.h
143+
ompi/include/mpif-c-constants-decl.h
144+
ompi/include/mpif-c-constants.h
143145
ompi/include/mpif-common.h
144146
ompi/include/mpi-ext.h
145147
ompi/include/mpif-ext.h
148+
ompi/include/mpif-f08-types.h
146149
ompi/include/mpif-handles.h
147150
ompi/include/mpif-io-constants.h
148151
ompi/include/mpif-constants.h

config/ompi_setup_mpi_fortran.m4

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,15 +103,23 @@ AC_DEFUN([OMPI_SETUP_MPI_FORTRAN],[
103103
AC_DEFINE_UNQUOTED([OMPI_FORTRAN_DOUBLE_UNDERSCORE],
104104
[$ompi_fortran_double_underscore],
105105
[Whether fortran symbols have a trailing double underscore or not])
106+
OMPI_FORTRAN_DOUBLE_UNDERSCORE=$ompi_fortran_double_underscore
107+
AC_SUBST(OMPI_FORTRAN_DOUBLE_UNDERSCORE)
106108
AC_DEFINE_UNQUOTED([OMPI_FORTRAN_SINGLE_UNDERSCORE],
107109
[$ompi_fortran_single_underscore],
108110
[Whether fortran symbols have a trailing underscore or not])
111+
OMPI_FORTRAN_SINGLE_UNDERSCORE=$ompi_fortran_single_underscore
112+
AC_SUBST(OMPI_FORTRAN_SINGLE_UNDERSCORE)
109113
AC_DEFINE_UNQUOTED([OMPI_FORTRAN_CAPS],
110114
[$ompi_fortran_caps],
111115
[Whether fortran symbols are all caps or not])
116+
OMPI_FORTRAN_CAPS=$ompi_fortran_caps
117+
AC_SUBST(OMPI_FORTRAN_CAPS)
112118
AC_DEFINE_UNQUOTED([OMPI_FORTRAN_PLAIN],
113119
[$ompi_fortran_plain],
114120
[Whether fortran symbols have no trailing underscore or not])
121+
OMPI_FORTRAN_PLAIN=$ompi_fortran_plain
122+
AC_SUBST(OMPI_FORTRAN_PLAIN)
115123

116124
# Check to see if any of the MPI Fortran bindings were
117125
# specifically requested. If so, and we weren't able to setup the

ompi/include/Makefile.am

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,8 @@ nodist_include_HEADERS = \
5353
mpif.h \
5454
mpif-ext.h \
5555
mpif-sizeof.h \
56-
mpi_portable_platform.h
56+
mpif-c-constants-decl.h \
57+
mpi_portable_platform.h
5758

5859
if OMPI_BUILD_FORTRAN_MPIFH_BINDINGS
5960
nodist_include_HEADERS += \
@@ -62,8 +63,8 @@ endif
6263

6364
include ompi/Makefile.am
6465

65-
# This is complicated, but mpif-values.pl generates
66-
# several mpif-*.h files in this directory (during autogen.pl).
66+
# This is complicated, but mpif-values.pl generates several
67+
# mpif-*.h files in this directory (during autogen.pl).
6768
# Hence, if any of those files change, it's safer to just force the
6869
# user to re-autogen.
6970
#mpif.h: mpif-constants.h mpif-handles.h mpif-io-constants.h mpif-io-handles.h
@@ -88,7 +89,22 @@ mpif-sizeof.h:
8889
--real16=$(OMPI_HAVE_FORTRAN_REAL16) \
8990
--complex32=$(OMPI_HAVE_FORTRAN_COMPLEX32)
9091

91-
if WANT_INSTALL_HEADERS
92+
#
93+
# mpif-c-constants-decl.h, among other files, is generated based on some
94+
# results from configure tests.
95+
#
96+
97+
mpif_mangling_pl=$(top_srcdir)/ompi/mpi/fortran/base/gen-mpi-mangling.pl
98+
mpif-c-constants-decl.h: $(top_builddir)/config.status
99+
mpif-c-constants-decl.h: $(mpif_mangling_pl)
100+
mpif-c-constants-decl.h:
101+
$(OMPI_V_GEN) $(mpif_mangling_pl) \
102+
--caps $(OMPI_FORTRAN_CAPS) \
103+
--plain $(OMPI_FORTRAN_PLAIN) \
104+
--single $(OMPI_FORTRAN_SINGLE_UNDERSCORE) \
105+
--double $(OMPI_FORTRAN_DOUBLE_UNDERSCORE)
106+
107+
if WANT_INSTALL_HEADERS
92108
ompidir = $(ompiincludedir)
93109
nobase_dist_ompi_HEADERS = $(headers)
94110
nobase_nodist_ompi_HEADERS = $(nodist_headers)
@@ -103,7 +119,9 @@ CLEANFILES = mpif-sizeof.f90
103119
# Remove the auto-generated files (they are generated by configure)
104120
# Since there is no mpi-ext.h.in, autogen does not know to cleanup this file.
105121
distclean-local:
106-
rm -f mpi-ext.h mpif-ext.h mpi_portable_platform.h mpif-sizeof.h
122+
rm -f mpi-ext.h mpif-ext.h mpi_portable_platform.h \
123+
mpif-sizeof.h \
124+
mpif-c-constants-decl.h mpif-c-constants.h mpif-f08-types.h
107125

108126
mpi_portable_platform.h: $(top_srcdir)/opal/include/opal/opal_portable_platform.h
109127
-@rm -f mpi_portable_platform.h

ompi/mpi/fortran/base/Makefile.am

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@
99
# University of Stuttgart. All rights reserved.
1010
# Copyright (c) 2004-2005 The Regents of the University of California.
1111
# All rights reserved.
12-
# Copyright (c) 2006-2014 Cisco Systems, Inc. All rights reserved.
12+
# Copyright (c) 2006-2015 Cisco Systems, Inc. All rights reserved.
13+
# Copyright (c) 2015 Research Organization for Information Science
14+
# and Technology (RIST). All rights reserved.
1315
# $COPYRIGHT$
1416
#
1517
# Additional copyrights may follow
@@ -22,7 +24,8 @@ noinst_LTLIBRARIES =
2224
EXTRA_DIST = \
2325
attr-fn-int-callback-interfaces.h \
2426
conversion-fn-null-int-interface.h \
25-
gen-mpi-sizeof.pl
27+
gen-mpi-sizeof.pl \
28+
gen-mpi-mangling.pl
2629

2730
#-----------------------------------------------------------------------------
2831

ompi/mpi/fortran/base/constants.h

Lines changed: 7 additions & 163 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@
99
* University of Stuttgart. All rights reserved.
1010
* Copyright (c) 2004-2005 The Regents of the University of California.
1111
* All rights reserved.
12-
* Copyright (c) 2006-2012 Cisco Systems, Inc. All rights reserved.
12+
* Copyright (c) 2006-2015 Cisco Systems, Inc. All rights reserved.
1313
* Copyright (c) 2011-2013 Inria. All rights reserved.
1414
* Copyright (c) 2011-2012 Universite Bordeaux 1
15+
* Copyright (c) 2015 Research Organization for Information Science
16+
* and Technology (RIST). All rights reserved.
1517
* $COPYRIGHT$
1618
*
1719
* Additional copyrights may follow
@@ -24,6 +26,7 @@
2426

2527
#include "ompi_config.h"
2628

29+
#if OMPI_BUILD_FORTRAN_BINDINGS
2730
/*
2831
* Several variables are used to link against MPI F77 constants which
2932
* correspond to addresses, e.g. MPI_BOTTOM, and are implemented via
@@ -85,173 +88,14 @@
8588
* file.
8689
*/
8790

88-
#define DECL(type, upper_case, lower_case, single_u, double_u) \
89-
OMPI_DECLSPEC extern type upper_case; \
90-
OMPI_DECLSPEC extern type lower_case; \
91-
OMPI_DECLSPEC extern type single_u; \
92-
OMPI_DECLSPEC extern type double_u
93-
94-
/* Note that the rationale for the types of each of these variables is
95-
discussed in ompi/include/mpif-common.h. Do not change the types
96-
without also changing ompi/runtime/ompi_mpi_init.c and
97-
ompi/include/mpif-common.h. */
98-
99-
DECL(int, MPI_FORTRAN_BOTTOM, mpi_fortran_bottom,
100-
mpi_fortran_bottom_, mpi_fortran_bottom__);
101-
DECL(int, MPI_FORTRAN_IN_PLACE, mpi_fortran_in_place,
102-
mpi_fortran_in_place_, mpi_fortran_in_place__);
103-
DECL(int, MPI_FORTRAN_UNWEIGHTED, mpi_fortran_unweighted,
104-
mpi_fortran_unweighted_, mpi_fortran_unweighted__);
105-
DECL(int, MPI_FORTRAN_WEIGHTS_EMPTY, mpi_fortran_weights_empty,
106-
mpi_fortran_weights_empty_, mpi_fortran_weights_empty__);
107-
DECL(char *, MPI_FORTRAN_ARGV_NULL, mpi_fortran_argv_null,
108-
mpi_fortran_argv_null_, mpi_fortran_argv_null__);
109-
DECL(char *, MPI_FORTRAN_ARGVS_NULL, mpi_fortran_argvs_null,
110-
mpi_fortran_argvs_null_, mpi_fortran_argvs_null__);
111-
DECL(int *, MPI_FORTRAN_ERRCODES_IGNORE, mpi_fortran_errcodes_ignore,
112-
mpi_fortran_errcodes_ignore_, mpi_fortran_errcodes_ignore__);
113-
DECL(int *, MPI_FORTRAN_STATUS_IGNORE, mpi_fortran_status_ignore,
114-
mpi_fortran_status_ignore_, mpi_fortran_status_ignore__);
115-
DECL(int *, MPI_FORTRAN_STATUSES_IGNORE, mpi_fortran_statuses_ignore,
116-
mpi_fortran_statuses_ignore_, mpi_fortran_statuses_ignore__);
117-
118-
/*
119-
* Create macros to do the checking. Only check for all 4 if we have
120-
* weak symbols. Otherwise, just check for the one relevant symbol.
121-
*/
122-
#if OPAL_HAVE_WEAK_SYMBOLS
123-
#define OMPI_IS_FORTRAN_BOTTOM(addr) \
124-
(addr == (void*) &MPI_FORTRAN_BOTTOM || \
125-
addr == (void*) &mpi_fortran_bottom || \
126-
addr == (void*) &mpi_fortran_bottom_ || \
127-
addr == (void*) &mpi_fortran_bottom__)
128-
#define OMPI_IS_FORTRAN_IN_PLACE(addr) \
129-
(addr == (void*) &MPI_FORTRAN_IN_PLACE || \
130-
addr == (void*) &mpi_fortran_in_place || \
131-
addr == (void*) &mpi_fortran_in_place_ || \
132-
addr == (void*) &mpi_fortran_in_place__)
133-
#define OMPI_IS_FORTRAN_UNWEIGHTED(addr) \
134-
(addr == (void*) &MPI_FORTRAN_UNWEIGHTED || \
135-
addr == (void*) &mpi_fortran_unweighted || \
136-
addr == (void*) &mpi_fortran_unweighted_ || \
137-
addr == (void*) &mpi_fortran_unweighted__)
138-
#define OMPI_IS_FORTRAN_WEIGHTS_EMPTY(addr) \
139-
(addr == (void*) &MPI_FORTRAN_WEIGHTS_EMPTY || \
140-
addr == (void*) &mpi_fortran_weights_empty || \
141-
addr == (void*) &mpi_fortran_weights_empty_ || \
142-
addr == (void*) &mpi_fortran_weights_empty__)
143-
#define OMPI_IS_FORTRAN_ARGV_NULL(addr) \
144-
(addr == (void*) &MPI_FORTRAN_ARGV_NULL || \
145-
addr == (void*) &mpi_fortran_argv_null || \
146-
addr == (void*) &mpi_fortran_argv_null_ || \
147-
addr == (void*) &mpi_fortran_argv_null__)
148-
#define OMPI_IS_FORTRAN_ARGVS_NULL(addr) \
149-
(addr == (void*) &MPI_FORTRAN_ARGVS_NULL || \
150-
addr == (void*) &mpi_fortran_argvs_null || \
151-
addr == (void*) &mpi_fortran_argvs_null_ || \
152-
addr == (void*) &mpi_fortran_argvs_null__)
153-
#define OMPI_IS_FORTRAN_ERRCODES_IGNORE(addr) \
154-
(addr == (void*) &MPI_FORTRAN_ERRCODES_IGNORE || \
155-
addr == (void*) &mpi_fortran_errcodes_ignore || \
156-
addr == (void*) &mpi_fortran_errcodes_ignore_ || \
157-
addr == (void*) &mpi_fortran_errcodes_ignore__)
158-
#define OMPI_IS_FORTRAN_STATUS_IGNORE(addr) \
159-
(addr == (void*) &MPI_FORTRAN_STATUS_IGNORE || \
160-
addr == (void*) &mpi_fortran_status_ignore || \
161-
addr == (void*) &mpi_fortran_status_ignore_ || \
162-
addr == (void*) &mpi_fortran_status_ignore__)
163-
#define OMPI_IS_FORTRAN_STATUSES_IGNORE(addr) \
164-
(addr == (void*) &MPI_FORTRAN_STATUSES_IGNORE || \
165-
addr == (void*) &mpi_fortran_statuses_ignore || \
166-
addr == (void*) &mpi_fortran_statuses_ignore_ || \
167-
addr == (void*) &mpi_fortran_statuses_ignore__)
168-
169-
#elif OMPI_FORTRAN_CAPS
170-
#define OMPI_IS_FORTRAN_BOTTOM(addr) \
171-
(addr == (void*) &MPI_FORTRAN_BOTTOM)
172-
#define OMPI_IS_FORTRAN_IN_PLACE(addr) \
173-
(addr == (void*) &MPI_FORTRAN_IN_PLACE)
174-
#define OMPI_IS_FORTRAN_UNWEIGHTED(addr) \
175-
(addr == (void*) &MPI_FORTRAN_UNWEIGHTED)
176-
#define OMPI_IS_FORTRAN_WEIGHTS_EMPTY(addr) \
177-
(addr == (void*) &MPI_FORTRAN_WEIGHTS_EMPTY)
178-
#define OMPI_IS_FORTRAN_ARGV_NULL(addr) \
179-
(addr == (void*) &MPI_FORTRAN_ARGV_NULL)
180-
#define OMPI_IS_FORTRAN_ARGVS_NULL(addr) \
181-
(addr == (void*) &MPI_FORTRAN_ARGVS_NULL)
182-
#define OMPI_IS_FORTRAN_ERRCODES_IGNORE(addr) \
183-
(addr == (void*) &MPI_FORTRAN_ERRCODES_IGNORE)
184-
#define OMPI_IS_FORTRAN_STATUS_IGNORE(addr) \
185-
(addr == (void*) &MPI_FORTRAN_STATUS_IGNORE)
186-
#define OMPI_IS_FORTRAN_STATUSES_IGNORE(addr) \
187-
(addr == (void*) &MPI_FORTRAN_STATUSES_IGNORE)
188-
189-
#elif OMPI_FORTRAN_PLAIN
190-
#define OMPI_IS_FORTRAN_BOTTOM(addr) \
191-
(addr == (void*) &mpi_fortran_bottom)
192-
#define OMPI_IS_FORTRAN_IN_PLACE(addr) \
193-
(addr == (void*) &mpi_fortran_in_place)
194-
#define OMPI_IS_FORTRAN_UNWEIGHTED(addr) \
195-
(addr == (void*) &mpi_fortran_unweighted)
196-
#define OMPI_IS_FORTRAN_WEIGHTS_EMPTY(addr) \
197-
(addr == (void*) &mpi_fortran_weights_empty)
198-
#define OMPI_IS_FORTRAN_ARGV_NULL(addr) \
199-
(addr == (void*) &mpi_fortran_argv_null)
200-
#define OMPI_IS_FORTRAN_ARGVS_NULL(addr) \
201-
(addr == (void*) &mpi_fortran_argvs_null)
202-
#define OMPI_IS_FORTRAN_ERRCODES_IGNORE(addr) \
203-
(addr == (void*) &mpi_fortran_errcodes_ignore)
204-
#define OMPI_IS_FORTRAN_STATUS_IGNORE(addr) \
205-
(addr == (void*) &mpi_fortran_status_ignore)
206-
#define OMPI_IS_FORTRAN_STATUSES_IGNORE(addr) \
207-
(addr == (void*) &mpi_fortran_statuses_ignore)
208-
209-
#elif OMPI_FORTRAN_SINGLE_UNDERSCORE
210-
#define OMPI_IS_FORTRAN_BOTTOM(addr) \
211-
(addr == (void*) &mpi_fortran_bottom_)
212-
#define OMPI_IS_FORTRAN_IN_PLACE(addr) \
213-
(addr == (void*) &mpi_fortran_in_place_)
214-
#define OMPI_IS_FORTRAN_UNWEIGHTED(addr) \
215-
(addr == (void*) &mpi_fortran_unweighted_)
216-
#define OMPI_IS_FORTRAN_WEIGHTS_EMPTY(addr) \
217-
(addr == (void*) &mpi_fortran_weights_empty_)
218-
#define OMPI_IS_FORTRAN_ARGV_NULL(addr) \
219-
(addr == (void*) &mpi_fortran_argv_null_)
220-
#define OMPI_IS_FORTRAN_ARGVS_NULL(addr) \
221-
(addr == (void*) &mpi_fortran_argvs_null_)
222-
#define OMPI_IS_FORTRAN_ERRCODES_IGNORE(addr) \
223-
(addr == (void*) &mpi_fortran_errcodes_ignore_)
224-
#define OMPI_IS_FORTRAN_STATUS_IGNORE(addr) \
225-
(addr == (void*) &mpi_fortran_status_ignore_)
226-
#define OMPI_IS_FORTRAN_STATUSES_IGNORE(addr) \
227-
(addr == (void*) &mpi_fortran_statuses_ignore_)
228-
229-
#else
230-
#define OMPI_IS_FORTRAN_BOTTOM(addr) \
231-
(addr == (void*) &mpi_fortran_bottom__)
232-
#define OMPI_IS_FORTRAN_IN_PLACE(addr) \
233-
(addr == (void*) &mpi_fortran_in_place__)
234-
#define OMPI_IS_FORTRAN_UNWEIGHTED(addr) \
235-
(addr == (void*) &mpi_fortran_unweighted__)
236-
#define OMPI_IS_FORTRAN_WEIGHTS_EMPTY(addr) \
237-
(addr == (void*) &mpi_fortran_weights_empty__)
238-
#define OMPI_IS_FORTRAN_ARGV_NULL(addr) \
239-
(addr == (void*) &mpi_fortran_argv_null__)
240-
#define OMPI_IS_FORTRAN_ARGVS_NULL(addr) \
241-
(addr == (void*) &mpi_fortran_argvs_null__)
242-
#define OMPI_IS_FORTRAN_ERRCODES_IGNORE(addr) \
243-
(addr == (void*) &mpi_fortran_errcodes_ignore__)
244-
#define OMPI_IS_FORTRAN_STATUS_IGNORE(addr) \
245-
(addr == (void*) &mpi_fortran_status_ignore__)
246-
#define OMPI_IS_FORTRAN_STATUSES_IGNORE(addr) \
247-
(addr == (void*) &mpi_fortran_statuses_ignore__)
248-
249-
#endif /* weak / specific symbol type */
91+
#include "mpif-c-constants-decl.h"
25092

25193
/* Convert between Fortran and C MPI_BOTTOM */
25294
#define OMPI_F2C_BOTTOM(addr) (OMPI_IS_FORTRAN_BOTTOM(addr) ? MPI_BOTTOM : (addr))
25395
#define OMPI_F2C_IN_PLACE(addr) (OMPI_IS_FORTRAN_IN_PLACE(addr) ? MPI_IN_PLACE : (addr))
25496
#define OMPI_F2C_UNWEIGHTED(addr) (OMPI_IS_FORTRAN_UNWEIGHTED(addr) ? MPI_UNWEIGHTED : (addr))
25597
#define OMPI_F2C_WEIGHTS_EMPTY(addr) (OMPI_IS_FORTRAN_WEIGHTS_EMPTY(addr) ? MPI_WEIGHTS_EMPTY : (addr))
25698

99+
#endif /* OMPI_BUILD_FORTRAN_BINDINGS */
100+
257101
#endif /* OMPI_FORTRAN_BASE_CONSTANTS_H */

0 commit comments

Comments
 (0)