genattrtab.c (write_header): Include hash-set.h...
[platform/upstream/gcc.git] / gcc / targhooks.c
1 /* Default target hook functions.
2    Copyright (C) 2003-2015 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3.  If not see
18 <http://www.gnu.org/licenses/>.  */
19
20 /* The migration of target macros to target hooks works as follows:
21
22    1. Create a target hook that uses the existing target macros to
23       implement the same functionality.
24
25    2. Convert all the MI files to use the hook instead of the macro.
26
27    3. Repeat for a majority of the remaining target macros.  This will
28       take some time.
29
30    4. Tell target maintainers to start migrating.
31
32    5. Eventually convert the backends to override the hook instead of
33       defining the macros.  This will take some time too.
34
35    6. TBD when, poison the macros.  Unmigrated targets will break at
36       this point.
37
38    Note that we expect steps 1-3 to be done by the people that
39    understand what the MI does with each macro, and step 5 to be done
40    by the target maintainers for their respective targets.
41
42    Note that steps 1 and 2 don't have to be done together, but no
43    target can override the new hook until step 2 is complete for it.
44
45    Once the macros are poisoned, we will revert to the old migration
46    rules - migrate the macro, callers, and targets all at once.  This
47    comment can thus be removed at that point.  */
48
49 #include "config.h"
50 #include "system.h"
51 #include "coretypes.h"
52 #include "tm.h"
53 #include "machmode.h"
54 #include "rtl.h"
55 #include "hash-set.h"
56 #include "machmode.h"
57 #include "vec.h"
58 #include "double-int.h"
59 #include "input.h"
60 #include "alias.h"
61 #include "symtab.h"
62 #include "wide-int.h"
63 #include "inchash.h"
64 #include "tree.h"
65 #include "fold-const.h"
66 #include "stor-layout.h"
67 #include "varasm.h"
68 #include "expr.h"
69 #include "output.h"
70 #include "diagnostic-core.h"
71 #include "hard-reg-set.h"
72 #include "input.h"
73 #include "function.h"
74 #include "target.h"
75 #include "tm_p.h"
76 #include "target-def.h"
77 #include "regs.h"
78 #include "reload.h"
79 #include "insn-codes.h"
80 #include "optabs.h"
81 #include "recog.h"
82 #include "intl.h"
83 #include "opts.h"
84 #include "tree-ssa-alias.h"
85 #include "gimple-expr.h"
86 #include "gimplify.h"
87 #include "stringpool.h"
88 #include "tree-ssanames.h"
89
90
91 bool
92 default_legitimate_address_p (machine_mode mode ATTRIBUTE_UNUSED,
93                               rtx addr ATTRIBUTE_UNUSED,
94                               bool strict ATTRIBUTE_UNUSED)
95 {
96 #ifdef GO_IF_LEGITIMATE_ADDRESS
97   /* Defer to the old implementation using a goto.  */
98   if (strict)
99     return strict_memory_address_p (mode, addr);
100   else
101     return memory_address_p (mode, addr);
102 #else
103   gcc_unreachable ();
104 #endif
105 }
106
107 void
108 default_external_libcall (rtx fun ATTRIBUTE_UNUSED)
109 {
110 #ifdef ASM_OUTPUT_EXTERNAL_LIBCALL
111   ASM_OUTPUT_EXTERNAL_LIBCALL (asm_out_file, fun);
112 #endif
113 }
114
115 int
116 default_unspec_may_trap_p (const_rtx x, unsigned flags)
117 {
118   int i;
119
120   /* Any floating arithmetic may trap.  */
121   if ((SCALAR_FLOAT_MODE_P (GET_MODE (x)) && flag_trapping_math))
122     return 1;
123
124   for (i = 0; i < XVECLEN (x, 0); ++i)
125     {
126       if (may_trap_p_1 (XVECEXP (x, 0, i), flags))
127         return 1;
128     }
129
130   return 0;
131 }
132
133 machine_mode
134 default_promote_function_mode (const_tree type ATTRIBUTE_UNUSED,
135                                machine_mode mode,
136                                int *punsignedp ATTRIBUTE_UNUSED,
137                                const_tree funtype ATTRIBUTE_UNUSED,
138                                int for_return ATTRIBUTE_UNUSED)
139 {
140   if (type != NULL_TREE && for_return == 2)
141     return promote_mode (type, mode, punsignedp);
142   return mode;
143 }
144
145 machine_mode
146 default_promote_function_mode_always_promote (const_tree type,
147                                               machine_mode mode,
148                                               int *punsignedp,
149                                               const_tree funtype ATTRIBUTE_UNUSED,
150                                               int for_return ATTRIBUTE_UNUSED)
151 {
152   return promote_mode (type, mode, punsignedp);
153 }
154
155 machine_mode
156 default_cc_modes_compatible (machine_mode m1, machine_mode m2)
157 {
158   if (m1 == m2)
159     return m1;
160   return VOIDmode;
161 }
162
163 bool
164 default_return_in_memory (const_tree type,
165                           const_tree fntype ATTRIBUTE_UNUSED)
166 {
167   return (TYPE_MODE (type) == BLKmode);
168 }
169
170 rtx
171 default_legitimize_address (rtx x, rtx orig_x ATTRIBUTE_UNUSED,
172                             machine_mode mode ATTRIBUTE_UNUSED)
173 {
174   return x;
175 }
176
177 bool
178 default_legitimize_address_displacement (rtx *disp ATTRIBUTE_UNUSED,
179                                          rtx *offset ATTRIBUTE_UNUSED,
180                                          machine_mode mode ATTRIBUTE_UNUSED)
181 {
182   return false;
183 }
184
185 rtx
186 default_expand_builtin_saveregs (void)
187 {
188   error ("__builtin_saveregs not supported by this target");
189   return const0_rtx;
190 }
191
192 void
193 default_setup_incoming_varargs (cumulative_args_t ca ATTRIBUTE_UNUSED,
194                                 machine_mode mode ATTRIBUTE_UNUSED,
195                                 tree type ATTRIBUTE_UNUSED,
196                                 int *pretend_arg_size ATTRIBUTE_UNUSED,
197                                 int second_time ATTRIBUTE_UNUSED)
198 {
199 }
200
201 /* The default implementation of TARGET_BUILTIN_SETJMP_FRAME_VALUE.  */
202
203 rtx
204 default_builtin_setjmp_frame_value (void)
205 {
206   return virtual_stack_vars_rtx;
207 }
208
209 /* Generic hook that takes a CUMULATIVE_ARGS pointer and returns false.  */
210
211 bool
212 hook_bool_CUMULATIVE_ARGS_false (cumulative_args_t ca ATTRIBUTE_UNUSED)
213 {
214   return false;
215 }
216
217 bool
218 default_pretend_outgoing_varargs_named (cumulative_args_t ca ATTRIBUTE_UNUSED)
219 {
220   return (targetm.calls.setup_incoming_varargs
221           != default_setup_incoming_varargs);
222 }
223
224 machine_mode
225 default_eh_return_filter_mode (void)
226 {
227   return targetm.unwind_word_mode ();
228 }
229
230 machine_mode
231 default_libgcc_cmp_return_mode (void)
232 {
233   return word_mode;
234 }
235
236 machine_mode
237 default_libgcc_shift_count_mode (void)
238 {
239   return word_mode;
240 }
241
242 machine_mode
243 default_unwind_word_mode (void)
244 {
245   return word_mode;
246 }
247
248 /* The default implementation of TARGET_SHIFT_TRUNCATION_MASK.  */
249
250 unsigned HOST_WIDE_INT
251 default_shift_truncation_mask (machine_mode mode)
252 {
253   return SHIFT_COUNT_TRUNCATED ? GET_MODE_BITSIZE (mode) - 1 : 0;
254 }
255
256 /* The default implementation of TARGET_MIN_DIVISIONS_FOR_RECIP_MUL.  */
257
258 unsigned int
259 default_min_divisions_for_recip_mul (machine_mode mode ATTRIBUTE_UNUSED)
260 {
261   return have_insn_for (DIV, mode) ? 3 : 2;
262 }
263
264 /* The default implementation of TARGET_MODE_REP_EXTENDED.  */
265
266 int
267 default_mode_rep_extended (machine_mode mode ATTRIBUTE_UNUSED,
268                            machine_mode mode_rep ATTRIBUTE_UNUSED)
269 {
270   return UNKNOWN;
271 }
272
273 /* Generic hook that takes a CUMULATIVE_ARGS pointer and returns true.  */
274
275 bool
276 hook_bool_CUMULATIVE_ARGS_true (cumulative_args_t a ATTRIBUTE_UNUSED)
277 {
278   return true;
279 }
280
281 /* Return machine mode for non-standard suffix
282    or VOIDmode if non-standard suffixes are unsupported.  */
283 machine_mode
284 default_mode_for_suffix (char suffix ATTRIBUTE_UNUSED)
285 {
286   return VOIDmode;
287 }
288
289 /* The generic C++ ABI specifies this is a 64-bit value.  */
290 tree
291 default_cxx_guard_type (void)
292 {
293   return long_long_integer_type_node;
294 }
295
296 /* Returns the size of the cookie to use when allocating an array
297    whose elements have the indicated TYPE.  Assumes that it is already
298    known that a cookie is needed.  */
299
300 tree
301 default_cxx_get_cookie_size (tree type)
302 {
303   tree cookie_size;
304
305   /* We need to allocate an additional max (sizeof (size_t), alignof
306      (true_type)) bytes.  */
307   tree sizetype_size;
308   tree type_align;
309
310   sizetype_size = size_in_bytes (sizetype);
311   type_align = size_int (TYPE_ALIGN_UNIT (type));
312   if (tree_int_cst_lt (type_align, sizetype_size))
313     cookie_size = sizetype_size;
314   else
315     cookie_size = type_align;
316
317   return cookie_size;
318 }
319
320 /* Return true if a parameter must be passed by reference.  This version
321    of the TARGET_PASS_BY_REFERENCE hook uses just MUST_PASS_IN_STACK.  */
322
323 bool
324 hook_pass_by_reference_must_pass_in_stack (cumulative_args_t c ATTRIBUTE_UNUSED,
325         machine_mode mode ATTRIBUTE_UNUSED, const_tree type ATTRIBUTE_UNUSED,
326         bool named_arg ATTRIBUTE_UNUSED)
327 {
328   return targetm.calls.must_pass_in_stack (mode, type);
329 }
330
331 /* Return true if a parameter follows callee copies conventions.  This
332    version of the hook is true for all named arguments.  */
333
334 bool
335 hook_callee_copies_named (cumulative_args_t ca ATTRIBUTE_UNUSED,
336                           machine_mode mode ATTRIBUTE_UNUSED,
337                           const_tree type ATTRIBUTE_UNUSED, bool named)
338 {
339   return named;
340 }
341
342 /* Emit to STREAM the assembler syntax for insn operand X.  */
343
344 void
345 default_print_operand (FILE *stream ATTRIBUTE_UNUSED, rtx x ATTRIBUTE_UNUSED,
346                        int code ATTRIBUTE_UNUSED)
347 {
348 #ifdef PRINT_OPERAND
349   PRINT_OPERAND (stream, x, code);
350 #else
351   gcc_unreachable ();
352 #endif
353 }
354
355 /* Emit to STREAM the assembler syntax for an insn operand whose memory
356    address is X.  */
357
358 void
359 default_print_operand_address (FILE *stream ATTRIBUTE_UNUSED,
360                                rtx x ATTRIBUTE_UNUSED)
361 {
362 #ifdef PRINT_OPERAND_ADDRESS
363   PRINT_OPERAND_ADDRESS (stream, x);
364 #else
365   gcc_unreachable ();
366 #endif
367 }
368
369 /* Return true if CODE is a valid punctuation character for the
370    `print_operand' hook.  */
371
372 bool
373 default_print_operand_punct_valid_p (unsigned char code ATTRIBUTE_UNUSED)
374 {
375 #ifdef PRINT_OPERAND_PUNCT_VALID_P
376   return PRINT_OPERAND_PUNCT_VALID_P (code);
377 #else
378   return false;
379 #endif
380 }
381
382 /* The default implementation of TARGET_MANGLE_ASSEMBLER_NAME.  */
383 tree
384 default_mangle_assembler_name (const char *name ATTRIBUTE_UNUSED)
385 {
386   const char *skipped = name + (*name == '*' ? 1 : 0);
387   const char *stripped = targetm.strip_name_encoding (skipped);
388   if (*name != '*' && user_label_prefix[0])
389     stripped = ACONCAT ((user_label_prefix, stripped, NULL));
390   return get_identifier (stripped);
391 }
392
393 /* True if MODE is valid for the target.  By "valid", we mean able to
394    be manipulated in non-trivial ways.  In particular, this means all
395    the arithmetic is supported.
396
397    By default we guess this means that any C type is supported.  If
398    we can't map the mode back to a type that would be available in C,
399    then reject it.  Special case, here, is the double-word arithmetic
400    supported by optabs.c.  */
401
402 bool
403 default_scalar_mode_supported_p (machine_mode mode)
404 {
405   int precision = GET_MODE_PRECISION (mode);
406
407   switch (GET_MODE_CLASS (mode))
408     {
409     case MODE_PARTIAL_INT:
410     case MODE_INT:
411       if (precision == CHAR_TYPE_SIZE)
412         return true;
413       if (precision == SHORT_TYPE_SIZE)
414         return true;
415       if (precision == INT_TYPE_SIZE)
416         return true;
417       if (precision == LONG_TYPE_SIZE)
418         return true;
419       if (precision == LONG_LONG_TYPE_SIZE)
420         return true;
421       if (precision == 2 * BITS_PER_WORD)
422         return true;
423       return false;
424
425     case MODE_FLOAT:
426       if (precision == FLOAT_TYPE_SIZE)
427         return true;
428       if (precision == DOUBLE_TYPE_SIZE)
429         return true;
430       if (precision == LONG_DOUBLE_TYPE_SIZE)
431         return true;
432       return false;
433
434     case MODE_DECIMAL_FLOAT:
435     case MODE_FRACT:
436     case MODE_UFRACT:
437     case MODE_ACCUM:
438     case MODE_UACCUM:
439       return false;
440
441     default:
442       gcc_unreachable ();
443     }
444 }
445
446 /* Return true if libgcc supports floating-point mode MODE (known to
447    be supported as a scalar mode).  */
448
449 bool
450 default_libgcc_floating_mode_supported_p (machine_mode mode)
451 {
452   switch (mode)
453     {
454 #ifdef HAVE_SFmode
455     case SFmode:
456 #endif
457 #ifdef HAVE_DFmode
458     case DFmode:
459 #endif
460 #ifdef HAVE_XFmode
461     case XFmode:
462 #endif
463 #ifdef HAVE_TFmode
464     case TFmode:
465 #endif
466       return true;
467
468     default:
469       return false;
470     }
471 }
472
473 /* Make some target macros useable by target-independent code.  */
474 bool
475 targhook_words_big_endian (void)
476 {
477   return !!WORDS_BIG_ENDIAN;
478 }
479
480 bool
481 targhook_float_words_big_endian (void)
482 {
483   return !!FLOAT_WORDS_BIG_ENDIAN;
484 }
485
486 /* True if the target supports floating-point exceptions and rounding
487    modes.  */
488
489 bool
490 default_float_exceptions_rounding_supported_p (void)
491 {
492 #ifdef HAVE_adddf3
493   return HAVE_adddf3;
494 #else
495   return false;
496 #endif
497 }
498
499 /* True if the target supports decimal floating point.  */
500
501 bool
502 default_decimal_float_supported_p (void)
503 {
504   return ENABLE_DECIMAL_FLOAT;
505 }
506
507 /* True if the target supports fixed-point arithmetic.  */
508
509 bool
510 default_fixed_point_supported_p (void)
511 {
512   return ENABLE_FIXED_POINT;
513 }
514
515 /* True if the target supports GNU indirect functions.  */
516
517 bool
518 default_has_ifunc_p (void)
519 {
520   return HAVE_GNU_INDIRECT_FUNCTION;
521 }
522
523 /* NULL if INSN insn is valid within a low-overhead loop, otherwise returns
524    an error message.
525
526    This function checks whether a given INSN is valid within a low-overhead
527    loop.  If INSN is invalid it returns the reason for that, otherwise it
528    returns NULL. A called function may clobber any special registers required
529    for low-overhead looping. Additionally, some targets (eg, PPC) use the count
530    register for branch on table instructions. We reject the doloop pattern in
531    these cases.  */
532
533 const char *
534 default_invalid_within_doloop (const rtx_insn *insn)
535 {
536   if (CALL_P (insn))
537     return "Function call in loop.";
538
539   if (tablejump_p (insn, NULL, NULL) || computed_jump_p (insn))
540     return "Computed branch in the loop.";
541
542   return NULL;
543 }
544
545 /* Mapping of builtin functions to vectorized variants.  */
546
547 tree
548 default_builtin_vectorized_function (tree fndecl ATTRIBUTE_UNUSED,
549                                      tree type_out ATTRIBUTE_UNUSED,
550                                      tree type_in ATTRIBUTE_UNUSED)
551 {
552   return NULL_TREE;
553 }
554
555 /* Vectorized conversion.  */
556
557 tree
558 default_builtin_vectorized_conversion (unsigned int code ATTRIBUTE_UNUSED,
559                                        tree dest_type ATTRIBUTE_UNUSED,
560                                        tree src_type ATTRIBUTE_UNUSED)
561 {
562   return NULL_TREE;
563 }
564
565 /* Default vectorizer cost model values.  */
566
567 int
568 default_builtin_vectorization_cost (enum vect_cost_for_stmt type_of_cost,
569                                     tree vectype,
570                                     int misalign ATTRIBUTE_UNUSED)
571 {
572   unsigned elements;
573
574   switch (type_of_cost)
575     {
576       case scalar_stmt:
577       case scalar_load:
578       case scalar_store:
579       case vector_stmt:
580       case vector_load:
581       case vector_store:
582       case vec_to_scalar:
583       case scalar_to_vec:
584       case cond_branch_not_taken:
585       case vec_perm:
586       case vec_promote_demote:
587         return 1;
588
589       case unaligned_load:
590       case unaligned_store:
591         return 2;
592
593       case cond_branch_taken:
594         return 3;
595
596       case vec_construct:
597         elements = TYPE_VECTOR_SUBPARTS (vectype);
598         return elements / 2 + 1;
599
600       default:
601         gcc_unreachable ();
602     }
603 }
604
605 /* Reciprocal.  */
606
607 tree
608 default_builtin_reciprocal (unsigned int fn ATTRIBUTE_UNUSED,
609                             bool md_fn ATTRIBUTE_UNUSED,
610                             bool sqrt ATTRIBUTE_UNUSED)
611 {
612   return NULL_TREE;
613 }
614
615 bool
616 hook_bool_CUMULATIVE_ARGS_mode_tree_bool_false (
617         cumulative_args_t ca ATTRIBUTE_UNUSED,
618         machine_mode mode ATTRIBUTE_UNUSED,
619         const_tree type ATTRIBUTE_UNUSED, bool named ATTRIBUTE_UNUSED)
620 {
621   return false;
622 }
623
624 bool
625 hook_bool_CUMULATIVE_ARGS_mode_tree_bool_true (
626         cumulative_args_t ca ATTRIBUTE_UNUSED,
627         machine_mode mode ATTRIBUTE_UNUSED,
628         const_tree type ATTRIBUTE_UNUSED, bool named ATTRIBUTE_UNUSED)
629 {
630   return true;
631 }
632
633 int
634 hook_int_CUMULATIVE_ARGS_mode_tree_bool_0 (
635         cumulative_args_t ca ATTRIBUTE_UNUSED,
636         machine_mode mode ATTRIBUTE_UNUSED,
637         tree type ATTRIBUTE_UNUSED, bool named ATTRIBUTE_UNUSED)
638 {
639   return 0;
640 }
641
642 void
643 default_function_arg_advance (cumulative_args_t ca ATTRIBUTE_UNUSED,
644                               machine_mode mode ATTRIBUTE_UNUSED,
645                               const_tree type ATTRIBUTE_UNUSED,
646                               bool named ATTRIBUTE_UNUSED)
647 {
648   gcc_unreachable ();
649 }
650
651 rtx
652 default_function_arg (cumulative_args_t ca ATTRIBUTE_UNUSED,
653                       machine_mode mode ATTRIBUTE_UNUSED,
654                       const_tree type ATTRIBUTE_UNUSED,
655                       bool named ATTRIBUTE_UNUSED)
656 {
657   gcc_unreachable ();
658 }
659
660 rtx
661 default_function_incoming_arg (cumulative_args_t ca ATTRIBUTE_UNUSED,
662                                machine_mode mode ATTRIBUTE_UNUSED,
663                                const_tree type ATTRIBUTE_UNUSED,
664                                bool named ATTRIBUTE_UNUSED)
665 {
666   gcc_unreachable ();
667 }
668
669 unsigned int
670 default_function_arg_boundary (machine_mode mode ATTRIBUTE_UNUSED,
671                                const_tree type ATTRIBUTE_UNUSED)
672 {
673   return PARM_BOUNDARY;
674 }
675
676 unsigned int
677 default_function_arg_round_boundary (machine_mode mode ATTRIBUTE_UNUSED,
678                                      const_tree type ATTRIBUTE_UNUSED)
679 {
680   return PARM_BOUNDARY;
681 }
682
683 void
684 hook_void_bitmap (bitmap regs ATTRIBUTE_UNUSED)
685 {
686 }
687
688 const char *
689 hook_invalid_arg_for_unprototyped_fn (
690         const_tree typelist ATTRIBUTE_UNUSED,
691         const_tree funcdecl ATTRIBUTE_UNUSED,
692         const_tree val ATTRIBUTE_UNUSED)
693 {
694   return NULL;
695 }
696
697 /* Initialize the stack protection decls.  */
698
699 /* Stack protection related decls living in libgcc.  */
700 static GTY(()) tree stack_chk_guard_decl;
701
702 tree
703 default_stack_protect_guard (void)
704 {
705   tree t = stack_chk_guard_decl;
706
707   if (t == NULL)
708     {
709       rtx x;
710
711       t = build_decl (UNKNOWN_LOCATION,
712                       VAR_DECL, get_identifier ("__stack_chk_guard"),
713                       ptr_type_node);
714       TREE_STATIC (t) = 1;
715       TREE_PUBLIC (t) = 1;
716       DECL_EXTERNAL (t) = 1;
717       TREE_USED (t) = 1;
718       TREE_THIS_VOLATILE (t) = 1;
719       DECL_ARTIFICIAL (t) = 1;
720       DECL_IGNORED_P (t) = 1;
721
722       /* Do not share RTL as the declaration is visible outside of
723          current function.  */
724       x = DECL_RTL (t);
725       RTX_FLAG (x, used) = 1;
726
727       stack_chk_guard_decl = t;
728     }
729
730   return t;
731 }
732
733 static GTY(()) tree stack_chk_fail_decl;
734
735 tree
736 default_external_stack_protect_fail (void)
737 {
738   tree t = stack_chk_fail_decl;
739
740   if (t == NULL_TREE)
741     {
742       t = build_function_type_list (void_type_node, NULL_TREE);
743       t = build_decl (UNKNOWN_LOCATION,
744                       FUNCTION_DECL, get_identifier ("__stack_chk_fail"), t);
745       TREE_STATIC (t) = 1;
746       TREE_PUBLIC (t) = 1;
747       DECL_EXTERNAL (t) = 1;
748       TREE_USED (t) = 1;
749       TREE_THIS_VOLATILE (t) = 1;
750       TREE_NOTHROW (t) = 1;
751       DECL_ARTIFICIAL (t) = 1;
752       DECL_IGNORED_P (t) = 1;
753       DECL_VISIBILITY (t) = VISIBILITY_DEFAULT;
754       DECL_VISIBILITY_SPECIFIED (t) = 1;
755
756       stack_chk_fail_decl = t;
757     }
758
759   return build_call_expr (t, 0);
760 }
761
762 tree
763 default_hidden_stack_protect_fail (void)
764 {
765 #ifndef HAVE_GAS_HIDDEN
766   return default_external_stack_protect_fail ();
767 #else
768   tree t = stack_chk_fail_decl;
769
770   if (!flag_pic)
771     return default_external_stack_protect_fail ();
772
773   if (t == NULL_TREE)
774     {
775       t = build_function_type_list (void_type_node, NULL_TREE);
776       t = build_decl (UNKNOWN_LOCATION, FUNCTION_DECL,
777                       get_identifier ("__stack_chk_fail_local"), t);
778       TREE_STATIC (t) = 1;
779       TREE_PUBLIC (t) = 1;
780       DECL_EXTERNAL (t) = 1;
781       TREE_USED (t) = 1;
782       TREE_THIS_VOLATILE (t) = 1;
783       TREE_NOTHROW (t) = 1;
784       DECL_ARTIFICIAL (t) = 1;
785       DECL_IGNORED_P (t) = 1;
786       DECL_VISIBILITY_SPECIFIED (t) = 1;
787       DECL_VISIBILITY (t) = VISIBILITY_HIDDEN;
788
789       stack_chk_fail_decl = t;
790     }
791
792   return build_call_expr (t, 0);
793 #endif
794 }
795
796 bool
797 hook_bool_const_rtx_commutative_p (const_rtx x,
798                                    int outer_code ATTRIBUTE_UNUSED)
799 {
800   return COMMUTATIVE_P (x);
801 }
802
803 rtx
804 default_function_value (const_tree ret_type ATTRIBUTE_UNUSED,
805                         const_tree fn_decl_or_type,
806                         bool outgoing ATTRIBUTE_UNUSED)
807 {
808   /* The old interface doesn't handle receiving the function type.  */
809   if (fn_decl_or_type
810       && !DECL_P (fn_decl_or_type))
811     fn_decl_or_type = NULL;
812
813 #ifdef FUNCTION_VALUE
814   return FUNCTION_VALUE (ret_type, fn_decl_or_type);
815 #else
816   gcc_unreachable ();
817 #endif
818 }
819
820 rtx
821 default_libcall_value (machine_mode mode ATTRIBUTE_UNUSED,
822                        const_rtx fun ATTRIBUTE_UNUSED)
823 {
824 #ifdef LIBCALL_VALUE
825   return LIBCALL_VALUE (mode);
826 #else
827   gcc_unreachable ();
828 #endif
829 }
830
831 /* The default hook for TARGET_FUNCTION_VALUE_REGNO_P.  */
832
833 bool
834 default_function_value_regno_p (const unsigned int regno ATTRIBUTE_UNUSED)
835 {
836 #ifdef FUNCTION_VALUE_REGNO_P
837   return FUNCTION_VALUE_REGNO_P (regno);
838 #else
839   gcc_unreachable ();
840 #endif
841 }
842
843 rtx
844 default_internal_arg_pointer (void)
845 {
846   /* If the reg that the virtual arg pointer will be translated into is
847      not a fixed reg or is the stack pointer, make a copy of the virtual
848      arg pointer, and address parms via the copy.  The frame pointer is
849      considered fixed even though it is not marked as such.  */
850   if ((ARG_POINTER_REGNUM == STACK_POINTER_REGNUM
851        || ! (fixed_regs[ARG_POINTER_REGNUM]
852              || ARG_POINTER_REGNUM == FRAME_POINTER_REGNUM)))
853     return copy_to_reg (virtual_incoming_args_rtx);
854   else
855     return virtual_incoming_args_rtx;
856 }
857
858 rtx
859 default_static_chain (const_tree ARG_UNUSED (fndecl_or_type), bool incoming_p)
860 {
861   if (incoming_p)
862     {
863 #ifdef STATIC_CHAIN_INCOMING_REGNUM
864       return gen_rtx_REG (Pmode, STATIC_CHAIN_INCOMING_REGNUM);
865 #endif
866     }
867
868 #ifdef STATIC_CHAIN_REGNUM
869   return gen_rtx_REG (Pmode, STATIC_CHAIN_REGNUM);
870 #endif
871
872   {
873     static bool issued_error;
874     if (!issued_error)
875       {
876         issued_error = true;
877         sorry ("nested functions not supported on this target");
878       }
879
880     /* It really doesn't matter what we return here, so long at it
881        doesn't cause the rest of the compiler to crash.  */
882     return gen_rtx_MEM (Pmode, stack_pointer_rtx);
883   }
884 }
885
886 void
887 default_trampoline_init (rtx ARG_UNUSED (m_tramp), tree ARG_UNUSED (t_func),
888                          rtx ARG_UNUSED (r_chain))
889 {
890   sorry ("nested function trampolines not supported on this target");
891 }
892
893 int
894 default_return_pops_args (tree fundecl ATTRIBUTE_UNUSED,
895                           tree funtype ATTRIBUTE_UNUSED,
896                           int size ATTRIBUTE_UNUSED)
897 {
898   return 0;
899 }
900
901 reg_class_t
902 default_branch_target_register_class (void)
903 {
904   return NO_REGS;
905 }
906
907 extern bool
908 default_lra_p (void)
909 {
910   return false;
911 }
912
913 int
914 default_register_priority (int hard_regno ATTRIBUTE_UNUSED)
915 {
916   return 0;
917 }
918
919 extern bool
920 default_register_usage_leveling_p (void)
921 {
922   return false;
923 }
924
925 extern bool
926 default_different_addr_displacement_p (void)
927 {
928   return false;
929 }
930
931 reg_class_t
932 default_secondary_reload (bool in_p ATTRIBUTE_UNUSED, rtx x ATTRIBUTE_UNUSED,
933                           reg_class_t reload_class_i ATTRIBUTE_UNUSED,
934                           machine_mode reload_mode ATTRIBUTE_UNUSED,
935                           secondary_reload_info *sri)
936 {
937   enum reg_class rclass = NO_REGS;
938   enum reg_class reload_class = (enum reg_class) reload_class_i;
939
940   if (sri->prev_sri && sri->prev_sri->t_icode != CODE_FOR_nothing)
941     {
942       sri->icode = sri->prev_sri->t_icode;
943       return NO_REGS;
944     }
945 #ifdef SECONDARY_INPUT_RELOAD_CLASS
946   if (in_p)
947     rclass = SECONDARY_INPUT_RELOAD_CLASS (reload_class, reload_mode, x);
948 #endif
949 #ifdef SECONDARY_OUTPUT_RELOAD_CLASS
950   if (! in_p)
951     rclass = SECONDARY_OUTPUT_RELOAD_CLASS (reload_class, reload_mode, x);
952 #endif
953   if (rclass != NO_REGS)
954     {
955       enum insn_code icode
956         = direct_optab_handler (in_p ? reload_in_optab : reload_out_optab,
957                                 reload_mode);
958
959       if (icode != CODE_FOR_nothing
960           && !insn_operand_matches (icode, in_p, x))
961         icode = CODE_FOR_nothing;
962       else if (icode != CODE_FOR_nothing)
963         {
964           const char *insn_constraint, *scratch_constraint;
965           enum reg_class insn_class, scratch_class;
966
967           gcc_assert (insn_data[(int) icode].n_operands == 3);
968           insn_constraint = insn_data[(int) icode].operand[!in_p].constraint;
969           if (!*insn_constraint)
970             insn_class = ALL_REGS;
971           else
972             {
973               if (in_p)
974                 {
975                   gcc_assert (*insn_constraint == '=');
976                   insn_constraint++;
977                 }
978               insn_class = (reg_class_for_constraint
979                             (lookup_constraint (insn_constraint)));
980               gcc_assert (insn_class != NO_REGS);
981             }
982
983           scratch_constraint = insn_data[(int) icode].operand[2].constraint;
984           /* The scratch register's constraint must start with "=&",
985              except for an input reload, where only "=" is necessary,
986              and where it might be beneficial to re-use registers from
987              the input.  */
988           gcc_assert (scratch_constraint[0] == '='
989                       && (in_p || scratch_constraint[1] == '&'));
990           scratch_constraint++;
991           if (*scratch_constraint == '&')
992             scratch_constraint++;
993           scratch_class = (reg_class_for_constraint
994                            (lookup_constraint (scratch_constraint)));
995
996           if (reg_class_subset_p (reload_class, insn_class))
997             {
998               gcc_assert (scratch_class == rclass);
999               rclass = NO_REGS;
1000             }
1001           else
1002             rclass = insn_class;
1003
1004         }
1005       if (rclass == NO_REGS)
1006         sri->icode = icode;
1007       else
1008         sri->t_icode = icode;
1009     }
1010   return rclass;
1011 }
1012
1013 /* By default, if flag_pic is true, then neither local nor global relocs
1014    should be placed in readonly memory.  */
1015
1016 int
1017 default_reloc_rw_mask (void)
1018 {
1019   return flag_pic ? 3 : 0;
1020 }
1021
1022 /* By default, do no modification. */
1023 tree default_mangle_decl_assembler_name (tree decl ATTRIBUTE_UNUSED,
1024                                          tree id)
1025 {
1026    return id;
1027 }
1028
1029 /* Default to natural alignment for vector types.  */
1030 HOST_WIDE_INT
1031 default_vector_alignment (const_tree type)
1032 {
1033   return tree_to_shwi (TYPE_SIZE (type));
1034 }
1035
1036 bool
1037 default_builtin_vector_alignment_reachable (const_tree type, bool is_packed)
1038 {
1039   if (is_packed)
1040     return false;
1041
1042   /* Assuming that types whose size is > pointer-size are not guaranteed to be
1043      naturally aligned.  */
1044   if (tree_int_cst_compare (TYPE_SIZE (type), bitsize_int (POINTER_SIZE)) > 0)
1045     return false;
1046
1047   /* Assuming that types whose size is <= pointer-size
1048      are naturally aligned.  */
1049   return true;
1050 }
1051
1052 /* By default, assume that a target supports any factor of misalignment
1053    memory access if it supports movmisalign patten.
1054    is_packed is true if the memory access is defined in a packed struct.  */
1055 bool
1056 default_builtin_support_vector_misalignment (machine_mode mode,
1057                                              const_tree type
1058                                              ATTRIBUTE_UNUSED,
1059                                              int misalignment
1060                                              ATTRIBUTE_UNUSED,
1061                                              bool is_packed
1062                                              ATTRIBUTE_UNUSED)
1063 {
1064   if (optab_handler (movmisalign_optab, mode) != CODE_FOR_nothing)
1065     return true;
1066   return false;
1067 }
1068
1069 /* By default, only attempt to parallelize bitwise operations, and
1070    possibly adds/subtracts using bit-twiddling.  */
1071
1072 machine_mode
1073 default_preferred_simd_mode (machine_mode mode ATTRIBUTE_UNUSED)
1074 {
1075   return word_mode;
1076 }
1077
1078 /* By default only the size derived from the preferred vector mode
1079    is tried.  */
1080
1081 unsigned int
1082 default_autovectorize_vector_sizes (void)
1083 {
1084   return 0;
1085 }
1086
1087 /* By default, the cost model accumulates three separate costs (prologue,
1088    loop body, and epilogue) for a vectorized loop or block.  So allocate an
1089    array of three unsigned ints, set it to zero, and return its address.  */
1090
1091 void *
1092 default_init_cost (struct loop *loop_info ATTRIBUTE_UNUSED)
1093 {
1094   unsigned *cost = XNEWVEC (unsigned, 3);
1095   cost[vect_prologue] = cost[vect_body] = cost[vect_epilogue] = 0;
1096   return cost;
1097 }
1098
1099 /* By default, the cost model looks up the cost of the given statement
1100    kind and mode, multiplies it by the occurrence count, accumulates
1101    it into the cost specified by WHERE, and returns the cost added.  */
1102
1103 unsigned
1104 default_add_stmt_cost (void *data, int count, enum vect_cost_for_stmt kind,
1105                        struct _stmt_vec_info *stmt_info, int misalign,
1106                        enum vect_cost_model_location where)
1107 {
1108   unsigned *cost = (unsigned *) data;
1109   unsigned retval = 0;
1110
1111   tree vectype = stmt_info ? stmt_vectype (stmt_info) : NULL_TREE;
1112   int stmt_cost = targetm.vectorize.builtin_vectorization_cost (kind, vectype,
1113                                                                 misalign);
1114    /* Statements in an inner loop relative to the loop being
1115       vectorized are weighted more heavily.  The value here is
1116       arbitrary and could potentially be improved with analysis.  */
1117   if (where == vect_body && stmt_info && stmt_in_inner_loop_p (stmt_info))
1118     count *= 50;  /* FIXME.  */
1119
1120   retval = (unsigned) (count * stmt_cost);
1121   cost[where] += retval;
1122
1123   return retval;
1124 }
1125
1126 /* By default, the cost model just returns the accumulated costs.  */
1127
1128 void
1129 default_finish_cost (void *data, unsigned *prologue_cost,
1130                      unsigned *body_cost, unsigned *epilogue_cost)
1131 {
1132   unsigned *cost = (unsigned *) data;
1133   *prologue_cost = cost[vect_prologue];
1134   *body_cost     = cost[vect_body];
1135   *epilogue_cost = cost[vect_epilogue];
1136 }
1137
1138 /* Free the cost data.  */
1139
1140 void
1141 default_destroy_cost_data (void *data)
1142 {
1143   free (data);
1144 }
1145
1146 /* Determine whether or not a pointer mode is valid. Assume defaults
1147    of ptr_mode or Pmode - can be overridden.  */
1148 bool
1149 default_valid_pointer_mode (machine_mode mode)
1150 {
1151   return (mode == ptr_mode || mode == Pmode);
1152 }
1153
1154 /* Determine whether the memory reference specified by REF may alias
1155    the C libraries errno location.  */
1156 bool
1157 default_ref_may_alias_errno (ao_ref *ref)
1158 {
1159   tree base = ao_ref_base (ref);
1160   /* The default implementation assumes the errno location is
1161      a declaration of type int or is always accessed via a
1162      pointer to int.  We assume that accesses to errno are
1163      not deliberately obfuscated (even in conforming ways).  */
1164   if (TYPE_UNSIGNED (TREE_TYPE (base))
1165       || TYPE_MODE (TREE_TYPE (base)) != TYPE_MODE (integer_type_node))
1166     return false;
1167   /* The default implementation assumes an errno location
1168      declaration is never defined in the current compilation unit.  */
1169   if (DECL_P (base)
1170       && !TREE_STATIC (base))
1171     return true;
1172   else if (TREE_CODE (base) == MEM_REF
1173            && TREE_CODE (TREE_OPERAND (base, 0)) == SSA_NAME)
1174     {
1175       struct ptr_info_def *pi = SSA_NAME_PTR_INFO (TREE_OPERAND (base, 0));
1176       return !pi || pi->pt.anything || pi->pt.nonlocal;
1177     }
1178   return false;
1179 }
1180
1181 /* Return the mode for a pointer to a given ADDRSPACE, defaulting to ptr_mode
1182    for the generic address space only.  */
1183
1184 machine_mode
1185 default_addr_space_pointer_mode (addr_space_t addrspace ATTRIBUTE_UNUSED)
1186 {
1187   gcc_assert (ADDR_SPACE_GENERIC_P (addrspace));
1188   return ptr_mode;
1189 }
1190
1191 /* Return the mode for an address in a given ADDRSPACE, defaulting to Pmode
1192    for the generic address space only.  */
1193
1194 machine_mode
1195 default_addr_space_address_mode (addr_space_t addrspace ATTRIBUTE_UNUSED)
1196 {
1197   gcc_assert (ADDR_SPACE_GENERIC_P (addrspace));
1198   return Pmode;
1199 }
1200
1201 /* Named address space version of valid_pointer_mode.  */
1202
1203 bool
1204 default_addr_space_valid_pointer_mode (machine_mode mode, addr_space_t as)
1205 {
1206   if (!ADDR_SPACE_GENERIC_P (as))
1207     return (mode == targetm.addr_space.pointer_mode (as)
1208             || mode == targetm.addr_space.address_mode (as));
1209
1210   return targetm.valid_pointer_mode (mode);
1211 }
1212
1213 /* Some places still assume that all pointer or address modes are the
1214    standard Pmode and ptr_mode.  These optimizations become invalid if
1215    the target actually supports multiple different modes.  For now,
1216    we disable such optimizations on such targets, using this function.  */
1217
1218 bool
1219 target_default_pointer_address_modes_p (void)
1220 {
1221   if (targetm.addr_space.address_mode != default_addr_space_address_mode)
1222     return false;
1223   if (targetm.addr_space.pointer_mode != default_addr_space_pointer_mode)
1224     return false;
1225
1226   return true;
1227 }
1228
1229 /* Named address space version of legitimate_address_p.  */
1230
1231 bool
1232 default_addr_space_legitimate_address_p (machine_mode mode, rtx mem,
1233                                          bool strict, addr_space_t as)
1234 {
1235   if (!ADDR_SPACE_GENERIC_P (as))
1236     gcc_unreachable ();
1237
1238   return targetm.legitimate_address_p (mode, mem, strict);
1239 }
1240
1241 /* Named address space version of LEGITIMIZE_ADDRESS.  */
1242
1243 rtx
1244 default_addr_space_legitimize_address (rtx x, rtx oldx,
1245                                        machine_mode mode, addr_space_t as)
1246 {
1247   if (!ADDR_SPACE_GENERIC_P (as))
1248     return x;
1249
1250   return targetm.legitimize_address (x, oldx, mode);
1251 }
1252
1253 /* The default hook for determining if one named address space is a subset of
1254    another and to return which address space to use as the common address
1255    space.  */
1256
1257 bool
1258 default_addr_space_subset_p (addr_space_t subset, addr_space_t superset)
1259 {
1260   return (subset == superset);
1261 }
1262
1263 /* The default hook for TARGET_ADDR_SPACE_CONVERT. This hook should never be
1264    called for targets with only a generic address space.  */
1265
1266 rtx
1267 default_addr_space_convert (rtx op ATTRIBUTE_UNUSED,
1268                             tree from_type ATTRIBUTE_UNUSED,
1269                             tree to_type ATTRIBUTE_UNUSED)
1270 {
1271   gcc_unreachable ();
1272 }
1273
1274 bool
1275 default_hard_regno_scratch_ok (unsigned int regno ATTRIBUTE_UNUSED)
1276 {
1277   return true;
1278 }
1279
1280 /* The default implementation of TARGET_MODE_DEPENDENT_ADDRESS_P.  */
1281
1282 bool
1283 default_mode_dependent_address_p (const_rtx addr ATTRIBUTE_UNUSED,
1284                                   addr_space_t addrspace ATTRIBUTE_UNUSED)
1285 {
1286   return false;
1287 }
1288
1289 bool
1290 default_target_option_valid_attribute_p (tree ARG_UNUSED (fndecl),
1291                                          tree ARG_UNUSED (name),
1292                                          tree ARG_UNUSED (args),
1293                                          int ARG_UNUSED (flags))
1294 {
1295   warning (OPT_Wattributes,
1296            "target attribute is not supported on this machine");
1297
1298   return false;
1299 }
1300
1301 bool
1302 default_target_option_pragma_parse (tree ARG_UNUSED (args),
1303                                     tree ARG_UNUSED (pop_target))
1304 {
1305   warning (OPT_Wpragmas,
1306            "#pragma GCC target is not supported for this machine");
1307
1308   return false;
1309 }
1310
1311 bool
1312 default_target_can_inline_p (tree caller, tree callee)
1313 {
1314   bool ret = false;
1315   tree callee_opts = DECL_FUNCTION_SPECIFIC_TARGET (callee);
1316   tree caller_opts = DECL_FUNCTION_SPECIFIC_TARGET (caller);
1317
1318   /* If callee has no option attributes, then it is ok to inline */
1319   if (!callee_opts)
1320     ret = true;
1321
1322   /* If caller has no option attributes, but callee does then it is not ok to
1323      inline */
1324   else if (!caller_opts)
1325     ret = false;
1326
1327   /* If both caller and callee have attributes, assume that if the
1328      pointer is different, the two functions have different target
1329      options since build_target_option_node uses a hash table for the
1330      options.  */
1331   else
1332     ret = (callee_opts == caller_opts);
1333
1334   return ret;
1335 }
1336
1337 #ifndef HAVE_casesi
1338 # define HAVE_casesi 0
1339 #endif
1340
1341 /* If the machine does not have a case insn that compares the bounds,
1342    this means extra overhead for dispatch tables, which raises the
1343    threshold for using them.  */
1344
1345 unsigned int
1346 default_case_values_threshold (void)
1347 {
1348   return (HAVE_casesi ? 4 : 5);
1349 }
1350
1351 bool
1352 default_have_conditional_execution (void)
1353 {
1354 #ifdef HAVE_conditional_execution
1355   return HAVE_conditional_execution;
1356 #else
1357   return false;
1358 #endif
1359 }
1360
1361 /* By default we assume that c99 functions are present at the runtime,
1362    but sincos is not.  */
1363 bool
1364 default_libc_has_function (enum function_class fn_class)
1365 {
1366   if (fn_class == function_c94
1367       || fn_class == function_c99_misc
1368       || fn_class == function_c99_math_complex)
1369     return true;
1370
1371   return false;
1372 }
1373
1374 bool
1375 gnu_libc_has_function (enum function_class fn_class ATTRIBUTE_UNUSED)
1376 {
1377   return true;
1378 }
1379
1380 bool
1381 no_c99_libc_has_function (enum function_class fn_class ATTRIBUTE_UNUSED)
1382 {
1383   return false;
1384 }
1385
1386 tree
1387 default_builtin_tm_load_store (tree ARG_UNUSED (type))
1388 {
1389   return NULL_TREE;
1390 }
1391
1392 /* Compute cost of moving registers to/from memory.  */
1393
1394 int
1395 default_memory_move_cost (machine_mode mode ATTRIBUTE_UNUSED,
1396                           reg_class_t rclass ATTRIBUTE_UNUSED,
1397                           bool in ATTRIBUTE_UNUSED)
1398 {
1399 #ifndef MEMORY_MOVE_COST
1400     return (4 + memory_move_secondary_cost (mode, (enum reg_class) rclass, in));
1401 #else
1402     return MEMORY_MOVE_COST (mode, (enum reg_class) rclass, in);
1403 #endif
1404 }
1405
1406 /* Compute cost of moving data from a register of class FROM to one of
1407    TO, using MODE.  */
1408
1409 int
1410 default_register_move_cost (machine_mode mode ATTRIBUTE_UNUSED,
1411                             reg_class_t from ATTRIBUTE_UNUSED,
1412                             reg_class_t to ATTRIBUTE_UNUSED)
1413 {
1414 #ifndef REGISTER_MOVE_COST
1415   return 2;
1416 #else
1417   return REGISTER_MOVE_COST (mode, (enum reg_class) from, (enum reg_class) to);
1418 #endif
1419 }
1420
1421 /* For hooks which use the MOVE_RATIO macro, this gives the legacy default
1422    behaviour.  SPEED_P is true if we are compiling for speed.  */
1423
1424 unsigned int
1425 get_move_ratio (bool speed_p ATTRIBUTE_UNUSED)
1426 {
1427   unsigned int move_ratio;
1428 #ifdef MOVE_RATIO
1429   move_ratio = (unsigned int) MOVE_RATIO (speed_p);
1430 #else
1431 #if defined (HAVE_movmemqi) || defined (HAVE_movmemhi) || defined (HAVE_movmemsi) || defined (HAVE_movmemdi) || defined (HAVE_movmemti)
1432   move_ratio = 2;
1433 #else /* No movmem patterns, pick a default.  */
1434   move_ratio = ((speed_p) ? 15 : 3);
1435 #endif
1436 #endif
1437   return move_ratio;
1438 }
1439
1440 /* Return TRUE if the move_by_pieces/set_by_pieces infrastructure should be
1441    used; return FALSE if the movmem/setmem optab should be expanded, or
1442    a call to memcpy emitted.  */
1443
1444 bool
1445 default_use_by_pieces_infrastructure_p (unsigned HOST_WIDE_INT size,
1446                                         unsigned int alignment,
1447                                         enum by_pieces_operation op,
1448                                         bool speed_p)
1449 {
1450   unsigned int max_size = 0;
1451   unsigned int ratio = 0;
1452
1453   switch (op)
1454     {
1455       case CLEAR_BY_PIECES:
1456         max_size = STORE_MAX_PIECES;
1457         ratio = CLEAR_RATIO (speed_p);
1458         break;
1459       case MOVE_BY_PIECES:
1460         max_size = MOVE_MAX_PIECES;
1461         ratio = get_move_ratio (speed_p);
1462         break;
1463       case SET_BY_PIECES:
1464         max_size = STORE_MAX_PIECES;
1465         ratio = SET_RATIO (speed_p);
1466         break;
1467       case STORE_BY_PIECES:
1468         max_size = STORE_MAX_PIECES;
1469         ratio = get_move_ratio (speed_p);
1470         break;
1471     }
1472
1473   return move_by_pieces_ninsns (size, alignment, max_size + 1) < ratio;
1474 }
1475
1476 bool
1477 default_profile_before_prologue (void)
1478 {
1479 #ifdef PROFILE_BEFORE_PROLOGUE
1480   return true;
1481 #else
1482   return false;
1483 #endif
1484 }
1485
1486 /* The default implementation of TARGET_PREFERRED_RELOAD_CLASS.  */
1487
1488 reg_class_t
1489 default_preferred_reload_class (rtx x ATTRIBUTE_UNUSED,
1490                                 reg_class_t rclass)
1491 {
1492 #ifdef PREFERRED_RELOAD_CLASS 
1493   return (reg_class_t) PREFERRED_RELOAD_CLASS (x, (enum reg_class) rclass);
1494 #else
1495   return rclass;
1496 #endif
1497 }
1498
1499 /* The default implementation of TARGET_OUTPUT_PREFERRED_RELOAD_CLASS.  */
1500
1501 reg_class_t
1502 default_preferred_output_reload_class (rtx x ATTRIBUTE_UNUSED,
1503                                        reg_class_t rclass)
1504 {
1505   return rclass;
1506 }
1507
1508 /* The default implementation of TARGET_PREFERRED_RENAME_CLASS.  */
1509 reg_class_t
1510 default_preferred_rename_class (reg_class_t rclass ATTRIBUTE_UNUSED)
1511 {
1512   return NO_REGS;
1513 }
1514
1515 /* The default implementation of TARGET_CLASS_LIKELY_SPILLED_P.  */
1516
1517 bool
1518 default_class_likely_spilled_p (reg_class_t rclass)
1519 {
1520   return (reg_class_size[(int) rclass] == 1);
1521 }
1522
1523 /* The default implementation of TARGET_CLASS_MAX_NREGS.  */
1524
1525 unsigned char
1526 default_class_max_nregs (reg_class_t rclass ATTRIBUTE_UNUSED,
1527                          machine_mode mode ATTRIBUTE_UNUSED)
1528 {
1529 #ifdef CLASS_MAX_NREGS
1530   return (unsigned char) CLASS_MAX_NREGS ((enum reg_class) rclass, mode);
1531 #else
1532   return ((GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD);
1533 #endif
1534 }
1535
1536 /* Determine the debugging unwind mechanism for the target.  */
1537
1538 enum unwind_info_type
1539 default_debug_unwind_info (void)
1540 {
1541   /* If the target wants to force the use of dwarf2 unwind info, let it.  */
1542   /* ??? Change all users to the hook, then poison this.  */
1543 #ifdef DWARF2_FRAME_INFO
1544   if (DWARF2_FRAME_INFO)
1545     return UI_DWARF2;
1546 #endif
1547
1548   /* Otherwise, only turn it on if dwarf2 debugging is enabled.  */
1549 #ifdef DWARF2_DEBUGGING_INFO
1550   if (write_symbols == DWARF2_DEBUG || write_symbols == VMS_AND_DWARF2_DEBUG)
1551     return UI_DWARF2;
1552 #endif
1553
1554   return UI_NONE;
1555 }
1556
1557 /* Determine the correct mode for a Dwarf frame register that represents
1558    register REGNO.  */
1559
1560 machine_mode
1561 default_dwarf_frame_reg_mode (int regno)
1562 {
1563   machine_mode save_mode = reg_raw_mode[regno];
1564
1565   if (HARD_REGNO_CALL_PART_CLOBBERED (regno, save_mode))
1566     save_mode = choose_hard_reg_mode (regno, 1, true);
1567   return save_mode;
1568 }
1569
1570 /* To be used by targets where reg_raw_mode doesn't return the right
1571    mode for registers used in apply_builtin_return and apply_builtin_arg.  */
1572
1573 machine_mode
1574 default_get_reg_raw_mode (int regno)
1575 {
1576   return reg_raw_mode[regno];
1577 }
1578
1579 /* Return true if a leaf function should stay leaf even with profiling
1580    enabled.  */
1581
1582 bool
1583 default_keep_leaf_when_profiled ()
1584 {
1585   return false;
1586 }
1587
1588 /* Return true if the state of option OPTION should be stored in PCH files
1589    and checked by default_pch_valid_p.  Store the option's current state
1590    in STATE if so.  */
1591
1592 static inline bool
1593 option_affects_pch_p (int option, struct cl_option_state *state)
1594 {
1595   if ((cl_options[option].flags & CL_TARGET) == 0)
1596     return false;
1597   if ((cl_options[option].flags & CL_PCH_IGNORE) != 0)
1598     return false;
1599   if (option_flag_var (option, &global_options) == &target_flags)
1600     if (targetm.check_pch_target_flags)
1601       return false;
1602   return get_option_state (&global_options, option, state);
1603 }
1604
1605 /* Default version of get_pch_validity.
1606    By default, every flag difference is fatal; that will be mostly right for
1607    most targets, but completely right for very few.  */
1608
1609 void *
1610 default_get_pch_validity (size_t *sz)
1611 {
1612   struct cl_option_state state;
1613   size_t i;
1614   char *result, *r;
1615
1616   *sz = 2;
1617   if (targetm.check_pch_target_flags)
1618     *sz += sizeof (target_flags);
1619   for (i = 0; i < cl_options_count; i++)
1620     if (option_affects_pch_p (i, &state))
1621       *sz += state.size;
1622
1623   result = r = XNEWVEC (char, *sz);
1624   r[0] = flag_pic;
1625   r[1] = flag_pie;
1626   r += 2;
1627   if (targetm.check_pch_target_flags)
1628     {
1629       memcpy (r, &target_flags, sizeof (target_flags));
1630       r += sizeof (target_flags);
1631     }
1632
1633   for (i = 0; i < cl_options_count; i++)
1634     if (option_affects_pch_p (i, &state))
1635       {
1636         memcpy (r, state.data, state.size);
1637         r += state.size;
1638       }
1639
1640   return result;
1641 }
1642
1643 /* Return a message which says that a PCH file was created with a different
1644    setting of OPTION.  */
1645
1646 static const char *
1647 pch_option_mismatch (const char *option)
1648 {
1649   return xasprintf (_("created and used with differing settings of '%s'"),
1650                     option);
1651 }
1652
1653 /* Default version of pch_valid_p.  */
1654
1655 const char *
1656 default_pch_valid_p (const void *data_p, size_t len)
1657 {
1658   struct cl_option_state state;
1659   const char *data = (const char *)data_p;
1660   size_t i;
1661
1662   /* -fpic and -fpie also usually make a PCH invalid.  */
1663   if (data[0] != flag_pic)
1664     return _("created and used with different settings of -fpic");
1665   if (data[1] != flag_pie)
1666     return _("created and used with different settings of -fpie");
1667   data += 2;
1668
1669   /* Check target_flags.  */
1670   if (targetm.check_pch_target_flags)
1671     {
1672       int tf;
1673       const char *r;
1674
1675       memcpy (&tf, data, sizeof (target_flags));
1676       data += sizeof (target_flags);
1677       len -= sizeof (target_flags);
1678       r = targetm.check_pch_target_flags (tf);
1679       if (r != NULL)
1680         return r;
1681     }
1682
1683   for (i = 0; i < cl_options_count; i++)
1684     if (option_affects_pch_p (i, &state))
1685       {
1686         if (memcmp (data, state.data, state.size) != 0)
1687           return pch_option_mismatch (cl_options[i].opt_text);
1688         data += state.size;
1689         len -= state.size;
1690       }
1691
1692   return NULL;
1693 }
1694
1695 /* Default version of cstore_mode.  */
1696
1697 machine_mode
1698 default_cstore_mode (enum insn_code icode)
1699 {
1700   return insn_data[(int) icode].operand[0].mode;
1701 }
1702
1703 /* Default version of member_type_forces_blk.  */
1704
1705 bool
1706 default_member_type_forces_blk (const_tree, machine_mode)
1707 {
1708   return false;
1709 }
1710
1711 rtx
1712 default_load_bounds_for_arg (rtx addr ATTRIBUTE_UNUSED,
1713                              rtx ptr ATTRIBUTE_UNUSED,
1714                              rtx bnd ATTRIBUTE_UNUSED)
1715 {
1716   gcc_unreachable ();
1717 }
1718
1719 void
1720 default_store_bounds_for_arg (rtx val ATTRIBUTE_UNUSED,
1721                               rtx addr ATTRIBUTE_UNUSED,
1722                               rtx bounds ATTRIBUTE_UNUSED,
1723                               rtx to ATTRIBUTE_UNUSED)
1724 {
1725   gcc_unreachable ();
1726 }
1727
1728 rtx
1729 default_load_returned_bounds (rtx slot ATTRIBUTE_UNUSED)
1730 {
1731   gcc_unreachable ();
1732 }
1733
1734 void
1735 default_store_returned_bounds (rtx slot ATTRIBUTE_UNUSED,
1736                                rtx bounds ATTRIBUTE_UNUSED)
1737 {
1738   gcc_unreachable ();
1739 }
1740
1741 /* Default version of canonicalize_comparison.  */
1742
1743 void
1744 default_canonicalize_comparison (int *, rtx *, rtx *, bool)
1745 {
1746 }
1747
1748 /* Default implementation of TARGET_ATOMIC_ASSIGN_EXPAND_FENV.  */
1749
1750 void
1751 default_atomic_assign_expand_fenv (tree *, tree *, tree *)
1752 {
1753 }
1754
1755 #ifndef PAD_VARARGS_DOWN
1756 #define PAD_VARARGS_DOWN BYTES_BIG_ENDIAN
1757 #endif
1758
1759 /* Build an indirect-ref expression over the given TREE, which represents a
1760    piece of a va_arg() expansion.  */
1761 tree
1762 build_va_arg_indirect_ref (tree addr)
1763 {
1764   addr = build_simple_mem_ref_loc (EXPR_LOCATION (addr), addr);
1765   return addr;
1766 }
1767
1768 /* The "standard" implementation of va_arg: read the value from the
1769    current (padded) address and increment by the (padded) size.  */
1770
1771 tree
1772 std_gimplify_va_arg_expr (tree valist, tree type, gimple_seq *pre_p,
1773                           gimple_seq *post_p)
1774 {
1775   tree addr, t, type_size, rounded_size, valist_tmp;
1776   unsigned HOST_WIDE_INT align, boundary;
1777   bool indirect;
1778
1779 #ifdef ARGS_GROW_DOWNWARD
1780   /* All of the alignment and movement below is for args-grow-up machines.
1781      As of 2004, there are only 3 ARGS_GROW_DOWNWARD targets, and they all
1782      implement their own specialized gimplify_va_arg_expr routines.  */
1783   gcc_unreachable ();
1784 #endif
1785
1786   indirect = pass_by_reference (NULL, TYPE_MODE (type), type, false);
1787   if (indirect)
1788     type = build_pointer_type (type);
1789
1790   align = PARM_BOUNDARY / BITS_PER_UNIT;
1791   boundary = targetm.calls.function_arg_boundary (TYPE_MODE (type), type);
1792
1793   /* When we align parameter on stack for caller, if the parameter
1794      alignment is beyond MAX_SUPPORTED_STACK_ALIGNMENT, it will be
1795      aligned at MAX_SUPPORTED_STACK_ALIGNMENT.  We will match callee
1796      here with caller.  */
1797   if (boundary > MAX_SUPPORTED_STACK_ALIGNMENT)
1798     boundary = MAX_SUPPORTED_STACK_ALIGNMENT;
1799
1800   boundary /= BITS_PER_UNIT;
1801
1802   /* Hoist the valist value into a temporary for the moment.  */
1803   valist_tmp = get_initialized_tmp_var (valist, pre_p, NULL);
1804
1805   /* va_list pointer is aligned to PARM_BOUNDARY.  If argument actually
1806      requires greater alignment, we must perform dynamic alignment.  */
1807   if (boundary > align
1808       && !integer_zerop (TYPE_SIZE (type)))
1809     {
1810       t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
1811                   fold_build_pointer_plus_hwi (valist_tmp, boundary - 1));
1812       gimplify_and_add (t, pre_p);
1813
1814       t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
1815                   fold_build2 (BIT_AND_EXPR, TREE_TYPE (valist),
1816                                valist_tmp,
1817                                build_int_cst (TREE_TYPE (valist), -boundary)));
1818       gimplify_and_add (t, pre_p);
1819     }
1820   else
1821     boundary = align;
1822
1823   /* If the actual alignment is less than the alignment of the type,
1824      adjust the type accordingly so that we don't assume strict alignment
1825      when dereferencing the pointer.  */
1826   boundary *= BITS_PER_UNIT;
1827   if (boundary < TYPE_ALIGN (type))
1828     {
1829       type = build_variant_type_copy (type);
1830       TYPE_ALIGN (type) = boundary;
1831     }
1832
1833   /* Compute the rounded size of the type.  */
1834   type_size = size_in_bytes (type);
1835   rounded_size = round_up (type_size, align);
1836
1837   /* Reduce rounded_size so it's sharable with the postqueue.  */
1838   gimplify_expr (&rounded_size, pre_p, post_p, is_gimple_val, fb_rvalue);
1839
1840   /* Get AP.  */
1841   addr = valist_tmp;
1842   if (PAD_VARARGS_DOWN && !integer_zerop (rounded_size))
1843     {
1844       /* Small args are padded downward.  */
1845       t = fold_build2_loc (input_location, GT_EXPR, sizetype,
1846                        rounded_size, size_int (align));
1847       t = fold_build3 (COND_EXPR, sizetype, t, size_zero_node,
1848                        size_binop (MINUS_EXPR, rounded_size, type_size));
1849       addr = fold_build_pointer_plus (addr, t);
1850     }
1851
1852   /* Compute new value for AP.  */
1853   t = fold_build_pointer_plus (valist_tmp, rounded_size);
1854   t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist, t);
1855   gimplify_and_add (t, pre_p);
1856
1857   addr = fold_convert (build_pointer_type (type), addr);
1858
1859   if (indirect)
1860     addr = build_va_arg_indirect_ref (addr);
1861
1862   return build_va_arg_indirect_ref (addr);
1863 }
1864
1865 tree
1866 default_chkp_bound_type (void)
1867 {
1868   tree res = make_node (POINTER_BOUNDS_TYPE);
1869   TYPE_PRECISION (res) = TYPE_PRECISION (size_type_node) * 2;
1870   TYPE_NAME (res) = get_identifier ("__bounds_type");
1871   SET_TYPE_MODE (res, targetm.chkp_bound_mode ());
1872   layout_type (res);
1873   return res;
1874 }
1875
1876 enum machine_mode
1877 default_chkp_bound_mode (void)
1878 {
1879   return VOIDmode;
1880 }
1881
1882 tree
1883 default_builtin_chkp_function (unsigned int fcode ATTRIBUTE_UNUSED)
1884 {
1885   return NULL_TREE;
1886 }
1887
1888 rtx
1889 default_chkp_function_value_bounds (const_tree ret_type ATTRIBUTE_UNUSED,
1890                                     const_tree fn_decl_or_type ATTRIBUTE_UNUSED,
1891                                     bool outgoing ATTRIBUTE_UNUSED)
1892 {
1893   gcc_unreachable ();
1894 }
1895
1896 tree
1897 default_chkp_make_bounds_constant (HOST_WIDE_INT lb ATTRIBUTE_UNUSED,
1898                                    HOST_WIDE_INT ub ATTRIBUTE_UNUSED)
1899 {
1900   return NULL_TREE;
1901 }
1902
1903 int
1904 default_chkp_initialize_bounds (tree var ATTRIBUTE_UNUSED,
1905                                 tree lb ATTRIBUTE_UNUSED,
1906                                 tree ub ATTRIBUTE_UNUSED,
1907                                 tree *stmts ATTRIBUTE_UNUSED)
1908 {
1909   return 0;
1910 }
1911
1912 void
1913 default_setup_incoming_vararg_bounds (cumulative_args_t ca ATTRIBUTE_UNUSED,
1914                                       enum machine_mode mode ATTRIBUTE_UNUSED,
1915                                       tree type ATTRIBUTE_UNUSED,
1916                                       int *pretend_arg_size ATTRIBUTE_UNUSED,
1917                                       int second_time ATTRIBUTE_UNUSED)
1918 {
1919 }
1920
1921 /* An implementation of TARGET_CAN_USE_DOLOOP_P for targets that do
1922    not support nested low-overhead loops.  */
1923
1924 bool
1925 can_use_doloop_if_innermost (const widest_int &, const widest_int &,
1926                              unsigned int loop_depth, bool)
1927 {
1928   return loop_depth == 1;
1929 }
1930
1931 #include "gt-targhooks.h"