190075Sobrien/* The lang_hooks data structure.
2169689Skan   Copyright 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
390075Sobrien
4132718SkanThis file is part of GCC.
590075Sobrien
6132718SkanGCC is free software; you can redistribute it and/or modify
790075Sobrienit under the terms of the GNU General Public License as published by
890075Sobrienthe Free Software Foundation; either version 2, or (at your option)
990075Sobrienany later version.
1090075Sobrien
11132718SkanGCC is distributed in the hope that it will be useful,
1290075Sobrienbut WITHOUT ANY WARRANTY; without even the implied warranty of
1390075SobrienMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1490075SobrienGNU General Public License for more details.
1590075Sobrien
1690075SobrienYou should have received a copy of the GNU General Public License
17132718Skanalong with GCC; see the file COPYING.  If not, write to
18169689Skanthe Free Software Foundation, 51 Franklin Street, Fifth Floor,
19169689SkanBoston, MA 02110-1301, USA.  */
2090075Sobrien
2190075Sobrien#ifndef GCC_LANG_HOOKS_H
2290075Sobrien#define GCC_LANG_HOOKS_H
2390075Sobrien
24117395Skan/* This file should be #include-d after tree.h.  */
25117395Skan
26117395Skanstruct diagnostic_context;
27117395Skan
28169689Skanstruct gimplify_omp_ctx;
29169689Skan
3090075Sobrien/* A print hook for print_tree ().  */
31132718Skantypedef void (*lang_print_tree_hook) (FILE *, tree, int indent);
3290075Sobrien
3390075Sobrien/* The following hooks are documented in langhooks.c.  Must not be
3490075Sobrien   NULL.  */
3590075Sobrien
3690075Sobrienstruct lang_hooks_for_tree_inlining
3790075Sobrien{
38132718Skan  tree (*walk_subtrees) (tree *, int *,
39132718Skan			 tree (*) (tree *, int *, void *),
40169689Skan			 void *, struct pointer_set_t*);
41132718Skan  int (*cannot_inline_tree_fn) (tree *);
42132718Skan  int (*disregard_inline_limits) (tree);
43132718Skan  tree (*add_pending_fn_decls) (void *, tree);
44132718Skan  int (*auto_var_in_fn_p) (tree, tree);
45132718Skan  int (*anon_aggr_type_p) (tree);
46169689Skan  bool (*var_mod_type_p) (tree, tree);
47132718Skan  int (*start_inlining) (tree);
48132718Skan  void (*end_inlining) (tree);
49132718Skan  tree (*convert_parm_for_inlining) (tree, tree, tree, int);
5090075Sobrien};
5190075Sobrien
52132718Skanstruct lang_hooks_for_callgraph
53132718Skan{
54132718Skan  /* The node passed is a language-specific tree node.  If its contents
55132718Skan     are relevant to use of other declarations, mark them.  */
56132718Skan  tree (*analyze_expr) (tree *, int *, tree);
57132718Skan
58132718Skan  /* Produce RTL for function passed as argument.  */
59132718Skan  void (*expand_function) (tree);
60132718Skan};
61132718Skan
62117395Skan/* Lang hooks for management of language-specific data or status
63117395Skan   when entering / leaving functions etc.  */
64117395Skanstruct lang_hooks_for_functions
65117395Skan{
66117395Skan  /* Called when entering a function.  */
67132718Skan  void (*init) (struct function *);
68117395Skan
69117395Skan  /* Called when leaving a function.  */
70132718Skan  void (*final) (struct function *);
71117395Skan
72117395Skan  /* Called when entering a nested function.  */
73132718Skan  void (*enter_nested) (struct function *);
74117395Skan
75117395Skan  /* Called when leaving a nested function.  */
76132718Skan  void (*leave_nested) (struct function *);
77117395Skan
78169689Skan  /* Determines if it's ok for a function to have no noreturn attribute.  */
79169689Skan  bool (*missing_noreturn_ok_p) (tree);
80132718Skan};
81132718Skan
8290075Sobrien/* The following hooks are used by tree-dump.c.  */
8390075Sobrien
8490075Sobrienstruct lang_hooks_for_tree_dump
8590075Sobrien{
86117395Skan  /* Dump language-specific parts of tree nodes.  Returns nonzero if it
8790075Sobrien     does not want the usual dumping of the second argument.  */
88132718Skan  bool (*dump_tree) (void *, tree);
8990075Sobrien
9090075Sobrien  /* Determine type qualifiers in a language-specific way.  */
91132718Skan  int (*type_quals) (tree);
9290075Sobrien};
9390075Sobrien
94117395Skan/* Hooks related to types.  */
95117395Skan
96117395Skanstruct lang_hooks_for_types
97117395Skan{
98117395Skan  /* Return a new type (with the indicated CODE), doing whatever
99117395Skan     language-specific processing is required.  */
100132718Skan  tree (*make_type) (enum tree_code);
101117395Skan
102117395Skan  /* Given MODE and UNSIGNEDP, return a suitable type-tree with that
103117395Skan     mode.  */
104132718Skan  tree (*type_for_mode) (enum machine_mode, int);
105117395Skan
106117395Skan  /* Given PRECISION and UNSIGNEDP, return a suitable type-tree for an
107117395Skan     integer type with at least that precision.  */
108132718Skan  tree (*type_for_size) (unsigned, int);
109117395Skan
110117395Skan  /* Given an integer type T, return a type like T but unsigned.
111117395Skan     If T is unsigned, the value is T.  */
112132718Skan  tree (*unsigned_type) (tree);
113117395Skan
114117395Skan  /* Given an integer type T, return a type like T but signed.
115117395Skan     If T is signed, the value is T.  */
116132718Skan  tree (*signed_type) (tree);
117117395Skan
118117395Skan  /* Return a type the same as TYPE except unsigned or signed
119117395Skan     according to UNSIGNEDP.  */
120132718Skan  tree (*signed_or_unsigned_type) (int, tree);
121117395Skan
122259268Spfg  /* True if the type is an instantiation of a generic type,
123259268Spfg     e.g. C++ template implicit specializations.  */
124259268Spfg  bool (*generic_p) (tree);
125259268Spfg
126117395Skan  /* Given a type, apply default promotions to unnamed function
127117395Skan     arguments and return the new type.  Return the same type if no
128117395Skan     change.  Required by any language that supports variadic
129169689Skan     arguments.  The default hook dies.  */
130132718Skan  tree (*type_promotes_to) (tree);
131117395Skan
132132718Skan  /* Register TYPE as a builtin type with the indicated NAME.  The
133132718Skan     TYPE is placed in the outermost lexical scope.  The semantics
134132718Skan     should be analogous to:
135132718Skan
136132718Skan       typedef TYPE NAME;
137132718Skan
138132718Skan     in C.  The default hook ignores the declaration.  */
139132718Skan  void (*register_builtin_type) (tree, const char *);
140132718Skan
141117395Skan  /* This routine is called in tree.c to print an error message for
142117395Skan     invalid use of an incomplete type.  VALUE is the expression that
143117395Skan     was used (or 0 if that isn't known) and TYPE is the type that was
144117395Skan     invalid.  */
145132718Skan  void (*incomplete_type_error) (tree value, tree type);
146169689Skan
147169689Skan  /* Called from assign_temp to return the maximum size, if there is one,
148169689Skan     for a type.  */
149169689Skan  tree (*max_size) (tree);
150169689Skan
151169689Skan  /* Register language specific type size variables as potentially OpenMP
152169689Skan     firstprivate variables.  */
153169689Skan  void (*omp_firstprivatize_type_sizes) (struct gimplify_omp_ctx *, tree);
154169689Skan
155261188Spfg  /* APPLE LOCAL begin radar 6386976  */
156261188Spfg  /* Determine whether the type-tree passed in is specific to the
157261188Spfg     language/runtime definitions, e.g. is an Objective-C class...  */
158261188Spfg  bool (*is_runtime_specific_type) (tree);
159261188Spfg  /* APPLE LOCAL end radar 6386976  */
160261188Spfg
161169689Skan  /* Nonzero if types that are identical are to be hashed so that only
162169689Skan     one copy is kept.  If a language requires unique types for each
163169689Skan     user-specified type, such as Ada, this should be set to TRUE.  */
164169689Skan  bool hash_types;
165117395Skan};
166117395Skan
167117395Skan/* Language hooks related to decls and the symbol table.  */
168117395Skan
169117395Skanstruct lang_hooks_for_decls
170117395Skan{
171117395Skan  /* Returns nonzero if we are in the global binding level.  Ada
172117395Skan     returns -1 for an undocumented reason used in stor-layout.c.  */
173132718Skan  int (*global_bindings_p) (void);
174117395Skan
175117395Skan  /* Insert BLOCK at the end of the list of subblocks of the
176117395Skan     current binding level.  This is used when a BIND_EXPR is expanded,
177117395Skan     to handle the BLOCK node inside the BIND_EXPR.  */
178132718Skan  void (*insert_block) (tree);
179117395Skan
180117395Skan  /* Function to add a decl to the current scope level.  Takes one
181117395Skan     argument, a decl to add.  Returns that decl, or, if the same
182117395Skan     symbol is already declared, may return a different decl for that
183117395Skan     name.  */
184132718Skan  tree (*pushdecl) (tree);
185117395Skan
186117395Skan  /* Returns the chain of decls so far in the current scope level.  */
187132718Skan  tree (*getdecls) (void);
188117395Skan
189117395Skan  /* Returns true when we should warn for an unused global DECL.
190117395Skan     We will already have checked that it has static binding.  */
191132718Skan  bool (*warn_unused_global) (tree);
192117395Skan
193117395Skan  /* Obtain a list of globals and do final output on them at end
194117395Skan     of compilation */
195132718Skan  void (*final_write_globals) (void);
196117395Skan
197132718Skan  /* Do necessary preparations before assemble_variable can proceed.  */
198132718Skan  void (*prepare_assemble_variable) (tree);
199132718Skan
200117395Skan  /* True if this decl may be called via a sibcall.  */
201132718Skan  bool (*ok_for_sibcall) (tree);
202169689Skan
203169689Skan  /* Return the COMDAT group into which this DECL should be placed.
204169689Skan     It is known that the DECL belongs in *some* COMDAT group when
205169689Skan     this hook is called.  The return value will be used immediately,
206169689Skan     but not explicitly deallocated, so implementations should not use
207169689Skan     xmalloc to allocate the string returned.  (Typically, the return
208169689Skan     value will be the string already stored in an
209169689Skan     IDENTIFIER_NODE.)  */
210169689Skan  const char * (*comdat_group) (tree);
211169689Skan
212169689Skan  /* True if OpenMP should privatize what this DECL points to rather
213169689Skan     than the DECL itself.  */
214169689Skan  bool (*omp_privatize_by_reference) (tree);
215169689Skan
216169689Skan  /* Return sharing kind if OpenMP sharing attribute of DECL is
217169689Skan     predetermined, OMP_CLAUSE_DEFAULT_UNSPECIFIED otherwise.  */
218169689Skan  enum omp_clause_default_kind (*omp_predetermined_sharing) (tree);
219169689Skan
220169689Skan  /* Return true if DECL's DECL_VALUE_EXPR (if any) should be
221169689Skan     disregarded in OpenMP construct, because it is going to be
222169689Skan     remapped during OpenMP lowering.  SHARED is true if DECL
223169689Skan     is going to be shared, false if it is going to be privatized.  */
224169689Skan  bool (*omp_disregard_value_expr) (tree, bool);
225169689Skan
226169689Skan  /* Return true if DECL that is shared iff SHARED is true should
227169689Skan     be put into OMP_CLAUSE_PRIVATE_DEBUG.  */
228169689Skan  bool (*omp_private_debug_clause) (tree, bool);
229169689Skan
230169689Skan  /* Build and return code for a default constructor for DECL in
231169689Skan     response to CLAUSE.  Return NULL if nothing to be done.  */
232169689Skan  tree (*omp_clause_default_ctor) (tree clause, tree decl);
233169689Skan
234169689Skan  /* Build and return code for a copy constructor from SRC to DST.  */
235169689Skan  tree (*omp_clause_copy_ctor) (tree clause, tree dst, tree src);
236169689Skan
237169689Skan  /* Similarly, except use an assignment operator instead.  */
238169689Skan  tree (*omp_clause_assign_op) (tree clause, tree dst, tree src);
239169689Skan
240169689Skan  /* Build and return code destructing DECL.  Return NULL if nothing
241169689Skan     to be done.  */
242169689Skan  tree (*omp_clause_dtor) (tree clause, tree decl);
243117395Skan};
244117395Skan
24590075Sobrien/* Language-specific hooks.  See langhooks-def.h for defaults.  */
24690075Sobrien
24790075Sobrienstruct lang_hooks
24890075Sobrien{
24990075Sobrien  /* String identifying the front end.  e.g. "GNU C++".  */
25090075Sobrien  const char *name;
25190075Sobrien
25290075Sobrien  /* sizeof (struct lang_identifier), so make_node () creates
25390075Sobrien     identifier nodes long enough for the language-specific slots.  */
25490075Sobrien  size_t identifier_size;
25590075Sobrien
256169689Skan  /* Determines the size of any language-specific tcc_constant or
257169689Skan     tcc_exceptional nodes.  Since it is called from make_node, the
258169689Skan     only information available is the tree code.  Expected to die
259169689Skan     on unrecognized codes.  */
260132718Skan  size_t (*tree_size) (enum tree_code);
261132718Skan
26290075Sobrien  /* The first callback made to the front end, for simple
263132718Skan     initialization needed before any calls to handle_option.  Return
264132718Skan     the language mask to filter the switch array with.  */
265132718Skan  unsigned int (*init_options) (unsigned int argc, const char **argv);
26690075Sobrien
267132718Skan  /* Callback used to perform language-specific initialization for the
268132718Skan     global diagnostic context structure.  */
269132718Skan  void (*initialize_diagnostics) (struct diagnostic_context *);
27090075Sobrien
271132718Skan  /* Handle the switch CODE, which has real type enum opt_code from
272132718Skan     options.h.  If the switch takes an argument, it is passed in ARG
273132718Skan     which points to permanent storage.  The handler is responsible for
274132718Skan     checking whether ARG is NULL, which indicates that no argument
275132718Skan     was in fact supplied.  For -f and -W switches, VALUE is 1 or 0
276132718Skan     for the positive and negative forms respectively.
277102780Skan
278132718Skan     Return 1 if the switch is valid, 0 if invalid, and -1 if it's
279132718Skan     valid and should not be treated as language-independent too.  */
280132718Skan  int (*handle_option) (size_t code, const char *arg, int value);
281132718Skan
282132718Skan  /* Return false to use the default complaint about a missing
283132718Skan     argument, otherwise output a complaint and return true.  */
284132718Skan  bool (*missing_argument) (const char *opt, size_t code);
285132718Skan
286132718Skan  /* Called when all command line options have been parsed to allow
287132718Skan     further processing and initialization
288132718Skan
289132718Skan     Should return true to indicate that a compiler back-end is
290132718Skan     not required, such as with the -E option.
291132718Skan
292117395Skan     If errorcount is nonzero after this call the compiler exits
293102780Skan     immediately and the finish hook is not called.  */
294132718Skan  bool (*post_options) (const char **);
29590075Sobrien
296132718Skan  /* Called after post_options to initialize the front end.  Return
297132718Skan     false to indicate that no further compilation be performed, in
298132718Skan     which case the finish hook is called immediately.  */
299132718Skan  bool (*init) (void);
30090075Sobrien
30190075Sobrien  /* Called at the end of compilation, as a finalizer.  */
302132718Skan  void (*finish) (void);
30390075Sobrien
304117395Skan  /* Parses the entire file.  The argument is nonzero to cause bison
305117395Skan     parsers to dump debugging information during parsing.  */
306132718Skan  void (*parse_file) (int);
307117395Skan
30890075Sobrien  /* Called immediately after parsing to clear the binding stack.  */
309132718Skan  void (*clear_binding_stack) (void);
31090075Sobrien
31190075Sobrien  /* Called to obtain the alias set to be used for an expression or type.
31290075Sobrien     Returns -1 if the language does nothing special for it.  */
313132718Skan  HOST_WIDE_INT (*get_alias_set) (tree);
31490075Sobrien
31590075Sobrien  /* Called with an expression that is to be processed as a constant.
31690075Sobrien     Returns either the same expression or a language-independent
31790075Sobrien     constant equivalent to its input.  */
318132718Skan  tree (*expand_constant) (tree);
31990075Sobrien
320117395Skan  /* Called by expand_expr for language-specific tree codes.
321117395Skan     Fourth argument is actually an enum expand_modifier.  */
322132718Skan  rtx (*expand_expr) (tree, rtx, enum machine_mode, int, rtx *);
323117395Skan
324169689Skan  /* Called by expand_expr to generate the definition of a decl.  Returns
325169689Skan     1 if handled, 0 otherwise.  */
326169689Skan  int (*expand_decl) (tree);
327117395Skan
32890075Sobrien  /* Hook called by safe_from_p for language-specific tree codes.  It is
32990075Sobrien     up to the language front-end to install a hook if it has any such
33090075Sobrien     codes that safe_from_p needs to know about.  Since same_from_p will
33190075Sobrien     recursively explore the TREE_OPERANDs of an expression, this hook
33290075Sobrien     should not reexamine those pieces.  This routine may recursively
33390075Sobrien     call safe_from_p; it should always pass `0' as the TOP_P
33490075Sobrien     parameter.  */
335132718Skan  int (*safe_from_p) (rtx, tree);
33690075Sobrien
337117395Skan  /* Function to finish handling an incomplete decl at the end of
338117395Skan     compilation.  Default hook is does nothing.  */
339132718Skan  void (*finish_incomplete_decl) (tree);
340117395Skan
341117395Skan  /* Mark EXP saying that we need to be able to take the address of
342117395Skan     it; it should not be allocated in a register.  Return true if
343117395Skan     successful.  */
344132718Skan  bool (*mark_addressable) (tree);
345117395Skan
34690075Sobrien  /* Hook called by staticp for language-specific tree codes.  */
347169689Skan  tree (*staticp) (tree);
34890075Sobrien
349117395Skan  /* Replace the DECL_LANG_SPECIFIC data, which may be NULL, of the
350117395Skan     DECL_NODE with a newly GC-allocated copy.  */
351132718Skan  void (*dup_lang_specific_decl) (tree);
352117395Skan
353117395Skan  /* Set the DECL_ASSEMBLER_NAME for a node.  If it is the sort of
354117395Skan     thing that the assembler should talk about, set
355117395Skan     DECL_ASSEMBLER_NAME to an appropriate IDENTIFIER_NODE.
356117395Skan     Otherwise, set it to the ERROR_MARK_NODE to ensure that the
357117395Skan     assembler does not talk about it.  */
358132718Skan  void (*set_decl_assembler_name) (tree);
359117395Skan
360117395Skan  /* Return nonzero if fold-const is free to use bit-field
361117395Skan     optimizations, for instance in fold_truthop().  */
362132718Skan  bool (*can_use_bit_fields_p) (void);
363117395Skan
364169689Skan  /* Nonzero if operations on types narrower than their mode should
365169689Skan     have their results reduced to the precision of the type.  */
366169689Skan  bool reduce_bit_field_operations;
36790075Sobrien
368132718Skan  /* Nonzero if this front end does not generate a dummy BLOCK between
369132718Skan     the outermost scope of the function and the FUNCTION_DECL.  See
370132718Skan     is_body_block in stmt.c, and its callers.  */
371132718Skan  bool no_body_blocks;
372132718Skan
37390075Sobrien  /* The front end can add its own statistics to -fmem-report with
37490075Sobrien     this hook.  It should output to stderr.  */
375132718Skan  void (*print_statistics) (void);
37690075Sobrien
377169689Skan  /* Called by print_tree when there is a tree of class tcc_exceptional
378169689Skan     that it doesn't know how to display.  */
37990075Sobrien  lang_print_tree_hook print_xnode;
38090075Sobrien
381169689Skan  /* Called to print language-dependent parts of tcc_decl, tcc_type,
382169689Skan     and IDENTIFIER_NODE nodes.  */
38390075Sobrien  lang_print_tree_hook print_decl;
38490075Sobrien  lang_print_tree_hook print_type;
38590075Sobrien  lang_print_tree_hook print_identifier;
38690075Sobrien
387117395Skan  /* Computes the name to use to print a declaration.  DECL is the
388117395Skan     non-NULL declaration in question.  VERBOSITY determines what
389117395Skan     information will be printed: 0: DECL_NAME, demangled as
390117395Skan     necessary.  1: and scope information.  2: and any other
391117395Skan     information that might be interesting, such as function parameter
392117395Skan     types in C++.  */
393132718Skan  const char *(*decl_printable_name) (tree decl, int verbosity);
39490075Sobrien
395169689Skan  /* Computes the dwarf-2/3 name for a tree.  VERBOSITY determines what
396169689Skan     information will be printed: 0: DECL_NAME, demangled as
397169689Skan     necessary.  1: and scope information.  */
398169689Skan  const char *(*dwarf_name) (tree, int verbosity);
399169689Skan
400169689Skan  /* This compares two types for equivalence ("compatible" in C-based languages).
401169689Skan     This routine should only return 1 if it is sure.  It should not be used
402169689Skan     in contexts where erroneously returning 0 causes problems.  */
403169689Skan  int (*types_compatible_p) (tree x, tree y);
404169689Skan
405132718Skan  /* Given a CALL_EXPR, return a function decl that is its target.  */
406132718Skan  tree (*lang_get_callee_fndecl) (tree);
407132718Skan
408117395Skan  /* Called by report_error_function to print out function name.  */
409132718Skan  void (*print_error_function) (struct diagnostic_context *, const char *);
410117395Skan
411102780Skan  /* Called from expr_size to calculate the size of the value of an
412102780Skan     expression in a language-dependent way.  Returns a tree for the size
413102780Skan     in bytes.  A frontend can call lhd_expr_size to get the default
414102780Skan     semantics in cases that it doesn't want to handle specially.  */
415132718Skan  tree (*expr_size) (tree);
416102780Skan
417169689Skan  /* Convert a character from the host's to the target's character
418169689Skan     set.  The character should be in what C calls the "basic source
419169689Skan     character set" (roughly, the set of characters defined by plain
420169689Skan     old ASCII).  The default is to return the character unchanged,
421169689Skan     which is correct in most circumstances.  Note that both argument
422169689Skan     and result should be sign-extended under -fsigned-char,
423169689Skan     zero-extended under -fno-signed-char.  */
424169689Skan  HOST_WIDE_INT (*to_target_charset) (HOST_WIDE_INT);
425132718Skan
426117395Skan  /* Pointers to machine-independent attribute tables, for front ends
427117395Skan     using attribs.c.  If one is NULL, it is ignored.  Respectively, a
428117395Skan     table of attributes specific to the language, a table of
429117395Skan     attributes common to two or more languages (to allow easy
430117395Skan     sharing), and a table of attributes for checking formats.  */
431117395Skan  const struct attribute_spec *attribute_table;
432117395Skan  const struct attribute_spec *common_attribute_table;
433117395Skan  const struct attribute_spec *format_attribute_table;
434117395Skan
435117395Skan  /* Function-related language hooks.  */
436117395Skan  struct lang_hooks_for_functions function;
437117395Skan
43890075Sobrien  struct lang_hooks_for_tree_inlining tree_inlining;
439117395Skan
440132718Skan  struct lang_hooks_for_callgraph callgraph;
441132718Skan
44290075Sobrien  struct lang_hooks_for_tree_dump tree_dump;
44390075Sobrien
444117395Skan  struct lang_hooks_for_decls decls;
445117395Skan
446117395Skan  struct lang_hooks_for_types types;
447117395Skan
448169689Skan  /* Perform language-specific gimplification on the argument.  Returns an
449169689Skan     enum gimplify_status, though we can't see that type here.  */
450169689Skan  int (*gimplify_expr) (tree *, tree *, tree *);
451132718Skan
452169689Skan  /* Fold an OBJ_TYPE_REF expression to the address of a function.
453169689Skan     KNOWN_TYPE carries the true type of the OBJ_TYPE_REF_OBJECT.  */
454169689Skan  tree (*fold_obj_type_ref) (tree, tree);
455169689Skan
456169689Skan  /* Return a definition for a builtin function named NAME and whose data type
457169689Skan     is TYPE.  TYPE should be a function type with argument types.
458169689Skan     FUNCTION_CODE tells later passes how to compile calls to this function.
459169689Skan     See tree.h for its possible values.
460169689Skan
461169689Skan     If LIBRARY_NAME is nonzero, use that for DECL_ASSEMBLER_NAME,
462169689Skan     the name to be called if we can't opencode the function.  If
463169689Skan     ATTRS is nonzero, use that for the function's attribute list.  */
464169689Skan  tree (*builtin_function) (const char *name, tree type, int function_code,
465169689Skan			    enum built_in_class bt_class,
466169689Skan			    const char *library_name, tree attrs);
467169689Skan
468169689Skan  /* Used to set up the tree_contains_structure array for a frontend. */
469169689Skan  void (*init_ts) (void);
470169689Skan
471169689Skan  /* Called by recompute_tree_invariant_for_addr_expr to go from EXPR
472169689Skan     to a contained expression or DECL, possibly updating *TC, *TI or
473169689Skan     *SE if in the process TREE_CONSTANT, TREE_INVARIANT or
474169689Skan     TREE_SIDE_EFFECTS need updating.  */
475169689Skan  tree (*expr_to_decl) (tree expr, bool *tc, bool *ti, bool *se);
476169689Skan
477261188Spfg  /* APPLE LOCAL begin radar 6353006  */
478261188Spfg  /*  For c-based languages, builds a generic type for Blocks pointers (for
479261188Spfg   emitting debug information.  For other languages, returns NULL.  */
480261188Spfg  tree (*build_generic_block_struct_type) (void);
481261188Spfg  /* APPLE LOCAL end radar 6353006  */
482261188Spfg
48390075Sobrien  /* Whenever you add entries here, make sure you adjust langhooks-def.h
48490075Sobrien     and langhooks.c accordingly.  */
48590075Sobrien};
48690075Sobrien
48790075Sobrien/* Each front end provides its own.  */
48890075Sobrienextern const struct lang_hooks lang_hooks;
48990075Sobrien
49090075Sobrien#endif /* GCC_LANG_HOOKS_H */
491