Bug 40569 - F2008: Support COMPILER_OPTIONS() / COMPILER_VERSION()
Summary: F2008: Support COMPILER_OPTIONS() / COMPILER_VERSION()
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: fortran (show other bugs)
Version: 4.5.0
: P3 enhancement
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks: 39627
  Show dependency treegraph
 
Reported: 2009-06-27 16:16 UTC by Tobias Burnus
Modified: 2010-09-28 19:55 UTC (History)
2 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2009-07-05 09:15:48


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Tobias Burnus 2009-06-27 16:16:27 UTC
Fortran 2008 adds the two inquiry subroutines, which return a string.

In GCC the version string is in "version.h":
  extern const char version_string[];

The options string has to constructed manually; the question is whether one wants to skip certain options. Optimally, one would record exactly those options passed to "gfortran" and not all those options passed to "f951". The middle end has -frecord-gcc-switches and -fverbose-asm; cf. toplev.c's print_switch_values.
Comment 1 Tobias Burnus 2009-06-27 19:44:08 UTC
Do not forget to update intrinsic.texi!

For the missing constants in ISO_FORTRAN_ENV, see PR 40571
Comment 2 Tobias Burnus 2010-06-23 16:46:08 UTC
Cf. PR 40568 for "C_SIZEOF", a F2008 module procedure of ISO_C_BINDING
Comment 3 Tobias Burnus 2010-09-25 12:34:38 UTC
First part of an implementation.

TODO: (a) Use a module rather than the normal name space. (b) Get the command line options; cf. http://gcc.gnu.org/ml/gcc-patches/2010-09/msg02006.html

--- intrinsic.c (Revision 164618)
+++ intrinsic.c (Arbeitskopie)
@@ -2613,0 +2615,6 @@ add_functions (void)
+
+/* MOVE TO MODULE: ISO_FORTRAN_ENV.  */
+  add_sym_0 ("compiler_options", GFC_ISYM_COMPILER_VERSION, CLASS_IMPURE, ACTUAL_NO, BT_CHARACTER,
+            1, GFC_STD_F2008, NULL, gfc_simplify_compiler_options, NULL);
+  add_sym_0 ("compiler_version", GFC_ISYM_COMPILER_VERSION, CLASS_IMPURE, ACTUAL_NO, BT_CHARACTER,
+            1, GFC_STD_F2008, NULL, gfc_simplify_compiler_version, NULL);
--- simplify.c  (Revision 164618)
+++ simplify.c
@@ -29,2 +29,3 @@ along with GCC; see the file COPYING3.
 #include "constructor.h"
+#include "version.h"  /* For version_string.  */
 
@@ -6735 +6736,17 @@ gfc_convert_char_constant (gfc_expr *e,
 }
+
+
+gfc_expr *
+gfc_simplify_compiler_options (void)
+{
+  return NULL;
+}
+
+
+gfc_expr *
+gfc_simplify_compiler_version (void)
+{
+  return gfc_get_character_expr (gfc_default_character_kind,
+                                &gfc_current_locus, version_string,
+                                strlen (version_string));
+}
Comment 4 Tobias Burnus 2010-09-25 22:43:13 UTC
Patch: http://gcc.gnu.org/ml/fortran/2010-09/msg00455.html
Comment 5 Tobias Burnus 2010-09-26 22:30:52 UTC
Author: burnus
Date: Sun Sep 26 22:30:48 2010
New Revision: 164639

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=164639
Log:
2010-09-27  Tobias Burnus  <burnus@net-b.de>

        PR fortran/40569
        PR fortran/40568
        * intrinsic.h (gfc_simplify_compiler_options,
        gfc_simplify_compiler_version): New prototypes.
        * intrinsic.c (gfc_intrinsic_function_by_id,
        make_from_module): New functions.
        (gfc_find_function, gfc_find_subroutine, gfc_generic_intrinsic,
        gfc_specific_intrinsic): Don't return module intrinsics.
        (add_functions): Add compiler_options, compiler_version.
        (gfc_intrinsic_func_interface): Also lookup symbol by ISYM ID.
        * symbol.c (std_for_isocbinding_symbol): Add version check for
        NAMED_FUNCTIONS.
        * iso-fortran-env.def: Add compiler_options, compiler_version.
        * iso-c-binding.def: Add c_sizeof.
        * gfortran.h (gfc_intrinsic_sym): Add from_module:1.
        (iso_c_binding_symbol, iso_fortran_env_symbol): Add NAMED_FUNCTIONS.
        (gfc_intrinsic_function_by_id): New prototype.
        * module.c (create_intrinsic_function): New function.
        (import_iso_c_binding_module, use_iso_fortran_env_module): Use it.
        * trans-types.c (init_c_interop_kinds): Add NAMED_FUNCTIONS.
        * resolve.c (resolve_intrinsic): Try also to resolve intrinsics
        by ISYM ID.
        * simplify.c (gfc_simplify_compiler_options,
        gfc_simplify_compiler_version): New functions.

