OSDN Git Service

* config/m68k/m68k.h (REGISTER_NAMES): Prefix each name with
[pf3gnuchains/gcc-fork.git] / gcc / function.h
index 1c6337c..1e5c56f 100644 (file)
@@ -1,6 +1,6 @@
 /* Structure for saving state for a nested function.
    Copyright (C) 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
-   1999, 2000 Free Software Foundation, Inc.
+   1999, 2000, 2003, 2004 Free Software Foundation, Inc.
 
 This file is part of GCC.
 
@@ -19,6 +19,9 @@ 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.  */
 
+#ifndef GCC_FUNCTION_H
+#define GCC_FUNCTION_H
+
 struct var_refs_queue GTY(())
 {
   rtx modified;
@@ -62,7 +65,7 @@ struct emit_status GTY(())
 
   /* The ends of the doubly-linked chain of rtl for the current function.
      Both are reset to null at the start of rtl generation for the function.
-   
+
      start_sequence saves both of these on `sequence_stack' along with
      `sequence_rtl_expr' and then starts a new, nested sequence of insns.  */
   rtx x_first_insn;
@@ -83,10 +86,9 @@ struct emit_status GTY(())
      Reset to 1 for each function compiled.  */
   int x_cur_insn_uid;
 
-  /* Line number and source file of the last line-number NOTE emitted.
+  /* Location the last line-number NOTE emitted.
      This is used to avoid generating duplicates.  */
-  int x_last_linenum;
-  const char *x_last_filename;
+  location_t x_last_location;
 
   /* The length of the regno_pointer_align, regno_decl, and x_regno_reg_rtx
      vectors.  Since these vectors are needed during the expansion phase when
@@ -97,16 +99,15 @@ struct emit_status GTY(())
   /* Indexed by pseudo register number, if nonzero gives the known alignment
      for that pseudo (if REG_POINTER is set in x_regno_reg_rtx).
      Allocated in parallel with x_regno_reg_rtx.  */
-  unsigned char * GTY ((length ("%h.regno_pointer_align_length"))) 
+  unsigned char * GTY ((length ("%h.x_reg_rtx_no")))
     regno_pointer_align;
 
-  /* Indexed by pseudo register number, if nonzero gives the decl
-     corresponding to that register.  */
-  tree * GTY ((length ("%h.regno_pointer_align_length"))) regno_decl;
-
   /* Indexed by pseudo register number, gives the rtx for that pseudo.
-     Allocated in parallel with regno_pointer_align.  */
-  rtx * GTY ((length ("%h.regno_pointer_align_length"))) x_regno_reg_rtx;
+     Allocated in parallel with regno_pointer_align.
+
+     Note MEM expressions can appear in this array due to the actions
+     of put_var_into_stack.  */
+  rtx * GTY ((length ("%h.x_reg_rtx_no"))) x_regno_reg_rtx;
 };
 
 /* For backward compatibility... eventually these should all go away.  */
@@ -116,7 +117,6 @@ struct emit_status GTY(())
 #define seq_stack (cfun->emit->sequence_stack)
 
 #define REGNO_POINTER_ALIGN(REGNO) (cfun->emit->regno_pointer_align[REGNO])
-#define REGNO_DECL(REGNO) (cfun->emit->regno_decl[REGNO])
 
 struct expr_status GTY(())
 {
@@ -135,7 +135,7 @@ struct expr_status GTY(())
      since code outside the conditional won't know whether or not the
      arguments need to be popped.)
 
-     When INHIBIT_DEFER_POP is non-zero, however, the compiler does not
+     When INHIBIT_DEFER_POP is nonzero, however, the compiler does not
      attempt to defer pops.  Instead, the stack is popped immediately
      after each call.  Rather then setting this variable directly, use
      NO_DEFER_POP and OK_DEFER_POP.  */
@@ -183,9 +183,6 @@ struct function GTY(())
 
   /* For function.c.  */
 
-  /* Name of this function.  */
-  const char *name;
-
   /* Points to the FUNCTION_DECL of this function.  */
   tree decl;
 
