targhooks.c revision 267654
1/* Default target hook functions.
2   Copyright (C) 2003, 2004, 2005, 2007 Free Software Foundation, Inc.
3
4This file is part of GCC.
5
6GCC is free software; you can redistribute it and/or modify it under
7the terms of the GNU General Public License as published by the Free
8Software Foundation; either version 2, or (at your option) any later
9version.
10
11GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12WARRANTY; without even the implied warranty of MERCHANTABILITY or
13FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14for more details.
15
16You should have received a copy of the GNU General Public License
17along with GCC; see the file COPYING.  If not, write to the Free
18Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
1902110-1301, USA.  */
20
21/* The migration of target macros to target hooks works as follows:
22
23   1. Create a target hook that uses the existing target macros to
24      implement the same functionality.
25
26   2. Convert all the MI files to use the hook instead of the macro.
27
28   3. Repeat for a majority of the remaining target macros.  This will
29      take some time.
30
31   4. Tell target maintainers to start migrating.
32
33   5. Eventually convert the backends to override the hook instead of
34      defining the macros.  This will take some time too.
35
36   6. TBD when, poison the macros.  Unmigrated targets will break at
37      this point.
38
39   Note that we expect steps 1-3 to be done by the people that
40   understand what the MI does with each macro, and step 5 to be done
41   by the target maintainers for their respective targets.
42
43   Note that steps 1 and 2 don't have to be done together, but no
44   target can override the new hook until step 2 is complete for it.
45
46   Once the macros are poisoned, we will revert to the old migration
47   rules - migrate the macro, callers, and targets all at once.  This
48   comment can thus be removed at that point.  */
49
50#include "config.h"
51#include "system.h"
52#include "coretypes.h"
53#include "tm.h"
54#include "machmode.h"
55#include "rtl.h"
56#include "tree.h"
57#include "expr.h"
58#include "output.h"
59#include "toplev.h"
60#include "function.h"
61#include "target.h"
62#include "tm_p.h"
63#include "target-def.h"
64#include "ggc.h"
65#include "hard-reg-set.h"
66#include "reload.h"
67#include "optabs.h"
68#include "recog.h"
69
70
71void
72default_external_libcall (rtx fun ATTRIBUTE_UNUSED)
73{
74#ifdef ASM_OUTPUT_EXTERNAL_LIBCALL
75  ASM_OUTPUT_EXTERNAL_LIBCALL(asm_out_file, fun);
76#endif
77}
78
79enum machine_mode
80default_cc_modes_compatible (enum machine_mode m1, enum machine_mode m2)
81{
82  if (m1 == m2)
83    return m1;
84  return VOIDmode;
85}
86
87bool
88default_return_in_memory (tree type,
89			  tree fntype ATTRIBUTE_UNUSED)
90{
91#ifndef RETURN_IN_MEMORY
92  return (TYPE_MODE (type) == BLKmode);
93#else
94  return RETURN_IN_MEMORY (type);
95#endif
96}
97
98rtx
99default_expand_builtin_saveregs (void)
100{
101  error ("__builtin_saveregs not supported by this target");
102  return const0_rtx;
103}
104
105void
106default_setup_incoming_varargs (CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED,
107				enum machine_mode mode ATTRIBUTE_UNUSED,
108				tree type ATTRIBUTE_UNUSED,
109				int *pretend_arg_size ATTRIBUTE_UNUSED,
110				int second_time ATTRIBUTE_UNUSED)
111{
112}
113
114/* The default implementation of TARGET_BUILTIN_SETJMP_FRAME_VALUE.  */
115
116rtx
117default_builtin_setjmp_frame_value (void)
118{
119  return virtual_stack_vars_rtx;
120}
121
122/* Generic hook that takes a CUMULATIVE_ARGS pointer and returns false.  */
123
124bool
125hook_bool_CUMULATIVE_ARGS_false (CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED)
126{
127  return false;
128}
129
130bool
131default_pretend_outgoing_varargs_named (CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED)
132{
133  return (targetm.calls.setup_incoming_varargs
134	  != default_setup_incoming_varargs);
135}
136
137enum machine_mode
138default_eh_return_filter_mode (void)
139{
140  return word_mode;
141}
142
143/* The default implementation of TARGET_SHIFT_TRUNCATION_MASK.  */
144
145unsigned HOST_WIDE_INT
146default_shift_truncation_mask (enum machine_mode mode)
147{
148  return SHIFT_COUNT_TRUNCATED ? GET_MODE_BITSIZE (mode) - 1 : 0;
149}
150
151/* The default implementation of TARGET_MIN_DIVISIONS_FOR_RECIP_MUL.  */
152
153unsigned int
154default_min_divisions_for_recip_mul (enum machine_mode mode ATTRIBUTE_UNUSED)
155{
156  return have_insn_for (DIV, mode) ? 3 : 2;
157}
158
159/* The default implementation of TARGET_MODE_REP_EXTENDED.  */
160
161int
162default_mode_rep_extended (enum machine_mode mode ATTRIBUTE_UNUSED,
163			   enum machine_mode mode_rep ATTRIBUTE_UNUSED)
164{
165  return UNKNOWN;
166}
167
168/* Generic hook that takes a CUMULATIVE_ARGS pointer and returns true.  */
169
170bool
171hook_bool_CUMULATIVE_ARGS_true (CUMULATIVE_ARGS * a ATTRIBUTE_UNUSED)
172{
173  return true;
174}
175
176
177/* The generic C++ ABI specifies this is a 64-bit value.  */
178tree
179default_cxx_guard_type (void)
180{
181  return long_long_integer_type_node;
182}
183
184
185/* Returns the size of the cookie to use when allocating an array
186   whose elements have the indicated TYPE.  Assumes that it is already
187   known that a cookie is needed.  */
188
189tree
190default_cxx_get_cookie_size (tree type)
191{
192  tree cookie_size;
193
194  /* We need to allocate an additional max (sizeof (size_t), alignof
195     (true_type)) bytes.  */
196  tree sizetype_size;
197  tree type_align;
198
199  sizetype_size = size_in_bytes (sizetype);
200  type_align = size_int (TYPE_ALIGN_UNIT (type));
201  if (INT_CST_LT_UNSIGNED (type_align, sizetype_size))
202    cookie_size = sizetype_size;
203  else
204    cookie_size = type_align;
205
206  return cookie_size;
207}
208
209/* Return true if a parameter must be passed by reference.  This version
210   of the TARGET_PASS_BY_REFERENCE hook uses just MUST_PASS_IN_STACK.  */
211
212bool
213hook_pass_by_reference_must_pass_in_stack (CUMULATIVE_ARGS *c ATTRIBUTE_UNUSED,
214	enum machine_mode mode ATTRIBUTE_UNUSED, tree type ATTRIBUTE_UNUSED,
215	bool named_arg ATTRIBUTE_UNUSED)
216{
217  return targetm.calls.must_pass_in_stack (mode, type);
218}
219
220/* Return true if a parameter follows callee copies conventions.  This
221   version of the hook is true for all named arguments.  */
222
223bool
224hook_callee_copies_named (CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED,
225			  enum machine_mode mode ATTRIBUTE_UNUSED,
226			  tree type ATTRIBUTE_UNUSED, bool named)
227{
228  return named;
229}
230
231/* Emit any directives required to unwind this instruction.  */
232
233void
234default_unwind_emit (FILE * stream ATTRIBUTE_UNUSED,
235		     rtx insn ATTRIBUTE_UNUSED)
236{
237  /* Should never happen.  */
238  gcc_unreachable ();
239}
240
241/* True if MODE is valid for the target.  By "valid", we mean able to
242   be manipulated in non-trivial ways.  In particular, this means all
243   the arithmetic is supported.
244
245   By default we guess this means that any C type is supported.  If
246   we can't map the mode back to a type that would be available in C,
247   then reject it.  Special case, here, is the double-word arithmetic
248   supported by optabs.c.  */
249
250bool
251default_scalar_mode_supported_p (enum machine_mode mode)
252{
253  int precision = GET_MODE_PRECISION (mode);
254
255  switch (GET_MODE_CLASS (mode))
256    {
257    case MODE_PARTIAL_INT:
258    case MODE_INT:
259      if (precision == CHAR_TYPE_SIZE)
260	return true;
261      if (precision == SHORT_TYPE_SIZE)
262	return true;
263      if (precision == INT_TYPE_SIZE)
264	return true;
265      if (precision == LONG_TYPE_SIZE)
266	return true;
267      if (precision == LONG_LONG_TYPE_SIZE)
268	return true;
269      if (precision == 2 * BITS_PER_WORD)
270	return true;
271      return false;
272
273    case MODE_FLOAT:
274      if (precision == FLOAT_TYPE_SIZE)
275	return true;
276      if (precision == DOUBLE_TYPE_SIZE)
277	return true;
278      if (precision == LONG_DOUBLE_TYPE_SIZE)
279	return true;
280      return false;
281
282    case MODE_DECIMAL_FLOAT:
283      return false;
284
285    default:
286      gcc_unreachable ();
287    }
288}
289
290/* True if the target supports decimal floating point.  */
291
292bool
293default_decimal_float_supported_p (void)
294{
295  return ENABLE_DECIMAL_FLOAT;
296}
297
298/* NULL if INSN insn is valid within a low-overhead loop, otherwise returns
299   an error message.
300
301   This function checks whether a given INSN is valid within a low-overhead
302   loop.  If INSN is invalid it returns the reason for that, otherwise it
303   returns NULL. A called function may clobber any special registers required
304   for low-overhead looping. Additionally, some targets (eg, PPC) use the count
305   register for branch on table instructions. We reject the doloop pattern in
306   these cases.  */
307
308const char *
309default_invalid_within_doloop (rtx insn)
310{
311  if (CALL_P (insn))
312    return "Function call in loop.";
313
314  if (JUMP_P (insn)
315      && (GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC
316	  || GET_CODE (PATTERN (insn)) == ADDR_VEC))
317    return "Computed branch in the loop.";
318
319  return NULL;
320}
321
322bool
323hook_bool_CUMULATIVE_ARGS_mode_tree_bool_false (
324	CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED,
325	enum machine_mode mode ATTRIBUTE_UNUSED,
326	tree type ATTRIBUTE_UNUSED, bool named ATTRIBUTE_UNUSED)
327{
328  return false;
329}
330
331bool
332hook_bool_CUMULATIVE_ARGS_mode_tree_bool_true (
333	CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED,
334	enum machine_mode mode ATTRIBUTE_UNUSED,
335	tree type ATTRIBUTE_UNUSED, bool named ATTRIBUTE_UNUSED)
336{
337  return true;
338}
339
340int
341hook_int_CUMULATIVE_ARGS_mode_tree_bool_0 (
342	CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED,
343	enum machine_mode mode ATTRIBUTE_UNUSED,
344	tree type ATTRIBUTE_UNUSED, bool named ATTRIBUTE_UNUSED)
345{
346  return 0;
347}
348
349void
350hook_void_bitmap (bitmap regs ATTRIBUTE_UNUSED)
351{
352}
353
354const char *
355hook_invalid_arg_for_unprototyped_fn (
356	tree typelist ATTRIBUTE_UNUSED,
357	tree funcdecl ATTRIBUTE_UNUSED,
358	tree val ATTRIBUTE_UNUSED)
359{
360  return NULL;
361}
362
363/* Initialize the stack protection decls.  */
364
365/* Stack protection related decls living in libgcc.  */
366static GTY(()) tree stack_chk_guard_decl;
367
368tree
369default_stack_protect_guard (void)
370{
371  tree t = stack_chk_guard_decl;
372
373  if (t == NULL)
374    {
375      t = build_decl (VAR_DECL, get_identifier ("__stack_chk_guard"),
376		      ptr_type_node);
377      TREE_STATIC (t) = 1;
378      TREE_PUBLIC (t) = 1;
379      DECL_EXTERNAL (t) = 1;
380      TREE_USED (t) = 1;
381      TREE_THIS_VOLATILE (t) = 1;
382      DECL_ARTIFICIAL (t) = 1;
383      DECL_IGNORED_P (t) = 1;
384
385      stack_chk_guard_decl = t;
386    }
387
388  return t;
389}
390
391static GTY(()) tree stack_chk_fail_decl;
392
393tree
394default_external_stack_protect_fail (void)
395{
396  tree t = stack_chk_fail_decl;
397
398  if (t == NULL_TREE)
399    {
400      t = build_function_type_list (void_type_node, NULL_TREE);
401      t = build_decl (FUNCTION_DECL, get_identifier ("__stack_chk_fail"), t);
402      TREE_STATIC (t) = 1;
403      TREE_PUBLIC (t) = 1;
404      DECL_EXTERNAL (t) = 1;
405      TREE_USED (t) = 1;
406      TREE_THIS_VOLATILE (t) = 1;
407      TREE_NOTHROW (t) = 1;
408      DECL_ARTIFICIAL (t) = 1;
409      DECL_IGNORED_P (t) = 1;
410      DECL_VISIBILITY (t) = VISIBILITY_DEFAULT;
411      DECL_VISIBILITY_SPECIFIED (t) = 1;
412
413      stack_chk_fail_decl = t;
414    }
415
416  return build_function_call_expr (t, NULL_TREE);
417}
418
419tree
420default_hidden_stack_protect_fail (void)
421{
422#ifndef HAVE_GAS_HIDDEN
423  return default_external_stack_protect_fail ();
424#else
425  tree t = stack_chk_fail_decl;
426
427  if (!flag_pic)
428    return default_external_stack_protect_fail ();
429
430  if (t == NULL_TREE)
431    {
432      t = build_function_type_list (void_type_node, NULL_TREE);
433      t = build_decl (FUNCTION_DECL,
434		      get_identifier ("__stack_chk_fail_local"), t);
435      TREE_STATIC (t) = 1;
436      TREE_PUBLIC (t) = 1;
437      DECL_EXTERNAL (t) = 1;
438      TREE_USED (t) = 1;
439      TREE_THIS_VOLATILE (t) = 1;
440      TREE_NOTHROW (t) = 1;
441      DECL_ARTIFICIAL (t) = 1;
442      DECL_IGNORED_P (t) = 1;
443      DECL_VISIBILITY_SPECIFIED (t) = 1;
444      DECL_VISIBILITY (t) = VISIBILITY_HIDDEN;
445
446      stack_chk_fail_decl = t;
447    }
448
449  return build_function_call_expr (t, NULL_TREE);
450#endif
451}
452
453bool
454hook_bool_rtx_commutative_p (rtx x, int outer_code ATTRIBUTE_UNUSED)
455{
456  return COMMUTATIVE_P (x);
457}
458
459rtx
460default_function_value (tree ret_type ATTRIBUTE_UNUSED,
461			tree fn_decl_or_type,
462			bool outgoing ATTRIBUTE_UNUSED)
463{
464  /* The old interface doesn't handle receiving the function type.  */
465  if (fn_decl_or_type
466      && !DECL_P (fn_decl_or_type))
467    fn_decl_or_type = NULL;
468
469#ifdef FUNCTION_OUTGOING_VALUE
470  if (outgoing)
471    return FUNCTION_OUTGOING_VALUE (ret_type, fn_decl_or_type);
472#endif
473
474#ifdef FUNCTION_VALUE
475  return FUNCTION_VALUE (ret_type, fn_decl_or_type);
476#else
477  return NULL_RTX;
478#endif
479}
480
481rtx
482default_internal_arg_pointer (void)
483{
484  /* If the reg that the virtual arg pointer will be translated into is
485     not a fixed reg or is the stack pointer, make a copy of the virtual
486     arg pointer, and address parms via the copy.  The frame pointer is
487     considered fixed even though it is not marked as such.  */
488  if ((ARG_POINTER_REGNUM == STACK_POINTER_REGNUM
489       || ! (fixed_regs[ARG_POINTER_REGNUM]
490	     || ARG_POINTER_REGNUM == FRAME_POINTER_REGNUM)))
491    return copy_to_reg (virtual_incoming_args_rtx);
492  else
493    return virtual_incoming_args_rtx;
494}
495
496enum reg_class
497default_secondary_reload (bool in_p ATTRIBUTE_UNUSED, rtx x ATTRIBUTE_UNUSED,
498			  enum reg_class reload_class ATTRIBUTE_UNUSED,
499			  enum machine_mode reload_mode ATTRIBUTE_UNUSED,
500			  secondary_reload_info *sri)
501{
502  enum reg_class class = NO_REGS;
503
504  if (sri->prev_sri && sri->prev_sri->t_icode != CODE_FOR_nothing)
505    {
506      sri->icode = sri->prev_sri->t_icode;
507      return NO_REGS;
508    }
509#ifdef SECONDARY_INPUT_RELOAD_CLASS
510  if (in_p)
511    class = SECONDARY_INPUT_RELOAD_CLASS (reload_class, reload_mode, x);
512#endif
513#ifdef SECONDARY_OUTPUT_RELOAD_CLASS
514  if (! in_p)
515    class = SECONDARY_OUTPUT_RELOAD_CLASS (reload_class, reload_mode, x);
516#endif
517  if (class != NO_REGS)
518    {
519      enum insn_code icode = (in_p ? reload_in_optab[(int) reload_mode]
520			      : reload_out_optab[(int) reload_mode]);
521
522      if (icode != CODE_FOR_nothing
523	  && insn_data[(int) icode].operand[in_p].predicate
524	  && ! insn_data[(int) icode].operand[in_p].predicate (x, reload_mode))
525	icode = CODE_FOR_nothing;
526      else if (icode != CODE_FOR_nothing)
527	{
528	  const char *insn_constraint, *scratch_constraint;
529	  char insn_letter, scratch_letter;
530	  enum reg_class insn_class, scratch_class;
531
532	  gcc_assert (insn_data[(int) icode].n_operands == 3);
533	  insn_constraint = insn_data[(int) icode].operand[!in_p].constraint;
534	  if (!*insn_constraint)
535	    insn_class = ALL_REGS;
536	  else
537	    {
538	      if (in_p)
539		{
540		  gcc_assert (*insn_constraint == '=');
541		  insn_constraint++;
542		}
543	      insn_letter = *insn_constraint;
544	      insn_class
545		= (insn_letter == 'r' ? GENERAL_REGS
546		   : REG_CLASS_FROM_CONSTRAINT ((unsigned char) insn_letter,
547						insn_constraint));
548	      gcc_assert (insn_class != NO_REGS);
549	    }
550
551	  scratch_constraint = insn_data[(int) icode].operand[2].constraint;
552	  /* The scratch register's constraint must start with "=&",
553	     except for an input reload, where only "=" is necessary,
554	     and where it might be beneficial to re-use registers from
555	     the input.  */
556	  gcc_assert (scratch_constraint[0] == '='
557		      && (in_p || scratch_constraint[1] == '&'));
558	  scratch_constraint++;
559	  if (*scratch_constraint == '&')
560	    scratch_constraint++;
561	  scratch_letter = *scratch_constraint;
562	  scratch_class
563	    = (scratch_letter == 'r' ? GENERAL_REGS
564	       : REG_CLASS_FROM_CONSTRAINT ((unsigned char) scratch_letter,
565					    scratch_constraint));
566
567	  if (reg_class_subset_p (reload_class, insn_class))
568	    {
569	      gcc_assert (scratch_class == class);
570	      class = NO_REGS;
571	    }
572	  else
573	    class = insn_class;
574
575        }
576      if (class == NO_REGS)
577	sri->icode = icode;
578      else
579	sri->t_icode = icode;
580    }
581  return class;
582}
583
584
585/* If STRICT_ALIGNMENT is true we use the container type for accessing
586   volatile bitfields.  This is generally the preferred behavior for memory
587   mapped peripherals on RISC architectures.
588   If STRICT_ALIGNMENT is false we use the narrowest type possible.  This
589   is typically used to avoid spurious page faults and extra memory accesses
590   due to unaligned accesses on CISC architectures.  */
591
592bool
593default_narrow_bitfield (void)
594{
595  return !STRICT_ALIGNMENT;
596}
597
598/* By default, if flag_pic is true, then neither local nor global relocs
599   should be placed in readonly memory.  */
600
601int
602default_reloc_rw_mask (void)
603{
604  return flag_pic ? 3 : 0;
605}
606
607bool
608default_builtin_vector_alignment_reachable (tree type, bool is_packed)
609{
610  if (is_packed)
611    return false;
612
613  /* Assuming that types whose size is > pointer-size are not guaranteed to be
614     naturally aligned.  */
615  if (tree_int_cst_compare (TYPE_SIZE (type), bitsize_int (POINTER_SIZE)) > 0)
616    return false;
617
618  /* Assuming that types whose size is <= pointer-size
619     are naturally aligned.  */
620  return true;
621}
622
623#include "gt-targhooks.h"
624