📄 trans.h
字号:
/* Header for code translation functions Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. Contributed by Paul BrookThis file is part of GCC.GCC is free software; you can redistribute it and/or modify it underthe terms of the GNU General Public License as published by the FreeSoftware Foundation; either version 2, or (at your option) any laterversion.GCC is distributed in the hope that it will be useful, but WITHOUT ANYWARRANTY; without even the implied warranty of MERCHANTABILITY orFITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public Licensefor more details.You should have received a copy of the GNU General Public Licensealong with GCC; see the file COPYING. If not, write to the FreeSoftware Foundation, 51 Franklin Street, Fifth Floor, Boston, MA02110-1301, USA. */#ifndef GFC_TRANS_H#define GFC_TRANS_H/* Mangled symbols take the form __module__name. */#define GFC_MAX_MANGLED_SYMBOL_LEN (GFC_MAX_SYMBOL_LEN*2+4)/* Struct for holding a block of statements. It should be treated as an opaque entity and not modified directly. This allows us to change the underlying representation of statement lists. */typedef struct{ tree head; unsigned int has_scope:1;}stmtblock_t;/* a simplified expression */typedef struct gfc_se{ /* Code blocks to be executed before and after using the value. */ stmtblock_t pre; stmtblock_t post; /* the result of the expression */ tree expr; /* The length of a character string value. */ tree string_length; /* If set gfc_conv_variable will return an expression for the array descriptor. When set, want_pointer should also be set. If not set scalarizing variables will be substituted. */ unsigned descriptor_only:1; /* When this is set gfc_conv_expr returns the address of a variable. Only applies to EXPR_VARIABLE nodes. Also used by gfc_conv_array_parameter. When set this indicates a pointer to the descriptor should be returned, rather than the descriptor itself. */ unsigned want_pointer:1; /* An array function call returning without a temporary. Also used for array pointer assignments. */ unsigned direct_byref:1; /* Ignore absent optional arguments. Used for some intrinsics. */ unsigned ignore_optional:1; /* Scalarization parameters. */ struct gfc_se *parent; struct gfc_ss *ss; struct gfc_loopinfo *loop;}gfc_se;/* 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 indicates to gfc_conv_* that this is a scalar expression. Note that some member arrays correspond to scalarizer rank and others are the variable rank. */typedef struct gfc_ss_info{ int dimen; /* The ref that holds information on this section. */ gfc_ref *ref; /* The descriptor of this array. */ tree descriptor; /* holds the pointer to the data array. */ tree data; /* To move some of the array index calculation out of the innermost loop. */ tree offset; tree saved_offset; tree stride0; /* Holds the SS for a subscript. Indexed by actual dimension. */ struct gfc_ss *subscript[GFC_MAX_DIMENSIONS]; /* stride and delta are used to access this inside a scalarization loop. start is used in the calculation of these. Indexed by scalarizer dimension. */ tree start[GFC_MAX_DIMENSIONS]; tree stride[GFC_MAX_DIMENSIONS]; tree delta[GFC_MAX_DIMENSIONS]; /* Translation from scalarizer dimensions to actual dimensions. actual = dim[scalarizer] */ int dim[GFC_MAX_DIMENSIONS];}gfc_ss_info;typedef enum{ /* A scalar value. This will be evaluated before entering the scalarization loop. */ GFC_SS_SCALAR, /* Like GFC_SS_SCALAR except it evaluates a pointer to the expression. Used for elemental function parameters. */ GFC_SS_REFERENCE, /* An array section. Scalarization indices will be substituted during expression translation. */ GFC_SS_SECTION, /* A non-elemental function call returning an array. The call is executed before entering the scalarization loop, storing the result in a temporary. This temporary is then used inside the scalarization loop. Simple assignments, eg. a(:) = fn() are handles without a temporary as a special case. */ GFC_SS_FUNCTION, /* An array constructor. The current implementation is sub-optimal in many cases. It allocated a temporary, assigns the values to it, then uses this temporary inside the scalarization loop. */ GFC_SS_CONSTRUCTOR, /* 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 than that of the assignment expression. */ GFC_SS_TEMP, /* An intrinsic function call. Many intrinsic functions which map directly to library calls are created as GFC_SS_FUNCTION nodes. */ GFC_SS_INTRINSIC, /* A component of a derived type. */ GFC_SS_COMPONENT}gfc_ss_type;/* SS structures can only belong to a single loopinfo. They must be added otherwise they will not get freed. */typedef struct gfc_ss{ 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; } scalar; /* GFC_SS_TEMP. */ struct { /* The rank of the temporary. May be less than the rank of the assigned expression. */ int dimen; tree type; } temp; /* All other types. */ gfc_ss_info info; } data; /* All the SS in a loop and linked through loop_chain. The SS for an expression are linked by the next pointer. */ struct gfc_ss *loop_chain; struct gfc_ss *next; /* 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 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;/* Holds information about an expression while it is being scalarized. */typedef struct gfc_loopinfo{ stmtblock_t pre; stmtblock_t post; int dimen; /* All the SS involved with this loop. */ gfc_ss *ss; /* The SS describing the temporary used in an assignment. */ gfc_ss *temp_ss; /* The scalarization loop index variables. */ tree loopvar[GFC_MAX_DIMENSIONS]; /* The bounds of the scalarization loops. */ tree from[GFC_MAX_DIMENSIONS]; tree to[GFC_MAX_DIMENSIONS]; gfc_ss *specloop[GFC_MAX_DIMENSIONS]; /* The code member contains the code for the body of the next outer loop. */ stmtblock_t code[GFC_MAX_DIMENSIONS]; /* Order in which the dimensions should be looped, innermost first. */ int order[GFC_MAX_DIMENSIONS]; /* The number of dimensions for which a temporary is used. */ int temp_dim; /* If set we don't need the loop variables. */ unsigned array_parameter:1;}gfc_loopinfo;/* Information about a symbol that has been shadowed by a temporary. */typedef struct{ symbol_attribute attr; tree decl;}gfc_saved_var;/* Advance the SS chain to the next term. */void gfc_advance_se_ss_chain (gfc_se *);/* 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 *);/* Create an artificial variable decl and add it to the current scope. */tree gfc_create_var (tree, const char *);/* Like above but doesn't add it to the current scope. */tree gfc_create_var_np (tree, const char *);/* Store the result of an expression in a temp variable so it can be used repeatedly even if the original changes */void gfc_make_safe_expr (gfc_se * se);/* Makes sure se is suitable for passing as a function string parameter. */void gfc_conv_string_parameter (gfc_se * se);/* Compare two strings. */tree gfc_build_compare_string (tree, tree, tree, tree);/* 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, 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. See the implementations in trans-expr.c for details of the individual functions. */void gfc_conv_expr (gfc_se * se, gfc_expr * expr);void gfc_conv_expr_val (gfc_se * se, gfc_expr * expr);void gfc_conv_expr_lhs (gfc_se * se, gfc_expr * expr);void gfc_conv_expr_reference (gfc_se * se, gfc_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 *);/* Intrinsic function handling. */void gfc_conv_intrinsic_function (gfc_se *, gfc_expr *);/* Does an intrinsic map directly to an external library call. */int gfc_is_intrinsic_libcall (gfc_expr *);/* Also used to CALL subroutines. */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. */tree gfc_trans_scalar_assign (gfc_se *, gfc_se *, bt);/* Translate COMMON blocks. */void gfc_trans_common (gfc_namespace *);/* 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. */tree gfc_conv_expr_present (gfc_symbol *);/* 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 *);/* Add an expression to the end of a block. */void gfc_add_expr_to_block (stmtblock_t *, tree);/* Add a block to the end of a block. */void gfc_add_block_to_block (stmtblock_t *, stmtblock_t *);/* Add a MODIFY_EXPR to a block. */void gfc_add_modify_expr (stmtblock_t *, tree, tree);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -