Annotation of gcc/integrate.h, revision 1.1.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:   /* Definition of function be inlined.  */
                     35:   union tree_node *fndecl;
                     36:   /* Place to put insns needed at start of function.  */
                     37:   rtx insns_at_start;
                     38:   /* Mapping from old registers to new registers.
                     39:      It is allocated and deallocated in `expand_inline_function' */
                     40:   rtx *reg_map;
                     41:   /* Mapping from old code-labels to new code-labels.
                     42:      The first element of this map is label_map[min_labelno].  */
                     43:   rtx *label_map;
                     44:   /* Mapping from old insn uid's to copied insns.  The first element
                     45:    of this map is insn_map[min_insnno]; the last element is
                     46:    insn_map[max_insnno].  We keep the bounds here for when the map
                     47:    only covers a partial range of insns (such as loop unrolling or
                     48:    code replication).  */
                     49:   rtx *insn_map;
                     50:   int min_insnno, max_insnno;
                     51: 
                     52:   /* Map pseudo reg number in calling function to equivalent constant.  We
                     53:      cannot in general substitute constants into parameter pseudo registers,
                     54:      since some machine descriptions (many RISCs) won't always handle
                     55:      the resulting insns.  So if an incoming parameter has a constant
                     56:      equivalent, we record it here, and if the resulting insn is
                     57:      recognizable, we go with it.
                     58: 
                     59:      We also use this mechanism to convert references to incoming arguments
                     60:      and stacked variables.  copy_rtx_and_substitute will replace the virtual
                     61:      incoming argument and virtual stacked variables registers with new
                     62:      pseudos that contain pointers into the replacement area allocated for
                     63:      this inline instance.  These pseudos are then marked as being equivalent
                     64:      to the appropriate address and substituted if valid.  */
                     65:   rtx *const_equiv_map;
                     66:   /* Number of entries in const_equiv_map and const_arg_map.  */
                     67:   int const_equiv_map_size;
                     68:   /* This is incremented for each new basic block.
                     69:      It is used to store in const_age_map to record the domain of validity
                     70:      of each entry in const_equiv_map.
                     71:      A value of -1 indicates an entry for a reg which is a parm.
                     72:      All other values are "positive".  */
                     73: #define CONST_AGE_PARM (-1)
                     74:   unsigned int const_age;
                     75:   /* In parallel with const_equiv_map, record the valid age for each entry.
                     76:      The entry is invalid if its age is less than const_age.  */
                     77:   unsigned int *const_age_map;
                     78:   /* Target of the inline function being expanded, or NULL if none.  */
                     79:   rtx inline_target;
                     80:   /* When an insn is being copied by copy_rtx_and_substitute,
                     81:      this is nonzero if we have copied an ASM_OPERANDS.
                     82:      In that case, it is the original input-operand vector.  */
                     83:   rtvec orig_asm_operands_vector;
                     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 copied input-operand vector.  */
                     87:   rtvec copy_asm_operands_vector;
                     88:   /* Likewise, this is the copied constraints vector.  */
                     89:   rtvec copy_asm_constraints_vector;
                     90: 
                     91:   /* The next few fields are used for subst_constants to record the SETs
                     92:      that it saw.  */
                     93:   int num_sets;
                     94:   struct equiv_table
                     95:     {
                     96:       rtx dest;
                     97:       rtx equiv;
                     98:     }  equiv_sets[MAX_RECOG_OPERANDS];
                     99:   /* Record the last thing assigned to pc.  This is used for folded 
                    100:      conditional branch insns.  */
                    101:   rtx last_pc_value;
                    102: #ifdef HAVE_cc0
                    103:   /* Record the last thing assigned to cc0.  */
                    104:   rtx last_cc0_value;
                    105: #endif
                    106: };
                    107: 
                    108: /* Return a copy of an rtx (as needed), substituting pseudo-register,
                    109:    labels, and frame-pointer offsets as necessary.  */
                    110: extern rtx copy_rtx_and_substitute ();
                    111: 
                    112: extern void try_constants ();
                    113: 
                    114: extern void mark_stores ();
                    115: 
                    116: /* We do some simple constant folding optimization.  This optimization
                    117:    really exists primarily to save time inlining a function.  It
                    118:    also helps users who ask for inline functions without -O.  */
                    119: extern rtx try_fold_condition ();
                    120: 
                    121: extern rtx *global_const_equiv_map;

unix.superglobalmegacorp.com

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