/* Header for code translation functions
- Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
Contributed by Paul Brook
This file is part of GCC.
You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING. If not, write to the Free
-Software Foundation, 59 Temple Place - Suite 330, Boston, MA
-02111-1307, USA. */
+Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301, USA. */
#ifndef GFC_TRANS_H
#define GFC_TRANS_H
typedef struct
{
tree head;
- int has_scope:1;
+ unsigned int has_scope:1;
}
stmtblock_t;
-/* a simplified expresson */
+/* a simplified expression */
typedef struct gfc_se
{
/* Code blocks to be executed before and after using the value. */
gfc_se;
-/* Scalarisation State chain. Created by walking an expression tree before
+/* Scalarization State chain. Created by walking an expression tree before
creating the scalarization loops. Then passed as part of a gfc_se structure
to translate the expression inside the loop. Note that these chains are
terminated by gfc_se_terminator, not NULL. A NULL pointer in a gfc_se
tree stride[GFC_MAX_DIMENSIONS];
tree delta[GFC_MAX_DIMENSIONS];
- /* Translation from scalariser dimensions to actual dimensions.
+ /* Translation from scalarizer dimensions to actual dimensions.
actual = dim[scalarizer] */
int dim[GFC_MAX_DIMENSIONS];
}
scalarization loop. */
GFC_SS_SCALAR,
- /* Like GFC_SS_SCALAR except it evaluates a pointer the the expression.
+ /* Like GFC_SS_SCALAR except it evaluates a pointer to the expression.
Used for elemental function parameters. */
GFC_SS_REFERENCE,
uses this temporary inside the scalarization loop. */
GFC_SS_CONSTRUCTOR,
- /* A vector subscript. Only used as the SS chain for a subscript.
- Similar int format to a GFC_SS_SECTION. */
+ /* A vector subscript. The vector's descriptor is cached in the
+ "descriptor" field of the associated gfc_ss_info. */
GFC_SS_VECTOR,
/* A temporary array allocated by the scalarizer. Its rank can be less
/* An intrinsic function call. Many intrinsic functions which map directly
to library calls are created as GFC_SS_FUNCTION nodes. */
- GFC_SS_INTRINSIC
+ GFC_SS_INTRINSIC,
+
+ /* A component of a derived type. */
+ GFC_SS_COMPONENT
}
gfc_ss_type;
{
gfc_ss_type type;
gfc_expr *expr;
+ mpz_t *shape;
+ tree string_length;
union
{
/* If type is GFC_SS_SCALAR or GFC_SS_REFERENCE. */
struct
{
tree expr;
- tree string_length;
}
scalar;
assigned expression. */
int dimen;
tree type;
- tree string_length;
}
temp;
/* All other types. */
struct gfc_ss *loop_chain;
struct gfc_ss *next;
- /* This is used by assignments requiring teporaries. The bits specify which
+ /* This is used by assignments requiring temporaries. The bits specify which
loops the terms appear in. This will be 1 for the RHS expressions,
2 for the LHS expressions, and 3(=1|2) for the temporary. */
unsigned useflags:2;
gfc_ss;
#define gfc_get_ss() gfc_getmem(sizeof(gfc_ss))
-/* The contents of this aren't actualy used. A NULL SS chain indicates a
+/* The contents of this aren't actually used. A NULL SS chain indicates a
scalar expression, so this pointer is used to terminate SS chains. */
extern gfc_ss * const gfc_ss_terminator;
/* All the SS involved with this loop. */
gfc_ss *ss;
- /* The SS describing the teporary used in an assignment. */
+ /* The SS describing the temporary used in an assignment. */
gfc_ss *temp_ss;
/* The scalarization loop index variables. */
/* Advance the SS chain to the next term. */
void gfc_advance_se_ss_chain (gfc_se *);
-/* Call this to initialise a gfc_se structure before use
- first parameter is structure to initialise, second is
+/* Call this to initialize a gfc_se structure before use
+ first parameter is structure to initialize, second is
parent to get scalarization data from, or NULL. */
void gfc_init_se (gfc_se *, gfc_se *);
/* Add an item to the end of TREE_LIST. */
tree gfc_chainon_list (tree, tree);
-/* When using the gfc_conv_* make sure you understand what they do, ie.
- when a POST chain may be created, and what the retured expression may be
+/* When using the gfc_conv_* make sure you understand what they do, i.e.
+ when a POST chain may be created, and what the returned expression may be
used for. Note that character strings have special handling. This
should not be a problem as most statements/operations only deal with
- numeric/logical types. */
+ numeric/logical types. See the implementations in trans-expr.c
+ for details of the individual functions. */
-/* Entry point for expression translation. */
void gfc_conv_expr (gfc_se * se, gfc_expr * expr);
-/* Like gfc_conv_expr, but the POST block is guaranteed to be empty for
- numeric expressions. */
void gfc_conv_expr_val (gfc_se * se, gfc_expr * expr);
-/* Like gfc_conv_expr_val, but the value is also suitable for use in the lhs of
- an assignment. */
void gfc_conv_expr_lhs (gfc_se * se, gfc_expr * expr);
-/* Converts an expression so that it can be passed be reference. */
void gfc_conv_expr_reference (gfc_se * se, gfc_expr *);
-/* Equivalent to convert(type, gfc_conv_expr_val(se, expr)). */
void gfc_conv_expr_type (gfc_se * se, gfc_expr *, tree);
+
+/* Find the decl containing the auxiliary variables for assigned variables. */
+void gfc_conv_label_variable (gfc_se * se, gfc_expr * expr);
/* If the value is not constant, Create a temporary and copy the value. */
tree gfc_evaluate_now (tree, stmtblock_t *);
int gfc_is_intrinsic_libcall (gfc_expr *);
/* Also used to CALL subroutines. */
-void gfc_conv_function_call (gfc_se *, gfc_symbol *, gfc_actual_arglist *);
+int gfc_conv_function_call (gfc_se *, gfc_symbol *, gfc_actual_arglist *);
/* gfc_trans_* shouldn't call push/poplevel, use gfc_push/pop_scope */
/* Generate code for a scalar assignment. */
/* Translate COMMON blocks. */
void gfc_trans_common (gfc_namespace *);
-/* Translate a derived type constructor. */
+/* Translate a derived type constructor. */
void gfc_conv_structure (gfc_se *, gfc_expr *, int);
/* Return an expression which determines if a dummy parameter is present. */
/* Generate code to allocate a string temporary. */
tree gfc_conv_string_tmp (gfc_se *, tree, tree);
+/* Get the string length variable belonging to an expression. */
+tree gfc_get_expr_charlen (gfc_expr *);
/* Initialize a string length variable. */
void gfc_trans_init_string_length (gfc_charlen *, stmtblock_t *);
/* Initialize a statement block. */
void gfc_init_block (stmtblock_t *);
-/* Start a new satement block. Like gfc_init_block but also starts a new
+/* Start a new statement block. Like gfc_init_block but also starts a new
variable scope. */
void gfc_start_block (stmtblock_t *);
/* Finish a statement block. Also closes the scope if the block was created
/* Build an ARRAY_REF. */
tree gfc_build_array_ref (tree, tree);
-/* Creates an label. Decl is artificial if label_id == NULL_TREE. */
+/* Creates a label. Decl is artificial if label_id == NULL_TREE. */
tree gfc_build_label_decl (tree);
/* Return the decl used to hold the function return value.
/* Make prototypes for runtime library functions. */
void gfc_build_builtin_function_decls (void);
+/* Set the backend source location of a decl. */
+void gfc_set_decl_location (tree, locus *);
+
/* Return the variable decl for a symbol. */
tree gfc_get_symbol_decl (gfc_symbol *);
+/* Build a static initializer. */
+tree gfc_conv_initializer (gfc_expr *, gfc_typespec *, tree, bool, bool);
+
/* Substitute a temporary variable in place of the real one. */
void gfc_shadow_sym (gfc_symbol *, tree, gfc_saved_var *);
/* Restore the original variable. */
void gfc_restore_sym (gfc_symbol *, gfc_saved_var *);
-/* Allocate the lang-spcific part of a decl node. */
+/* Returns true if a variable of specified size should go on the stack. */
+int gfc_can_put_var_on_stack (tree);
+
+/* Allocate the lang-specific part of a decl node. */
void gfc_allocate_lang_decl (tree);
/* Advance along a TREE_CHAIN. */
tree gfc_advance_chain (tree, int);
/* Create a decl for a function. */
-void gfc_build_function_decl (gfc_symbol *);
+void gfc_create_function_decl (gfc_namespace *);
/* Generate the code for a function. */
void gfc_generate_function_code (gfc_namespace *);
+/* Output a BLOCK DATA program unit. */
+void gfc_generate_block_data (gfc_namespace *);
/* Output a decl for a module variable. */
void gfc_generate_module_vars (gfc_namespace *);
/* Generate a runtime error check. */
void gfc_trans_runtime_check (tree, tree, stmtblock_t *);
-/* Generate code for an assigment, includes scalarization. */
+/* Generate code for an assignment, includes scalarization. */
tree gfc_trans_assignment (gfc_expr *, gfc_expr *);
-/* Generate code for an pointer assignment. */
+/* Generate code for a pointer assignment. */
tree gfc_trans_pointer_assignment (gfc_expr *, gfc_expr *);
/* Initialize function decls for library functions. */
tree poplevel (int, int, int);
tree getdecls (void);
tree gfc_truthvalue_conversion (tree);
+tree builtin_function (const char *, tree, int, enum built_in_class,
+ const char *, tree);
/* Runtime library function decls. */
extern GTY(()) tree gfor_fndecl_internal_malloc;
extern GTY(()) tree gfor_fndecl_internal_malloc64;
+extern GTY(()) tree gfor_fndecl_internal_realloc;
+extern GTY(()) tree gfor_fndecl_internal_realloc64;
extern GTY(()) tree gfor_fndecl_internal_free;
extern GTY(()) tree gfor_fndecl_allocate;
extern GTY(()) tree gfor_fndecl_allocate64;
extern GTY(()) tree gfor_fndecl_stop_string;
extern GTY(()) tree gfor_fndecl_select_string;
extern GTY(()) tree gfor_fndecl_runtime_error;
+extern GTY(()) tree gfor_fndecl_set_fpe;
+extern GTY(()) tree gfor_fndecl_set_std;
extern GTY(()) tree gfor_fndecl_in_pack;
extern GTY(()) tree gfor_fndecl_in_unpack;
extern GTY(()) tree gfor_fndecl_associated;
}
gfc_powdecl_list;
-extern GTY(()) gfc_powdecl_list gfor_fndecl_math_powi[3][2];
+extern GTY(()) gfc_powdecl_list gfor_fndecl_math_powi[4][3];
extern GTY(()) tree gfor_fndecl_math_cpowf;
extern GTY(()) tree gfor_fndecl_math_cpow;
-extern GTY(()) tree gfor_fndecl_math_cabsf;
-extern GTY(()) tree gfor_fndecl_math_cabs;
-extern GTY(()) tree gfor_fndecl_math_sign4;
-extern GTY(()) tree gfor_fndecl_math_sign8;
+extern GTY(()) tree gfor_fndecl_math_cpowl10;
+extern GTY(()) tree gfor_fndecl_math_cpowl16;
extern GTY(()) tree gfor_fndecl_math_ishftc4;
extern GTY(()) tree gfor_fndecl_math_ishftc8;
+extern GTY(()) tree gfor_fndecl_math_ishftc16;
extern GTY(()) tree gfor_fndecl_math_exponent4;
extern GTY(()) tree gfor_fndecl_math_exponent8;
+extern GTY(()) tree gfor_fndecl_math_exponent10;
+extern GTY(()) tree gfor_fndecl_math_exponent16;
/* String functions. */
extern GTY(()) tree gfor_fndecl_copy_string;
/* Other misc. runtime library functions. */
extern GTY(()) tree gfor_fndecl_size0;
extern GTY(()) tree gfor_fndecl_size1;
+extern GTY(()) tree gfor_fndecl_iargc;
/* Implemented in FORTRAN. */
extern GTY(()) tree gfor_fndecl_si_kind;
tree saved_descriptor;
/* Assigned integer nodes. Stringlength is the IO format string's length.
Addr is the address of the string or the target label. Stringlength is
- initialized to -2 and assiged to -1 when addr is assigned to the
+ initialized to -2 and assigned to -1 when addr is assigned to the
address of target label. */
tree stringlen;
tree addr;
#define GFC_TYPE_ARRAY_RANK(node) (TYPE_LANG_SPECIFIC(node)->rank)
#define GFC_TYPE_ARRAY_SIZE(node) (TYPE_LANG_SPECIFIC(node)->size)
#define GFC_TYPE_ARRAY_OFFSET(node) (TYPE_LANG_SPECIFIC(node)->offset)
+/* Code should use gfc_get_dtype instead of accesig this directly. It may
+ not be known when the type is created. */
#define GFC_TYPE_ARRAY_DTYPE(node) (TYPE_LANG_SPECIFIC(node)->dtype)
#define GFC_TYPE_ARRAY_DATAPTR_TYPE(node) \
(TYPE_LANG_SPECIFIC(node)->dataptr_type)
/* Build an expression with void type. */
#define build1_v(code, arg) build(code, void_type_node, arg)
-#define build_v(code, args...) build(code, void_type_node, args)
+#define build2_v(code, arg1, arg2) build2(code, void_type_node, \
+ arg1, arg2)
+#define build3_v(code, arg1, arg2, arg3) build3(code, void_type_node, \
+ arg1, arg2, arg3)
+
+/* This group of functions allows a caller to evaluate an expression from
+ the callee's interface. It establishes a mapping between the interface's
+ dummy arguments and the caller's actual arguments, then applies that
+ mapping to a given gfc_expr.
+
+ You can initialize a mapping structure like so:
+
+ gfc_interface_mapping mapping;
+ ...
+ gfc_init_interface_mapping (&mapping);
+
+ You should then evaluate each actual argument into a temporary
+ gfc_se structure, here called "se", and map the result to the
+ dummy argument's symbol, here called "sym":
+
+ gfc_add_interface_mapping (&mapping, sym, &se);
+
+ After adding all mappings, you should call:
+
+ gfc_finish_interface_mapping (&mapping, pre, post);
+
+ where "pre" and "post" are statement blocks for initialization
+ and finalization code respectively. You can then evaluate an
+ interface expression "expr" as follows:
+
+ gfc_apply_interface_mapping (&mapping, se, expr);
+
+ Once you've evaluated all expressions, you should free
+ the mapping structure with:
+
+ gfc_free_interface_mapping (&mapping); */
+
+
+/* This structure represents a mapping from OLD to NEW, where OLD is a
+ dummy argument symbol and NEW is a symbol that represents the value
+ of an actual argument. Mappings are linked together using NEXT
+ (in no particular order). */
+typedef struct gfc_interface_sym_mapping
+{
+ struct gfc_interface_sym_mapping *next;
+ gfc_symbol *old;
+ gfc_symtree *new;
+}
+gfc_interface_sym_mapping;
+
+
+/* This structure is used by callers to evaluate an expression from
+ a callee's interface. */
+typedef struct gfc_interface_mapping
+{
+ /* Maps the interface's dummy arguments to the values that the caller
+ is passing. The whole list is owned by this gfc_interface_mapping. */
+ gfc_interface_sym_mapping *syms;
+
+ /* A list of gfc_charlens that were needed when creating copies of
+ expressions. The whole list is owned by this gfc_interface_mapping. */
+ gfc_charlen *charlens;
+}
+gfc_interface_mapping;
+
+void gfc_init_interface_mapping (gfc_interface_mapping *);
+void gfc_free_interface_mapping (gfc_interface_mapping *);
+void gfc_add_interface_mapping (gfc_interface_mapping *,
+ gfc_symbol *, gfc_se *);
+void gfc_finish_interface_mapping (gfc_interface_mapping *,
+ stmtblock_t *, stmtblock_t *);
+void gfc_apply_interface_mapping (gfc_interface_mapping *,
+ gfc_se *, gfc_expr *);
-/* flag for alternative return labels. */
-extern int has_alternate_specifier; /* for caller */
#endif /* GFC_TRANS_H */