@@ -219,7 +216,7 @@ struct function GTY(())
      used for the current function's args.  */
   CUMULATIVE_ARGS args_info;
 
-  /* If non-zero, an RTL expression for the location at which the current 
+  /* If nonzero, an RTL expression for the location at which the current
      function returns its result.  If the current function returns its
      result in a register, current_function_return_rtx will always be
      the hard register containing the result.  */
@@ -270,6 +267,15 @@ struct function GTY(())
      on machines which require execution of the epilogue on all returns.  */
   rtx x_return_label;
 
+  /* Label that will go on the end of function epilogue.
+     Jumping to this label serves as a "naked return" instruction
+     on machines which require execution of the epilogue on all returns.  */
+  rtx x_naked_return_label;
+
+  /* Label and register for unswitching computed gotos.  */
+  rtx computed_goto_common_label;
+  rtx computed_goto_common_reg;
+
   /* List (chain of EXPR_LISTs) of pseudo-regs of SAVE_EXPRs.
      So we can mark them all live at the end of the function, if nonopt.  */
   rtx x_save_expr_regs;
@@ -349,7 +355,7 @@ struct function GTY(())
      until no longer needed.  CLEANUP_POINT_EXPRs define the lifetime
      of TARGET_EXPRs.  */
   int x_target_temp_slot_level;
-  
+
   /* This slot is initialized as 0 and is added to
      during the nested function.  */
   struct var_refs_queue *fixup_var_refs_queue;
@@ -376,6 +382,8 @@ struct function GTY(())
   int stack_alignment_needed;
   /* Preferred alignment of the end of stack frame.  */
   int preferred_stack_boundary;
+  /* Set when the call to function itself has been emit.  */
+  bool recursive_call_emit;
 
   /* Language-specific code can use this to store whatever it likes.  */
   struct language_function * language;
@@ -386,6 +394,23 @@ struct function GTY(())
      delay list for them is recorded here.  */
   rtx epilogue_delay_list;
 
+  /* How commonly executed the function is.  Initialized during branch
+     probabilities pass.  */
+  enum function_frequency {
+    /* This function most likely won't be executed at all.
+       (set only when profile feedback is available).  */
+    FUNCTION_FREQUENCY_UNLIKELY_EXECUTED,
+    /* The default value.  */
+    FUNCTION_FREQUENCY_NORMAL,
+    /* Optimize this function hard
+       (set only when profile feedback is available).  */
+    FUNCTION_FREQUENCY_HOT
+  } function_frequency;
+
+  /* Maximal number of entities in the single jumptable.  Used to estimate
+     final flowgraph size.  */
+  int max_jumptable_ents;
+
   /* Collected bit flags.  */
 
   /* Nonzero if function being compiled needs to be given an address
@@ -395,7 +420,7 @@ struct function GTY(())
   /* Nonzero if function being compiled needs to
      return the address of where it has put a structure value.  */
   unsigned int returns_pcc_struct : 1;
-  
+
   /* Nonzero if the current function returns a pointer type.  */
   unsigned int returns_pointer : 1;
 
@@ -407,7 +432,7 @@ struct function GTY(())
 
   /* Nonzero if function being compiled can call longjmp.  */
   unsigned int calls_longjmp : 1;
-  
+
   /* Nonzero if function being compiled can call alloca,
      either as a subroutine or builtin.  */
   unsigned int calls_alloca : 1;
@@ -415,6 +440,9 @@ struct function GTY(())
   /* Nonzero if the function calls __builtin_eh_return.  */
   unsigned int calls_eh_return : 1;
 
+  /* Nonzero if the function calls __builtin_constant_p.  */
+  unsigned int calls_constant_p : 1;
+
   /* Nonzero if function being compiled receives nonlocal gotos
      from nested functions.  */
   unsigned int has_nonlocal_label : 1;
@@ -429,18 +457,23 @@ struct function GTY(())
   /* Nonzero if the function being compiled issues a computed jump.  */
   unsigned int has_computed_jump : 1;
 
