⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 trans.h

📁 gcc-fortran,linux使用fortran的编译软件。很好用的。
💻 H
📖 第 1 页 / 共 2 页
字号:
/* 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 + -