gcse.c (target.h): Include.
[platform/upstream/gcc.git] / gcc / function.h
index 94f4642..de3a46a 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, 2003, 2004, 2005, 2006, 2007, 2008
+   1999, 2000, 2003, 2004, 2005, 2006, 2007, 2008, 2009
    Free Software Foundation, Inc.
 
 This file is part of GCC.
@@ -31,16 +31,14 @@ along with GCC; see the file COPYING3.  If not see
    The main insn-chain is saved in the last element of the chain,
    unless the chain is empty.  */
 
-struct sequence_stack GTY(())
-{
+struct GTY(()) sequence_stack {
   /* First and last insns in the chain of the saved sequence.  */
   rtx first;
   rtx last;
   struct sequence_stack *next;
 };
 \f
-struct emit_status GTY(())
-{
+struct GTY(()) emit_status {
   /* This is reset to LAST_VIRTUAL_REGISTER + 1 at the start of each function.
      After rtl generation, it is 1 plus the largest register number used.  */
   int x_reg_rtx_no;
@@ -96,8 +94,7 @@ extern GTY ((length ("crtl->emit.x_reg_rtx_no"))) rtx * regno_reg_rtx;
 
 #define REGNO_POINTER_ALIGN(REGNO) (crtl->emit.regno_pointer_align[REGNO])
 
-struct expr_status GTY(())
-{
+struct GTY(()) expr_status {
   /* Number of units that we should eventually pop off the stack.
      These are the arguments to function calls that have already returned.  */
   int x_pending_stack_adjust;
@@ -137,13 +134,12 @@ struct expr_status GTY(())
   rtx x_forced_labels;
 };
 
-typedef struct call_site_record *call_site_record;
+typedef struct call_site_record_d *call_site_record;
 DEF_VEC_P(call_site_record);
 DEF_VEC_ALLOC_P(call_site_record, gc);
 
 /* RTL representation of exception handling.  */
-struct rtl_eh GTY(())
-{
+struct GTY(()) rtl_eh {
   rtx filter;
   rtx exc_ptr;
 
@@ -156,8 +152,6 @@ struct rtl_eh GTY(())
   rtx sjlj_fc;
   rtx sjlj_exit_after;
 
-  htab_t GTY ((param_is (struct ehl_map_entry))) exception_handler_label_map;
-
   VEC(tree,gc) *ttype_data;
   varray_type ehspec_data;
   varray_type action_record_data;
@@ -175,12 +169,12 @@ struct rtl_eh GTY(())
 struct gimple_df;
 struct temp_slot;
 typedef struct temp_slot *temp_slot_p;
-struct call_site_record;
+struct call_site_record_d;
 
 DEF_VEC_P(temp_slot_p);
 DEF_VEC_ALLOC_P(temp_slot_p,gc);
-struct ipa_opt_pass;
-typedef struct ipa_opt_pass *ipa_opt_pass;
+struct ipa_opt_pass_d;
+typedef struct ipa_opt_pass_d *ipa_opt_pass;
 
 DEF_VEC_P(ipa_opt_pass);
 DEF_VEC_ALLOC_P(ipa_opt_pass,heap);
@@ -196,8 +190,7 @@ enum function_frequency {
   FUNCTION_FREQUENCY_HOT
 };
 
-struct varasm_status GTY(())
-{
+struct GTY(()) varasm_status {
   /* If we're using a per-function constant pool, this is it.  */
   struct rtx_constant_pool *pool;
 
@@ -207,8 +200,7 @@ struct varasm_status GTY(())
 };
 
 /* Information mainlined about RTL representation of incoming arguments.  */
-struct incoming_args GTY(())
-{
+struct GTY(()) incoming_args {
   /* Number of bytes of args popped by function being compiled on its return.
      Zero if no bytes are to be popped.
      May affect compilation of return insn or of function epilogue.  */
@@ -237,8 +229,7 @@ struct incoming_args GTY(())
 };
 
 /* Data for function partitioning.  */
-struct function_subsections GTY(())
-{
+struct GTY(()) function_subsections {
   /* Assembly labels for the hot and cold text sections, to
      be used by debugger functions for determining the size of text
      sections.  */
@@ -255,8 +246,7 @@ struct function_subsections GTY(())
 };
 
 /* Datastructures maintained for currently processed function in RTL form.  */
-struct rtl_data GTY(())
-{
+struct GTY(()) rtl_data {
   struct expr_status expr;
   struct emit_status emit;
   struct varasm_status varasm;
@@ -311,6 +301,9 @@ struct rtl_data GTY(())
      needed by inner routines.  */
   rtx x_arg_pointer_save_area;
 
+  /* Dynamic Realign Argument Pointer used for realigning stack.  */
+  rtx drap_reg;
+
   /* Offset to end of allocated area of stack frame.
      If stack grows down, this is the address of the last stack slot allocated.
      If stack grows up, this is the address for the next slot.  */
@@ -328,12 +321,29 @@ struct rtl_data GTY(())
   /* Current nesting level for temporaries.  */
   int x_temp_slot_level;
 
-  /* The largest alignment of slot allocated on the stack.  */
+  /* The largest alignment needed on the stack, including requirement
+     for outgoing stack alignment.  */
   unsigned int stack_alignment_needed;
 
-  /* Preferred alignment of the end of stack frame.  */
+  /* Preferred alignment of the end of stack frame, which is preferred
+     to call other functions.  */
   unsigned int preferred_stack_boundary;
 
+  /* The minimum alignment of parameter stack.  */
+  unsigned int parm_stack_boundary;
+
+  /* The largest alignment of slot allocated on the stack.  */
+  unsigned int max_used_stack_slot_alignment;
+
+  /* The stack alignment estimated before reload, with consideration of
+     following factors:
+     1. Alignment of local stack variables (max_used_stack_slot_alignment)
+     2. Alignment requirement to call other functions 
+        (preferred_stack_boundary)
+     3. Alignment of non-local stack variables but might be spilled in
+        local stack.  */
+  unsigned int stack_alignment_estimated;
+
   /* For reorg.  */
 
   /* If some insns can be deferred to the delay slots of the epilogue, the
@@ -358,12 +368,6 @@ struct rtl_data GTY(())
   /* Nonzero if function being compiled has an asm statement.  */
   bool has_asm_statement;
 
-  /* 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.  */
-  bool is_thunk;
-
   /* 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
@@ -393,13 +397,45 @@ struct rtl_data GTY(())
   /* Nonzero if code to initialize arg_pointer_save_area has been emitted.  */
   bool arg_pointer_save_area_init;
 
-  /* Nonzero means current function must be given a frame pointer.
-     Set in stmt.c if anything is allocated on the stack there.
-     Set in reload1.c if anything is allocated on the stack there.  */
+  /* Nonzero if current function must be given a frame pointer.
+     Set in global.c if anything is allocated on the stack there.  */
   bool frame_pointer_needed;
 
   /* When set, expand should optimize for speed.  */
   bool maybe_hot_insn_p;
+
+  /* Nonzero if function stack realignment is needed.  This flag may be
+     set twice: before and after reload.  It is set before reload wrt
+     stack alignment estimation before reload.  It will be changed after
+     reload if by then criteria of stack realignment is different.
+     The value set after reload is the accurate one and is finalized.  */
+  bool stack_realign_needed;
+
+  /* Nonzero if function stack realignment is tried.  This flag is set
+     only once before reload.  It affects register elimination.  This
+     is used to generate DWARF debug info for stack variables.  */
+  bool stack_realign_tried;
+
+  /* Nonzero if function being compiled needs dynamic realigned
+     argument pointer (drap) if stack needs realigning.  */
+  bool need_drap;
+
+  /* Nonzero if function stack realignment estimation is done, namely
+     stack_realign_needed flag has been set before reload wrt estimated
+     stack alignment info.  */
+  bool stack_realign_processed;
+
+  /* Nonzero if function stack realignment has been finalized, namely
+     stack_realign_needed flag has been set and finalized after reload.  */
+  bool stack_realign_finalized;
+
+  /* True if dbr_schedule has already been called for this function.  */
+  bool dbr_scheduled_p;
+
+  /* True if current function can not throw.  Unlike
+     TREE_NOTHROW (current_function_decl) it is set even for overwritable
+     function where currently compiled version of it is nothrow.  */
+  bool nothrow;
 };
 
 #define return_label (crtl->x_return_label)
@@ -414,6 +450,8 @@ struct rtl_data GTY(())
 #define temp_slot_level (crtl->x_temp_slot_level)
 #define nonlocal_goto_handler_labels (crtl->x_nonlocal_goto_handler_labels)
 #define frame_pointer_needed (crtl->frame_pointer_needed)
+#define stack_realign_fp (crtl->stack_realign_needed && !crtl->need_drap)
+#define stack_realign_drap (crtl->stack_realign_needed && crtl->need_drap)
 
 extern GTY(()) struct rtl_data x_rtl;
 
@@ -425,8 +463,7 @@ extern GTY(()) struct rtl_data x_rtl;
 /* This structure can save all the important global and static variables
    describing the status of the current function.  */
 
-struct function GTY(())
-{
+struct GTY(()) function {
   struct eh_status *eh;
 
   /* The control flow graph for this function.  */
@@ -449,9 +486,6 @@ struct function GTY(())
   /* Points to the FUNCTION_DECL of this function.  */
   tree decl;
 
-  /* Function containing this function, if any.  */
-  struct function *outer;
-
   /* A PARM_DECL that should contain the static chain for this function.
      It will be initialized at the beginning of the function.  */
   tree static_chain_decl;
@@ -461,9 +495,6 @@ struct function GTY(())
      pointer.  */
   tree nonlocal_goto_save_area;
 
-  /* Function sequence number for profiling, debugging, etc.  */
-  int funcdef_no;
-
   /* List of function local variables, functions, types and constants.  */
   tree local_decls;
 
@@ -481,6 +512,12 @@ struct function GTY(())
   /* Last statement uid.  */
   int last_stmt_uid;
 
+  /* Function sequence number for profiling, debugging, etc.  */
+  int funcdef_no;
+
+  /* Line number of the start of the function for debugging purposes.  */
+  location_t function_start_locus;
+
   /* Line number of the end of the function.  */
   location_t function_end_locus;
 
@@ -532,6 +569,7 @@ struct function GTY(())
   unsigned int dont_save_pending_sizes_p : 1;
 
   unsigned int after_inlining : 1;
+  unsigned int always_inline_functions_inlined : 1;
 
   /* Fields below this point are not set for abstract functions; see
      allocate_struct_function.  */
@@ -546,6 +584,16 @@ struct function GTY(())
 
   /* Nonzero if pass_tree_profile was run on this function.  */
   unsigned int after_tree_profile : 1;
+
+  /* Nonzero if this function has local DECL_HARD_REGISTER variables.
+     In this case code motion has to be done more carefully.  */
+  unsigned int has_local_explicit_reg_vars : 1;
+
+  /* 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;
 };
 
 /* If va_list_[gf]pr_size is set to this, it means we don't know how
@@ -561,9 +609,6 @@ extern GTY(()) struct function *cfun;
    push_cfun or set_cfun.  */
 #define cfun (cfun + 0)
 
-/* 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;
 
@@ -584,10 +629,6 @@ extern void instantiate_decl_rtl (rtx x);
 #define n_bbs_in_dom_tree (cfun->cfg->x_n_bbs_in_dom_tree)
 #define VALUE_HISTOGRAMS(fun) (fun)->value_histograms
 
-/* Given a function decl for a containing function,
-   return the `struct function' for it.  */
-struct function *find_function_data (tree);
-
 /* Identify BLOCKs referenced by more than one NOTE_INSN_BLOCK_{BEG,END},
    and create duplicate blocks.  */
 extern void reorder_blocks (void);
@@ -627,8 +668,6 @@ extern rtx get_arg_pointer_save_area (void);
 
 /* Returns the name of the current function.  */
 extern const char *current_function_name (void);
-/* Returns the assembler name (raw, mangled) of the current function.  */
-extern const char *current_function_assembler_name (void);
 
 extern void do_warn_unused_parameter (tree);