-  /* Nonzero if the current function is a thunk (a lightweight function that
-     just adjusts one of its arguments and forwards to another function), so
-     we should try to cut corners where we can.  */
+  /* Nonzero if the current function is a thunk, i.e., a lightweight
+     function implemented by the output_mi_thunk hook) that just
+     adjusts one of its arguments and forwards to another
+     function.  */
   unsigned int is_thunk : 1;
 
+  /* This bit is used by the exception handling logic.  It is set if all
+     calls (if any) are sibling calls.  Such functions do not have to
+     have EH tables generated, as they cannot throw.  A call to such a
+     function, however, should be treated as throwing if any of its callees
+     can throw.  */
+  unsigned int all_throwers_are_sibcalls : 1;
+
   /* Nonzero if instrumentation calls for function entry and exit should be
      generated.  */
   unsigned int instrument_entry_exit : 1;
 
-  /* Nonzero if arc profiling should be done for the function.  */
-  unsigned int arc_profile : 1;
-
   /* Nonzero if profiling code should be generated.  */
   unsigned int profile : 1;
 
@@ -448,12 +481,7 @@ struct function GTY(())
      function.  */
   unsigned int limit_stack : 1;
 
-  /* Nonzero if current function uses varargs.h or equivalent.
-     Zero for functions that use stdarg.h.  */
-  unsigned int varargs : 1;
-
-  /* Nonzero if current function uses stdarg.h or equivalent.
-     Zero for functions that use varargs.h.  */
+  /* Nonzero if current function uses stdarg.h or equivalent.  */
   unsigned int stdarg : 1;
 
   /* Nonzero if this function is being processed in function-at-a-time
@@ -480,31 +508,30 @@ struct function GTY(())
   /* Nonzero if the current function needs an lsda for exception handling.  */
   unsigned int uses_eh_lsda : 1;
 
-  /* Nonzero if code to initialize arg_pointer_save_area has been emited.  */
+  /* Nonzero if code to initialize arg_pointer_save_area has been emitted.  */
   unsigned int arg_pointer_save_area_init : 1;
 
-  /* How commonly executed the function is.  Initialized during branch
-     probabilities pass.  */
-  enum function_frequency {
-    /* This function most likely won't be executed at all.
-       (set only when profile feedback is available).  */
-    FUNCTION_FREQUENCY_UNLIKELY_EXECUTED,
-    /* The default value.  */
-    FUNCTION_FREQUENCY_NORMAL,
-    /* Optimize this function hard
-       (set only when profile feedback is available).  */
-    FUNCTION_FREQUENCY_HOT
-  } function_frequency;
+  /* Flag for use by ther rtl inliner, to tell if the function has been
+     processed at least once.  */
+  unsigned int rtl_inline_init : 1;
+
+  /* Nonzero if the rtl inliner has saved the function for inlining.  */
+  unsigned int saved_for_inline : 1;
 };
 
 /* The function currently being compiled.  */
 extern GTY(()) struct function *cfun;
 
+/* Pointer to chain of `struct function' for containing functions.  */
+extern GTY(()) struct function *outer_function_chain;
+
 /* Nonzero if we've already converted virtual regs to hard regs.  */
 extern int virtuals_instantiated;
 
+/* Nonzero if at least one trampoline has been created.  */
+extern int trampolines_created;
+
 /* For backward compatibility... eventually these should all go away.  */
-#define current_function_name (cfun->name)
 #define current_function_pops_args (cfun->pops_args)
 #define current_function_returns_struct (cfun->returns_struct)
 #define current_function_returns_pcc_struct (cfun->returns_pcc_struct)
@@ -514,6 +541,7 @@ extern int virtuals_instantiated;
 #define current_function_calls_alloca (cfun->calls_alloca)
 #define current_function_calls_longjmp (cfun->calls_longjmp)
 #define current_function_calls_eh_return (cfun->calls_eh_return)
+#define current_function_calls_constant_p (cfun->calls_constant_p)
 #define current_function_has_computed_jump (cfun->has_computed_jump)
 #define current_function_contains_functions (cfun->contains_functions)
 #define current_function_is_thunk (cfun->is_thunk)
