]> gcc.gnu.org Git - gcc.git/blobdiff - gcc/target.h
hooks.c (hook_tree_bool_false): New.
[gcc.git] / gcc / target.h
index 08d0568573c33211e86aafbf769808285ec8c918..8b500bd15c64820d1504dff3e5a1c8fea1b76279 100644 (file)
@@ -1,5 +1,5 @@
 /* Data structure definitions for a generic GCC target.
-   Copyright (C) 2001 Free Software Foundation, Inc.
+   Copyright (C) 2001, 2002 Free Software Foundation, Inc.
 
 This program is free software; you can redistribute it and/or modify it
 under the terms of the GNU General Public License as published by the
@@ -20,7 +20,7 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  what you give them.   Help stamp out software-hoarding!  */
 
 /* This file contains a data structure that describes a GCC target.
-   At present, it is incomplete, but in future it should grow to
+   At present it is incomplete, but in future it should grow to
    contain most or all target machine and target O/S specific
    information.
 
@@ -33,36 +33,211 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
    includes target.h and target-def.h, and overrides any inappropriate
    defaults by undefining the relevant macro and defining a suitable
    replacement.  That file should then contain the definition of
-   "target" like so:
+   "targetm" like so:
 
-   struct gcc_target target = TARGET_INITIALIZER;
+   struct gcc_target targetm = TARGET_INITIALIZER;
 
    Doing things this way allows us to bring together everything that
-   defines a target to GCC.  By supplying a default that is
-   appropriate to most targets, we can easily add new items without
-   needing to edit dozens of target configuration files.  It should
-   also allow us to gradually reduce the amount of conditional
-   compilation that is scattered throughout GCC.  */
+   defines a GCC target.  By supplying a default that is appropriate
+   to most targets, we can easily add new items without needing to
+   edit dozens of target configuration files.  It should also allow us
+   to gradually reduce the amount of conditional compilation that is
+   scattered throughout GCC.  */
 
 struct gcc_target
 {
+  /* Functions that output assembler for the target.  */
+  struct asm_out
+  {
+    /* Opening and closing parentheses for asm expression grouping.  */
+    const char *open_paren, *close_paren;
+
+    /* Assembler instructions for creating various kinds of integer object.  */
+    const char *byte_op;
+    struct asm_int_op
+    {
+      const char *hi;
+      const char *si;
+      const char *di;
+      const char *ti;
+    } aligned_op, unaligned_op;
+
+    /* Try to output the assembler code for an integer object whose
+       value is given by X.  SIZE is the size of the object in bytes and
+       ALIGNED_P indicates whether it is aligned.  Return true if
+       successful.  Only handles cases for which BYTE_OP, ALIGNED_OP
+       and UNALIGNED_OP are NULL.  */
+    bool (* integer) PARAMS ((rtx x, unsigned int size, int aligned_p));
+
+    /* Output the assembler code for entry to a function.  */
+    void (* function_prologue) PARAMS ((FILE *, HOST_WIDE_INT));
+
+    /* Output the assembler code for end of prologue.  */
+    void (* function_end_prologue) PARAMS ((FILE *));
+
+    /* Output the assembler code for start of epilogue.  */
+    void (* function_begin_epilogue) PARAMS ((FILE *));
+
+    /* Output the assembler code for function exit.  */
+    void (* function_epilogue) PARAMS ((FILE *, HOST_WIDE_INT));
+
+    /* Switch to an arbitrary section NAME with attributes as
+       specified by FLAGS.  */
+    void (* named_section) PARAMS ((const char *, unsigned int));
+
+    /* Switch to the section that holds the exception table.  */
+    void (* exception_section) PARAMS ((void));
+
+    /* Switch to the section that holds the exception frames.  */
+    void (* eh_frame_section) PARAMS ((void));
+
+    /* Select and switch to a section for EXP.  It may be a DECL or a
+       constant for which TREE_CST_RTL is valid.  RELOC is non-zero if
+       runtime relocations must be applied; bit 1 will be set if the
+       runtime relocations require non-local name resolution.  ALIGN is
+       the required alignment of the data.  */
+    void (* select_section) PARAMS ((tree, int, unsigned HOST_WIDE_INT));
+
+    /* Select a unique section name for DECL.  RELOC is the same as
+       for SELECT_SECTION.  */
+    void (* unique_section) PARAMS ((tree, int));
+
+    /* Output a constructor for a symbol with a given priority.  */
+    void (* constructor) PARAMS ((rtx, int));
+
+    /* Output a destructor for a symbol with a given priority.  */
+    void (* destructor) PARAMS ((rtx, int));
+  } asm_out;
+
+  /* Functions relating to instruction scheduling.  */
+  struct sched
+  {
+    /* Given the current cost, COST, of an insn, INSN, calculate and
+       return a new cost based on its relationship to DEP_INSN through
+       the dependence LINK.  The default is to make no adjustment.  */
+    int (* adjust_cost) PARAMS ((rtx insn, rtx link, rtx def_insn, int cost));
+
+    /* Adjust the priority of an insn as you see fit.  Returns the new
+       priority.  */
+    int (* adjust_priority) PARAMS ((rtx, int));
+
+    /* Function which returns the maximum number of insns that can be
+       scheduled in the same machine cycle.  This must be constant
+       over an entire compilation.  The default is 1.  */
+    int (* issue_rate) PARAMS ((void));
+
+    /* Calculate how much this insn affects how many more insns we
+       can emit this cycle.  Default is they all cost the same.  */
+    int (* variable_issue) PARAMS ((FILE *, int, rtx, int));
+    
+    /* Initialize machine-dependent scheduling code.  */
+    void (* md_init) PARAMS ((FILE *, int, int));
+
+    /* Finalize machine-dependent scheduling code.  */
+    void (* md_finish) PARAMS ((FILE *, int));
+
+    /* Reorder insns in a machine-dependent fashion, in two different
+       places.  Default does nothing.  */
+    int (* reorder)  PARAMS ((FILE *, int, rtx *, int *, int));
+    int (* reorder2) PARAMS ((FILE *, int, rtx *, int *, int));
+
+    /* 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) PARAMS ((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
+       returning insns which are used to change the pipeline hazard
+       recognizer state when the new simulated processor cycle
+       correspondingly starts and finishes.  The function defined by
+       init_dfa_pre_cycle_insn and init_dfa_post_cycle_insn are used
+       to initialize the corresponding insns.  The default values of
+       the memebers result in not changing the automaton state when
+       the new simulated processor cycle correspondingly starts and
+       finishes.  */
+    void (* init_dfa_pre_cycle_insn) PARAMS ((void));
+    rtx (* dfa_pre_cycle_insn) PARAMS ((void));
+    void (* init_dfa_post_cycle_insn) PARAMS ((void));
+    rtx (* dfa_post_cycle_insn) PARAMS ((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
+       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) PARAMS ((void));
+    /* 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) PARAMS ((void));
+    rtx (* dfa_bubble) PARAMS ((int));
+  } sched;
+
   /* Given two decls, merge their attributes and return the result.  */
   tree (* merge_decl_attributes) PARAMS ((tree, tree));
 
   /* Given two types, merge their attributes and return the result.  */
   tree (* merge_type_attributes) PARAMS ((tree, tree));
 
-  /* Nonzero if IDENTIFIER with arguments ARGS is a valid machine
-     specific attribute for DECL.  The attributes in ATTRIBUTES have
-     previously been assigned to DECL.  */
-  int (* valid_decl_attribute) PARAMS ((tree decl, tree attributes,
-                                       tree identifier, tree args));
-
-  /* Nonzero if IDENTIFIER with arguments ARGS is a valid machine
-     specific attribute for TYPE.  The attributes in ATTRIBUTES have
-     previously been assigned to TYPE.  */
-  int (* valid_type_attribute) PARAMS ((tree type, tree attributes,
-                                       tree identifier, tree args));
+  /* Table of machine attributes and functions to handle them.
+     Ignored if NULL.  */
+  const struct attribute_spec *attribute_table;
+
+  /* Return zero if the attributes on TYPE1 and TYPE2 are incompatible,
+     one if they are compatible and two if they are nearly compatible
+     (which causes a warning to be generated).  */
+  int (* comp_type_attributes) PARAMS ((tree type1, tree type2));
+
+  /* Assign default attributes to the newly defined TYPE.  */
+  void (* set_default_type_attributes) PARAMS ((tree type));
+
+  /* Insert attributes on the newly created DECL.  */
+  void (* insert_attributes) PARAMS ((tree decl, tree *attributes));
+
+  /* Return true if FNDECL (which has at least one machine attribute)
+     can be inlined despite its machine attributes, false otherwise.  */
+  bool (* function_attribute_inlinable_p) PARAMS ((tree fndecl));
+
+  /* Return true if bitfields in RECORD_TYPE should follow the
+     Microsoft Visual C++ bitfield layout rules.  */
+  bool (* ms_bitfield_layout_p) PARAMS ((tree record_type));
+
+  /* Set up target-specific built-in functions.  */
+  void (* init_builtins) PARAMS ((void));
+
+  /* Expand a target-specific builtin.  */
+  rtx (* expand_builtin) PARAMS ((tree exp, rtx target, rtx subtarget,
+                                 enum machine_mode mode, int ignore));
+
+  /* Given a decl, a section name, and whether the decl initializer
+     has relocs, choose attributes for the section.  */
+  /* ??? Should be merged with SELECT_SECTION and UNIQUE_SECTION.  */
+  unsigned int (* section_type_flags) PARAMS ((tree, const char *, int));
+
+  /* True if arbitrary sections are supported.  */
+  bool have_named_sections;
+
+  /* True if "native" constructors and destructors are supported,
+     false if we're using collect2 for the job.  */
+  bool have_ctors_dtors;
+
+  /* True if new jumps cannot be created, to replace existing ones or
+     not, at the current point in the compilation.  */
+  bool (* cannot_modify_jumps_p) PARAMS ((void));
+
+  /* True if EXP should be placed in a "small data" section.  */
+  bool (* in_small_data_p) PARAMS ((tree));
 };
 
-extern struct gcc_target target;
+extern struct gcc_target targetm;
This page took 0.033716 seconds and 5 git commands to generate.