Annotation of GNUtools/cc/integrate.h, revision 1.1

1.1     ! root        1: /* Function integration definitions for GNU C-Compiler
        !             2:    Copyright (C) 1990 Free Software Foundation, Inc.
        !             3: 
        !             4: This file is part of GNU CC.
        !             5: 
        !             6: GNU CC is free software; you can redistribute it and/or modify
        !             7: it under the terms of the GNU General Public License as published by
        !             8: the Free Software Foundation; either version 2, or (at your option)
        !             9: any later version.
        !            10: 
        !            11: GNU CC is distributed in the hope that it will be useful,
        !            12: but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        !            14: GNU General Public License for more details.
        !            15: 
        !            16: You should have received a copy of the GNU General Public License
        !            17: along with GNU CC; see the file COPYING.  If not, write to
        !            18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
        !            19: 
        !            20: /* This structure is used to remap objects in the function being inlined to
        !            21:    those belonging to the calling function.  It is passed by
        !            22:    expand_inline_function to its children.
        !            23: 
        !            24:    This structure is also used when unrolling loops and otherwise
        !            25:    replicating code, although not all fields are needed in this case;
        !            26:    only those fields needed by copy_rtx_and_substitute() and its children
        !            27:    are used.
        !            28: 
        !            29:    This structure is used instead of static variables because
        !            30:    expand_inline_function may be called recursively via expand_expr.  */
        !            31: 
        !            32: struct inline_remap
        !            33: {
        !            34:   /* True if we are doing function integration, false otherwise.
        !            35:      Used to control whether RTX_UNCHANGING bits are copied by
        !            36:      copy_rtx_and_substitute. */
        !            37:   int integrating;
        !            38:   /* Definition of function be inlined.  */
        !            39:   union tree_node *fndecl;
        !            40:   /* Place to put insns needed at start of function.  */
        !            41:   rtx insns_at_start;
        !            42:   /* Mapping from old registers to new registers.
        !            43:      It is allocated and deallocated in `expand_inline_function' */
        !            44:   rtx *reg_map;
        !            45:   /* Mapping from old code-labels to new code-labels.
        !            46:      The first element of this map is label_map[min_labelno].  */
        !            47:   rtx *label_map;
        !            48:   /* Mapping from old insn uid's to copied insns.  The first element
        !            49:    of this map is insn_map[min_insnno]; the last element is
        !            50:    insn_map[max_insnno].  We keep the bounds here for when the map
        !            51:    only covers a partial range of insns (such as loop unrolling or
        !            52:    code replication).  */
        !            53:   rtx *insn_map;
        !            54:   int min_insnno, max_insnno;
        !            55: 
        !            56:   /* Map pseudo reg number in calling function to equivalent constant.  We
        !            57:      cannot in general substitute constants into parameter pseudo registers,
        !            58:      since some machine descriptions (many RISCs) won't always handle
        !            59:      the resulting insns.  So if an incoming parameter has a constant
        !            60:      equivalent, we record it here, and if the resulting insn is
        !            61:      recognizable, we go with it.
        !            62: 
        !            63:      We also use this mechanism to convert references to incoming arguments
        !            64:      and stacked variables.  copy_rtx_and_substitute will replace the virtual
        !            65:      incoming argument and virtual stacked variables registers with new
        !            66:      pseudos that contain pointers into the replacement area allocated for
        !            67:      this inline instance.  These pseudos are then marked as being equivalent
        !            68:      to the appropriate address and substituted if valid.  */
        !            69:   rtx *const_equiv_map;
        !            70:   /* Number of entries in const_equiv_map and const_arg_map.  */
        !            71:   int const_equiv_map_size;
        !            72:   /* This is incremented for each new basic block.
        !            73:      It is used to store in const_age_map to record the domain of validity
        !            74:      of each entry in const_equiv_map.
        !            75:      A value of -1 indicates an entry for a reg which is a parm.
        !            76:      All other values are "positive".  */
        !            77: #define CONST_AGE_PARM (-1)
        !            78:   unsigned int const_age;
        !            79:   /* In parallel with const_equiv_map, record the valid age for each entry.
        !            80:      The entry is invalid if its age is less than const_age.  */
        !            81:   unsigned int *const_age_map;
        !            82:   /* Target of the inline function being expanded, or NULL if none.  */
        !            83:   rtx inline_target;
        !            84:   /* When an insn is being copied by copy_rtx_and_substitute,
        !            85:      this is nonzero if we have copied an ASM_OPERANDS.
        !            86:      In that case, it is the original input-operand vector.  */
        !            87:   rtvec orig_asm_operands_vector;
        !            88:   /* When an insn is being copied by copy_rtx_and_substitute,
        !            89:      this is nonzero if we have copied an ASM_OPERANDS.
        !            90:      In that case, it is the copied input-operand vector.  */
        !            91:   rtvec copy_asm_operands_vector;
        !            92:   /* Likewise, this is the copied constraints vector.  */
        !            93:   rtvec copy_asm_constraints_vector;
        !            94: 
        !            95:   /* The next few fields are used for subst_constants to record the SETs
        !            96:      that it saw.  */
        !            97:   int num_sets;
        !            98:   struct equiv_table
        !            99:     {
        !           100:       rtx dest;
        !           101:       rtx equiv;
        !           102:     }  equiv_sets[MAX_RECOG_OPERANDS];
        !           103:   /* Record the last thing assigned to pc.  This is used for folded 
        !           104:      conditional branch insns.  */
        !           105:   rtx last_pc_value;
        !           106: #ifdef HAVE_cc0
        !           107:   /* Record the last thing assigned to cc0.  */
        !           108:   rtx last_cc0_value;
        !           109: #endif
        !           110: };
        !           111: 
        !           112: /* Return a copy of an rtx (as needed), substituting pseudo-register,
        !           113:    labels, and frame-pointer offsets as necessary.  */
        !           114: extern rtx copy_rtx_and_substitute PROTO((rtx, struct inline_remap *));
        !           115: 
        !           116: extern void try_constants PROTO((rtx, struct inline_remap *));
        !           117: 
        !           118: extern void mark_stores PROTO((rtx, rtx));
        !           119: 
        !           120: /* Unfortunately, we need a global copy of const_equiv map for communication
        !           121:    with a function called from note_stores.  Be *very* careful that this
        !           122:    is used properly in the presence of recursion.  */
        !           123: 
        !           124: extern rtx *global_const_equiv_map;
        !           125: extern int global_const_equiv_map_size;

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.