From patchwork Tue Nov 4 14:34:43 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bernd Schmidt X-Patchwork-Id: 406632 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 6B86C1400B7 for ; Wed, 5 Nov 2014 01:38:27 +1100 (AEDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :message-id:date:from:mime-version:to:subject:content-type; q= dns; s=default; b=B+QYQ8EiiKDHrombv5Cta4u9bup0+J+AkS7Tu0vCveDDUc caAJ3M3T8OlRz+sSidW4oVsKS6tE6oC2x3lDjMtRvwG+u+XJd3yOjh46tejaJ+ZV 0Imnd44glp0gkeMHa1H6I1mh3fu6u9T/QXo90YVaFzDSg3+TpK6wVyx9HAPBA= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :message-id:date:from:mime-version:to:subject:content-type; s= default; bh=FthuNrM5qikeEf8zpA6C2JPRF4k=; b=U9PwR6coDRvKfa99Dam/ yQ2We+fV/F2NAlOjhFetX1j9F0zJoY5Yl1TTS6EfQEoa9XJdZTEFb1P5n5ybrEt9 XnOekjlV/ZE5CP0wQ3GY6SGV2ARuUBuywqSzD3B/NKXYX37NKZntjsVdqbmMq5ro brDuNzI2XdOwjaF54WYJpZ4= Received: (qmail 12025 invoked by alias); 4 Nov 2014 14:38:19 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 11953 invoked by uid 89); 4 Nov 2014 14:38:15 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.8 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.2 X-Spam-User: qpsmtpd, 2 recipients X-HELO: relay1.mentorg.com Received: from relay1.mentorg.com (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 04 Nov 2014 14:38:07 +0000 Received: from nat-ies.mentorg.com ([192.94.31.2] helo=SVR-IES-FEM-01.mgc.mentorg.com) by relay1.mentorg.com with esmtp id 1XlfFD-00050J-DW from Bernd_Schmidt@mentor.com ; Tue, 04 Nov 2014 06:38:04 -0800 Received: from [127.0.0.1] (137.202.0.76) by SVR-IES-FEM-01.mgc.mentorg.com (137.202.0.104) with Microsoft SMTP Server id 14.3.181.6; Tue, 4 Nov 2014 14:38:01 +0000 Message-ID: <5458E403.4010408@codesourcery.com> Date: Tue, 4 Nov 2014 15:34:43 +0100 From: Bernd Schmidt User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.8.0 MIME-Version: 1.0 To: GCC Patches , gfortran Subject: RFC: Building a minimal libgfortran for nvptx 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 + +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 +. */ + +#include "libgfortran.h" +#include +#include +#include +#include + + +#ifdef HAVE_UNISTD_H +#include +#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(); +}