forked from illumos/gcc
-
Notifications
You must be signed in to change notification settings - Fork 1
/
target.def
2782 lines (2419 loc) · 81 KB
/
target.def
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
/* Target hook definitions.
Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
2011
Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 3, or (at your option) any
later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; see the file COPYING3. If not see
<http://www.gnu.org/licenses/>.
In other words, you are welcome to use, share and improve this program.
You are forbidden to forbid anyone else to use, share and improve
what you give them. Help stamp out software-hoarding! */
/* The following macros should be provided by the including file:
DEFHOOK(NAME, DOC, TYPE, PARAMS, INIT): Define a function-valued hook.
DEFHOOKPOD(DOC, TYPE, NAME, INIT): Define a piece-of-data 'hook'. */
/* Defaults for optional macros:
DEFHOOKPODX(NAME, TYPE, INIT): Like DEFHOOKPOD, but share documentation
with the previous 'hook'. */
#ifndef DEFHOOKPODX
#define DEFHOOKPODX(NAME, TYPE, INIT) DEFHOOKPOD (NAME, 0, TYPE, INIT)
#endif
/* HOOKSTRUCT(FRAGMENT): Declarator fragments to encapsulate all the
members into a struct gcc_target, which in turn contains several
sub-structs. */
#ifndef HOOKSTRUCT
#define HOOKSTRUCT(FRAGMENT)
#endif
/* HOOK_VECTOR: Start a struct declaration, which then gets its own initializer.
HOOK_VECTOR_END: Close a struct declaration, providing a member declarator
name for nested use. */
#ifndef HOOK_VECTOR_1
#define HOOK_VECTOR_1(NAME, FRAGMENT) HOOKSTRUCT(FRAGMENT)
#endif
#define HOOK_VECTOR(INIT_NAME, SNAME) HOOK_VECTOR_1 (INIT_NAME, struct SNAME {)
#define HOOK_VECTOR_END(DECL_NAME) HOOK_VECTOR_1(,} DECL_NAME ;)
HOOK_VECTOR (TARGET_INITIALIZER, gcc_target)
/* FIXME: For pre-existing hooks, we can't place the documentation in the
documentation field here till we get permission from the FSF to include
it in GPLed software - the target hook documentation is so far only
available under the GFDL. */
/* A hook should generally be documented by a string in the DOC parameter,
which should contain texinfo markup. If the documentation is only available
under the GPL, but not under the GFDL, put it in a comment above the hook
definition. If the function declaration is available both under GPL and
GFDL, but the documentation is only available under the GFDL, put the
documentaton in tm.texi.in, heading with @hook <hookname> and closing
the paragraph with @end deftypefn / deftypevr as appropriate, and marking
the next autogenerated hook with @hook <hookname>.
In both these cases, leave the DOC string empty, i.e. "".
Sometimes, for some historic reason the function declaration
has to be documented differently
than what it is. In that case, use DEFHOOK_UNDOC to supress auto-generation
of documentation. DEFHOOK_UNDOC takes a DOC string which it ignores, so
you can put GPLed documentation string there if you have hopes that you
can clear the declaration & documentation for GFDL distribution later,
in which case you can then simply change the DEFHOOK_UNDOC to DEFHOOK
to turn on the autogeneration of the documentation.
A documentation string of "*" means not to emit any documentation at all,
and is mainly used internally for DEFHOOK_UNDOC. It should generally not
be used otherwise, but it has its use for exceptional cases where automatic
documentation is not wanted, and the real documentation is elsewere, like
for TARGET_ASM_{,UN}ALIGNED_INT_OP, which are hooks only for implementation
purposes; they refer to structs, the components of which are documented as
separate hooks TARGET_ASM_{,UN}ALIGNED_[HSDT]I_OP.
A DOC string of 0 is for internal use of DEFHOOKPODX and special table
entries only. */
/* Functions that output assembler for the target. */
#define HOOK_PREFIX "TARGET_ASM_"
HOOK_VECTOR (TARGET_ASM_OUT, asm_out)
/* Opening and closing parentheses for asm expression grouping. */
DEFHOOKPOD
(open_paren,
"",
const char *, "(")
DEFHOOKPODX (close_paren, const char *, ")")
/* Assembler instructions for creating various kinds of integer object. */
DEFHOOKPOD
(byte_op,
"",
const char *, "\t.byte\t")
DEFHOOKPOD (aligned_op, "*", struct asm_int_op, TARGET_ASM_ALIGNED_INT_OP)
DEFHOOKPOD (unaligned_op, "*", struct asm_int_op, TARGET_ASM_UNALIGNED_INT_OP)
/* The maximum number of bytes to skip when applying
LABEL_ALIGN_AFTER_BARRIER. */
DEFHOOK
(label_align_after_barrier_max_skip,
"",
int, (rtx label),
default_label_align_after_barrier_max_skip)
/* The maximum number of bytes to skip when applying
LOOP_ALIGN. */
DEFHOOK
(loop_align_max_skip,
"",
int, (rtx label),
default_loop_align_max_skip)
/* The maximum number of bytes to skip when applying
LABEL_ALIGN. */
DEFHOOK
(label_align_max_skip,
"",
int, (rtx label),
default_label_align_max_skip)
/* The maximum number of bytes to skip when applying
JUMP_ALIGN. */
DEFHOOK
(jump_align_max_skip,
"",
int, (rtx label),
default_jump_align_max_skip)
/* Try to output the assembler code for an integer object whose
value is given by X. SIZE is the size of the object in bytes and
ALIGNED_P indicates whether it is aligned. Return true if
successful. Only handles cases for which BYTE_OP, ALIGNED_OP
and UNALIGNED_OP are NULL. */
DEFHOOK
(integer,
"",
/* Only handles cases for which BYTE_OP, ALIGNED_OP and UNALIGNED_OP are
NULL. */
bool, (rtx x, unsigned int size, int aligned_p),
default_assemble_integer)
/* Output code that will globalize a label. */
DEFHOOK
(globalize_label,
"",
void, (FILE *stream, const char *name),
default_globalize_label)
/* Output code that will globalize a declaration. */
DEFHOOK
(globalize_decl_name,
"",
void, (FILE *stream, tree decl), default_globalize_decl_name)
/* Output code that will emit a label for unwind info, if this
target requires such labels. Second argument is the decl the
unwind info is associated with, third is a boolean: true if
this is for exception handling, fourth is a boolean: true if
this is only a placeholder for an omitted FDE. */
DEFHOOK
(emit_unwind_label,
"",
void, (FILE *stream, tree decl, int for_eh, int empty),
default_emit_unwind_label)
/* Output code that will emit a label to divide up the exception table. */
DEFHOOK
(emit_except_table_label,
"",
void, (FILE *stream),
default_emit_except_table_label)
/* Emit a directive for setting the personality for the function. */
DEFHOOK
(emit_except_personality,
"If the target implements @code{TARGET_ASM_UNWIND_EMIT}, this hook may be\
used to emit a directive to install a personality hook into the unwind\
info. This hook should not be used if dwarf2 unwind info is used.",
void, (rtx personality),
NULL)
/* Emit any directives required to unwind this instruction. */
DEFHOOK
(unwind_emit,
"",
void, (FILE *stream, rtx insn),
NULL)
DEFHOOKPOD
(unwind_emit_before_insn,
"True if the @code{TARGET_ASM_UNWIND_EMIT} hook should be called before\
the assembly for @var{insn} has been emitted, false if the hook should\
be called afterward.",
bool, true)
/* Generate an internal label.
For now this is just a wrapper for ASM_GENERATE_INTERNAL_LABEL. */
DEFHOOK_UNDOC
(generate_internal_label,
"",
void, (char *buf, const char *prefix, unsigned long labelno),
default_generate_internal_label)
/* Output an internal label. */
DEFHOOK
(internal_label,
"",
void, (FILE *stream, const char *prefix, unsigned long labelno),
default_internal_label)
/* Output label for the constant. */
DEFHOOK
(declare_constant_name,
"",
void, (FILE *file, const char *name, const_tree expr, HOST_WIDE_INT size),
default_asm_declare_constant_name)
/* Emit a ttype table reference to a typeinfo object. */
DEFHOOK
(ttype,
"",
bool, (rtx sym),
hook_bool_rtx_false)
/* Emit an assembler directive to set visibility for the symbol
associated with the tree decl. */
DEFHOOK
(assemble_visibility,
"",
void, (tree decl, int visibility),
default_assemble_visibility)
/* Output the assembler code for entry to a function. */
DEFHOOK
(function_prologue,
"",
void, (FILE *file, HOST_WIDE_INT size),
default_function_pro_epilogue)
/* Output the assembler code for end of prologue. */
DEFHOOK
(function_end_prologue,
"",
void, (FILE *file),
no_asm_to_stream)
/* Output the assembler code for start of epilogue. */
DEFHOOK
(function_begin_epilogue,
"",
void, (FILE *file),
no_asm_to_stream)
/* Output the assembler code for function exit. */
DEFHOOK
(function_epilogue,
"",
void, (FILE *file, HOST_WIDE_INT size),
default_function_pro_epilogue)
/* Initialize target-specific sections. */
DEFHOOK
(init_sections,
"",
void, (void),
hook_void_void)
/* Tell assembler to change to section NAME with attributes FLAGS.
If DECL is non-NULL, it is the VAR_DECL or FUNCTION_DECL with
which this section is associated. */
DEFHOOK
(named_section,
"",
void, (const char *name, unsigned int flags, tree decl),
default_no_named_section)
/* Return preferred text (sub)section for function DECL.
Main purpose of this function is to separate cold, normal and hot
functions. STARTUP is true when function is known to be used only
at startup (from static constructors or it is main()).
EXIT is true when function is known to be used only at exit
(from static destructors).
Return NULL if function should go to default text section. */
DEFHOOK
(function_section,
"",
section *, (tree decl, enum node_frequency freq, bool startup, bool exit),
default_function_section)
/* Output the assembler code for function exit. */
DEFHOOK
(function_switched_text_sections,
"Used by the target to emit any assembler directives or additional\
labels needed when a function is partitioned between different\
sections. Output should be written to @var{file}. The function\
decl is available as @var{decl} and the new section is `cold' if\
@var{new_is_cold} is @code{true}.",
void, (FILE *file, tree decl, bool new_is_cold),
default_function_switched_text_sections)
/* Return a mask describing how relocations should be treated when
selecting sections. Bit 1 should be set if global relocations
should be placed in a read-write section; bit 0 should be set if
local relocations should be placed in a read-write section. */
DEFHOOK
(reloc_rw_mask,
"",
int, (void),
default_reloc_rw_mask)
/* Return a section for EXP. It may be a DECL or a constant. RELOC
is nonzero if runtime relocations must be applied; bit 1 will be
set if the runtime relocations require non-local name resolution.
ALIGN is the required alignment of the data. */
DEFHOOK
(select_section,
"",
section *, (tree exp, int reloc, unsigned HOST_WIDE_INT align),
default_select_section)
/* Return a section for X. MODE is X's mode and ALIGN is its
alignment in bits. */
DEFHOOK
(select_rtx_section,
"",
section *, (enum machine_mode mode, rtx x, unsigned HOST_WIDE_INT align),
default_select_rtx_section)
/* Select a unique section name for DECL. RELOC is the same as
for SELECT_SECTION. */
DEFHOOK
(unique_section,
"",
void, (tree decl, int reloc),
default_unique_section)
/* Return the readonly data section associated with function DECL. */
DEFHOOK
(function_rodata_section,
"",
section *, (tree decl),
default_function_rodata_section)
/* Output a constructor for a symbol with a given priority. */
DEFHOOK
(constructor,
"",
void, (rtx symbol, int priority), NULL)
/* Output a destructor for a symbol with a given priority. */
DEFHOOK
(destructor,
"",
void, (rtx symbol, int priority), NULL)
/* Output the assembler code for a thunk function. THUNK_DECL is the
declaration for the thunk function itself, FUNCTION is the decl for
the target function. DELTA is an immediate constant offset to be
added to THIS. If VCALL_OFFSET is nonzero, the word at
*(*this + vcall_offset) should be added to THIS. */
DEFHOOK
(output_mi_thunk,
"",
void, (FILE *file, tree thunk_fndecl, HOST_WIDE_INT delta,
HOST_WIDE_INT vcall_offset, tree function),
NULL)
/* Determine whether output_mi_thunk would succeed. */
/* ??? Ideally, this hook would not exist, and success or failure
would be returned from output_mi_thunk directly. But there's
too much undo-able setup involved in invoking output_mi_thunk.
Could be fixed by making output_mi_thunk emit rtl instead of
text to the output file. */
DEFHOOK
(can_output_mi_thunk,
"",
bool, (const_tree thunk_fndecl, HOST_WIDE_INT delta,
HOST_WIDE_INT vcall_offset, const_tree function),
hook_bool_const_tree_hwi_hwi_const_tree_false)
/* Output any boilerplate text needed at the beginning of a
translation unit. */
DEFHOOK
(file_start,
"",
void, (void),
default_file_start)
/* Output any boilerplate text needed at the end of a translation unit. */
DEFHOOK
(file_end,
"",
void, (void),
hook_void_void)
/* Output any boilerplate text needed at the beginning of an
LTO output stream. */
DEFHOOK
(lto_start,
"",
void, (void),
hook_void_void)
/* Output any boilerplate text needed at the end of an
LTO output stream. */
DEFHOOK
(lto_end,
"",
void, (void),
hook_void_void)
/* Output any boilerplace text needed at the end of a
translation unit before debug and unwind info is emitted. */
DEFHOOK
(code_end,
"",
void, (void),
hook_void_void)
/* Output an assembler pseudo-op to declare a library function name
external. */
DEFHOOK
(external_libcall,
"",
void, (rtx symref),
default_external_libcall)
/* Output an assembler directive to mark decl live. This instructs
linker to not dead code strip this symbol. */
DEFHOOK
(mark_decl_preserved,
"",
void, (const char *symbol),
hook_void_constcharptr)
/* Output a record of the command line switches that have been passed. */
DEFHOOK
(record_gcc_switches,
"",
int, (print_switch_type type, const char *text),
NULL)
/* The name of the section that the example ELF implementation of
record_gcc_switches will use to store the information. Target
specific versions of record_gcc_switches may or may not use
this information. */
DEFHOOKPOD
(record_gcc_switches_section,
"",
const char *, ".GCC.command.line")
/* Output the definition of a section anchor. */
DEFHOOK
(output_anchor,
"",
void, (rtx x),
default_asm_output_anchor)
/* Output a DTP-relative reference to a TLS symbol. */
DEFHOOK
(output_dwarf_dtprel,
"",
void, (FILE *file, int size, rtx x),
NULL)
/* Some target machines need to postscan each insn after it is output. */
DEFHOOK
(final_postscan_insn,
"",
void, (FILE *file, rtx insn, rtx *opvec, int noperands),
NULL)
/* Emit the trampoline template. This hook may be NULL. */
DEFHOOK
(trampoline_template,
"",
void, (FILE *f),
NULL)
DEFHOOK
(output_source_filename,
"Output COFF information or DWARF debugging information which indicates\
that filename @var{name} is the current source file to the stdio\
stream @var{file}.\n\
\n\
This target hook need not be defined if the standard form of output\
for the file format in use is appropriate.",
void ,(FILE *file, const char *name),
default_asm_output_source_filename)
DEFHOOK
(output_addr_const_extra,
"",
bool, (FILE *file, rtx x),
default_asm_output_addr_const_extra)
/* ??? The TARGET_PRINT_OPERAND* hooks are part of the asm_out struct,
even though that is not reflected in the macro name to override their
initializers. */
#undef HOOK_PREFIX
#define HOOK_PREFIX "TARGET_"
/* Emit a machine-specific insn operand. */
/* ??? tm.texi only documents the old macro PRINT_OPERAND,
not this hook, and uses a different name for the argument FILE. */
DEFHOOK_UNDOC
(print_operand,
"",
void, (FILE *file, rtx x, int code),
default_print_operand)
/* Emit a machine-specific memory address. */
/* ??? tm.texi only documents the old macro PRINT_OPERAND_ADDRESS,
not this hook, and uses different argument names. */
DEFHOOK_UNDOC
(print_operand_address,
"",
void, (FILE *file, rtx addr),
default_print_operand_address)
/* Determine whether CODE is a valid punctuation character for the
`print_operand' hook. */
/* ??? tm.texi only documents the old macro PRINT_OPERAND_PUNCT_VALID_P,
not this hook. */
DEFHOOK_UNDOC
(print_operand_punct_valid_p,
"",
bool ,(unsigned char code),
default_print_operand_punct_valid_p)
/* Given a symbol name, perform same mangling as assemble_name and
ASM_OUTPUT_LABELREF, returning result as an IDENTIFIER_NODE. */
DEFHOOK
(mangle_assembler_name,
"Given a symbol @var{name}, perform same mangling as @code{varasm.c}'s\
@code{assemble_name}, but in memory rather than to a file stream, returning\
result as an @code{IDENTIFIER_NODE}. Required for correct LTO symtabs. The\
default implementation calls the @code{TARGET_STRIP_NAME_ENCODING} hook and\
then prepends the @code{USER_LABEL_PREFIX}, if any.",
tree, (const char *name),
default_mangle_assembler_name)
HOOK_VECTOR_END (asm_out)
/* Functions relating to instruction scheduling. All of these
default to null pointers, which haifa-sched.c looks for and handles. */
#undef HOOK_PREFIX
#define HOOK_PREFIX "TARGET_SCHED_"
HOOK_VECTOR (TARGET_SCHED, sched)
/* Given the current cost, COST, of an insn, INSN, calculate and
return a new cost based on its relationship to DEP_INSN through
the dependence LINK. The default is to make no adjustment. */
DEFHOOK
(adjust_cost,
"",
int, (rtx insn, rtx link, rtx dep_insn, int cost), NULL)
/* Adjust the priority of an insn as you see fit. Returns the new priority. */
DEFHOOK
(adjust_priority,
"",
int, (rtx insn, int priority), NULL)
/* Function which returns the maximum number of insns that can be
scheduled in the same machine cycle. This must be constant
over an entire compilation. The default is 1. */
DEFHOOK
(issue_rate,
"",
int, (void), NULL)
/* Calculate how much this insn affects how many more insns we
can emit this cycle. Default is they all cost the same. */
DEFHOOK
(variable_issue,
"",
int, (FILE *file, int verbose, rtx insn, int more), NULL)
/* Initialize machine-dependent scheduling code. */
DEFHOOK
(init,
"",
void, (FILE *file, int verbose, int max_ready), NULL)
/* Finalize machine-dependent scheduling code. */
DEFHOOK
(finish,
"",
void, (FILE *file, int verbose), NULL)
/* Initialize machine-dependent function wide scheduling code. */
DEFHOOK
(init_global,
"",
void, (FILE *file, int verbose, int old_max_uid), NULL)
/* Finalize machine-dependent function wide scheduling code. */
DEFHOOK
(finish_global,
"",
void, (FILE *file, int verbose), NULL)
/* Reorder insns in a machine-dependent fashion, in two different
places. Default does nothing. */
DEFHOOK
(reorder,
"",
int, (FILE *file, int verbose, rtx *ready, int *n_readyp, int clock), NULL)
DEFHOOK
(reorder2,
"",
int, (FILE *file, int verbose, rtx *ready, int *n_readyp, int clock), NULL)
/* The following member value is a pointer to a function called
after evaluation forward dependencies of insns in chain given
by two parameter values (head and tail correspondingly). */
DEFHOOK
(dependencies_evaluation_hook,
"",
void, (rtx head, rtx tail), NULL)
/* The values of the following four members are pointers to functions
used to simplify the automaton descriptions. dfa_pre_cycle_insn and
dfa_post_cycle_insn give functions returning insns which are used to
change the pipeline hazard recognizer state when the new simulated
processor cycle correspondingly starts and finishes. The function
defined by init_dfa_pre_cycle_insn and init_dfa_post_cycle_insn are
used to initialize the corresponding insns. The default values of
the members result in not changing the automaton state when the
new simulated processor cycle correspondingly starts and finishes. */
DEFHOOK
(init_dfa_pre_cycle_insn,
"",
void, (void), NULL)
DEFHOOK
(dfa_pre_cycle_insn,
"",
rtx, (void), NULL)
DEFHOOK
(init_dfa_post_cycle_insn,
"",
void, (void), NULL)
DEFHOOK
(dfa_post_cycle_insn,
"",
rtx, (void), NULL)
/* The values of the following two members are pointers to
functions used to simplify the automaton descriptions.
dfa_pre_advance_cycle and dfa_post_advance_cycle are getting called
immediately before and after cycle is advanced. */
DEFHOOK
(dfa_pre_advance_cycle,
"",
void, (void), NULL)
DEFHOOK
(dfa_post_advance_cycle,
"",
void, (void), NULL)
/* The following member value is a pointer to a function returning value
which defines how many insns in queue `ready' will we try for
multi-pass scheduling. If the member value is nonzero and the
function returns positive value, the DFA based scheduler will make
multi-pass scheduling for the first cycle. In other words, we will
try to choose ready insn which permits to start maximum number of
insns on the same cycle. */
DEFHOOK
(first_cycle_multipass_dfa_lookahead,
"",
int, (void), NULL)
/* The following member value is pointer to a function controlling
what insns from the ready insn queue will be considered for the
multipass insn scheduling. If the hook returns zero for insn
passed as the parameter, the insn will be not chosen to be issued. */
DEFHOOK
(first_cycle_multipass_dfa_lookahead_guard,
"",
int, (rtx insn), NULL)
/* This hook prepares the target for a new round of multipass
scheduling.
DATA is a pointer to target-specific data used for multipass scheduling.
READY_TRY and N_READY represent the current state of search in the
optimization space. The target can filter out instructions that
should not be tried during current round by setting corresponding
elements in READY_TRY to non-zero.
FIRST_CYCLE_INSN_P is true if this is the first round of multipass
scheduling on current cycle. */
DEFHOOK
(first_cycle_multipass_begin,
"",
void, (void *data, char *ready_try, int n_ready, bool first_cycle_insn_p),
NULL)
/* This hook is called when multipass scheduling evaluates instruction INSN.
DATA is a pointer to target-specific data that can be used to record effects
of INSN on CPU that are not described in DFA.
READY_TRY and N_READY represent the current state of search in the
optimization space. The target can filter out instructions that
should not be tried after issueing INSN by setting corresponding
elements in READY_TRY to non-zero.
INSN is the instruction being evaluated.
PREV_DATA is a pointer to target-specific data corresponding
to a state before issueing INSN. */
DEFHOOK
(first_cycle_multipass_issue,
"",
void, (void *data, char *ready_try, int n_ready, rtx insn,
const void *prev_data), NULL)
/* This hook is called when multipass scheduling backtracks from evaluation of
instruction corresponding to DATA.
DATA is a pointer to target-specific data that stores the effects
of instruction from which the algorithm backtracks on CPU that are not
described in DFA.
READY_TRY and N_READY represent the current state of search in the
optimization space. The target can filter out instructions that
should not be tried after issueing INSN by setting corresponding
elements in READY_TRY to non-zero. */
DEFHOOK
(first_cycle_multipass_backtrack,
"",
void, (const void *data, char *ready_try, int n_ready), NULL)
/* This hook notifies the target about the result of the concluded current
round of multipass scheduling.
DATA is a pointer.
If DATA is non-NULL it points to target-specific data used for multipass
scheduling which corresponds to instruction at the start of the chain of
the winning solution. DATA is NULL when multipass scheduling cannot find
a good enough solution on current cycle and decides to retry later,
usually after advancing the cycle count. */
DEFHOOK
(first_cycle_multipass_end,
"",
void, (const void *data), NULL)
/* This hook is called to initialize target-specific data for multipass
scheduling after it has been allocated.
DATA is a pointer to target-specific data that stores the effects
of instruction from which the algorithm backtracks on CPU that are not
described in DFA. */
DEFHOOK
(first_cycle_multipass_init,
"",
void, (void *data), NULL)
/* This hook is called to finalize target-specific data for multipass
scheduling before it is deallocated.
DATA is a pointer to target-specific data that stores the effects
of instruction from which the algorithm backtracks on CPU that are not
described in DFA. */
DEFHOOK
(first_cycle_multipass_fini,
"",
void, (void *data), NULL)
/* The following member value is pointer to a function called by
the insn scheduler before issuing insn passed as the third
parameter on given cycle. If the hook returns nonzero, the
insn is not issued on given processors cycle. Instead of that,
the processor cycle is advanced. If the value passed through
the last parameter is zero, the insn ready queue is not sorted
on the new cycle start as usually. The first parameter passes
file for debugging output. The second one passes the scheduler
verbose level of the debugging output. The forth and the fifth
parameter values are correspondingly processor cycle on which
the previous insn has been issued and the current processor cycle. */
DEFHOOK
(dfa_new_cycle,
"",
int, (FILE *dump, int verbose, rtx insn, int last_clock,
int clock, int *sort_p),
NULL)
/* The following member value is a pointer to a function called by the
insn scheduler. It should return true if there exists a dependence
which is considered costly by the target, between the insn
DEP_PRO (&_DEP), and the insn DEP_CON (&_DEP). The first parameter is
the dep that represents the dependence between the two insns. The
second argument is the cost of the dependence as estimated by
the scheduler. The last argument is the distance in cycles
between the already scheduled insn (first parameter) and the
second insn (second parameter). */
DEFHOOK
(is_costly_dependence,
"",
bool, (struct _dep *_dep, int cost, int distance), NULL)
DEFHOOK_UNDOC
(adjust_cost_2,
"Given the current cost, @var{cost}, of an insn, @var{insn}, calculate and\
return a new cost based on its relationship to @var{dep_insn} through the\
dependence of weakness @var{dw}. The default is to make no adjustment.",
int, (rtx insn, int dep_type1, rtx dep_insn, int cost, int dw), NULL)
/* The following member value is a pointer to a function called
by the insn scheduler. This hook is called to notify the backend
that new instructions were emitted. */
DEFHOOK
(h_i_d_extended,
"",
void, (void), NULL)
/* Next 5 functions are for multi-point scheduling. */
/* Allocate memory for scheduler context. */
DEFHOOK
(alloc_sched_context,
"",
void *, (void), NULL)
/* Fills the context from the local machine scheduler context. */
DEFHOOK
(init_sched_context,
"",
void, (void *tc, bool clean_p), NULL)
/* Sets local machine scheduler context to a saved value. */
DEFHOOK
(set_sched_context,
"",
void, (void *tc), NULL)
/* Clears a scheduler context so it becomes like after init. */
DEFHOOK
(clear_sched_context,
"",
void, (void *tc), NULL)
/* Frees the scheduler context. */
DEFHOOK
(free_sched_context,
"",
void, (void *tc), NULL)
/* The following member value is a pointer to a function called
by the insn scheduler.
The first parameter is an instruction, the second parameter is the type
of the requested speculation, and the third parameter is a pointer to the
speculative pattern of the corresponding type (set if return value == 1).
It should return
-1, if there is no pattern, that will satisfy the requested speculation type,
0, if current pattern satisfies the requested speculation type,
1, if pattern of the instruction should be changed to the newly
generated one. */
DEFHOOK
(speculate_insn,
"",
int, (rtx insn, int request, rtx *new_pat), NULL)
/* The following member value is a pointer to a function called
by the insn scheduler. It should return true if the check instruction
passed as the parameter needs a recovery block. */
DEFHOOK
(needs_block_p,
"",
bool, (int dep_status), NULL)
/* The following member value is a pointer to a function called
by the insn scheduler. It should return a pattern for the check
instruction.
The first parameter is a speculative instruction, the second parameter
is the label of the corresponding recovery block (or null, if it is a
simple check). If the mutation of the check is requested (e.g. from
ld.c to chk.a), the third parameter is true - in this case the first
parameter is the previous check. */
DEFHOOK
(gen_spec_check,
"",
rtx, (rtx insn, rtx label, int mutate_p), NULL)
/* The following member value is a pointer to a function controlling
what insns from the ready insn queue will be considered for the
multipass insn scheduling. If the hook returns zero for the insn
passed as the parameter, the insn will not be chosen to be
issued. This hook is used to discard speculative instructions,
that stand at the first position of the ready list. */
DEFHOOK
(first_cycle_multipass_dfa_lookahead_guard_spec,
"",
bool, (const_rtx insn), NULL)
/* The following member value is a pointer to a function that provides
information about the speculation capabilities of the target.
The parameter is a pointer to spec_info variable. */
DEFHOOK
(set_sched_flags,
"",
void, (struct spec_info_def *spec_info), NULL)
DEFHOOK_UNDOC
(get_insn_spec_ds,
"Return speculation types of instruction @var{insn}.",
int, (rtx insn), NULL)
DEFHOOK_UNDOC
(get_insn_checked_ds,
"Return speculation types that are checked for instruction @var{insn}",
int, (rtx insn), NULL)
DEFHOOK_UNDOC
(skip_rtx_p,
"Return bool if rtx scanning should just skip current layer and\
advance to the inner rtxes.",
bool, (const_rtx x), NULL)
/* The following member value is a pointer to a function that provides
information about the target resource-based lower bound which is
used by the swing modulo scheduler. The parameter is a pointer
to ddg variable. */
DEFHOOK
(sms_res_mii,
"",
int, (struct ddg *g), NULL)
/* The following member value is a function that initializes dispatch
schedling and adds instructions to dispatch window according to its
parameters. */
DEFHOOK
(dispatch_do,
"",
void, (rtx insn, int x),
hook_void_rtx_int)
/* The following member value is a a function that returns true is
dispatch schedling is supported in hardware and condition passed
as the second parameter is true. */
DEFHOOK
(dispatch,
"",
bool, (rtx insn, int x),
hook_bool_rtx_int_false)
HOOK_VECTOR_END (sched)
/* Functions relating to vectorization. */
#undef HOOK_PREFIX
#define HOOK_PREFIX "TARGET_VECTORIZE_"
HOOK_VECTOR (TARGET_VECTORIZE, vectorize)
/* The following member value is a pointer to a function called
by the vectorizer, and return the decl of the target builtin
function. */
DEFHOOK
(builtin_mask_for_load,
"",
tree, (void), NULL)
/* Returns a code for builtin that realizes vectorized version of
function, or NULL_TREE if not available. */
DEFHOOK
(builtin_vectorized_function,
"",
tree, (tree fndecl, tree vec_type_out, tree vec_type_in),
default_builtin_vectorized_function)
/* Returns a function declaration for a builtin that realizes the
vector conversion, or NULL_TREE if not available. */
DEFHOOK
(builtin_conversion,
"",
tree, (unsigned code, tree dest_type, tree src_type),
default_builtin_vectorized_conversion)
/* Target builtin that implements vector widening multiplication.
builtin_mul_widen_eve computes the element-by-element products
for the even elements, and builtin_mul_widen_odd computes the
element-by-element products for the odd elements. */
DEFHOOK
(builtin_mul_widen_even,
"",
tree, (tree x), NULL)
DEFHOOK
(builtin_mul_widen_odd,
"",
tree, (tree x), NULL)
/* Cost of different vector/scalar statements in vectorization cost
model. In case of misaligned vector loads and stores the cost depends
on the data type and misalignment value. */