OpenCores
URL https://opencores.org/ocsvn/altor32/altor32/trunk

Subversion Repositories altor32

[/] [altor32/] [trunk/] [gcc-x64/] [or1knd-elf/] [lib/] [gcc/] [or1knd-elf/] [4.8.0/] [plugin/] [include/] [cfghooks.h] - Blame information for rev 35

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 35 ultra_embe
/* Hooks for cfg representation specific functions.
2
   Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008
3
   Free Software Foundation, Inc.
4
   Contributed by Sebastian Pop <s.pop@laposte.net>
5
 
6
This file is part of GCC.
7
 
8
GCC is free software; you can redistribute it and/or modify
9
it under the terms of the GNU General Public License as published by
10
the Free Software Foundation; either version 3, or (at your option)
11
any later version.
12
 
13
GCC is distributed in the hope that it will be useful,
14
but WITHOUT ANY WARRANTY; without even the implied warranty of
15
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
GNU General Public License for more details.
17
 
18
You should have received a copy of the GNU General Public License
19
along with GCC; see the file COPYING3.  If not see
20
<http://www.gnu.org/licenses/>.  */
21
 
22
/* Only basic-block.h includes this.  */
23
 
24
struct cfg_hooks
25
{
26
  /* Name of the corresponding ir.  */
27
  const char *name;
28
 
29
  /* Debugging.  */
30
  int (*verify_flow_info) (void);
31
  void (*dump_bb) (FILE *, basic_block, int, int);
32
 
33
  /* Basic CFG manipulation.  */
34
 
35
  /* Return new basic block.  */
36
  basic_block (*create_basic_block) (void *head, void *end, basic_block after);
37
 
38
  /* Redirect edge E to the given basic block B and update underlying program
39
     representation.  Returns edge representing redirected branch (that may not
40
     be equivalent to E in the case of duplicate edges being removed) or NULL
41
     if edge is not easily redirectable for whatever reason.  */
42
  edge (*redirect_edge_and_branch) (edge e, basic_block b);
43
 
44
  /* Same as the above but allows redirecting of fallthru edges.  In that case
45
     newly created forwarder basic block is returned.  The edge must
46
     not be abnormal.  */
47
  basic_block (*redirect_edge_and_branch_force) (edge, basic_block);
48
 
49
  /* Returns true if it is possible to remove the edge by redirecting it
50
     to the destination of the other edge going from its source.  */
51
  bool (*can_remove_branch_p) (const_edge);
52
 
53
  /* Remove statements corresponding to a given basic block.  */
54
  void (*delete_basic_block) (basic_block);
55
 
56
  /* Creates a new basic block just after basic block B by splitting
57
     everything after specified instruction I.  */
58
  basic_block (*split_block) (basic_block b, void * i);
59
 
60
  /* Move block B immediately after block A.  */
61
  bool (*move_block_after) (basic_block b, basic_block a);
62
 
63
  /* Return true when blocks A and B can be merged into single basic block.  */
64
  bool (*can_merge_blocks_p) (basic_block a, basic_block b);
65
 
66
  /* Merge blocks A and B.  */
67
  void (*merge_blocks) (basic_block a, basic_block b);
68
 
69
  /* Predict edge E using PREDICTOR to given PROBABILITY.  */
70
  void (*predict_edge) (edge e, enum br_predictor predictor, int probability);
71
 
72
  /* Return true if the one of outgoing edges is already predicted by
73
     PREDICTOR.  */
74
  bool (*predicted_by_p) (const_basic_block bb, enum br_predictor predictor);
75
 
76
  /* Return true when block A can be duplicated.  */
77
  bool (*can_duplicate_block_p) (const_basic_block a);
78
 
79
  /* Duplicate block A.  */
80
  basic_block (*duplicate_block) (basic_block a);
81
 
82
  /* Higher level functions representable by primitive operations above if
83
     we didn't have some oddities in RTL and Tree representations.  */
84
  basic_block (*split_edge) (edge);
85
  void (*make_forwarder_block) (edge);
86
 
87
  /* Try to make the edge fallthru.  */
88
  void (*tidy_fallthru_edge) (edge);
89
 
90
  /* Make the edge non-fallthru.  */
91
  basic_block (*force_nonfallthru) (edge);
92
 
93
  /* Say whether a block ends with a call, possibly followed by some
94
     other code that must stay with the call.  */
95
  bool (*block_ends_with_call_p) (basic_block);
96
 
97
  /* Say whether a block ends with a conditional branch.  Switches
98
     and unconditional branches do not qualify.  */
99
  bool (*block_ends_with_condjump_p) (const_basic_block);
100
 
101
  /* Add fake edges to the function exit for any non constant and non noreturn
102
     calls, volatile inline assembly in the bitmap of blocks specified by
103
     BLOCKS or to the whole CFG if BLOCKS is zero.  Return the number of blocks
104
     that were split.
105
 
106
     The goal is to expose cases in which entering a basic block does not imply
107
     that all subsequent instructions must be executed.  */
108
  int (*flow_call_edges_add) (sbitmap);
109
 
110
  /* This function is called immediately after edge E is added to the
111
     edge vector E->dest->preds.  */
112
  void (*execute_on_growing_pred) (edge);
113
 
114
  /* This function is called immediately before edge E is removed from
115
     the edge vector E->dest->preds.  */
116
  void (*execute_on_shrinking_pred) (edge);
117
 
118
  /* A hook for duplicating loop in CFG, currently this is used
119
     in loop versioning.  */
120
  bool (*cfg_hook_duplicate_loop_to_header_edge) (struct loop *, edge,
121
                                                  unsigned, sbitmap,
122
                                                  edge, vec<edge> *,
123
                                                  int);
124
 
125
  /* Add condition to new basic block and update CFG used in loop
126
     versioning.  */
127
  void (*lv_add_condition_to_bb) (basic_block, basic_block, basic_block,
128
                                  void *);
129
  /* Update the PHI nodes in case of loop versioning.  */
130
  void (*lv_adjust_loop_header_phi) (basic_block, basic_block,
131
                                     basic_block, edge);
132
 
133
  /* Given a condition BB extract the true/false taken/not taken edges
134
     (depending if we are on tree's or RTL). */
135
  void (*extract_cond_bb_edges) (basic_block, edge *, edge *);
136
 
137
 
138
  /* Add PHI arguments queued in PENDINT_STMT list on edge E to edge
139
     E->dest (only in tree-ssa loop versioning.  */
140
  void (*flush_pending_stmts) (edge);
141
 
142
  /* True if a block contains no executable instructions.  */
143
  bool (*empty_block_p) (basic_block);
144
 
145
  /* Split a basic block if it ends with a conditional branch and if
146
     the other part of the block is not empty.  */
147
  basic_block (*split_block_before_cond_jump) (basic_block);
148
 
149
  /* Do book-keeping of a basic block for the profile consistency checker.  */
150
  void (*account_profile_record) (basic_block, int, struct profile_record *);
151
};
152
 
