/* 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
/* 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));
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));
/* 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));
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. */
/* 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
/* 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));
/* ??? 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;