X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=blobdiff_plain;f=gcc%2Ffortran%2Fgfortran.h;h=6f6a9f46f764dd09f30f231d9d4fadecd69fc671;hp=11ff594f59ba1c20bf00d821091973854e505a87;hb=857616f6172b13aec886bb0b3e2e166f5e75622b;hpb=f10a970e36b75ac92c8d636846e0a7da6af97d1f diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h index 11ff594f59b..6f6a9f46f76 100644 --- a/gcc/fortran/gfortran.h +++ b/gcc/fortran/gfortran.h @@ -38,24 +38,6 @@ along with GCC; see the file COPYING3. If not see #include "coretypes.h" #include "input.h" #include "splay-tree.h" -/* The following ifdefs are recommended by the autoconf documentation - for any code using alloca. */ - -/* AIX requires this to be the first thing in the file. */ -#ifdef __GNUC__ -#else /* not __GNUC__ */ -#ifdef HAVE_ALLOCA_H -#include -#else /* do not HAVE_ALLOCA_H */ -#ifdef _AIX -#pragma alloca -#else -#ifndef alloca /* predefined by HP cc +Olibcalls */ -char *alloca (); -#endif /* not predefined */ -#endif /* not _AIX */ -#endif /* do not HAVE_ALLOCA_H */ -#endif /* not __GNUC__ */ /* Major control parameters. */ @@ -70,10 +52,6 @@ char *alloca (); #define free(x) Use_gfc_free_instead_of_free() #define gfc_is_whitespace(c) ((c==' ') || (c=='\t')) -#ifndef NULL -#define NULL ((void *) 0) -#endif - /* Stringization. */ #define stringize(x) expand_macro(x) #define expand_macro(x) # x @@ -118,6 +96,13 @@ typedef enum { SUCCESS = 1, FAILURE } gfc_try; +/* These are flags for identifying whether we are reading a character literal + between quotes or normal source code. */ + +typedef enum +{ NONSTRING = 0, INSTRING_WARN, INSTRING_NOWARN } +gfc_instring; + /* This is returned by gfc_notification_std to know if, given the flags that were given (-std=, -pedantic) we should issue an error, a warning or nothing. */ @@ -135,18 +120,11 @@ typedef enum { MATCH_NO = 1, MATCH_YES, MATCH_ERROR } match; +/* Used for different Fortran source forms in places like scanner.c. */ typedef enum { FORM_FREE, FORM_FIXED, FORM_UNKNOWN } gfc_source_form; -/* Basic types. BT_VOID is used by ISO C Binding so funcs like c_f_pointer - can take any arg with the pointer attribute as a param. */ -typedef enum -{ BT_UNKNOWN = 1, BT_INTEGER, BT_REAL, BT_COMPLEX, BT_LOGICAL, BT_CHARACTER, - BT_DERIVED, BT_CLASS, BT_PROCEDURE, BT_HOLLERITH, BT_VOID -} -bt; - /* Expression node types. */ typedef enum { EXPR_OP = 1, EXPR_FUNCTION, EXPR_CONSTANT, EXPR_VARIABLE, @@ -157,7 +135,7 @@ expr_t; /* Array types. */ typedef enum { AS_EXPLICIT = 1, AS_ASSUMED_SHAPE, AS_DEFERRED, - AS_ASSUMED_SIZE, AS_UNKNOWN + AS_ASSUMED_SIZE, AS_IMPLIED_SHAPE, AS_UNKNOWN } array_type; @@ -190,7 +168,6 @@ typedef enum } gfc_intrinsic_op; - /* This macro is the number of intrinsic operators that exist. Assumptions are made about the numbering of the interface_op enums. */ #define GFC_INTRINSIC_OPS GFC_INTRINSIC_END @@ -236,7 +213,6 @@ typedef enum } gfc_statement; - /* Types of interfaces that we can have. Assignment interfaces are considered to be intrinsic operators. */ typedef enum @@ -331,7 +307,11 @@ enum gfc_isym_id GFC_ISYM_ATAN, GFC_ISYM_ATAN2, GFC_ISYM_ATANH, + GFC_ISYM_BGE, + GFC_ISYM_BGT, GFC_ISYM_BIT_SIZE, + GFC_ISYM_BLE, + GFC_ISYM_BLT, GFC_ISYM_BTEST, GFC_ISYM_CEILING, GFC_ISYM_CHAR, @@ -339,6 +319,8 @@ enum gfc_isym_id GFC_ISYM_CHMOD, GFC_ISYM_CMPLX, GFC_ISYM_COMMAND_ARGUMENT_COUNT, + GFC_ISYM_COMPILER_OPTIONS, + GFC_ISYM_COMPILER_VERSION, GFC_ISYM_COMPLEX, GFC_ISYM_CONJG, GFC_ISYM_CONVERSION, @@ -355,6 +337,8 @@ enum gfc_isym_id GFC_ISYM_DIM, GFC_ISYM_DOT_PRODUCT, GFC_ISYM_DPROD, + GFC_ISYM_DSHIFTL, + GFC_ISYM_DSHIFTR, GFC_ISYM_DTIME, GFC_ISYM_EOSHIFT, GFC_ISYM_EPSILON, @@ -362,6 +346,7 @@ enum gfc_isym_id GFC_ISYM_ERFC, GFC_ISYM_ERFC_SCALED, GFC_ISYM_ETIME, + GFC_ISYM_EXECUTE_COMMAND_LINE, GFC_ISYM_EXIT, GFC_ISYM_EXP, GFC_ISYM_EXPONENT, @@ -396,7 +381,9 @@ enum gfc_isym_id GFC_ISYM_HUGE, GFC_ISYM_HYPOT, GFC_ISYM_IACHAR, + GFC_ISYM_IALL, GFC_ISYM_IAND, + GFC_ISYM_IANY, GFC_ISYM_IARGC, GFC_ISYM_IBCLR, GFC_ISYM_IBITS, @@ -411,6 +398,7 @@ enum gfc_isym_id GFC_ISYM_INT2, GFC_ISYM_INT8, GFC_ISYM_IOR, + GFC_ISYM_IPARITY, GFC_ISYM_IRAND, GFC_ISYM_ISATTY, GFC_ISYM_IS_IOSTAT_END, @@ -422,6 +410,7 @@ enum gfc_isym_id GFC_ISYM_J0, GFC_ISYM_J1, GFC_ISYM_JN, + GFC_ISYM_JN2, GFC_ISYM_KILL, GFC_ISYM_KIND, GFC_ISYM_LBOUND, @@ -444,6 +433,8 @@ enum gfc_isym_id GFC_ISYM_LSTAT, GFC_ISYM_LTIME, GFC_ISYM_MALLOC, + GFC_ISYM_MASKL, + GFC_ISYM_MASKR, GFC_ISYM_MATMUL, GFC_ISYM_MAX, GFC_ISYM_MAXEXPONENT, @@ -452,6 +443,7 @@ enum gfc_isym_id GFC_ISYM_MCLOCK, GFC_ISYM_MCLOCK8, GFC_ISYM_MERGE, + GFC_ISYM_MERGE_BITS, GFC_ISYM_MIN, GFC_ISYM_MINEXPONENT, GFC_ISYM_MINLOC, @@ -463,12 +455,16 @@ enum gfc_isym_id GFC_ISYM_NEAREST, GFC_ISYM_NEW_LINE, GFC_ISYM_NINT, + GFC_ISYM_NORM2, GFC_ISYM_NOT, GFC_ISYM_NULL, GFC_ISYM_NUMIMAGES, GFC_ISYM_OR, GFC_ISYM_PACK, + GFC_ISYM_PARITY, GFC_ISYM_PERROR, + GFC_ISYM_POPCNT, + GFC_ISYM_POPPAR, GFC_ISYM_PRECISION, GFC_ISYM_PRESENT, GFC_ISYM_PRODUCT, @@ -491,6 +487,9 @@ enum gfc_isym_id GFC_ISYM_SECOND, GFC_ISYM_SET_EXPONENT, GFC_ISYM_SHAPE, + GFC_ISYM_SHIFTA, + GFC_ISYM_SHIFTL, + GFC_ISYM_SHIFTR, GFC_ISYM_SIGN, GFC_ISYM_SIGNAL, GFC_ISYM_SI_KIND, @@ -531,7 +530,8 @@ enum gfc_isym_id GFC_ISYM_XOR, GFC_ISYM_Y0, GFC_ISYM_Y1, - GFC_ISYM_YN + GFC_ISYM_YN, + GFC_ISYM_YN2 }; typedef enum gfc_isym_id gfc_isym_id; @@ -576,12 +576,23 @@ typedef enum } gfc_fcoarray; +typedef enum +{ + GFC_REVERSE_NOT_SET, + GFC_REVERSE_SET, + GFC_CAN_REVERSE, + GFC_CANNOT_REVERSE +} +gfc_reverse; + /************************* Structures *****************************/ /* Used for keeping things in balanced binary trees. */ #define BBT_HEADER(self) int priority; struct self *left, *right #define NAMED_INTCST(a,b,c,d) a, +#define NAMED_KINDARRAY(a,b,c,d) a, +#define NAMED_FUNCTION(a,b,c,d) a, typedef enum { ISOFORTRANENV_INVALID = -1, @@ -590,6 +601,8 @@ typedef enum } iso_fortran_env_symbol; #undef NAMED_INTCST +#undef NAMED_KINDARRAY +#undef NAMED_FUNCTION #define NAMED_INTCST(a,b,c,d) a, #define NAMED_REALCST(a,b,c) a, @@ -599,6 +612,7 @@ iso_fortran_env_symbol; #define NAMED_CHARCST(a,b,c) a, #define DERIVED_TYPE(a,b,c) a, #define PROCEDURE(a,b) a, +#define NAMED_FUNCTION(a,b,c,d) a, typedef enum { ISOCBINDING_INVALID = -1, @@ -615,6 +629,7 @@ iso_c_binding_symbol; #undef NAMED_CHARCST #undef DERIVED_TYPE #undef PROCEDURE +#undef NAMED_FUNCTION typedef enum { @@ -753,6 +768,9 @@ typedef struct unsigned alloc_comp:1, pointer_comp:1, proc_pointer_comp:1, private_comp:1, zero_comp:1, coarray_comp:1; + /* This is a temporary selector for SELECT TYPE. */ + unsigned select_type_temporary:1; + /* Attributes set by compiler extensions (!GCC$ ATTRIBUTES). */ unsigned ext_attr:EXT_ATTR_NUM; @@ -851,7 +869,7 @@ typedef struct gfc_charlen struct gfc_charlen *next; bool length_from_typespec; /* Length from explicit array ctor typespec? */ tree backend_decl; - tree passed_length; /* Length argument explicitelly passed. */ + tree passed_length; /* Length argument explicitly passed. */ int resolved; } @@ -869,13 +887,15 @@ typedef struct { struct gfc_symbol *derived; /* For derived types only. */ gfc_charlen *cl; /* For character types only. */ + int pad; /* For hollerith types only. */ } u; struct gfc_symbol *interface; /* For PROCEDURE declarations. */ int is_c_interop; int is_iso_c; - bt f90_type; + bt f90_type; + bool deferred; } gfc_typespec; @@ -1346,7 +1366,7 @@ typedef struct gfc_namespace struct gfc_code *code; /* Points to the equivalences set up in this namespace. */ - struct gfc_equiv *equiv; + struct gfc_equiv *equiv, *old_equiv; /* Points to the equivalence groups produced by trans_common. */ struct gfc_equiv_list *equiv_lists; @@ -1529,7 +1549,7 @@ typedef struct gfc_intrinsic_arg char name[GFC_MAX_SYMBOL_LEN + 1]; gfc_typespec ts; - int optional; + unsigned optional:1, value:1; ENUM_BITFIELD (sym_intent) intent:2; gfc_actual_arglist *actual; @@ -1609,7 +1629,8 @@ typedef struct gfc_intrinsic_sym gfc_intrinsic_arg *formal; gfc_typespec ts; unsigned elemental:1, inquiry:1, transformational:1, pure:1, - generic:1, specific:1, actual_ok:1, noreturn:1, conversion:1; + generic:1, specific:1, actual_ok:1, noreturn:1, conversion:1, + from_module:1; int standard; @@ -1663,11 +1684,9 @@ typedef struct gfc_expr locus where; - /* True if the expression is a call to a function that returns an array, - and if we have decided not to allocate temporary data for that array. - is_boz is true if the integer is regarded as BOZ bitpatten and is_snan + /* is_boz is true if the integer is regarded as BOZ bitpatten and is_snan denotes a signalling not-a-number. */ - unsigned int inline_noncopying_intrinsic : 1, is_boz : 1, is_snan : 1; + unsigned int is_boz : 1, is_snan : 1; /* Sometimes, when an error has been emitted, it is necessary to prevent it from recurring. */ @@ -1808,6 +1827,7 @@ typedef struct unsigned int c_float : 1; unsigned int c_double : 1; unsigned int c_long_double : 1; + unsigned int c_float128 : 1; } gfc_real_info; @@ -1965,7 +1985,7 @@ typedef struct { gfc_expr *io_unit, *format_expr, *rec, *advance, *iostat, *size, *iomsg, *id, *pos, *asynchronous, *blank, *decimal, *delim, *pad, *round, - *sign, *extra_comma; + *sign, *extra_comma, *dt_io_kind; gfc_symbol *namelist; /* A format_label of `format_asterisk' indicates the "*" format */ @@ -1996,8 +2016,16 @@ typedef struct gfc_association_list lvalue. */ unsigned variable:1; + /* True if this struct is currently only linked to from a gfc_symbol rather + than as part of a real list in gfc_code->ext.block.assoc. This may + happen for SELECT TYPE temporaries and must be considered + for memory handling. */ + unsigned dangling:1; + char name[GFC_MAX_SYMBOL_LEN + 1]; gfc_symtree *st; /* Symtree corresponding to name. */ + locus where; + gfc_expr *target; } gfc_association_list; @@ -2070,7 +2098,7 @@ typedef struct gfc_code gfc_wait *wait; gfc_dt *dt; gfc_forall_iterator *forall_iterator; - struct gfc_code *whichloop; + struct gfc_code *which_construct; int stop_code; gfc_entry_list *entry; gfc_omp_clauses *omp_clauses; @@ -2080,7 +2108,7 @@ typedef struct gfc_code } ext; /* Points to additional structures required by statement */ - /* Cycle and break labels in do loops. */ + /* Cycle and break labels in constructs. */ tree cycle_label; tree exit_label; } @@ -2135,11 +2163,12 @@ typedef struct int max_continue_fixed; int max_continue_free; int max_identifier_length; - int dump_parse_tree; + int dump_fortran_original; + int dump_fortran_optimized; int warn_aliasing; int warn_ampersand; - int warn_conversion; + int gfc_warn_conversion; int warn_conversion_extra; int warn_implicit_interface; int warn_implicit_procedure; @@ -2179,7 +2208,7 @@ typedef struct int blas_matmul_limit; int flag_cray_pointer; int flag_d_lines; - int flag_openmp; + int gfc_flag_openmp; int flag_sign_zero; int flag_module_private; int flag_recursive; @@ -2193,6 +2222,7 @@ typedef struct int flag_align_commons; int flag_whole_file; int flag_protect_parens; + int flag_realloc_lhs; int fpe; int rtcheck; @@ -2308,7 +2338,7 @@ gfc_char_t *gfc_char_to_widechar (const char *); #define gfc_get_wide_string(n) XCNEWVEC (gfc_char_t, n) void gfc_skip_comments (void); -gfc_char_t gfc_next_char_literal (int); +gfc_char_t gfc_next_char_literal (gfc_instring); gfc_char_t gfc_next_char (void); char gfc_next_ascii_char (void); gfc_char_t gfc_peek_char (void); @@ -2346,9 +2376,14 @@ void gfc_done_2 (void); int get_c_kind (const char *, CInteropKind_t *); /* options.c */ -unsigned int gfc_init_options (unsigned int, const char **); -int gfc_handle_option (size_t, const char *, int, int); +unsigned int gfc_option_lang_mask (void); +void gfc_init_options_struct (struct gcc_options *); +void gfc_init_options (unsigned int, + struct cl_decoded_option *); +bool gfc_handle_option (size_t, const char *, int, int, location_t, + 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); @@ -2452,7 +2487,7 @@ gfc_try gfc_add_cray_pointee (symbol_attribute *, locus *); match gfc_mod_pointee_as (gfc_array_spec *); gfc_try gfc_add_protected (symbol_attribute *, const char *, locus *); gfc_try gfc_add_result (symbol_attribute *, const char *, locus *); -gfc_try gfc_add_save (symbol_attribute *, const char *, locus *); +gfc_try gfc_add_save (symbol_attribute *, save_state, const char *, locus *); gfc_try gfc_add_threadprivate (symbol_attribute *, const char *, locus *); gfc_try gfc_add_saved_common (symbol_attribute *, locus *); gfc_try gfc_add_target (symbol_attribute *, locus *); @@ -2511,7 +2546,9 @@ gfc_symtree *gfc_get_unique_symtree (gfc_namespace *); gfc_user_op *gfc_get_uop (const char *); gfc_user_op *gfc_find_uop (const char *, gfc_namespace *); void gfc_free_symbol (gfc_symbol *); +void gfc_release_symbol (gfc_symbol *); gfc_symbol *gfc_new_symbol (const char *, gfc_namespace *); +gfc_symtree* gfc_find_symtree_in_proc (const char *, gfc_namespace *); int gfc_find_symbol (const char *, gfc_namespace *, int, gfc_symbol **); int gfc_find_sym_tree (const char *, gfc_namespace *, int, gfc_symtree **); int gfc_get_symbol (const char *, gfc_namespace *, gfc_symbol **); @@ -2543,7 +2580,7 @@ void gfc_traverse_ns (gfc_namespace *, void (*)(gfc_symbol *)); void gfc_traverse_user_op (gfc_namespace *, void (*)(gfc_user_op *)); void gfc_save_all (gfc_namespace *); -void gfc_symbol_state (void); +void gfc_enforce_clean_symbol_state (void); void gfc_free_dt_list (void); @@ -2563,6 +2600,9 @@ void gfc_copy_formal_args_ppc (gfc_component *, gfc_symbol *); void gfc_free_finalizer (gfc_finalizer *el); /* Needed in resolve.c, too */ gfc_try gfc_check_symbol_typed (gfc_symbol*, gfc_namespace*, bool, locus); +gfc_namespace* gfc_find_proc_namespace (gfc_namespace*); + +bool gfc_is_associate_pointer (gfc_symbol*); /* intrinsic.c -- true if working in an init-expr, false otherwise. */ extern bool gfc_init_expr_flag; @@ -2587,6 +2627,7 @@ bool gfc_is_intrinsic (gfc_symbol*, int, locus); int gfc_intrinsic_actual_ok (const char *, const bool); gfc_intrinsic_sym *gfc_find_function (const char *); gfc_intrinsic_sym *gfc_find_subroutine (const char *); +gfc_intrinsic_sym *gfc_intrinsic_function_by_id (gfc_isym_id); match gfc_intrinsic_func_interface (gfc_expr *, int); match gfc_intrinsic_sub_interface (gfc_code *, int); @@ -2601,6 +2642,7 @@ void gfc_free_forall_iterator (gfc_forall_iterator *); void gfc_free_alloc_list (gfc_alloc *); void gfc_free_namelist (gfc_namelist *); void gfc_free_equiv (gfc_equiv *); +void gfc_free_equiv_until (gfc_equiv *, gfc_equiv *); void gfc_free_data (gfc_data *); void gfc_free_case_list (gfc_case *); @@ -2677,6 +2719,9 @@ bool gfc_get_corank (gfc_expr *); bool gfc_has_ultimate_allocatable (gfc_expr *); bool gfc_has_ultimate_pointer (gfc_expr *); +gfc_expr* gfc_build_intrinsic_call (const char*, locus, unsigned, ...); +gfc_try gfc_check_vardef_context (gfc_expr*, bool, const char*); + /* st.c */ extern gfc_code new_st; @@ -2736,7 +2781,7 @@ gfc_try spec_size (gfc_array_spec *, mpz_t *); gfc_try spec_dimen_size (gfc_array_spec *, int, mpz_t *); int gfc_is_compile_time_shape (gfc_array_spec *); -gfc_try gfc_ref_dimen_size (gfc_array_ref *, int dimen, mpz_t *); +gfc_try gfc_ref_dimen_size (gfc_array_ref *, int dimen, mpz_t *, mpz_t *); /* interface.c -- FIXME: some of these should be in symbol.c */ @@ -2807,6 +2852,7 @@ void gfc_dump_parse_tree (gfc_namespace *, FILE *); /* parse.c */ gfc_try gfc_parse_file (void); void gfc_global_used (gfc_gsymbol *, locus *); +gfc_namespace* gfc_build_block_ns (gfc_namespace *); /* dependency.c */ int gfc_dep_compare_expr (gfc_expr *, gfc_expr *); @@ -2816,6 +2862,11 @@ gfc_try gfc_check_same_strlen (const gfc_expr*, const gfc_expr*, const char*); /* class.c */ void gfc_add_component_ref (gfc_expr *, const char *); +#define gfc_add_data_component(e) gfc_add_component_ref(e,"_data") +#define gfc_add_vptr_component(e) gfc_add_component_ref(e,"_vptr") +#define gfc_add_hash_component(e) gfc_add_component_ref(e,"_hash") +#define gfc_add_size_component(e) gfc_add_component_ref(e,"_size") +#define gfc_add_def_init_component(e) gfc_add_component_ref(e,"_def_init") gfc_expr *gfc_class_null_initializer (gfc_typespec *); gfc_try gfc_build_class_symbol (gfc_typespec *, symbol_attribute *, gfc_array_spec **, bool); @@ -2831,4 +2882,14 @@ gfc_symtree* gfc_get_tbp_symtree (gfc_symtree**, const char*); #define CLASS_DATA(sym) sym->ts.u.derived->components +/* frontend-passes.c */ + +void gfc_run_passes (gfc_namespace *); + +typedef int (*walk_code_fn_t) (gfc_code **, int *, void *); +typedef int (*walk_expr_fn_t) (gfc_expr **, int *, void *); + +int gfc_expr_walker (gfc_expr **, walk_expr_fn_t, void *); +int gfc_code_walker (gfc_code **, walk_code_fn_t, walk_expr_fn_t, void *); + #endif /* GCC_GFORTRAN_H */