summaryrefslogtreecommitdiffstats
path: root/contrib/gcc/target.h
diff options
context:
space:
mode:
authorobrien <obrien@FreeBSD.org>2002-02-01 18:16:02 +0000
committerobrien <obrien@FreeBSD.org>2002-02-01 18:16:02 +0000
commitc9ab9ae440a8066b2c2b85b157b1fdadcf09916a (patch)
tree086d9d6c8fbd4fc8fe4495059332f66bc0f8d12b /contrib/gcc/target.h
parent2ecfd8bd04b63f335c1ec6295740a4bfd97a4fa6 (diff)
downloadFreeBSD-src-c9ab9ae440a8066b2c2b85b157b1fdadcf09916a.zip
FreeBSD-src-c9ab9ae440a8066b2c2b85b157b1fdadcf09916a.tar.gz
Enlist the FreeBSD-CURRENT users as testers of what is to become Gcc 3.1.0.
These bits are taken from the FSF anoncvs repo on 1-Feb-2002 08:20 PST.
Diffstat (limited to 'contrib/gcc/target.h')
-rw-r--r--contrib/gcc/target.h185
1 files changed, 185 insertions, 0 deletions
diff --git a/contrib/gcc/target.h b/contrib/gcc/target.h
new file mode 100644
index 0000000..355a910
--- /dev/null
+++ b/contrib/gcc/target.h
@@ -0,0 +1,185 @@
+/* Data structure definitions for a generic GCC target.
+ Copyright (C) 2001 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
+Free Software Foundation; either version 2, or (at your option) any
+later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ In other words, you are welcome to use, share and improve this program.
+ You are forbidden to forbid anyone else to use, share and improve
+ 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
+ contain most or all target machine and target O/S specific
+ information.
+
+ This structure has its initializer declared in target-def.h in the
+ form of large macro TARGET_INITIALIZER that expands to many smaller
+ macros.
+
+ The smaller macros each initialize one component of the structure,
+ and each has a default. Each target should have a file that
+ 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
+ "targetm" like so:
+
+ struct gcc_target targetm = TARGET_INITIALIZER;
+
+ Doing things this way allows us to bring together everything that
+ 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));
+
+ /* 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));
+
+ /* 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));
+ } 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));
+
+ /* Table of machine attributes and functions to handle them. */
+ 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));
+
+ /* 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;
+};
+
+extern struct gcc_target targetm;
OpenPOWER on IntegriCloud