re PR fortran/40569 (F2008: Support COMPILER_OPTIONS() / COMPILER_VERSION())

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.

From-SVN: r164698
This commit is contained in:
Tobias Burnus 2010-09-28 21:51:38 +02:00 committed by Tobias Burnus
parent 770a498aee
commit 41804a5be0
9 changed files with 222 additions and 13 deletions

View File

@ -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

View File

@ -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.

View File

@ -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);

View File

@ -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();

View File

@ -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.

View File

@ -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;
}

View File

@ -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);
}

View File

@ -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.

View File

@ -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);