OSDN Git Service

Undo changes to the PDR representation.
[pf3gnuchains/gcc-fork.git] / gcc / targhooks.c
1 /* Default target hook functions.
2    Copyright (C) 2003, 2004, 2005, 2007, 2008, 2009
3    Free Software Foundation, Inc.
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
11
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3.  If not see
19 <http://www.gnu.org/licenses/>.  */
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
71 bool
72 default_legitimate_address_p (enum machine_mode mode ATTRIBUTE_UNUSED,
73                               rtx addr ATTRIBUTE_UNUSED,
74                               bool strict ATTRIBUTE_UNUSED)
75 {
76 #ifdef GO_IF_LEGITIMATE_ADDRESS
77   /* Defer to the old implementation using a goto.  */
78   if (strict)
79     return strict_memory_address_p (mode, addr);
80   else
81     return memory_address_p (mode, addr);
82 #else
83   gcc_unreachable ();
84 #endif
85 }
86
87 void
88 default_external_libcall (rtx fun ATTRIBUTE_UNUSED)
89 {
90 #ifdef ASM_OUTPUT_EXTERNAL_LIBCALL
91   ASM_OUTPUT_EXTERNAL_LIBCALL(asm_out_file, fun);
92 #endif
93 }
94
95 int
96 default_unspec_may_trap_p (const_rtx x, unsigned flags)
97 {
98   int i;
99
100   if (GET_CODE (x) == UNSPEC_VOLATILE
101       /* Any floating arithmetic may trap.  */
102       || (SCALAR_FLOAT_MODE_P (GET_MODE (x))
103           && flag_trapping_math))
104     return 1;
105
106   for (i = 0; i < XVECLEN (x, 0); ++i)
107     {
108       if (may_trap_p_1 (XVECEXP (x, 0, i), flags))
109         return 1;
110     }
111
112   return 0;
113 }
114
115 enum machine_mode
116 default_promote_function_mode (const_tree type ATTRIBUTE_UNUSED,
117                                enum machine_mode mode,
118                                int *punsignedp ATTRIBUTE_UNUSED,
119                                const_tree funtype ATTRIBUTE_UNUSED,
120                                int for_return ATTRIBUTE_UNUSED)
121 {
122   return mode;
123 }
124
125 enum machine_mode
126 default_promote_function_mode_always_promote (const_tree type,
127                                               enum machine_mode mode,
128                                               int *punsignedp,
129                                               const_tree funtype ATTRIBUTE_UNUSED,
130                                               int for_return ATTRIBUTE_UNUSED)
131 {
132   return promote_mode (type, mode, punsignedp);
133 }
134
135
136 enum machine_mode
137 default_cc_modes_compatible (enum machine_mode m1, enum machine_mode m2)
138 {
139   if (m1 == m2)
140     return m1;
141   return VOIDmode;
142 }
143
144 bool
145 default_return_in_memory (const_tree type,
146                           const_tree fntype ATTRIBUTE_UNUSED)
147 {
148   return (TYPE_MODE (type) == BLKmode);
149 }
150
151 rtx
152 default_legitimize_address (rtx x, rtx orig_x ATTRIBUTE_UNUSED,
153                             enum machine_mode mode ATTRIBUTE_UNUSED)
154 {
155   return x;
156 }
157
158 rtx
159 default_expand_builtin_saveregs (void)
160 {
161   error ("__builtin_saveregs not supported by this target");
162   return const0_rtx;
163 }
164
165 void
166 default_setup_incoming_varargs (CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED,
167                                 enum machine_mode mode ATTRIBUTE_UNUSED,
168                                 tree type ATTRIBUTE_UNUSED,
169                                 int *pretend_arg_size ATTRIBUTE_UNUSED,
170                                 int second_time ATTRIBUTE_UNUSED)
171 {
172 }
173
174 /* The default implementation of TARGET_BUILTIN_SETJMP_FRAME_VALUE.  */
175
176 rtx
177 default_builtin_setjmp_frame_value (void)
178 {
179   return virtual_stack_vars_rtx;
180 }
181
182 /* Generic hook that takes a CUMULATIVE_ARGS pointer and returns false.  */
183
184 bool
185 hook_bool_CUMULATIVE_ARGS_false (CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED)
186 {
187   return false;
188 }
189
190 bool
191 default_pretend_outgoing_varargs_named (CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED)
192 {
193   return (targetm.calls.setup_incoming_varargs
194           != default_setup_incoming_varargs);
195 }
196
197 enum machine_mode
198 default_eh_return_filter_mode (void)
199 {
200   return targetm.unwind_word_mode ();
201 }
202
203 enum machine_mode
204 default_libgcc_cmp_return_mode (void)
205 {
206   return word_mode;
207 }
208
209 enum machine_mode
210 default_libgcc_shift_count_mode (void)
211 {
212   return word_mode;
213 }
214
215 enum machine_mode
216 default_unwind_word_mode (void)
217 {
218   return word_mode;
219 }
220
221 /* The default implementation of TARGET_SHIFT_TRUNCATION_MASK.  */
222
223 unsigned HOST_WIDE_INT
224 default_shift_truncation_mask (enum machine_mode mode)
225 {
226   return SHIFT_COUNT_TRUNCATED ? GET_MODE_BITSIZE (mode) - 1 : 0;
227 }
228
229 /* The default implementation of TARGET_MIN_DIVISIONS_FOR_RECIP_MUL.  */
230
231 unsigned int
232 default_min_divisions_for_recip_mul (enum machine_mode mode ATTRIBUTE_UNUSED)
233 {
234   return have_insn_for (DIV, mode) ? 3 : 2;
235 }
236
237 /* The default implementation of TARGET_MODE_REP_EXTENDED.  */
238
239 int
240 default_mode_rep_extended (enum machine_mode mode ATTRIBUTE_UNUSED,
241                            enum machine_mode mode_rep ATTRIBUTE_UNUSED)
242 {
243   return UNKNOWN;
244 }
245
246 /* Generic hook that takes a CUMULATIVE_ARGS pointer and returns true.  */
247
248 bool
249 hook_bool_CUMULATIVE_ARGS_true (CUMULATIVE_ARGS * a ATTRIBUTE_UNUSED)
250 {
251   return true;
252 }
253
254 /* Return machine mode for non-standard suffix
255    or VOIDmode if non-standard suffixes are unsupported.  */
256 enum machine_mode
257 default_mode_for_suffix (char suffix ATTRIBUTE_UNUSED)
258 {
259   return VOIDmode;
260 }
261
262 /* The generic C++ ABI specifies this is a 64-bit value.  */
263 tree
264 default_cxx_guard_type (void)
265 {
266   return long_long_integer_type_node;
267 }
268
269
270 /* Returns the size of the cookie to use when allocating an array
271    whose elements have the indicated TYPE.  Assumes that it is already
272    known that a cookie is needed.  */
273
274 tree
275 default_cxx_get_cookie_size (tree type)
276 {
277   tree cookie_size;
278
279   /* We need to allocate an additional max (sizeof (size_t), alignof
280      (true_type)) bytes.  */
281   tree sizetype_size;
282   tree type_align;
283
284   sizetype_size = size_in_bytes (sizetype);
285   type_align = size_int (TYPE_ALIGN_UNIT (type));
286   if (INT_CST_LT_UNSIGNED (type_align, sizetype_size))
287     cookie_size = sizetype_size;
288   else
289     cookie_size = type_align;
290
291   return cookie_size;
292 }
293
294 /* Return true if a parameter must be passed by reference.  This version
295    of the TARGET_PASS_BY_REFERENCE hook uses just MUST_PASS_IN_STACK.  */
296
297 bool
298 hook_pass_by_reference_must_pass_in_stack (CUMULATIVE_ARGS *c ATTRIBUTE_UNUSED,
299         enum machine_mode mode ATTRIBUTE_UNUSED, const_tree type ATTRIBUTE_UNUSED,
300         bool named_arg ATTRIBUTE_UNUSED)
301 {
302   return targetm.calls.must_pass_in_stack (mode, type);
303 }
304
305 /* Return true if a parameter follows callee copies conventions.  This
306    version of the hook is true for all named arguments.  */
307
308 bool
309 hook_callee_copies_named (CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED,
310                           enum machine_mode mode ATTRIBUTE_UNUSED,
311                           const_tree type ATTRIBUTE_UNUSED, bool named)
312 {
313   return named;
314 }
315
316 /* Emit any directives required to unwind this instruction.  */
317
318 void
319 default_unwind_emit (FILE * stream ATTRIBUTE_UNUSED,
320                      rtx insn ATTRIBUTE_UNUSED)
321 {
322   /* Should never happen.  */
323   gcc_unreachable ();
324 }
325
326 /* True if MODE is valid for the target.  By "valid", we mean able to
327    be manipulated in non-trivial ways.  In particular, this means all
328    the arithmetic is supported.
329
330    By default we guess this means that any C type is supported.  If
331    we can't map the mode back to a type that would be available in C,
332    then reject it.  Special case, here, is the double-word arithmetic
333    supported by optabs.c.  */
334
335 bool
336 default_scalar_mode_supported_p (enum machine_mode mode)
337 {
338   int precision = GET_MODE_PRECISION (mode);
339
340   switch (GET_MODE_CLASS (mode))
341     {
342     case MODE_PARTIAL_INT:
343     case MODE_INT:
344       if (precision == CHAR_TYPE_SIZE)
345         return true;
346       if (precision == SHORT_TYPE_SIZE)
347         return true;
348       if (precision == INT_TYPE_SIZE)
349         return true;
350       if (precision == LONG_TYPE_SIZE)
351         return true;
352       if (precision == LONG_LONG_TYPE_SIZE)
353         return true;
354       if (precision == 2 * BITS_PER_WORD)
355         return true;
356       return false;
357
358     case MODE_FLOAT:
359       if (precision == FLOAT_TYPE_SIZE)
360         return true;
361       if (precision == DOUBLE_TYPE_SIZE)
362         return true;
363       if (precision == LONG_DOUBLE_TYPE_SIZE)
364         return true;
365       return false;
366
367     case MODE_DECIMAL_FLOAT:
368     case MODE_FRACT:
369     case MODE_UFRACT:
370     case MODE_ACCUM:
371     case MODE_UACCUM:
372       return false;
373
374     default:
375       gcc_unreachable ();
376     }
377 }
378
379 /* True if the target supports decimal floating point.  */
380
381 bool
382 default_decimal_float_supported_p (void)
383 {
384   return ENABLE_DECIMAL_FLOAT;
385 }
386
387 /* True if the target supports fixed-point arithmetic.  */
388
389 bool
390 default_fixed_point_supported_p (void)
391 {
392   return ENABLE_FIXED_POINT;
393 }
394
395 /* NULL if INSN insn is valid within a low-overhead loop, otherwise returns
396    an error message.
397   
398    This function checks whether a given INSN is valid within a low-overhead
399    loop.  If INSN is invalid it returns the reason for that, otherwise it
400    returns NULL. A called function may clobber any special registers required
401    for low-overhead looping. Additionally, some targets (eg, PPC) use the count
402    register for branch on table instructions. We reject the doloop pattern in
403    these cases.  */
404
405 const char *
406 default_invalid_within_doloop (const_rtx insn)
407 {
408   if (CALL_P (insn))
409     return "Function call in loop.";
410   
411   if (JUMP_TABLE_DATA_P (insn))
412     return "Computed branch in the loop.";
413   
414   return NULL;
415 }
416
417 /* Mapping of builtin functions to vectorized variants.  */
418
419 tree
420 default_builtin_vectorized_function (unsigned int fn ATTRIBUTE_UNUSED,
421                                      tree type_out ATTRIBUTE_UNUSED,
422                                      tree type_in ATTRIBUTE_UNUSED)
423 {
424   return NULL_TREE;
425 }
426
427 /* Vectorized conversion.  */
428
429 tree
430 default_builtin_vectorized_conversion (unsigned int code ATTRIBUTE_UNUSED,
431                                        tree type ATTRIBUTE_UNUSED)
432 {
433   return NULL_TREE;
434 }
435
436 /* Reciprocal.  */
437
438 tree
439 default_builtin_reciprocal (unsigned int fn ATTRIBUTE_UNUSED,
440                             bool md_fn ATTRIBUTE_UNUSED,
441                             bool sqrt ATTRIBUTE_UNUSED)
442 {
443   return NULL_TREE;
444 }
445
446 bool
447 hook_bool_CUMULATIVE_ARGS_mode_tree_bool_false (
448         CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED,
449         enum machine_mode mode ATTRIBUTE_UNUSED,
450         const_tree type ATTRIBUTE_UNUSED, bool named ATTRIBUTE_UNUSED)
451 {
452   return false;
453 }
454
455 bool
456 hook_bool_CUMULATIVE_ARGS_mode_tree_bool_true (
457         CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED,
458         enum machine_mode mode ATTRIBUTE_UNUSED,
459         const_tree type ATTRIBUTE_UNUSED, bool named ATTRIBUTE_UNUSED)
460 {
461   return true;
462 }
463
464 int
465 hook_int_CUMULATIVE_ARGS_mode_tree_bool_0 (
466         CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED,
467         enum machine_mode mode ATTRIBUTE_UNUSED,
468         tree type ATTRIBUTE_UNUSED, bool named ATTRIBUTE_UNUSED)
469 {
470   return 0;
471 }
472
473 void 
474 hook_void_bitmap (bitmap regs ATTRIBUTE_UNUSED)
475 {
476 }
477
478 const char *
479 hook_invalid_arg_for_unprototyped_fn (
480         const_tree typelist ATTRIBUTE_UNUSED,
481         const_tree funcdecl ATTRIBUTE_UNUSED,
482         const_tree val ATTRIBUTE_UNUSED)
483 {
484   return NULL;
485 }
486
487 /* Initialize the stack protection decls.  */
488
489 /* Stack protection related decls living in libgcc.  */
490 static GTY(()) tree stack_chk_guard_decl;
491
492 tree
493 default_stack_protect_guard (void)
494 {
495   tree t = stack_chk_guard_decl;
496
497   if (t == NULL)
498     {
499       t = build_decl (UNKNOWN_LOCATION,
500                       VAR_DECL, get_identifier ("__stack_chk_guard"),
501                       ptr_type_node);
502       TREE_STATIC (t) = 1;
503       TREE_PUBLIC (t) = 1;
504       DECL_EXTERNAL (t) = 1;
505       TREE_USED (t) = 1;
506       TREE_THIS_VOLATILE (t) = 1;
507       DECL_ARTIFICIAL (t) = 1;
508       DECL_IGNORED_P (t) = 1;
509
510       stack_chk_guard_decl = t;
511     }
512
513   return t;
514 }
515
516 static GTY(()) tree stack_chk_fail_decl;
517
518 tree 
519 default_external_stack_protect_fail (void)
520 {
521   tree t = stack_chk_fail_decl;
522
523   if (t == NULL_TREE)
524     {
525       t = build_function_type_list (void_type_node, NULL_TREE);
526       t = build_decl (UNKNOWN_LOCATION,
527                       FUNCTION_DECL, get_identifier ("__stack_chk_fail"), t);
528       TREE_STATIC (t) = 1;
529       TREE_PUBLIC (t) = 1;
530       DECL_EXTERNAL (t) = 1;
531       TREE_USED (t) = 1;
532       TREE_THIS_VOLATILE (t) = 1;
533       TREE_NOTHROW (t) = 1;
534       DECL_ARTIFICIAL (t) = 1;
535       DECL_IGNORED_P (t) = 1;
536       DECL_VISIBILITY (t) = VISIBILITY_DEFAULT;
537       DECL_VISIBILITY_SPECIFIED (t) = 1;
538
539       stack_chk_fail_decl = t;
540     }
541
542   return build_call_expr (t, 0);
543 }
544
545 tree
546 default_hidden_stack_protect_fail (void)
547 {
548 #ifndef HAVE_GAS_HIDDEN
549   return default_external_stack_protect_fail ();
550 #else
551   tree t = stack_chk_fail_decl;
552
553   if (!flag_pic)
554     return default_external_stack_protect_fail ();
555
556   if (t == NULL_TREE)
557     {
558       t = build_function_type_list (void_type_node, NULL_TREE);
559       t = build_decl (UNKNOWN_LOCATION, FUNCTION_DECL,
560                       get_identifier ("__stack_chk_fail_local"), t);
561       TREE_STATIC (t) = 1;
562       TREE_PUBLIC (t) = 1;
563       DECL_EXTERNAL (t) = 1;
564       TREE_USED (t) = 1;
565       TREE_THIS_VOLATILE (t) = 1;
566       TREE_NOTHROW (t) = 1;
567       DECL_ARTIFICIAL (t) = 1;
568       DECL_IGNORED_P (t) = 1;
569       DECL_VISIBILITY_SPECIFIED (t) = 1;
570       DECL_VISIBILITY (t) = VISIBILITY_HIDDEN;
571
572       stack_chk_fail_decl = t;
573     }
574
575   return build_call_expr (t, 0);
576 #endif
577 }
578
579 bool
580 hook_bool_const_rtx_commutative_p (const_rtx x,
581                                    int outer_code ATTRIBUTE_UNUSED)
582 {
583   return COMMUTATIVE_P (x);
584 }
585
586 rtx
587 default_function_value (const_tree ret_type ATTRIBUTE_UNUSED,
588                         const_tree fn_decl_or_type,
589                         bool outgoing ATTRIBUTE_UNUSED)
590 {
591   /* The old interface doesn't handle receiving the function type.  */
592   if (fn_decl_or_type
593       && !DECL_P (fn_decl_or_type))
594     fn_decl_or_type = NULL;
595
596 #ifdef FUNCTION_OUTGOING_VALUE
597   if (outgoing)
598     return FUNCTION_OUTGOING_VALUE (ret_type, fn_decl_or_type);
599 #endif
600
601 #ifdef FUNCTION_VALUE
602   return FUNCTION_VALUE (ret_type, fn_decl_or_type);
603 #else
604   return NULL_RTX;
605 #endif
606 }
607
608 rtx
609 default_libcall_value (enum machine_mode mode, rtx fun ATTRIBUTE_UNUSED)
610 {
611   return LIBCALL_VALUE (mode);
612 }
613
614 rtx
615 default_internal_arg_pointer (void)
616 {
617   /* If the reg that the virtual arg pointer will be translated into is
618      not a fixed reg or is the stack pointer, make a copy of the virtual
619      arg pointer, and address parms via the copy.  The frame pointer is
620      considered fixed even though it is not marked as such.  */
621   if ((ARG_POINTER_REGNUM == STACK_POINTER_REGNUM
622        || ! (fixed_regs[ARG_POINTER_REGNUM]
623              || ARG_POINTER_REGNUM == FRAME_POINTER_REGNUM)))
624     return copy_to_reg (virtual_incoming_args_rtx);
625   else
626     return virtual_incoming_args_rtx;
627 }
628
629 enum reg_class
630 default_branch_target_register_class (void)
631 {
632   return NO_REGS;
633 }
634
635 #ifdef IRA_COVER_CLASSES
636 const enum reg_class *
637 default_ira_cover_classes (void)
638 {
639   static enum reg_class classes[] = IRA_COVER_CLASSES;
640   return classes;
641 }
642 #endif
643
644 enum reg_class
645 default_secondary_reload (bool in_p ATTRIBUTE_UNUSED, rtx x ATTRIBUTE_UNUSED,
646                           enum reg_class reload_class ATTRIBUTE_UNUSED,
647                           enum machine_mode reload_mode ATTRIBUTE_UNUSED,
648                           secondary_reload_info *sri)
649 {
650   enum reg_class rclass = NO_REGS;
651
652   if (sri->prev_sri && sri->prev_sri->t_icode != CODE_FOR_nothing)
653     {
654       sri->icode = sri->prev_sri->t_icode;
655       return NO_REGS;
656     }
657 #ifdef SECONDARY_INPUT_RELOAD_CLASS
658   if (in_p)
659     rclass = SECONDARY_INPUT_RELOAD_CLASS (reload_class, reload_mode, x);
660 #endif
661 #ifdef SECONDARY_OUTPUT_RELOAD_CLASS
662   if (! in_p)
663     rclass = SECONDARY_OUTPUT_RELOAD_CLASS (reload_class, reload_mode, x);
664 #endif
665   if (rclass != NO_REGS)
666     {
667       enum insn_code icode = (in_p ? reload_in_optab[(int) reload_mode]
668                               : reload_out_optab[(int) reload_mode]);
669
670       if (icode != CODE_FOR_nothing
671           && insn_data[(int) icode].operand[in_p].predicate
672           && ! insn_data[(int) icode].operand[in_p].predicate (x, reload_mode))
673         icode = CODE_FOR_nothing;
674       else if (icode != CODE_FOR_nothing)
675         {
676           const char *insn_constraint, *scratch_constraint;
677           char insn_letter, scratch_letter;
678           enum reg_class insn_class, scratch_class;
679
680           gcc_assert (insn_data[(int) icode].n_operands == 3);
681           insn_constraint = insn_data[(int) icode].operand[!in_p].constraint;
682           if (!*insn_constraint)
683             insn_class = ALL_REGS;
684           else
685             {
686               if (in_p)
687                 {
688                   gcc_assert (*insn_constraint == '=');
689                   insn_constraint++;
690                 }
691               insn_letter = *insn_constraint;
692               insn_class
693                 = (insn_letter == 'r' ? GENERAL_REGS
694                    : REG_CLASS_FROM_CONSTRAINT ((unsigned char) insn_letter,
695                                                 insn_constraint));
696               gcc_assert (insn_class != NO_REGS);
697             }
698
699           scratch_constraint = insn_data[(int) icode].operand[2].constraint;
700           /* The scratch register's constraint must start with "=&",
701              except for an input reload, where only "=" is necessary,
702              and where it might be beneficial to re-use registers from
703              the input.  */
704           gcc_assert (scratch_constraint[0] == '='
705                       && (in_p || scratch_constraint[1] == '&'));
706           scratch_constraint++;
707           if (*scratch_constraint == '&')
708             scratch_constraint++;
709           scratch_letter = *scratch_constraint;
710           scratch_class
711             = (scratch_letter == 'r' ? GENERAL_REGS
712                : REG_CLASS_FROM_CONSTRAINT ((unsigned char) scratch_letter,
713                                             scratch_constraint));
714
715           if (reg_class_subset_p (reload_class, insn_class))
716             {
717               gcc_assert (scratch_class == rclass);
718               rclass = NO_REGS;
719             }
720           else
721             rclass = insn_class;
722
723         }
724       if (rclass == NO_REGS)
725         sri->icode = icode;
726       else
727         sri->t_icode = icode;
728     }
729   return rclass;
730 }
731
732 bool
733 default_handle_c_option (size_t code ATTRIBUTE_UNUSED,
734                          const char *arg ATTRIBUTE_UNUSED,
735                          int value ATTRIBUTE_UNUSED)
736 {
737   return false;
738 }
739
740 /* By default, if flag_pic is true, then neither local nor global relocs
741    should be placed in readonly memory.  */
742
743 int
744 default_reloc_rw_mask (void)
745 {
746   return flag_pic ? 3 : 0;
747 }
748
749 /* By default, do no modification. */
750 tree default_mangle_decl_assembler_name (tree decl ATTRIBUTE_UNUSED,
751                                          tree id)
752 {
753    return id;
754 }
755
756 bool
757 default_builtin_vector_alignment_reachable (const_tree type, bool is_packed)
758 {
759   if (is_packed)
760     return false;
761
762   /* Assuming that types whose size is > pointer-size are not guaranteed to be
763      naturally aligned.  */
764   if (tree_int_cst_compare (TYPE_SIZE (type), bitsize_int (POINTER_SIZE)) > 0)
765     return false;
766
767   /* Assuming that types whose size is <= pointer-size
768      are naturally aligned.  */
769   return true;
770 }
771
772 bool
773 default_hard_regno_scratch_ok (unsigned int regno ATTRIBUTE_UNUSED)
774 {
775   return true;
776 }
777
778 bool
779 default_target_option_valid_attribute_p (tree ARG_UNUSED (fndecl),
780                                          tree ARG_UNUSED (name),
781                                          tree ARG_UNUSED (args),
782                                          int ARG_UNUSED (flags))
783 {
784   warning (OPT_Wattributes,
785            "target attribute is not supported on this machine");
786
787   return false;
788 }
789
790 bool
791 default_target_option_pragma_parse (tree ARG_UNUSED (args),
792                                     tree ARG_UNUSED (pop_target))
793 {
794   warning (OPT_Wpragmas,
795            "#pragma GCC target is not supported for this machine");
796
797   return false;
798 }
799
800 bool
801 default_target_can_inline_p (tree caller, tree callee)
802 {
803   bool ret = false;
804   tree callee_opts = DECL_FUNCTION_SPECIFIC_TARGET (callee);
805   tree caller_opts = DECL_FUNCTION_SPECIFIC_TARGET (caller);
806
807   /* If callee has no option attributes, then it is ok to inline */
808   if (!callee_opts)
809     ret = true;
810
811   /* If caller has no option attributes, but callee does then it is not ok to
812      inline */
813   else if (!caller_opts)
814     ret = false;
815
816   /* If both caller and callee have attributes, assume that if the pointer is
817      different, the the two functions have different target options since
818      build_target_option_node uses a hash table for the options.  */
819   else
820     ret = (callee_opts == caller_opts);
821
822   return ret;
823 }
824
825 #ifndef HAVE_casesi
826 # define HAVE_casesi 0
827 #endif
828
829 /* If the machine does not have a case insn that compares the bounds,
830    this means extra overhead for dispatch tables, which raises the
831    threshold for using them.  */
832
833 unsigned int default_case_values_threshold (void)
834 {
835   return (HAVE_casesi ? 4 : 5);
836 }
837
838 #include "gt-targhooks.h"