The ptx port by its nature is lacking features that are expected on
"normal" machines, such as alloca and indirect jumps. We have a subset
of the C library which contains functions that can be implemented on the
target (excluding things like file I/O other than printf which is a ptx
builtin).
It would be good to be able to also build as much of libgfortran as
possible, and the following patch is what I've been using so far. It
recognizes the target at configure time and restricts the list of
compiled files, as well as providing a LIBGFOR_MINIMAL define for #ifdef
tests. There's also a new file minimal.c which contains alternative
implementations of some functionality (using printf to write error
messages rather than fprintf and such). Constructors are currently
unimplemented on ptx and therefore the init function is commented out.
Comments on the approach, do the Fortran maintainers have a preference
how this should look? The whole thing is good enough to substantially
reduce the number of failures when trying to run the Fortran testsuites
on nvptx (although many remain).
Bernd
Index: libgfortran/Makefile.am
===================================================================
--- libgfortran/Makefile.am.orig
+++ libgfortran/Makefile.am
@@ -77,6 +77,14 @@ AM_CFLAGS += $(SECTION_FLAGS)
AM_CFLAGS += $(IEEE_FLAGS)
AM_FCFLAGS += $(IEEE_FLAGS)
+if LIBGFOR_MINIMAL
+AM_CFLAGS += -DLIBGFOR_MINIMAL
+endif
+
+if LIBGFOR_MINIMAL
+gfor_io_src= \
+io/size_from_kind.c
+else
gfor_io_src= \
io/close.c \
io/file_pos.c \
@@ -94,6 +102,7 @@ io/unit.c \
io/unix.c \
io/write.c \
io/fbuf.c
+endif
gfor_io_headers= \
io/io.h \
@@ -101,6 +110,41 @@ io/fbuf.h \
io/format.h \
io/unix.h
+if LIBGFOR_MINIMAL
+gfor_helper_src= \
+intrinsics/associated.c \
+intrinsics/abort.c \
+intrinsics/args.c \
+intrinsics/bit_intrinsics.c \
+intrinsics/cshift0.c \
+intrinsics/eoshift0.c \
+intrinsics/eoshift2.c \
+intrinsics/erfc_scaled.c \
+intrinsics/extends_type_of.c \
+intrinsics/fnum.c \
+intrinsics/ierrno.c \
+intrinsics/ishftc.c \
+intrinsics/iso_c_generated_procs.c \
+intrinsics/iso_c_binding.c \
+intrinsics/malloc.c \
+intrinsics/mvbits.c \
+intrinsics/move_alloc.c \
+intrinsics/pack_generic.c \
+intrinsics/selected_char_kind.c \
+intrinsics/size.c \
+intrinsics/spread_generic.c \
+intrinsics/string_intrinsics.c \
+intrinsics/rand.c \
+intrinsics/random.c \
+intrinsics/reshape_generic.c \
+intrinsics/reshape_packed.c \
+intrinsics/selected_int_kind.f90 \
+intrinsics/selected_real_kind.f90 \
+intrinsics/transpose_generic.c \
+intrinsics/unpack_generic.c \
+runtime/in_pack_generic.c \
+runtime/in_unpack_generic.c
+else
gfor_helper_src= \
intrinsics/associated.c \
intrinsics/abort.c \
@@ -165,6 +209,7 @@ intrinsics/unlink.c \
intrinsics/unpack_generic.c \
runtime/in_pack_generic.c \
runtime/in_unpack_generic.c
+endif
if IEEE_SUPPORT
@@ -181,6 +226,15 @@ gfor_ieee_src=
endif
+if LIBGFOR_MINIMAL
+gfor_src= \
+runtime/bounds.c \
+runtime/compile_options.c \
+runtime/memory.c \
+runtime/minimal.c \
+runtime/string.c \
+runtime/select.c
+else
gfor_src= \
runtime/backtrace.c \
runtime/bounds.c \
@@ -195,6 +249,7 @@ runtime/pause.c \
runtime/stop.c \
runtime/string.c \
runtime/select.c
+endif
i_all_c= \
$(srcdir)/generated/all_l1.c \
Index: libgfortran/Makefile.in
===================================================================
--- libgfortran/Makefile.in.orig
+++ libgfortran/Makefile.in
@@ -54,10 +54,11 @@ POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
target_triplet = @target@
-@IEEE_SUPPORT_TRUE@am__append_1 = ieee/ieee_helper.c
+@LIBGFOR_MINIMAL_TRUE@am__append_1 = -DLIBGFOR_MINIMAL
+@IEEE_SUPPORT_TRUE@am__append_2 = ieee/ieee_helper.c
# dummy sources for libtool
-@onestep_TRUE@am__append_2 = libgfortran_c.c libgfortran_f.f90
+@onestep_TRUE@am__append_3 = libgfortran_c.c libgfortran_f.f90
subdir = .
DIST_COMMON = ChangeLog $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
$(top_srcdir)/configure $(am__configure_deps) \
@@ -121,9 +122,13 @@ libcaf_single_la_LIBADD =
am_libcaf_single_la_OBJECTS = single.lo
libcaf_single_la_OBJECTS = $(am_libcaf_single_la_OBJECTS)
libgfortran_la_LIBADD =
-am__objects_1 = backtrace.lo bounds.lo compile_options.lo \
- convert_char.lo environ.lo error.lo fpu.lo main.lo memory.lo \
- pause.lo stop.lo string.lo select.lo
+@LIBGFOR_MINIMAL_FALSE@am__objects_1 = backtrace.lo bounds.lo \
+@LIBGFOR_MINIMAL_FALSE@ compile_options.lo convert_char.lo \
+@LIBGFOR_MINIMAL_FALSE@ environ.lo error.lo fpu.lo main.lo \
+@LIBGFOR_MINIMAL_FALSE@ memory.lo pause.lo stop.lo string.lo \
+@LIBGFOR_MINIMAL_FALSE@ select.lo
+@LIBGFOR_MINIMAL_TRUE@am__objects_1 = bounds.lo compile_options.lo \
+@LIBGFOR_MINIMAL_TRUE@ memory.lo minimal.lo string.lo select.lo
am__objects_2 = all_l1.lo all_l2.lo all_l4.lo all_l8.lo all_l16.lo
am__objects_3 = any_l1.lo any_l2.lo any_l4.lo any_l8.lo any_l16.lo
am__objects_4 = count_1_l.lo count_2_l.lo count_4_l.lo count_8_l.lo \
@@ -260,26 +265,54 @@ am__objects_40 = $(am__objects_2) $(am__
$(am__objects_32) $(am__objects_33) $(am__objects_34) \
$(am__objects_35) $(am__objects_36) $(am__objects_37) \
$(am__objects_38) $(am__objects_39)
-am__objects_41 = close.lo file_pos.lo format.lo inquire.lo \
- intrinsics.lo list_read.lo lock.lo open.lo read.lo \
- size_from_kind.lo transfer.lo transfer128.lo unit.lo unix.lo \
- write.lo fbuf.lo
+@LIBGFOR_MINIMAL_FALSE@am__objects_41 = close.lo file_pos.lo format.lo \
+@LIBGFOR_MINIMAL_FALSE@ inquire.lo intrinsics.lo list_read.lo \
+@LIBGFOR_MINIMAL_FALSE@ lock.lo open.lo read.lo \
+@LIBGFOR_MINIMAL_FALSE@ size_from_kind.lo transfer.lo \
+@LIBGFOR_MINIMAL_FALSE@ transfer128.lo unit.lo unix.lo write.lo \
+@LIBGFOR_MINIMAL_FALSE@ fbuf.lo
+@LIBGFOR_MINIMAL_TRUE@am__objects_41 = size_from_kind.lo
@IEEE_SUPPORT_TRUE@am__objects_42 = ieee_helper.lo
-am__objects_43 = associated.lo abort.lo access.lo args.lo \
- bit_intrinsics.lo c99_functions.lo chdir.lo chmod.lo clock.lo \
- cpu_time.lo cshift0.lo ctime.lo date_and_time.lo dtime.lo \
- env.lo eoshift0.lo eoshift2.lo erfc_scaled.lo etime.lo \
- execute_command_line.lo exit.lo extends_type_of.lo fnum.lo \
- gerror.lo getcwd.lo getlog.lo getXid.lo hostnm.lo ierrno.lo \
- ishftc.lo iso_c_generated_procs.lo iso_c_binding.lo kill.lo \
- link.lo malloc.lo mvbits.lo move_alloc.lo pack_generic.lo \
- perror.lo selected_char_kind.lo signal.lo size.lo sleep.lo \
- spread_generic.lo string_intrinsics.lo system.lo rand.lo \
- random.lo rename.lo reshape_generic.lo reshape_packed.lo \
- selected_int_kind.lo selected_real_kind.lo stat.lo symlnk.lo \
- system_clock.lo time.lo transpose_generic.lo umask.lo \
- unlink.lo unpack_generic.lo in_pack_generic.lo \
- in_unpack_generic.lo $(am__objects_42)
+@LIBGFOR_MINIMAL_FALSE@am__objects_43 = associated.lo abort.lo \
+@LIBGFOR_MINIMAL_FALSE@ access.lo args.lo bit_intrinsics.lo \
+@LIBGFOR_MINIMAL_FALSE@ c99_functions.lo chdir.lo chmod.lo \
+@LIBGFOR_MINIMAL_FALSE@ clock.lo cpu_time.lo cshift0.lo \
+@LIBGFOR_MINIMAL_FALSE@ ctime.lo date_and_time.lo dtime.lo \
+@LIBGFOR_MINIMAL_FALSE@ env.lo eoshift0.lo eoshift2.lo \
+@LIBGFOR_MINIMAL_FALSE@ erfc_scaled.lo etime.lo \
+@LIBGFOR_MINIMAL_FALSE@ execute_command_line.lo exit.lo \
+@LIBGFOR_MINIMAL_FALSE@ extends_type_of.lo fnum.lo gerror.lo \
+@LIBGFOR_MINIMAL_FALSE@ getcwd.lo getlog.lo getXid.lo hostnm.lo \
+@LIBGFOR_MINIMAL_FALSE@ ierrno.lo ishftc.lo \
+@LIBGFOR_MINIMAL_FALSE@ iso_c_generated_procs.lo \
+@LIBGFOR_MINIMAL_FALSE@ iso_c_binding.lo kill.lo link.lo \
+@LIBGFOR_MINIMAL_FALSE@ malloc.lo mvbits.lo move_alloc.lo \
+@LIBGFOR_MINIMAL_FALSE@ pack_generic.lo perror.lo \
+@LIBGFOR_MINIMAL_FALSE@ selected_char_kind.lo signal.lo size.lo \
+@LIBGFOR_MINIMAL_FALSE@ sleep.lo spread_generic.lo \
+@LIBGFOR_MINIMAL_FALSE@ string_intrinsics.lo system.lo rand.lo \
+@LIBGFOR_MINIMAL_FALSE@ random.lo rename.lo reshape_generic.lo \
+@LIBGFOR_MINIMAL_FALSE@ reshape_packed.lo selected_int_kind.lo \
+@LIBGFOR_MINIMAL_FALSE@ selected_real_kind.lo stat.lo symlnk.lo \
+@LIBGFOR_MINIMAL_FALSE@ system_clock.lo time.lo \
+@LIBGFOR_MINIMAL_FALSE@ transpose_generic.lo umask.lo unlink.lo \
+@LIBGFOR_MINIMAL_FALSE@ unpack_generic.lo in_pack_generic.lo \
+@LIBGFOR_MINIMAL_FALSE@ in_unpack_generic.lo $(am__objects_42)
+@LIBGFOR_MINIMAL_TRUE@am__objects_43 = associated.lo abort.lo args.lo \
+@LIBGFOR_MINIMAL_TRUE@ bit_intrinsics.lo cshift0.lo eoshift0.lo \
+@LIBGFOR_MINIMAL_TRUE@ eoshift2.lo erfc_scaled.lo \
+@LIBGFOR_MINIMAL_TRUE@ extends_type_of.lo fnum.lo ierrno.lo \
+@LIBGFOR_MINIMAL_TRUE@ ishftc.lo iso_c_generated_procs.lo \
+@LIBGFOR_MINIMAL_TRUE@ iso_c_binding.lo malloc.lo mvbits.lo \
+@LIBGFOR_MINIMAL_TRUE@ move_alloc.lo pack_generic.lo \
+@LIBGFOR_MINIMAL_TRUE@ selected_char_kind.lo size.lo \
+@LIBGFOR_MINIMAL_TRUE@ spread_generic.lo string_intrinsics.lo \
+@LIBGFOR_MINIMAL_TRUE@ rand.lo random.lo reshape_generic.lo \
+@LIBGFOR_MINIMAL_TRUE@ reshape_packed.lo selected_int_kind.lo \
+@LIBGFOR_MINIMAL_TRUE@ selected_real_kind.lo \
+@LIBGFOR_MINIMAL_TRUE@ transpose_generic.lo unpack_generic.lo \
+@LIBGFOR_MINIMAL_TRUE@ in_pack_generic.lo in_unpack_generic.lo \
+@LIBGFOR_MINIMAL_TRUE@ $(am__objects_42)
@IEEE_SUPPORT_TRUE@am__objects_44 = ieee_arithmetic.lo \
@IEEE_SUPPORT_TRUE@ ieee_exceptions.lo ieee_features.lo
am__objects_45 =
@@ -376,7 +409,7 @@ AMTAR = @AMTAR@
# Some targets require additional compiler options for IEEE compatibility.
AM_CFLAGS = @AM_CFLAGS@ -fcx-fortran-rules $(SECTION_FLAGS) \
- $(IEEE_FLAGS)
+ $(IEEE_FLAGS) $(am__append_1)
AM_FCFLAGS = @AM_FCFLAGS@ $(IEEE_FLAGS)
AR = @AR@
AS = @AS@
@@ -554,23 +587,26 @@ AM_CPPFLAGS = -iquote$(srcdir)/io -I$(sr
-I$(srcdir)/$(MULTISRCTOP)../libgcc \
-I$(MULTIBUILDTOP)../libgcc
-gfor_io_src = \
-io/close.c \
-io/file_pos.c \
-io/format.c \
-io/inquire.c \
-io/intrinsics.c \
-io/list_read.c \
-io/lock.c \
-io/open.c \
-io/read.c \
-io/size_from_kind.c \
-io/transfer.c \
-io/transfer128.c \
-io/unit.c \
-io/unix.c \
-io/write.c \
-io/fbuf.c
+@LIBGFOR_MINIMAL_FALSE@gfor_io_src = \
+@LIBGFOR_MINIMAL_FALSE@io/close.c \
+@LIBGFOR_MINIMAL_FALSE@io/file_pos.c \
+@LIBGFOR_MINIMAL_FALSE@io/format.c \
+@LIBGFOR_MINIMAL_FALSE@io/inquire.c \
+@LIBGFOR_MINIMAL_FALSE@io/intrinsics.c \
+@LIBGFOR_MINIMAL_FALSE@io/list_read.c \
+@LIBGFOR_MINIMAL_FALSE@io/lock.c \
+@LIBGFOR_MINIMAL_FALSE@io/open.c \
+@LIBGFOR_MINIMAL_FALSE@io/read.c \
+@LIBGFOR_MINIMAL_FALSE@io/size_from_kind.c \
+@LIBGFOR_MINIMAL_FALSE@io/transfer.c \
+@LIBGFOR_MINIMAL_FALSE@io/transfer128.c \
+@LIBGFOR_MINIMAL_FALSE@io/unit.c \
+@LIBGFOR_MINIMAL_FALSE@io/unix.c \
+@LIBGFOR_MINIMAL_FALSE@io/write.c \
+@LIBGFOR_MINIMAL_FALSE@io/fbuf.c
+
+@LIBGFOR_MINIMAL_TRUE@gfor_io_src = \
+@LIBGFOR_MINIMAL_TRUE@io/size_from_kind.c
gfor_io_headers = \
io/io.h \
@@ -578,54 +614,112 @@ io/fbuf.h \
io/format.h \
io/unix.h
-gfor_helper_src = intrinsics/associated.c intrinsics/abort.c \
- intrinsics/access.c intrinsics/args.c \
- intrinsics/bit_intrinsics.c intrinsics/c99_functions.c \
- intrinsics/chdir.c intrinsics/chmod.c intrinsics/clock.c \
- intrinsics/cpu_time.c intrinsics/cshift0.c intrinsics/ctime.c \
- intrinsics/date_and_time.c intrinsics/dtime.c intrinsics/env.c \
- intrinsics/eoshift0.c intrinsics/eoshift2.c \
- intrinsics/erfc_scaled.c intrinsics/etime.c \
- intrinsics/execute_command_line.c intrinsics/exit.c \
- intrinsics/extends_type_of.c intrinsics/fnum.c \
- intrinsics/gerror.c intrinsics/getcwd.c intrinsics/getlog.c \
- intrinsics/getXid.c intrinsics/hostnm.c intrinsics/ierrno.c \
- intrinsics/ishftc.c intrinsics/iso_c_generated_procs.c \
- intrinsics/iso_c_binding.c intrinsics/kill.c intrinsics/link.c \
- intrinsics/malloc.c intrinsics/mvbits.c \
- intrinsics/move_alloc.c intrinsics/pack_generic.c \
- intrinsics/perror.c intrinsics/selected_char_kind.c \
- intrinsics/signal.c intrinsics/size.c intrinsics/sleep.c \
- intrinsics/spread_generic.c intrinsics/string_intrinsics.c \
- intrinsics/system.c intrinsics/rand.c intrinsics/random.c \
- intrinsics/rename.c intrinsics/reshape_generic.c \
- intrinsics/reshape_packed.c intrinsics/selected_int_kind.f90 \
- intrinsics/selected_real_kind.f90 intrinsics/stat.c \
- intrinsics/symlnk.c intrinsics/system_clock.c \
- intrinsics/time.c intrinsics/transpose_generic.c \
- intrinsics/umask.c intrinsics/unlink.c \
- intrinsics/unpack_generic.c runtime/in_pack_generic.c \
- runtime/in_unpack_generic.c $(am__append_1)
+@LIBGFOR_MINIMAL_FALSE@gfor_helper_src = intrinsics/associated.c \
+@LIBGFOR_MINIMAL_FALSE@ intrinsics/abort.c intrinsics/access.c \
+@LIBGFOR_MINIMAL_FALSE@ intrinsics/args.c \
+@LIBGFOR_MINIMAL_FALSE@ intrinsics/bit_intrinsics.c \
+@LIBGFOR_MINIMAL_FALSE@ intrinsics/c99_functions.c \
+@LIBGFOR_MINIMAL_FALSE@ intrinsics/chdir.c intrinsics/chmod.c \
+@LIBGFOR_MINIMAL_FALSE@ intrinsics/clock.c \
+@LIBGFOR_MINIMAL_FALSE@ intrinsics/cpu_time.c \
+@LIBGFOR_MINIMAL_FALSE@ intrinsics/cshift0.c intrinsics/ctime.c \
+@LIBGFOR_MINIMAL_FALSE@ intrinsics/date_and_time.c \
+@LIBGFOR_MINIMAL_FALSE@ intrinsics/dtime.c intrinsics/env.c \
+@LIBGFOR_MINIMAL_FALSE@ intrinsics/eoshift0.c \
+@LIBGFOR_MINIMAL_FALSE@ intrinsics/eoshift2.c \
+@LIBGFOR_MINIMAL_FALSE@ intrinsics/erfc_scaled.c \
+@LIBGFOR_MINIMAL_FALSE@ intrinsics/etime.c \
+@LIBGFOR_MINIMAL_FALSE@ intrinsics/execute_command_line.c \
+@LIBGFOR_MINIMAL_FALSE@ intrinsics/exit.c \
+@LIBGFOR_MINIMAL_FALSE@ intrinsics/extends_type_of.c \
+@LIBGFOR_MINIMAL_FALSE@ intrinsics/fnum.c intrinsics/gerror.c \
+@LIBGFOR_MINIMAL_FALSE@ intrinsics/getcwd.c intrinsics/getlog.c \
+@LIBGFOR_MINIMAL_FALSE@ intrinsics/getXid.c intrinsics/hostnm.c \
+@LIBGFOR_MINIMAL_FALSE@ intrinsics/ierrno.c intrinsics/ishftc.c \
+@LIBGFOR_MINIMAL_FALSE@ intrinsics/iso_c_generated_procs.c \
+@LIBGFOR_MINIMAL_FALSE@ intrinsics/iso_c_binding.c \
+@LIBGFOR_MINIMAL_FALSE@ intrinsics/kill.c intrinsics/link.c \
+@LIBGFOR_MINIMAL_FALSE@ intrinsics/malloc.c intrinsics/mvbits.c \
+@LIBGFOR_MINIMAL_FALSE@ intrinsics/move_alloc.c \
+@LIBGFOR_MINIMAL_FALSE@ intrinsics/pack_generic.c \
+@LIBGFOR_MINIMAL_FALSE@ intrinsics/perror.c \
+@LIBGFOR_MINIMAL_FALSE@ intrinsics/selected_char_kind.c \
+@LIBGFOR_MINIMAL_FALSE@ intrinsics/signal.c intrinsics/size.c \
+@LIBGFOR_MINIMAL_FALSE@ intrinsics/sleep.c \
+@LIBGFOR_MINIMAL_FALSE@ intrinsics/spread_generic.c \
+@LIBGFOR_MINIMAL_FALSE@ intrinsics/string_intrinsics.c \
+@LIBGFOR_MINIMAL_FALSE@ intrinsics/system.c intrinsics/rand.c \
+@LIBGFOR_MINIMAL_FALSE@ intrinsics/random.c intrinsics/rename.c \
+@LIBGFOR_MINIMAL_FALSE@ intrinsics/reshape_generic.c \
+@LIBGFOR_MINIMAL_FALSE@ intrinsics/reshape_packed.c \
+@LIBGFOR_MINIMAL_FALSE@ intrinsics/selected_int_kind.f90 \
+@LIBGFOR_MINIMAL_FALSE@ intrinsics/selected_real_kind.f90 \
+@LIBGFOR_MINIMAL_FALSE@ intrinsics/stat.c intrinsics/symlnk.c \
+@LIBGFOR_MINIMAL_FALSE@ intrinsics/system_clock.c \
+@LIBGFOR_MINIMAL_FALSE@ intrinsics/time.c \
+@LIBGFOR_MINIMAL_FALSE@ intrinsics/transpose_generic.c \
+@LIBGFOR_MINIMAL_FALSE@ intrinsics/umask.c intrinsics/unlink.c \
+@LIBGFOR_MINIMAL_FALSE@ intrinsics/unpack_generic.c \
+@LIBGFOR_MINIMAL_FALSE@ runtime/in_pack_generic.c \
+@LIBGFOR_MINIMAL_FALSE@ runtime/in_unpack_generic.c \
+@LIBGFOR_MINIMAL_FALSE@ $(am__append_2)
+@LIBGFOR_MINIMAL_TRUE@gfor_helper_src = intrinsics/associated.c \
+@LIBGFOR_MINIMAL_TRUE@ intrinsics/abort.c intrinsics/args.c \
+@LIBGFOR_MINIMAL_TRUE@ intrinsics/bit_intrinsics.c \
+@LIBGFOR_MINIMAL_TRUE@ intrinsics/cshift0.c \
+@LIBGFOR_MINIMAL_TRUE@ intrinsics/eoshift0.c \
+@LIBGFOR_MINIMAL_TRUE@ intrinsics/eoshift2.c \
+@LIBGFOR_MINIMAL_TRUE@ intrinsics/erfc_scaled.c \
+@LIBGFOR_MINIMAL_TRUE@ intrinsics/extends_type_of.c \
+@LIBGFOR_MINIMAL_TRUE@ intrinsics/fnum.c intrinsics/ierrno.c \
+@LIBGFOR_MINIMAL_TRUE@ intrinsics/ishftc.c \
+@LIBGFOR_MINIMAL_TRUE@ intrinsics/iso_c_generated_procs.c \
+@LIBGFOR_MINIMAL_TRUE@ intrinsics/iso_c_binding.c \
+@LIBGFOR_MINIMAL_TRUE@ intrinsics/malloc.c intrinsics/mvbits.c \
+@LIBGFOR_MINIMAL_TRUE@ intrinsics/move_alloc.c \
+@LIBGFOR_MINIMAL_TRUE@ intrinsics/pack_generic.c \
+@LIBGFOR_MINIMAL_TRUE@ intrinsics/selected_char_kind.c \
+@LIBGFOR_MINIMAL_TRUE@ intrinsics/size.c \
+@LIBGFOR_MINIMAL_TRUE@ intrinsics/spread_generic.c \
+@LIBGFOR_MINIMAL_TRUE@ intrinsics/string_intrinsics.c \
+@LIBGFOR_MINIMAL_TRUE@ intrinsics/rand.c intrinsics/random.c \
+@LIBGFOR_MINIMAL_TRUE@ intrinsics/reshape_generic.c \
+@LIBGFOR_MINIMAL_TRUE@ intrinsics/reshape_packed.c \
+@LIBGFOR_MINIMAL_TRUE@ intrinsics/selected_int_kind.f90 \
+@LIBGFOR_MINIMAL_TRUE@ intrinsics/selected_real_kind.f90 \
+@LIBGFOR_MINIMAL_TRUE@ intrinsics/transpose_generic.c \
+@LIBGFOR_MINIMAL_TRUE@ intrinsics/unpack_generic.c \
+@LIBGFOR_MINIMAL_TRUE@ runtime/in_pack_generic.c \
+@LIBGFOR_MINIMAL_TRUE@ runtime/in_unpack_generic.c \
+@LIBGFOR_MINIMAL_TRUE@ $(am__append_2)
@IEEE_SUPPORT_FALSE@gfor_ieee_src =
@IEEE_SUPPORT_TRUE@gfor_ieee_src = \
@IEEE_SUPPORT_TRUE@ieee/ieee_arithmetic.F90 \
@IEEE_SUPPORT_TRUE@ieee/ieee_exceptions.F90 \
@IEEE_SUPPORT_TRUE@ieee/ieee_features.F90
-gfor_src = \
-runtime/backtrace.c \
-runtime/bounds.c \
-runtime/compile_options.c \
-runtime/convert_char.c \
-runtime/environ.c \
-runtime/error.c \
-runtime/fpu.c \
-runtime/main.c \
-runtime/memory.c \
-runtime/pause.c \
-runtime/stop.c \
-runtime/string.c \
-runtime/select.c
+@LIBGFOR_MINIMAL_FALSE@gfor_src = \
+@LIBGFOR_MINIMAL_FALSE@runtime/backtrace.c \
+@LIBGFOR_MINIMAL_FALSE@runtime/bounds.c \
+@LIBGFOR_MINIMAL_FALSE@runtime/compile_options.c \
+@LIBGFOR_MINIMAL_FALSE@runtime/convert_char.c \
+@LIBGFOR_MINIMAL_FALSE@runtime/environ.c \
+@LIBGFOR_MINIMAL_FALSE@runtime/error.c \
+@LIBGFOR_MINIMAL_FALSE@runtime/fpu.c \
+@LIBGFOR_MINIMAL_FALSE@runtime/main.c \
+@LIBGFOR_MINIMAL_FALSE@runtime/memory.c \
+@LIBGFOR_MINIMAL_FALSE@runtime/pause.c \
+@LIBGFOR_MINIMAL_FALSE@runtime/stop.c \
+@LIBGFOR_MINIMAL_FALSE@runtime/string.c \
+@LIBGFOR_MINIMAL_FALSE@runtime/select.c
+
+@LIBGFOR_MINIMAL_TRUE@gfor_src = \
+@LIBGFOR_MINIMAL_TRUE@runtime/bounds.c \
+@LIBGFOR_MINIMAL_TRUE@runtime/compile_options.c \
+@LIBGFOR_MINIMAL_TRUE@runtime/memory.c \
+@LIBGFOR_MINIMAL_TRUE@runtime/minimal.c \
+@LIBGFOR_MINIMAL_TRUE@runtime/string.c \
+@LIBGFOR_MINIMAL_TRUE@runtime/select.c
i_all_c = \
$(srcdir)/generated/all_l1.c \
@@ -1255,7 +1349,7 @@ intrinsics/f2c_specifics.F90
BUILT_SOURCES = $(gfor_built_src) $(gfor_built_specific_src) \
$(gfor_built_specific2_src) $(gfor_misc_specifics) \
- $(am__append_2)
+ $(am__append_3)
prereq_SRC = $(gfor_src) $(gfor_built_src) $(gfor_io_src) \
$(gfor_helper_src) $(gfor_ieee_src) $(gfor_io_headers) $(gfor_specific_src)
@@ -1669,6 +1763,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/maxval_r4.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/maxval_r8.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/memory.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/minimal.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/minloc0_16_i1.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/minloc0_16_i16.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/minloc0_16_i2.Plo@am__quote@
@@ -2463,6 +2558,13 @@ select.lo: runtime/select.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o select.lo `test -f 'runtime/select.c' || echo '$(srcdir)/'`runtime/select.c
+minimal.lo: runtime/minimal.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT minimal.lo -MD -MP -MF $(DEPDIR)/minimal.Tpo -c -o minimal.lo `test -f 'runtime/minimal.c' || echo '$(srcdir)/'`runtime/minimal.c
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/minimal.Tpo $(DEPDIR)/minimal.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='runtime/minimal.c' object='minimal.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o minimal.lo `test -f 'runtime/minimal.c' || echo '$(srcdir)/'`runtime/minimal.c
+
all_l1.lo: $(srcdir)/generated/all_l1.c
@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT all_l1.lo -MD -MP -MF $(DEPDIR)/all_l1.Tpo -c -o all_l1.lo `test -f '$(srcdir)/generated/all_l1.c' || echo '$(srcdir)/'`$(srcdir)/generated/all_l1.c
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/all_l1.Tpo $(DEPDIR)/all_l1.Plo
Index: libgfortran/caf/single.c
===================================================================
--- libgfortran/caf/single.c.orig
+++ libgfortran/caf/single.c
@@ -48,13 +48,14 @@ caf_static_t *caf_static_list = NULL;
static void
caf_runtime_error (const char *message, ...)
{
+#ifndef LIBGFOR_MINIMAL
va_list ap;
fprintf (stderr, "Fortran runtime error: ");
va_start (ap, message);
vfprintf (stderr, message, ap);
va_end (ap);
fprintf (stderr, "\n");
-
+#endif
/* FIXME: Shutdown the Fortran RTL to flush the buffer. PR 43849. */
exit (EXIT_FAILURE);
}
Index: libgfortran/configure
===================================================================
--- libgfortran/configure.orig
+++ libgfortran/configure
@@ -641,6 +641,8 @@ RANLIB
AR
AS
SECTION_FLAGS
+LIBGFOR_MINIMAL_FALSE
+LIBGFOR_MINIMAL_TRUE
LIBGFOR_USE_SYMVER_SUN_FALSE
LIBGFOR_USE_SYMVER_SUN_TRUE
LIBGFOR_USE_SYMVER_GNU_FALSE
@@ -5890,6 +5892,15 @@ else
fi
+ if test "x${target_cpu}" = xnvptx; then
+ LIBGFOR_MINIMAL_TRUE=
+ LIBGFOR_MINIMAL_FALSE='#'
+else
+ LIBGFOR_MINIMAL_TRUE='#'
+ LIBGFOR_MINIMAL_FALSE=
+fi
+
+
# Figure out whether the compiler supports "-ffunction-sections -fdata-sections",
# similarly to how libstdc++ does it
ac_test_CFLAGS="${CFLAGS+set}"
@@ -12350,7 +12361,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 12353 "configure"
+#line 12364 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -12456,7 +12467,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 12459 "configure"
+#line 12470 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -26799,6 +26810,10 @@ if test -z "${LIBGFOR_USE_SYMVER_SUN_TRU
as_fn_error "conditional \"LIBGFOR_USE_SYMVER_SUN\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
+if test -z "${LIBGFOR_MINIMAL_TRUE}" && test -z "${LIBGFOR_MINIMAL_FALSE}"; then
+ as_fn_error "conditional \"LIBGFOR_MINIMAL\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
if test -z "${LIBGFOR_BUILD_QUAD_TRUE}" && test -z "${LIBGFOR_BUILD_QUAD_FALSE}"; then
as_fn_error "conditional \"LIBGFOR_BUILD_QUAD\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
Index: libgfortran/configure.ac
===================================================================
--- libgfortran/configure.ac.orig
+++ libgfortran/configure.ac
@@ -189,6 +189,8 @@ AM_CONDITIONAL(LIBGFOR_USE_SYMVER, [test
AM_CONDITIONAL(LIBGFOR_USE_SYMVER_GNU, [test "x$gfortran_use_symver" = xgnu])
AM_CONDITIONAL(LIBGFOR_USE_SYMVER_SUN, [test "x$gfortran_use_symver" = xsun])
+AM_CONDITIONAL(LIBGFOR_MINIMAL, [test "x${target_cpu}" = xnvptx])
+
# Figure out whether the compiler supports "-ffunction-sections -fdata-sections",
# similarly to how libstdc++ does it
ac_test_CFLAGS="${CFLAGS+set}"
Index: libgfortran/runtime/compile_options.c
===================================================================
--- libgfortran/runtime/compile_options.c.orig
+++ libgfortran/runtime/compile_options.c
@@ -29,7 +29,7 @@ see the files COPYING3 and COPYING.RUNTI
/* Useful compile-time options will be stored in here. */
compile_options_t compile_options;
-
+#ifndef LIBGFOR_MINIMAL
volatile sig_atomic_t fatal_error_in_progress = 0;
@@ -146,6 +146,7 @@ maybe_find_addr2line (void)
if (options.backtrace == -1)
find_addr2line ();
}
+#endif
/* Set the usual compile-time options. */
extern void set_options (int , int []);
@@ -176,6 +177,7 @@ set_options (int num, int options[])
if (num >= 9)
compile_options.fpe_summary = options[8];
+#ifndef LIBGFOR_MINIMAL
/* If backtrace is required, we set signal handlers on the POSIX
2001 signals with core action. */
if (compile_options.backtrace)
@@ -212,6 +214,7 @@ set_options (int num, int options[])
maybe_find_addr2line ();
}
+#endif
}
Index: libgfortran/runtime/minimal.c
===================================================================
--- /dev/null
+++ libgfortran/runtime/minimal.c
@@ -0,0 +1,197 @@
+/* Copyright (C) 2002-2014 Free Software Foundation, Inc.
+ Contributed by Andy Vaught and Paul Brook <p...@nowt.org>
+
+This file is part of the GNU Fortran runtime library (libgfortran).
+
+Libgfortran is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 3, or (at your option)
+any later version.
+
+Libgfortran is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+Under Section 7 of GPL version 3, you are granted additional
+permissions described in the GCC Runtime Library Exception, version
+3.1, as published by the Free Software Foundation.
+
+You should have received a copy of the GNU General Public License and
+a copy of the GCC Runtime Library Exception along with this program;
+see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
+<http://www.gnu.org/licenses/>. */
+
+#include "libgfortran.h"
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+#include <errno.h>
+
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+/* Stupid function to be sure the constructor is always linked in, even
+ in the case of static linking. See PR libfortran/22298 for details. */
+void
+stupid_function_name_for_static_linking (void)
+{
+ return;
+}
+
+options_t options;
+
+/* This will be 0 for little-endian
+ machines and 1 for big-endian machines. */
+int big_endian = 0;
+
+
+/* Figure out endianness for this machine. */
+
+static void
+determine_endianness (void)
+{
+ union
+ {
+ GFC_LOGICAL_8 l8;
+ GFC_LOGICAL_4 l4[2];
+ } u;
+
+ u.l8 = 1;
+ if (u.l4[0])
+ big_endian = 0;
+ else if (u.l4[1])
+ big_endian = 1;
+ else
+ runtime_error ("Unable to determine machine endianness");
+}
+
+
+static int argc_save;
+static char **argv_save;
+
+static const char *exe_path;
+
+/* recursion_check()-- It's possible for additional errors to occur
+ * during fatal error processing. We detect this condition here and
+ * exit with code 4 immediately. */
+
+#define MAGIC 0x20DE8101
+
+static void
+recursion_check (void)
+{
+ static int magic = 0;
+
+ /* Don't even try to print something at this point */
+ if (magic == MAGIC)
+ sys_abort ();
+
+ magic = MAGIC;
+}
+
+#define STRERR_MAXSZ 256
+
+void
+os_error (const char *message)
+{
+ recursion_check ();
+ printf ("Operating system error: ");
+ printf ("%s\n", message);
+ exit (1);
+}
+iexport(os_error);
+
+void
+runtime_error (const char *message, ...)
+{
+ va_list ap;
+
+ recursion_check ();
+ printf ("Fortran runtime error: ");
+ va_start (ap, message);
+ vprintf (message, ap);
+ va_end (ap);
+ printf ("\n");
+ exit (2);
+}
+iexport(runtime_error);
+
+/* void runtime_error_at()-- These are errors associated with a
+ * run time error generated by the front end compiler. */
+
+void
+runtime_error_at (const char *where, const char *message, ...)
+{
+ va_list ap;
+
+ recursion_check ();
+ printf ("Fortran runtime error: ");
+ va_start (ap, message);
+ vprintf (message, ap);
+ va_end (ap);
+ printf ("\n");
+ exit (2);
+}
+iexport(runtime_error_at);
+
+/* Return the full path of the executable. */
+char *
+full_exe_path (void)
+{
+ return (char *) exe_path;
+}
+
+
+/* Set the saved values of the command line arguments. */
+
+void
+set_args (int argc, char **argv)
+{
+ argc_save = argc;
+ argv_save = argv;
+ exe_path = argv[0];
+}
+iexport(set_args);
+
+
+/* Retrieve the saved values of the command line arguments. */
+
+void
+get_args (int *argc, char ***argv)
+{
+ *argc = argc_save;
+ *argv = argv_save;
+}
+
+#if 0
+/* Initialize the runtime library. */
+
+static void /* __attribute__((constructor)) */
+init (void)
+{
+ /* Figure out the machine endianness. */
+ determine_endianness ();
+
+ /* Must be first */
+ init_variables ();
+
+ set_fpu ();
+ init_compile_options ();
+
+ random_seed_i4 (NULL, NULL, NULL);
+}
+
+#endif
+
+/* sys_abort()-- Terminate the program showing backtrace and dumping
+ core. */
+
+void
+sys_abort (void)
+{
+ printf ("Abort called.\n");
+ abort();
+}