2010-09-27  Tobias Burnus  <burnus@net-b.de>

        PR fortran/40569
        PR fortran/40568
        * gfortran.dg/storage_size_2.f08: Fix test.
        * gfortran.dg/c_sizeof_1.f90: Fix test.
        * gfortran.dg/c_sizeof_2.f90: Update dg-error.
        * gfortran.dg/c_sizeof_3.f90: New.
        * gfortran.dg/c_sizeof_4.f90: New.
        * gfortran.dg/iso_c_binding_compiler_1.f90: New.
        * gfortran.dg/iso_c_binding_compiler_2.f90: New.


Added:
    trunk/gcc/testsuite/gfortran.dg/c_sizeof_3.f90
    trunk/gcc/testsuite/gfortran.dg/c_sizeof_4.f90
    trunk/gcc/testsuite/gfortran.dg/iso_c_binding_compiler_1.f90
    trunk/gcc/testsuite/gfortran.dg/iso_c_binding_compiler_2.f90
Modified:
    trunk/gcc/fortran/ChangeLog
    trunk/gcc/fortran/gfortran.h
    trunk/gcc/fortran/intrinsic.c
    trunk/gcc/fortran/intrinsic.h
    trunk/gcc/fortran/iso-c-binding.def
    trunk/gcc/fortran/iso-fortran-env.def
    trunk/gcc/fortran/module.c
    trunk/gcc/fortran/resolve.c
    trunk/gcc/fortran/simplify.c
    trunk/gcc/fortran/symbol.c
    trunk/gcc/fortran/trans-types.c
    trunk/gcc/testsuite/ChangeLog
    trunk/gcc/testsuite/gfortran.dg/c_sizeof_1.f90
    trunk/gcc/testsuite/gfortran.dg/c_sizeof_2.f90
    trunk/gcc/testsuite/gfortran.dg/storage_size_2.f08
Comment 6 Tobias Burnus 2010-09-26 22:40:26 UTC
Basic implementation works. Remains to do:

(a) COMPILER_OPTIONS(): Return a more useful string than ""

(b) "-Wall" gives a bogus warning:
  Warning: Type specified for intrinsic function 'compiler_version' at (1)
           is ignored
  for
    use iso_fortran_env, only: compiler_version
    print *,compiler_version()
    end
Comment 7 Tobias Burnus 2010-09-26 22:46:10 UTC
(In reply to comment #6)
> Basic implementation works. Remains to do:
...
(c) CLASS_INQUIRY instead of CLASS_IMPURE?
Comment 8 Tobias Burnus 2010-09-27 06:34:09 UTC
(In reply to comment #7)
> (In reply to comment #6)
> > Basic implementation works. Remains to do:
> ...
> (c) CLASS_INQUIRY instead of CLASS_IMPURE?

(d) Documentation in intrinsic.texi
Comment 9 Joost VandeVondele 2010-09-28 08:38:52 UTC
this is nice... can this be used in an initialization expression ?

MODULE X
 CHARACTER(LEN=100), PARAMETER :: module_compile_info=compiler_version()//compiler_options()
END MODULE
Comment 10 Tobias Burnus 2010-09-28 19:51:42 UTC
Author: burnus
Date: Tue Sep 28 19:51:38 2010
New Revision: 164698

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=164698
Log:
gcc/
2010-09-28  Tobias Burnus  <burnus@net-b.de>

        PR fortran/40569
        PR fortran/40568
        * toplev.h (save_decoded_options, save_decoded_options_count):
        New global variables.
        * toplev.c (save_decoded_options, save_decoded_options_count):
        export variables.

gcc/fortran/
2010-09-28  Tobias Burnus  <burnus@net-b.de>

        PR fortran/40569
        PR fortran/40568
        * intrinsic.c (add_functions): Make compiler_version and
        compiler_options CLASS_INQUIRY.
        * gfortran.h (gfc_get_option_string): New prototype.
        * intrinsic.texi (COMPILER_VERSION, COMPILER_OPTIONS):
        Add documentation.
        (C_SIZEOF): Mark as inquiry function of ISO_C_BINDING.
        (ISO_FORTRAN_ENV): Refer to COMPILER_VERSION and COMPILER_OPTIONS.
        (ISO_C_BINDING): Refer to C_SIZEOF.
        * options.c (gfc_get_option_string): New function.
        * simplify.c (gfc_simplify_compiler_options): Use it.
        (gfc_simplify_compiler_version): Include compiler name.


Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/fortran/ChangeLog
    trunk/gcc/fortran/gfortran.h
    trunk/gcc/fortran/intrinsic.c
    trunk/gcc/fortran/intrinsic.texi
    trunk/gcc/fortran/options.c
    trunk/gcc/fortran/simplify.c
    trunk/gcc/toplev.c
    trunk/gcc/toplev.h
Comment 11 Tobias Burnus 2010-09-28 19:52:55 UTC
Close as FIXED (for 4.6).


Separately tracked follow ups:

For updating check_inquiry, cf. PR 45824.

For the bogus warning, cf. PR 45823



(In reply to comment #9)
> this is nice... can this be used in an initialization expression ?
>
>  CHARACTER(LEN=100), PARAMETER :: module_compile_info = & 
>         compiler_version()//compiler_options()

Yes, but you need to add "use iso_fortran_env".
Comment 12 Tobias Burnus 2010-09-28 19:55:51 UTC
Really mark as FIXED.