OSDN Git Service

Update email address for self.
[pf3gnuchains/gcc-fork.git] / gcc / target.h
index 8d73f49..7496fbb 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
@@ -52,6 +52,23 @@ struct gcc_target
     /* 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));
 
@@ -68,6 +85,28 @@ struct gcc_target
        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 and switch to a section for X with MODE.  ALIGN is
+       the desired alignment of the data.  */
+    void (* select_rtx_section) PARAMS ((enum machine_mode, rtx,
+                                        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));
 
@@ -95,7 +134,7 @@ struct gcc_target
     /* 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));
 
@@ -107,12 +146,47 @@ struct gcc_target
     int (* reorder)  PARAMS ((FILE *, int, rtx *, int *, int));
     int (* reorder2) PARAMS ((FILE *, int, rtx *, int *, int));
 
-    /* cycle_display is a pointer to a function which can emit
-       data into the assembly stream about the current cycle.
-       Arguments are CLOCK, the data to emit, and LAST, the last
-       insn in the new chain we're building.  Returns a new LAST.
-       The default is to do nothing.  */
-    rtx (* cycle_display) PARAMS ((int clock, rtx last));
+    /* 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.  */
@@ -121,17 +195,9 @@ struct gcc_target
   /* Given two types, merge their attributes and return the result.  */
   tree (* merge_type_attributes) PARAMS ((tree, tree));
 
-  /* Return 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));
-
-  /* Return 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
@@ -144,6 +210,14 @@ struct gcc_target
   /* 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));
 
@@ -156,12 +230,35 @@ struct gcc_target
   /* ??? Should be merged with SELECT_SECTION and UNIQUE_SECTION.  */
   unsigned int (* section_type_flags) PARAMS ((tree, const char *, int));
 
+  /* 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));
+
+  /* True if EXP names an object for which name resolution must resolve
+     to the current module.  */
+  bool (* binds_local_p) PARAMS ((tree));
+
+  /* Do something target-specific to record properties of the DECL into
+     the associated SYMBOL_REF.  */
+  void (* encode_section_info) PARAMS ((tree, int));
+
+  /* Undo the effects of encode_section_info on the symbol string.  */
+  const char * (* strip_name_encoding) PARAMS ((const char *));
+
+  /* Leave the boolean fields at the end.  */
+
   /* 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 thread-local storage is supported.  */
+  bool have_tls;
 };
 
 extern struct gcc_target targetm;