]> gcc.gnu.org Git - gcc.git/blame - gcc/langhooks.c
re PR debug/12066 (g++ generates stabs for "char *" that gdb cannot read)
[gcc.git] / gcc / langhooks.c
CommitLineData
69dcadff 1/* Default language-specific hooks.
0c20a65f 2 Copyright 2001, 2002, 2003 Free Software Foundation, Inc.
69dcadff
AO
3 Contributed by Alexandre Oliva <aoliva@redhat.com>
4
54a7b573 5This file is part of GCC.
69dcadff 6
54a7b573 7GCC is free software; you can redistribute it and/or modify
69dcadff
AO
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2, or (at your option)
10any later version.
11
54a7b573 12GCC is distributed in the hope that it will be useful,
69dcadff
AO
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
54a7b573 18along with GCC; see the file COPYING. If not, write to
69dcadff
AO
19the Free Software Foundation, 59 Temple Place - Suite 330,
20Boston, MA 02111-1307, USA. */
21
22#include "config.h"
23#include "system.h"
4977bab6
ZW
24#include "coretypes.h"
25#include "tm.h"
69dcadff
AO
26#include "toplev.h"
27#include "tree.h"
28#include "tree-inline.h"
1affb409
JJ
29#include "rtl.h"
30#include "insn-config.h"
31#include "integrate.h"
29ac78d5 32#include "flags.h"
59bee412 33#include "langhooks.h"
d23c55c2 34#include "langhooks-def.h"
26e0dcb3 35#include "ggc.h"
dba65e79 36#include "diagnostic.h"
59bee412 37
77b1a921 38/* Do nothing; in many cases the default hook. */
8ac61af7 39
77b1a921 40void
0c20a65f 41lhd_do_nothing (void)
77b1a921
NB
42{
43}
44
b03e38e1 45/* Do nothing (tree). */
63e1b1c4
NB
46
47void
0c20a65f 48lhd_do_nothing_t (tree t ATTRIBUTE_UNUSED)
63e1b1c4
NB
49{
50}
51
ff45c01e
NB
52/* Do nothing (int). */
53
54void
0c20a65f 55lhd_do_nothing_i (int i ATTRIBUTE_UNUSED)
ff45c01e
NB
56{
57}
58
a7e8c268
MM
59/* Do nothing (int, int, int). Return NULL_TREE. */
60
61tree
62lhd_do_nothing_iii_return_null_tree (int i ATTRIBUTE_UNUSED,
63 int j ATTRIBUTE_UNUSED,
64 int k ATTRIBUTE_UNUSED)
65{
66 return NULL_TREE;
67}
68
b03e38e1
NB
69/* Do nothing (function). */
70
71void
0c20a65f 72lhd_do_nothing_f (struct function *f ATTRIBUTE_UNUSED)
b03e38e1
NB
73{
74}
75
ac79cd5a
RK
76/* Do nothing (return the tree node passed). */
77
78tree
0c20a65f 79lhd_return_tree (tree t)
ac79cd5a
RK
80{
81 return t;
82}
83
c88770e9
NB
84/* Do nothing (return NULL_TREE). */
85
47aa0df4
MM
86tree
87lhd_return_null_tree_v (void)
88{
89 return NULL_TREE;
90}
91
92/* Do nothing (return NULL_TREE). */
93
c88770e9 94tree
0c20a65f 95lhd_return_null_tree (tree t ATTRIBUTE_UNUSED)
c88770e9
NB
96{
97 return NULL_TREE;
98}
99
4bfec483
NB
100/* The default post options hook. */
101
102bool
0c20a65f 103lhd_post_options (const char **pfilename ATTRIBUTE_UNUSED)
4bfec483
NB
104{
105 return false;
106}
107
5d69f816
NB
108/* Called from by print-tree.c. */
109
110void
0c20a65f
AJ
111lhd_print_tree_nothing (FILE *file ATTRIBUTE_UNUSED,
112 tree node ATTRIBUTE_UNUSED,
113 int indent ATTRIBUTE_UNUSED)
5d69f816 114{
ac79cd5a
RK
115}
116
117/* Called from safe_from_p. */
118
119int
0c20a65f 120lhd_safe_from_p (rtx x ATTRIBUTE_UNUSED, tree exp ATTRIBUTE_UNUSED)
ac79cd5a
RK
121{
122 return 1;
d062a680
JM
123}
124
48a7a235
NB
125/* Called from unsafe_for_reeval. */
126
127int
0c20a65f 128lhd_unsafe_for_reeval (tree t ATTRIBUTE_UNUSED)
48a7a235
NB
129{
130 return -1;
131}
132
d062a680
JM
133/* Called from staticp. */
134
135int
0c20a65f 136lhd_staticp (tree exp ATTRIBUTE_UNUSED)
d062a680
JM
137{
138 return 0;
5d69f816
NB
139}
140
ef4f94ac
RH
141/* Called from check_global_declarations. */
142
143bool
0c20a65f 144lhd_warn_unused_global_decl (tree decl)
ef4f94ac
RH
145{
146 /* This is what used to exist in check_global_declarations. Probably
147 not many of these actually apply to non-C languages. */
148
149 if (TREE_CODE (decl) == FUNCTION_DECL && DECL_INLINE (decl))
150 return false;
151 if (TREE_CODE (decl) == VAR_DECL && TREE_READONLY (decl))
152 return false;
153 if (DECL_IN_SYSTEM_HEADER (decl))
154 return false;
155
156 return true;
157}
158
26e0dcb3
GK
159/* Number for making the label on the next
160 static variable internal to a function. */
161
162static GTY(()) int var_labelno;
163
599bba86
NB
164/* Set the DECL_ASSEMBLER_NAME for DECL. */
165void
0c20a65f 166lhd_set_decl_assembler_name (tree decl)
599bba86
NB
167{
168 /* The language-independent code should never use the
169 DECL_ASSEMBLER_NAME for lots of DECLs. Only FUNCTION_DECLs and
170 VAR_DECLs for variables with static storage duration need a real
171 DECL_ASSEMBLER_NAME. */
172 if (TREE_CODE (decl) == FUNCTION_DECL
e11e816e
KH
173 || (TREE_CODE (decl) == VAR_DECL
174 && (TREE_STATIC (decl)
175 || DECL_EXTERNAL (decl)
599bba86 176 || TREE_PUBLIC (decl))))
26e0dcb3
GK
177 {
178 /* By default, assume the name to use in assembly code is the
179 same as that used in the source language. (That's correct
180 for C, and GCC used to set DECL_ASSEMBLER_NAME to the same
181 value as DECL_NAME in build_decl, so this choice provides
182 backwards compatibility with existing front-ends.
183
184 Can't use just the variable's own name for a variable whose
185 scope is less than the whole compilation. Concatenate a
186 distinguishing number. */
187 if (!TREE_PUBLIC (decl) && DECL_CONTEXT (decl))
188 {
189 const char *name = IDENTIFIER_POINTER (DECL_NAME (decl));
190 char *label;
191
192 ASM_FORMAT_PRIVATE_NAME (label, name, var_labelno);
193 var_labelno++;
194 SET_DECL_ASSEMBLER_NAME (decl, get_identifier (label));
195 }
196 else
197 SET_DECL_ASSEMBLER_NAME (decl, DECL_NAME (decl));
198 }
599bba86
NB
199 else
200 /* Nobody should ever be asking for the DECL_ASSEMBLER_NAME of
201 these DECLs -- unless they're in language-dependent code, in
202 which case set_decl_assembler_name hook should handle things. */
203 abort ();
204}
205
57ce46bb
TT
206/* By default we always allow bit-field based optimizations. */
207bool
0c20a65f 208lhd_can_use_bit_fields_p (void)
57ce46bb
TT
209{
210 return true;
211}
212
37207ee7
ZW
213/* Provide a default routine to clear the binding stack. This is used
214 by languages that don't need to do anything special. */
215void
0c20a65f 216lhd_clear_binding_stack (void)
37207ee7 217{
43577e6b 218 while (! (*lang_hooks.decls.global_bindings_p) ())
37207ee7
ZW
219 poplevel (0, 0, 0);
220}
221
ab393bf1
NB
222/* Type promotion for variable arguments. */
223tree
0c20a65f 224lhd_type_promotes_to (tree type ATTRIBUTE_UNUSED)
ab393bf1
NB
225{
226 abort ();
227}
228
9649812a
MM
229/* Registration of machine- or os-specific builtin types. */
230void
231lhd_register_builtin_type (tree type ATTRIBUTE_UNUSED,
232 const char* name ATTRIBUTE_UNUSED)
233{
234}
235
7a228918
NB
236/* Invalid use of an incomplete type. */
237void
0c20a65f 238lhd_incomplete_type_error (tree value ATTRIBUTE_UNUSED, tree type)
7a228918
NB
239{
240 if (TREE_CODE (type) == ERROR_MARK)
241 return;
242
243 abort ();
244}
245
37207ee7
ZW
246/* Provide a default routine for alias sets that always returns -1. This
247 is used by languages that don't need to do anything special. */
248
249HOST_WIDE_INT
0c20a65f 250lhd_get_alias_set (tree t ATTRIBUTE_UNUSED)
37207ee7
ZW
251{
252 return -1;
253}
254
8ac61af7
RK
255/* Provide a hook routine for alias sets that always returns 0. This is
256 used by languages that haven't deal with alias sets yet. */
257
258HOST_WIDE_INT
0c20a65f 259hook_get_alias_set_0 (tree t ATTRIBUTE_UNUSED)
8ac61af7
RK
260{
261 return 0;
262}
263
c9d892a8
NB
264/* This is the default expand_expr function. */
265
266rtx
0c20a65f
AJ
267lhd_expand_expr (tree t ATTRIBUTE_UNUSED, rtx r ATTRIBUTE_UNUSED,
268 enum machine_mode mm ATTRIBUTE_UNUSED,
269 int em ATTRIBUTE_UNUSED)
c9d892a8
NB
270{
271 abort ();
272}
273
7afff7cf
NB
274/* This is the default decl_printable_name function. */
275
276const char *
0c20a65f 277lhd_decl_printable_name (tree decl, int verbosity ATTRIBUTE_UNUSED)
7afff7cf
NB
278{
279 return IDENTIFIER_POINTER (DECL_NAME (decl));
280}
281
69dcadff
AO
282/* lang_hooks.tree_inlining.walk_subtrees is called by walk_tree()
283 after handling common cases, but before walking code-specific
284 sub-trees. If this hook is overridden for a language, it should
285 handle language-specific tree codes, as well as language-specific
286 information associated to common tree codes. If a tree node is
287 completely handled within this function, it should set *SUBTREES to
288 0, so that generic handling isn't attempted. For language-specific
289 tree codes, generic handling would abort(), so make sure it is set
cc2902df 290 properly. Both SUBTREES and *SUBTREES is guaranteed to be nonzero
69dcadff
AO
291 when the function is called. */
292
293tree
0c20a65f
AJ
294lhd_tree_inlining_walk_subtrees (tree *tp ATTRIBUTE_UNUSED,
295 int *subtrees ATTRIBUTE_UNUSED,
296 walk_tree_fn func ATTRIBUTE_UNUSED,
297 void *data ATTRIBUTE_UNUSED,
298 void *htab ATTRIBUTE_UNUSED)
69dcadff
AO
299{
300 return NULL_TREE;
301}
302
303/* lang_hooks.tree_inlining.cannot_inline_tree_fn is called to
304 determine whether there are language-specific reasons for not
305 inlining a given function. */
306
307int
0c20a65f 308lhd_tree_inlining_cannot_inline_tree_fn (tree *fnp)
69dcadff 309{
2cb921f4 310 if (flag_really_no_inline
6aa77e6c
AH
311 && lookup_attribute ("always_inline", DECL_ATTRIBUTES (*fnp)) == NULL)
312 return 1;
313
69dcadff
AO
314 return 0;
315}
316
317/* lang_hooks.tree_inlining.disregard_inline_limits is called to
318 determine whether a function should be considered for inlining even
319 if it would exceed inlining limits. */
320
321int
0c20a65f 322lhd_tree_inlining_disregard_inline_limits (tree fn)
69dcadff 323{
6aa77e6c
AH
324 if (lookup_attribute ("always_inline", DECL_ATTRIBUTES (fn)) != NULL)
325 return 1;
326
69dcadff
AO
327 return 0;
328}
329
330/* lang_hooks.tree_inlining.add_pending_fn_decls is called before
331 starting to inline a function, to push any language-specific
332 functions that should not be inlined into the current function,
333 into VAFNP. PFN is the top of varray, and should be returned if no
334 functions are pushed into VAFNP. The top of the varray should be
335 returned. */
336
337tree
0c20a65f 338lhd_tree_inlining_add_pending_fn_decls (void *vafnp ATTRIBUTE_UNUSED, tree pfn)
69dcadff
AO
339{
340 return pfn;
341}
342
343/* lang_hooks.tree_inlining.tree_chain_matters_p indicates whether the
344 TREE_CHAIN of a language-specific tree node is relevant, i.e.,
345 whether it should be walked, copied and preserved across copies. */
346
347int
0c20a65f 348lhd_tree_inlining_tree_chain_matters_p (tree t ATTRIBUTE_UNUSED)
69dcadff
AO
349{
350 return 0;
351}
352
353/* lang_hooks.tree_inlining.auto_var_in_fn_p is called to determine
354 whether VT is an automatic variable defined in function FT. */
355
356int
0c20a65f 357lhd_tree_inlining_auto_var_in_fn_p (tree var, tree fn)
69dcadff
AO
358{
359 return (DECL_P (var) && DECL_CONTEXT (var) == fn
360 && (((TREE_CODE (var) == VAR_DECL || TREE_CODE (var) == PARM_DECL)
361 && ! TREE_STATIC (var))
362 || TREE_CODE (var) == LABEL_DECL
363 || TREE_CODE (var) == RESULT_DECL));
364}
365
366/* lang_hooks.tree_inlining.copy_res_decl_for_inlining should return a
367 declaration for the result RES of function FN to be inlined into
368 CALLER. NDP points to an integer that should be set in case a new
369 declaration wasn't created (presumably because RES was of aggregate
370 type, such that a TARGET_EXPR is used for the result). TEXPS is a
371 pointer to a varray with the stack of TARGET_EXPRs seen while
372 inlining functions into caller; the top of TEXPS is supposed to
373 match RES. */
374
375tree
0c20a65f
AJ
376lhd_tree_inlining_copy_res_decl_for_inlining (tree res, tree fn, tree caller,
377 void *dm ATTRIBUTE_UNUSED,
378 int *ndp ATTRIBUTE_UNUSED,
379 tree return_slot_addr ATTRIBUTE_UNUSED)
69dcadff 380{
4977bab6
ZW
381 if (return_slot_addr)
382 return build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (return_slot_addr)),
383 return_slot_addr);
384 else
385 return copy_decl_for_inlining (res, fn, caller);
69dcadff
AO
386}
387
388/* lang_hooks.tree_inlining.anon_aggr_type_p determines whether T is a
389 type node representing an anonymous aggregate (union, struct, etc),
390 i.e., one whose members are in the same scope as the union itself. */
391
392int
0c20a65f 393lhd_tree_inlining_anon_aggr_type_p (tree t ATTRIBUTE_UNUSED)
69dcadff
AO
394{
395 return 0;
396}
397
742a37d5
JM
398/* lang_hooks.tree_inlining.start_inlining and end_inlining perform any
399 language-specific bookkeeping necessary for processing
cc2902df 400 FN. start_inlining returns nonzero if inlining should proceed, zero if
742a37d5
JM
401 not.
402
403 For instance, the C++ version keeps track of template instantiations to
404 avoid infinite recursion. */
405
406int
0c20a65f 407lhd_tree_inlining_start_inlining (tree fn ATTRIBUTE_UNUSED)
742a37d5
JM
408{
409 return 1;
410}
411
412void
0c20a65f 413lhd_tree_inlining_end_inlining (tree fn ATTRIBUTE_UNUSED)
742a37d5
JM
414{
415}
416
f735a153
JJ
417/* lang_hooks.tree_inlining.convert_parm_for_inlining performs any
418 language-specific conversion before assigning VALUE to PARM. */
419
420tree
0c20a65f
AJ
421lhd_tree_inlining_convert_parm_for_inlining (tree parm ATTRIBUTE_UNUSED,
422 tree value,
423 tree fndecl ATTRIBUTE_UNUSED)
f735a153
JJ
424{
425 return value;
426}
427
e11e816e 428/* lang_hooks.tree_dump.dump_tree: Dump language-specific parts of tree
cc2902df 429 nodes. Returns nonzero if it does not want the usual dumping of the
89d684bb
BM
430 second argument. */
431
2bd3ecad 432bool
0c20a65f 433lhd_tree_dump_dump_tree (void *di ATTRIBUTE_UNUSED, tree t ATTRIBUTE_UNUSED)
89d684bb 434{
2bd3ecad 435 return false;
89d684bb
BM
436}
437
e11e816e 438/* lang_hooks.tree_dump.type_qual: Determine type qualifiers in a
89d684bb
BM
439 language-specific way. */
440
441int
0c20a65f 442lhd_tree_dump_type_quals (tree t)
89d684bb
BM
443{
444 return TYPE_QUALS (t);
445}
a77a9a18
JM
446
447/* lang_hooks.expr_size: Determine the size of the value of an expression T
448 in a language-specific way. Returns a tree for the size in bytes. */
449
450tree
0c20a65f 451lhd_expr_size (tree exp)
a77a9a18
JM
452{
453 if (TREE_CODE_CLASS (TREE_CODE (exp)) == 'd'
454 && DECL_SIZE_UNIT (exp) != 0)
455 return DECL_SIZE_UNIT (exp);
456 else
457 return size_in_bytes (TREE_TYPE (exp));
458}
16b0d23f
AP
459/* lang_hooks.decl_uninit: Find out if a variable is uninitialized based
460 on DECL_INITIAL. */
461
462bool
463lhd_decl_uninit (tree t ATTRIBUTE_UNUSED)
464{
465 return false;
466}
2f51bb1d 467
d78e771d
ZW
468/* lang_hooks.tree_size: Determine the size of a tree with code C,
469 which is a language-specific tree code in category 'x'. The
470 default expects never to be called. */
471size_t
0c20a65f 472lhd_tree_size (enum tree_code c ATTRIBUTE_UNUSED)
d78e771d
ZW
473{
474 abort ();
475 return 0;
476}
477
e076f71a
AH
478/* Return true if decl, which is a function decl, may be called by a
479 sibcall. */
480
481bool
0c20a65f 482lhd_decl_ok_for_sibcall (tree decl ATTRIBUTE_UNUSED)
e076f71a
AH
483{
484 return true;
485}
486
2f51bb1d 487/* lang_hooks.decls.final_write_globals: perform final processing on
3dc575ff 488 global variables. */
2f51bb1d 489void
0c20a65f 490write_global_declarations (void)
2f51bb1d
MA
491{
492 /* Really define vars that have had only a tentative definition.
493 Really output inline functions that must actually be callable
494 and have not been output so far. */
495
496 tree globals = (*lang_hooks.decls.getdecls) ();
497 int len = list_length (globals);
703ad42b 498 tree *vec = xmalloc (sizeof (tree) * len);
2f51bb1d
MA
499 int i;
500 tree decl;
501
502 /* Process the decls in reverse order--earliest first.
503 Put them into VEC from back to front, then take out from front. */
504
505 for (i = 0, decl = globals; i < len; i++, decl = TREE_CHAIN (decl))
506 vec[len - i - 1] = decl;
507
508 wrapup_global_declarations (vec, len);
509
510 check_global_declarations (vec, len);
511
512 /* Clean up. */
513 free (vec);
514}
26e0dcb3 515
21ecc5a7
GDR
516/* Called to perform language-specific initialization of CTX. */
517void
518lhd_initialize_diagnostics (struct diagnostic_context *ctx ATTRIBUTE_UNUSED)
519{
520}
521
dba65e79
GDR
522/* The default function to print out name of current function that caused
523 an error. */
524void
525lhd_print_error_function (diagnostic_context *context, const char *file)
526{
527 if (diagnostic_last_function_changed (context))
528 {
529 const char *old_prefix = context->printer->prefix;
530 char *new_prefix = file ? file_name_as_prefix (file) : NULL;
531
532 pp_set_prefix (context->printer, new_prefix);
533
534 if (current_function_decl == NULL)
535 pp_printf (context->printer, "At top level:");
536 else
537 {
538 if (TREE_CODE (TREE_TYPE (current_function_decl)) == METHOD_TYPE)
539 pp_printf
540 (context->printer, "In member function `%s':",
541 (*lang_hooks.decl_printable_name) (current_function_decl, 2));
542 else
543 pp_printf
544 (context->printer, "In function `%s':",
545 (*lang_hooks.decl_printable_name) (current_function_decl, 2));
546 }
547 pp_newline (context->printer);
548
549 diagnostic_set_last_function (context);
550 pp_flush (context->printer);
551 context->printer->prefix = old_prefix;
552 free ((char*) new_prefix);
553 }
554}
555
25c84396
RH
556tree
557lhd_callgraph_analyze_expr (tree *tp ATTRIBUTE_UNUSED,
558 int *walk_subtrees ATTRIBUTE_UNUSED,
559 tree decl ATTRIBUTE_UNUSED)
560{
561 return NULL;
562}
563
26e0dcb3 564#include "gt-langhooks.h"
This page took 0.718012 seconds and 5 git commands to generate.