aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/fortran/ChangeLog16
-rw-r--r--gcc/fortran/gfortran.h1
-rw-r--r--gcc/fortran/intrinsic.c8
-rw-r--r--gcc/fortran/intrinsic.texi96
-rw-r--r--gcc/fortran/options.c77
-rw-r--r--gcc/fortran/simplify.c20
-rw-r--r--gcc/toplev.c4
-rw-r--r--gcc/toplev.h4
9 files changed, 222 insertions, 13 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 989d77d..440c257 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+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.
+
2010-09-28 Ian Lance Taylor <iant@google.com>
* config/i386/i386.c (ix86_supports_split_stack): Test
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 138f458..ef7257d 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,19 @@
+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.
+
2010-09-28 Jan Hubicka <jh@suse.cz>
* f95-lang.c (gfc_define_builtin): Make leaf.
diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h
index 5fdd0d7..c42be85 100644
--- a/gcc/fortran/gfortran.h
+++ b/gcc/fortran/gfortran.h
@@ -2403,6 +2403,7 @@ void gfc_init_options (unsigned int,
bool gfc_handle_option (size_t, const char *, int, int,
const struct cl_option_handlers *);
bool gfc_post_options (const char **);
+char *gfc_get_option_string (void);
/* f95-lang.c */
void gfc_maybe_initialize_eh (void);
diff --git a/gcc/fortran/intrinsic.c b/gcc/fortran/intrinsic.c
index 625ff03..436afb7 100644
--- a/gcc/fortran/intrinsic.c
+++ b/gcc/fortran/intrinsic.c
@@ -2644,13 +2644,13 @@ add_functions (void)
make_from_module();
/* COMPILER_OPTIONS and COMPILER_VERSION are part of ISO_FORTRAN_ENV. */
- add_sym_0 ("compiler_options", GFC_ISYM_COMPILER_OPTIONS, CLASS_IMPURE,
- ACTUAL_NO, BT_CHARACTER, 1, GFC_STD_F2008,
+ add_sym_0 ("compiler_options", GFC_ISYM_COMPILER_OPTIONS, CLASS_INQUIRY,
+ ACTUAL_NO, BT_CHARACTER, dc, GFC_STD_F2008,
NULL, gfc_simplify_compiler_options, NULL);
make_from_module();
- add_sym_0 ("compiler_version", GFC_ISYM_COMPILER_VERSION, CLASS_IMPURE,
- ACTUAL_NO, BT_CHARACTER, 1, GFC_STD_F2008,
+ add_sym_0 ("compiler_version", GFC_ISYM_COMPILER_VERSION, CLASS_INQUIRY,
+ ACTUAL_NO, BT_CHARACTER, dc, GFC_STD_F2008,
NULL, gfc_simplify_compiler_version, NULL);
make_from_module();
diff --git a/gcc/fortran/intrinsic.texi b/gcc/fortran/intrinsic.texi
index 5c7d463..09f5278 100644
--- a/gcc/fortran/intrinsic.texi
+++ b/gcc/fortran/intrinsic.texi
@@ -86,6 +86,8 @@ Some basic guidelines for editing this document:
* @code{CMPLX}: CMPLX, Complex conversion function
* @code{COMMAND_ARGUMENT_COUNT}: COMMAND_ARGUMENT_COUNT, Get number of command line arguments
* @code{COMPLEX}: COMPLEX, Complex conversion function
+* @code{COMPILER_VERSION}: COMPILER_VERSION, Compiler version string
+* @code{COMPILER_OPTIONS}: COMPILER_OPTIONS, Options passed to the compiler
* @code{CONJG}: CONJG, Complex conjugate function
* @code{COS}: COS, Cosine function
* @code{COSH}: COSH, Hyperbolic cosine function
@@ -2363,7 +2365,7 @@ expression @code{X} occupies.
Fortran 2008
@item @emph{Class}:
-Intrinsic function
+Inquiry function of the module @code{ISO_C_BINDING}
@item @emph{Syntax}:
@code{N = C_SIZEOF(X)}
@@ -2375,7 +2377,7 @@ Intrinsic function
@item @emph{Return value}:
The return value is of type integer and of the system-dependent kind
-@var{C_SIZE_T} (from the @var{ISO_C_BINDING} module). Its value is the
+@code{C_SIZE_T} (from the @code{ISO_C_BINDING} module). Its value is the
number of bytes occupied by the argument. If the argument has the
@code{POINTER} attribute, the number of bytes of the storage area pointed
to is returned. If the argument is of a derived type with @code{POINTER}
@@ -2719,6 +2721,92 @@ end program test_command_argument_count
+@node COMPILER_OPTIONS
+@section @code{COMPILER_OPTIONS} --- Options passed to the compiler
+@fnindex COMPILER_OPTIONS
+@cindex flags inquiry function
+@cindex options inquiry function
+@cindex compiler flags inquiry function
+
+@table @asis
+@item @emph{Description}:
+@code{COMPILER_OPTIONS()} returns a string with the options used for
+compiling.
+
+@item @emph{Standard}:
+Fortran 2008
+
+@item @emph{Class}:
+Inquiry function of the module @code{ISO_FORTRAN_ENV}
+
+@item @emph{Syntax}:
+@code{STR = COMPILER_OPTIONS()}
+
+@item @emph{Arguments}:
+None.
+
+@item @emph{Return value}:
+The return value is a default-kind string with system-dependent length.
+It contains the compiler flags used to compile the file, which called
+the @code{COMPILER_OPTIONS} intrinsic.
+
+@item @emph{Example}:
+@smallexample
+ use iso_fortran_env
+ print '(4a)', 'This file was compiled by ', &
+ compiler_version(), ' using the the options ', &
+ compiler_options()
+ end
+@end smallexample
+
+@item @emph{See also}:
+@ref{COMPILER_VERSION}, @ref{ISO_FORTRAN_ENV}
+@end table
+
+
+
+@node COMPILER_VERSION
+@section @code{COMPILER_VERSION} --- Compiler version string
+@fnindex COMPILER_VERSION
+@cindex compiler, name and version
+@cindex version of the compiler
+
+@table @asis
+@item @emph{Description}:
+@code{COMPILER_VERSION()} returns a string with the name and the
+version of the compiler.
+
+@item @emph{Standard}:
+Fortran 2008
+
+@item @emph{Class}:
+Inquiry function of the module @code{ISO_FORTRAN_ENV}
+
+@item @emph{Syntax}:
+@code{STR = COMPILER_VERSION()}
+
+@item @emph{Arguments}:
+None.
+
+@item @emph{Return value}:
+The return value is a default-kind string with system-dependent length.
+It contains the name of the compiler and its version number.
+
+@item @emph{Example}:
+@smallexample
+ use iso_fortran_env
+ print '(4a)', 'This file was compiled by ', &
+ compiler_version(), ' using the the options ', &
+ compiler_options()
+ end
+@end smallexample
+
+@item @emph{See also}:
+@ref{COMPILER_OPTIONS}, @ref{ISO_FORTRAN_ENV}
+@end table
+
+
+
@node COMPLEX
@section @code{COMPLEX} --- Complex conversion function
@fnindex COMPLEX
@@ -12685,6 +12773,9 @@ Scalar default-integer constant used as STAT= return value by @code{UNLOCK} to
denote that the lock variable is unlocked. (Fortran 2008 or later.)
@end table
+The module also provides the following intrinsic procedures:
+@ref{COMPILER_OPTIONS} and @ref{COMPILER_VERSION}.
+
@node ISO_C_BINDING
@@ -12704,6 +12795,7 @@ manual.
@item @code{C_F_PROCPOINTER}
@item @code{C_FUNLOC}
@item @code{C_LOC}
+@item @code{C_SIZEOF}
@end table
@c TODO: Vertical spacing between C_FUNLOC and C_LOC wrong in PDF,
@c don't really know why.
diff --git a/gcc/fortran/options.c b/gcc/fortran/options.c
index c49620a..f7f76f4 100644
--- a/gcc/fortran/options.c
+++ b/gcc/fortran/options.c
@@ -27,6 +27,7 @@ along with GCC; see the file COPYING3. If not see
#include "flags.h"
#include "intl.h"
#include "opts.h"
+#include "toplev.h" /* For save_decoded_options. */
#include "options.h"
#include "params.h"
#include "tree-inline.h"
@@ -966,3 +967,79 @@ gfc_handle_option (size_t scode, const char *arg, int value,
return result;
}
+
+
+/* Return a string with the options passed to the compiler; used for
+ Fortran's compiler_options() intrinsic. */
+
+char *
+gfc_get_option_string (void)
+{
+ unsigned j;
+ size_t len, pos;
+ char *result;
+
+ /* Determine required string length. */
+
+ len = 0;
+ for (j = 1; j < save_decoded_options_count; j++)
+ {
+ switch (save_decoded_options[j].opt_index)
+ {
+ case OPT_o:
+ case OPT_d:
+ case OPT_dumpbase:
+ case OPT_dumpdir:
+ case OPT_auxbase:
+ case OPT_quiet:
+ case OPT_version:
+ case OPT_fintrinsic_modules_path:
+ /* Ignore these. */
+ break;
+ default:
+ /* Ignore file names. */
+ if (save_decoded_options[j].orig_option_with_args_text[0] == '-')
+ len += 1
+ + strlen (save_decoded_options[j].orig_option_with_args_text);
+ }
+ }
+
+ result = (char *) gfc_getmem (len);
+
+ pos = 0;
+ for (j = 1; j < save_decoded_options_count; j++)
+ {
+ switch (save_decoded_options[j].opt_index)
+ {
+ case OPT_o:
+ case OPT_d:
+ case OPT_dumpbase:
+ case OPT_dumpdir:
+ case OPT_auxbase:
+ case OPT_quiet:
+ case OPT_version:
+ case OPT_fintrinsic_modules_path:
+ /* Ignore these. */
+ continue;
+
+ case OPT_cpp_:
+ /* Use "-cpp" rather than "-cpp=<temporary file>". */
+ len = 4;
+ break;
+
+ default:
+ /* Ignore file names. */
+ if (save_decoded_options[j].orig_option_with_args_text[0] != '-')
+ continue;
+
+ len = strlen (save_decoded_options[j].orig_option_with_args_text);
+ }
+
+ memcpy (&result[pos], save_decoded_options[j].orig_option_with_args_text, len);
+ pos += len;
+ result[pos++] = ' ';
+ }
+
+ result[--pos] = '\0';
+ return result;
+}
diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c
index 8748ecf..cdefcb5 100644
--- a/gcc/fortran/simplify.c
+++ b/gcc/fortran/simplify.c
@@ -6739,16 +6739,26 @@ gfc_convert_char_constant (gfc_expr *e, bt type ATTRIBUTE_UNUSED, int kind)
gfc_expr *
gfc_simplify_compiler_options (void)
{
- /* FIXME: PR40569 - return the proper compiler arguments. */
- return gfc_get_character_expr (gfc_default_character_kind,
- &gfc_current_locus, "", 0);
+ char *str;
+ gfc_expr *result;
+
+ str = gfc_get_option_string ();
+ result = gfc_get_character_expr (gfc_default_character_kind,
+ &gfc_current_locus, str, strlen (str));
+ gfc_free (str);
+ return result;
}
gfc_expr *
gfc_simplify_compiler_version (void)
{
+ char *buffer;
+ size_t len;
+
+ len = strlen ("GCC version ") + strlen (version_string) + 1;
+ buffer = (char*) alloca (len);
+ snprintf (buffer, len, "GCC version %s", version_string);
return gfc_get_character_expr (gfc_default_character_kind,
- &gfc_current_locus, version_string,
- strlen (version_string));
+ &gfc_current_locus, buffer, len);
}
diff --git a/gcc/toplev.c b/gcc/toplev.c
index e43b6d9..cf12b2f 100644
--- a/gcc/toplev.c
+++ b/gcc/toplev.c
@@ -127,8 +127,8 @@ static bool no_backend;
#define MAX_LINE 75
/* Decoded options, and number of such options. */
-static struct cl_decoded_option *save_decoded_options;
-static unsigned int save_decoded_options_count;
+struct cl_decoded_option *save_decoded_options;
+unsigned int save_decoded_options_count;
/* Name of top-level original source file (what was input to cpp).
This comes from the #-command at the beginning of the actual input.
diff --git a/gcc/toplev.h b/gcc/toplev.h
index 6de27a0..c72f468 100644
--- a/gcc/toplev.h
+++ b/gcc/toplev.h
@@ -29,6 +29,10 @@ along with GCC; see the file COPYING3. If not see
#define skip_leading_substring(whole, part) \
(strncmp (whole, part, strlen (part)) ? NULL : whole + strlen (part))
+/* Decoded options, and number of such options. */
+extern struct cl_decoded_option *save_decoded_options;
+extern unsigned int save_decoded_options_count;
+
extern int toplev_main (int, char **);
extern void strip_off_ending (char *, int);
extern void rest_of_decl_compilation (tree, int, int);