@@ -522,7 +550,6 @@ extern int virtuals_instantiated;
 #define current_function_pretend_args_size (cfun->pretend_args_size)
 #define current_function_outgoing_args_size (cfun->outgoing_args_size)
 #define current_function_arg_offset_rtx (cfun->arg_offset_rtx)
-#define current_function_varargs (cfun->varargs)
 #define current_function_stdarg (cfun->stdarg)
 #define current_function_internal_arg_pointer (cfun->internal_arg_pointer)
 #define current_function_return_rtx (cfun->return_rtx)
@@ -541,6 +568,7 @@ extern int virtuals_instantiated;
 #define parm_reg_stack_loc (cfun->x_parm_reg_stack_loc)
 #define cleanup_label (cfun->x_cleanup_label)
 #define return_label (cfun->x_return_label)
+#define naked_return_label (cfun->x_naked_return_label)
 #define save_expr_regs (cfun->x_save_expr_regs)
 #define stack_slot_list (cfun->x_stack_slot_list)
 #define parm_birth_insn (cfun->x_parm_birth_insn)
@@ -567,47 +595,50 @@ extern tree inline_function_decl;
 
 /* Given a function decl for a containing function,
    return the `struct function' for it.  */
-struct function *find_function_data PARAMS ((tree));
+struct function *find_function_data (tree);
 
 /* Set NOTE_BLOCK for each block note in the current function.  */
-extern void identify_blocks PARAMS ((void));
+extern void identify_blocks (void);
 
 /* Identify BLOCKs referenced by more than one NOTE_INSN_BLOCK_{BEG,END},
    and create duplicate blocks.  */
-extern void reorder_blocks PARAMS ((void));
+extern void reorder_blocks (void);
 
 /* Set BLOCK_NUMBER for all the blocks in FN.  */
-extern void number_blocks PARAMS ((tree));
+extern void number_blocks (tree);
 
 /* Return size needed for stack frame based on slots so far allocated.
    This size counts from zero.  It is not rounded to STACK_BOUNDARY;
    the caller may have to do that.  */
-extern HOST_WIDE_INT get_frame_size    PARAMS ((void));
+extern HOST_WIDE_INT get_frame_size (void);
 /* Likewise, but for a different than the current function.  */
-extern HOST_WIDE_INT get_func_frame_size       PARAMS ((struct function *));
+extern HOST_WIDE_INT get_func_frame_size (struct function *);
 
 /* A pointer to a function to create target specific, per-function
    data structures.  */
-extern struct machine_function * (*init_machine_status)        PARAMS ((void));
+extern struct machine_function * (*init_machine_status) (void);
 
 /* Save and restore status information for a nested function.  */
-extern void restore_emit_status                PARAMS ((struct function *));
-extern void free_after_parsing         PARAMS ((struct function *));
-extern void free_after_compilation     PARAMS ((struct function *));
+extern void restore_emit_status (struct function *);
+extern void free_after_parsing (struct function *);
+extern void free_after_compilation (struct function *);
 
-extern void init_varasm_status         PARAMS ((struct function *));
-
-extern rtx get_first_block_beg         PARAMS ((void));
+extern void init_varasm_status (struct function *);
 
 #ifdef RTX_CODE
-extern void diddle_return_value                PARAMS ((void (*)(rtx, void*), void*));
-extern void clobber_return_register    PARAMS ((void));
-extern void use_return_register                PARAMS ((void));
+extern void diddle_return_value (void (*)(rtx, void*), void*);
+extern void clobber_return_register (void);
+extern void use_return_register (void);
 #endif
 
-extern rtx get_arg_pointer_save_area   PARAMS ((struct function *));
+extern rtx get_arg_pointer_save_area (struct function *);
+
+extern void init_virtual_regs (struct emit_status *);
 
-extern void init_virtual_regs          PARAMS ((struct emit_status *));
+/* Returns the name of the current function.  */
+extern const char *current_function_name (void);
 
 /* Called once, at initialization, to initialize function.c.  */
-extern void init_function_once          PARAMS ((void));
+extern void init_function_once (void);
+
+#endif  /* GCC_FUNCTION_H */