OSDN Git Service

2004-08-04 Andrew Haley <aph@redhat.com>
[pf3gnuchains/gcc-fork.git] / gcc / target.h
index c122adb..44562da 100644 (file)
@@ -44,7 +44,11 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
    to gradually reduce the amount of conditional compilation that is
    scattered throughout GCC.  */
 
+#ifndef GCC_TARGET_H
+#define GCC_TARGET_H
+
 #include "tm.h"
+#include "insn-modes.h"
 
 struct gcc_target
 {
@@ -76,9 +80,13 @@ struct gcc_target
 
     /* Output code that will emit a label for unwind info, if this
        target requires such labels.  Second argument is the decl the
-       unwind info is associated with, third is is a boolean: true if
-       this is only a placeholder for an omitted FDE. */
-    void (* unwind_label ) (FILE *, tree, int);
+       unwind info is associated with, third is a boolean: true if
+       this is for exception handling, fourth is a boolean: true if
+       this is only a placeholder for an omitted FDE.  */
+    void (* unwind_label) (FILE *, tree, int, int);
+
+    /* Emit any directives required to unwind this instruction.  */
+    void (* unwind_emit) (FILE *, rtx);
 
     /* Output an internal label.  */
     void (* internal_label) (FILE *, const char *, unsigned long);
@@ -205,12 +213,6 @@ struct gcc_target
        by two parameter values (head and tail correspondingly).  */
     void (* dependencies_evaluation_hook) (rtx, rtx);
 
-    /* The following member value is a pointer to a function returning
-       nonzero if we should use DFA based scheduling.  The default is
-       to use the old pipeline scheduler.  */
-    int (* use_dfa_pipeline_interface) (void);
-    /* The values of all the following members are used only for the
-       DFA based scheduler: */
     /* The values of the following four members are pointers to
        functions used to simplify the automaton descriptions.
        dfa_pre_cycle_insn and dfa_post_cycle_insn give functions
@@ -226,20 +228,23 @@ struct gcc_target
     rtx (* dfa_pre_cycle_insn) (void);
     void (* init_dfa_post_cycle_insn) (void);
     rtx (* dfa_post_cycle_insn) (void);
+
     /* The following member value is a pointer to a function returning value
        which defines how many insns in queue `ready' will we try for
-       multi-pass scheduling.  if the member value is nonzero and the
+       multi-pass scheduling.  If the member value is nonzero and the
        function returns positive value, the DFA based scheduler will make
        multi-pass scheduling for the first cycle.  In other words, we will
        try to choose ready insn which permits to start maximum number of
        insns on the same cycle.  */
     int (* first_cycle_multipass_dfa_lookahead) (void);
+
     /* The following member value is pointer to a function controlling
        what insns from the ready insn queue will be considered for the
        multipass insn scheduling.  If the hook returns zero for insn
        passed as the parameter, the insn will be not chosen to be
        issued.  */
     int (* first_cycle_multipass_dfa_lookahead_guard) (rtx);
+
     /* The following member value is pointer to a function called by
        the insn scheduler before issuing insn passed as the third
        parameter on given cycle.  If the hook returns nonzero, the
@@ -253,18 +258,7 @@ struct gcc_target
        the previous insn has been issued and the current processor
        cycle.  */
     int (* dfa_new_cycle) (FILE *, int, rtx, int, int, int *);
-    /* The values of the following members are pointers to functions
-       used to improve the first cycle multipass scheduling by
-       inserting nop insns.  dfa_scheduler_bubble gives a function
-       returning a nop insn with given index.  The indexes start with
-       zero.  The function should return NULL if there are no more nop
-       insns with indexes greater than given index.  To initialize the
-       nop insn the function given by member
-       init_dfa_scheduler_bubbles is used.  The default values of the
-       members result in not inserting nop insns during the multipass
-       scheduling.  */
-    void (* init_dfa_bubbles) (void);
-    rtx (* dfa_bubble) (int);
+
     /* The following member value is a pointer to a function called
        by the insn scheduler.  It should return true if there exists a
        dependence which is considered costly by the target, between 
@@ -307,6 +301,9 @@ struct gcc_target
      Microsoft Visual C++ bitfield layout rules.  */
   bool (* ms_bitfield_layout_p) (tree record_type);
 
+  /* Return true if anonymous bitfields affect structure alignment.  */
+  bool (* align_anon_bitfield) (void);
+
   /* Set up target-specific built-in functions.  */
   void (* init_builtins) (void);
 
@@ -418,6 +415,10 @@ struct gcc_target
   /* Create the __builtin_va_list type.  */
   tree (* build_builtin_va_list) (void);
 
+  /* Gimplifies a VA_ARG_EXPR.  */
+  tree (* gimplify_va_arg_expr) (tree valist, tree type, tree *pre_p,
+                                tree *post_p);
+
   /* Validity-checking routines for PCH files, target-specific.
      get_pch_validity returns a pointer to the data to be stored,
      and stores the size in its argument.  pch_valid_p gets the same
@@ -448,6 +449,13 @@ struct gcc_target
     rtx (*struct_value_rtx) (tree fndecl, int incoming);
     bool (*return_in_memory) (tree type, tree fndecl);
     bool (*return_in_msb) (tree type);
+
+    /* Return true if a parameter must be passed by reference.  TYPE may
+       be null if this is a libcall.  CA may be null if this query is
+       from __builtin_va_arg.  */
+    bool (*pass_by_reference) (CUMULATIVE_ARGS *ca, enum machine_mode mode,
+                              tree type, bool named_arg);
+
     rtx (*expand_builtin_saveregs) (void);
     /* Returns pretend_argument_size.  */
     void (*setup_incoming_varargs) (CUMULATIVE_ARGS *ca, enum machine_mode mode,
@@ -462,8 +470,32 @@ struct gcc_target
     /* Given a complex type T, return true if a parameter of type T
        should be passed as two scalars.  */
     bool (* split_complex_arg) (tree type);
+
+    /* Return true if type T, mode MODE, may not be passed in registers,
+       but must be passed on the stack.  */
+    /* ??? This predicate should be applied strictly after pass-by-reference.
+       Need audit to verify that this is the case.  */
+    bool (* must_pass_in_stack) (enum machine_mode mode, tree t);
   } calls;
 
+  /* Functions specific to the C++ frontend.  */
+  struct cxx {
+    /* Return the integer type used for guard variables.  */
+    tree (*guard_type) (void);
+    /* Return true if only the low bit of the guard should be tested.  */
+    bool (*guard_mask_bit) (void);
+    /* Returns the size of the array cookie for an array of type.  */
+    tree (*get_cookie_size) (tree);
+    /* Returns true if the element size should be stored in the
+       array cookie.  */
+    bool (*cookie_has_size) (void);
+    /* Allows backends to perform additional processing when
+       deciding if a class should be exported or imported.  */
+    int (*import_export_class) (tree, int);
+    /* Returns true if constructors and destructors return "this".  */
+    bool (*cdtor_returns_this) (void);
+  } cxx;
+
   /* Leave the boolean fields at the end.  */
 
   /* True if arbitrary sections are supported.  */
@@ -490,7 +522,20 @@ struct gcc_target
      at the beginning of assembly output.  */
   bool file_start_file_directive;
 
+  /* True if #pragma redefine_extname is to be supported.  */
+  bool handle_pragma_redefine_extname;
+
+  /* True if #pragma extern_prefix is to be supported.  */
+  bool handle_pragma_extern_prefix;
+
+  /* True if the RTL prologue and epilogue should be expanded after all
+     passes that modify the instructions (and not merely reorder them)
+     have been run.  */
+  bool late_rtl_prologue_epilogue;
+
   /* Leave the boolean fields at the end.  */
 };
 
 extern struct gcc_target targetm;
+
+#endif /* GCC_TARGET_H */