153
extern void verify_flow_info (void);
154
extern void dump_bb (FILE *, basic_block, int, int);
155
extern edge redirect_edge_and_branch (edge, basic_block);
156
extern basic_block redirect_edge_and_branch_force (edge, basic_block);
157
extern bool can_remove_branch_p (const_edge);
158
extern void remove_branch (edge);
159
extern void remove_edge (edge);
160
extern edge split_block (basic_block, void *);
161
extern edge split_block_after_labels (basic_block);
162
extern bool move_block_after (basic_block, basic_block);
163
extern void delete_basic_block (basic_block);
164
extern basic_block split_edge (edge);
165
extern basic_block create_basic_block (void *, void *, basic_block);
166
extern basic_block create_empty_bb (basic_block);
167
extern bool can_merge_blocks_p (basic_block, basic_block);
168
extern void merge_blocks (basic_block, basic_block);
169
extern edge make_forwarder_block (basic_block, bool (*)(edge),
170
                                  void (*) (basic_block));
171
extern basic_block force_nonfallthru (edge);
172
extern void tidy_fallthru_edge (edge);
173
extern void tidy_fallthru_edges (void);
174
extern void predict_edge (edge e, enum br_predictor predictor, int probability);
175
extern bool predicted_by_p (const_basic_block bb, enum br_predictor predictor);
176
extern bool can_duplicate_block_p (const_basic_block);
177
extern basic_block duplicate_block (basic_block, edge, basic_block);
178
extern bool block_ends_with_call_p (basic_block bb);
179
extern bool empty_block_p (basic_block);
180
extern basic_block split_block_before_cond_jump (basic_block);
181
extern bool block_ends_with_condjump_p (const_basic_block bb);
182
extern int flow_call_edges_add (sbitmap);
183
extern void execute_on_growing_pred (edge);
184
extern void execute_on_shrinking_pred (edge);
185
extern bool cfg_hook_duplicate_loop_to_header_edge (struct loop *loop, edge,
186
                                                    unsigned int ndupl,
187
                                                    sbitmap wont_exit,
188
                                                    edge orig,
189
                                                    vec<edge> *to_remove,
190
                                                    int flags);
191
 
192
extern void lv_flush_pending_stmts (edge);
193
extern void extract_cond_bb_edges (basic_block, edge *, edge*);
194
extern void lv_adjust_loop_header_phi (basic_block, basic_block, basic_block,
195
                                       edge);
196
extern void lv_add_condition_to_bb (basic_block, basic_block, basic_block,
197
                                    void *);
198
 
199
extern bool can_copy_bbs_p (basic_block *, unsigned);
200
extern void copy_bbs (basic_block *, unsigned, basic_block *,
201
                      edge *, unsigned, edge *, struct loop *,
202
                      basic_block);
203
 
204
void account_profile_record (struct profile_record *, int);
205
 
206
extern void cfg_layout_initialize (unsigned int);
207
extern void cfg_layout_finalize (void);
208
 
209
/* Hooks containers.  */
210
extern struct cfg_hooks gimple_cfg_hooks;
211
extern struct cfg_hooks rtl_cfg_hooks;
212
extern struct cfg_hooks cfg_layout_rtl_cfg_hooks;
213
 
214
/* Declarations.  */
215
extern enum ir_type current_ir_type (void);
216
extern void rtl_register_cfg_hooks (void);
217
extern void cfg_layout_rtl_register_cfg_hooks (void);
218
extern void gimple_register_cfg_hooks (void);
219
extern struct cfg_hooks get_cfg_hooks (void);
220
extern void set_cfg_hooks (struct cfg_hooks);
221
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.