GCC Middle and Back End API Reference
Main Page
Namespaces
Data Structures
Files
File List
Globals
tree-inline.h
Go to the documentation of this file.
1
/* Tree inlining hooks and declarations.
2
Copyright (C) 2001-2013 Free Software Foundation, Inc.
3
Contributed by Alexandre Oliva <aoliva@redhat.com>
4
5
This file is part of GCC.
6
7
GCC is free software; you can redistribute it and/or modify
8
it under the terms of the GNU General Public License as published by
9
the Free Software Foundation; either version 3, or (at your option)
10
any later version.
11
12
GCC is distributed in the hope that it will be useful,
13
but WITHOUT ANY WARRANTY; without even the implied warranty of
14
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
GNU General Public License 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
#ifndef GCC_TREE_INLINE_H
22
#define GCC_TREE_INLINE_H
23
24
struct
cgraph_edge
;
25
26
/* Indicate the desired behavior wrt call graph edges. We can either
27
duplicate the edge (inlining, cloning), move the edge (versioning,
28
parallelization), or move the edges of the clones (saving). */
29
30
enum
copy_body_cge_which
31
{
32
CB_CGE_DUPLICATE
,
33
CB_CGE_MOVE
,
34
CB_CGE_MOVE_CLONES
35
};
36
37
/* Data required for function body duplication. */
38
39
typedef
struct
copy_body_data
40
{
41
/* FUNCTION_DECL for function being inlined, or in general the
42
source function providing the original trees. */
43
tree
src_fn
;
44
45
/* FUNCTION_DECL for function being inlined into, or in general
46
the destination function receiving the new trees. */
47
tree
dst_fn
;
48
49
/* Callgraph node of the source function. */
50
struct
cgraph_node
*
src_node
;
51
52
/* Callgraph node of the destination function. */
53
struct
cgraph_node
*
dst_node
;
54
55
/* struct function for function being inlined. Usually this is the same
56
as DECL_STRUCT_FUNCTION (src_fn), but can be different if saved_cfg
57
and saved_eh are in use. */
58
struct
function
*
src_cfun
;
59
60
/* The VAR_DECL for the return value. */
61
tree
retvar
;
62
63
/* The map from local declarations in the inlined function to
64
equivalents in the function into which it is being inlined. */
65
struct
pointer_map_t
*
decl_map
;
66
67
/* Create a new decl to replace DECL in the destination function. */
68
tree
(*
copy_decl
) (
tree
,
struct
copy_body_data
*);
69
70
/* Current BLOCK. */
71
tree
block
;
72
73
/* GIMPLE_CALL if va arg parameter packs should be expanded or NULL
74
is not. */
75
gimple
gimple_call
;
76
77
/* Exception landing pad the inlined call lies in. */
78
int
eh_lp_nr
;
79
80
/* Maps region and landing pad structures from the function being copied
81
to duplicates created within the function we inline into. */
82
struct
pointer_map_t
*
eh_map
;
83
84
/* We use the same mechanism do all sorts of different things. Rather
85
than enumerating the different cases, we categorize the behavior
86
in the various situations. */
87
88
/* What to do with call graph edges. */
89
enum
copy_body_cge_which
transform_call_graph_edges
;
90
91
/* True if a new CFG should be created. False for inlining, true for
92
everything else. */
93
bool
transform_new_cfg
;
94
95
/* True if RETURN_EXPRs should be transformed to just the contained
96
MODIFY_EXPR. The branch semantics of the return will be handled
97
by manipulating the CFG rather than a statement. */
98
bool
transform_return_to_modify
;
99
100
/* True if the parameters of the source function are transformed.
101
Only true for inlining. */
102
bool
transform_parameter
;
103
104
/* True if this statement will need to be regimplified. */
105
bool
regimplify
;
106
107
/* True if trees should not be unshared. */
108
bool
do_not_unshare
;
109
110
/* > 0 if we are remapping a type currently. */
111
int
remapping_type_depth
;
112
113
/* A function to be called when duplicating BLOCK nodes. */
114
void (*
transform_lang_insert_block
) (
tree
);
115
116
/* Statements that might be possibly folded. */
117
struct
pointer_set_t
*
statements_to_fold
;
118
119
/* Entry basic block to currently copied body. */
120
basic_block
entry_bb
;
121
122
/* For partial function versioning, bitmap of bbs to be copied,
123
otherwise NULL. */
124
bitmap
blocks_to_copy
;
125
126
/* Debug statements that need processing. */
127
vec<gimple>
debug_stmts
;
128
129
/* A map from local declarations in the inlined function to
130
equivalents in the function into which it is being inlined, where
131
the originals have been mapped to a value rather than to a
132
variable. */
133
struct
pointer_map_t
*
debug_map
;
134
135
/* Cilk keywords currently need to replace some variables that
136
ordinary nested functions do not. */
137
bool
remap_var_for_cilk
;
138
}
copy_body_data
;
139
140
/* Weights of constructions for estimate_num_insns. */
141
142
typedef
struct
eni_weights_d
143
{
144
/* Cost per call. */
145
unsigned
call_cost
;
146
147
/* Cost per indirect call. */
148
unsigned
indirect_call_cost
;
149
150
/* Cost per call to a target specific builtin */
151
unsigned
target_builtin_call_cost
;
152
153
/* Cost of "expensive" div and mod operations. */
154
unsigned
div_mod_cost
;
155
156
/* Cost for omp construct. */
157
unsigned
omp_cost
;
158
159
/* Cost for tm transaction. */
160
unsigned
tm_cost
;
161
162
/* Cost of return. */
163
unsigned
return_cost
;
164
165
/* True when time of statemnt should be estimated. Thus i.e
166
cost of switch statement is logarithmic rather than linear in number
167
of cases. */
168
bool
time_based
;
169
}
eni_weights
;
170
171
/* Weights that estimate_num_insns uses for heuristics in inlining. */
172
173
extern
eni_weights
eni_inlining_weights
;
174
175
/* Weights that estimate_num_insns uses to estimate the size of the
176
produced code. */
177
178
extern
eni_weights
eni_size_weights
;
179
180
/* Weights that estimate_num_insns uses to estimate the time necessary
181
to execute the produced code. */
182
183
extern
eni_weights
eni_time_weights
;
184
185
/* Function prototypes. */
186
187
extern
tree
copy_tree_body_r
(
tree
*,
int
*,
void
*);
188
extern
void
insert_decl_map
(
copy_body_data
*,
tree
,
tree
);
189
190
unsigned
int
optimize_inline_calls
(
tree
);
191
tree
maybe_inline_call_in_expr
(
tree
);
192
bool
tree_inlinable_function_p
(
tree
);
193
tree
copy_tree_r
(
tree
*,
int
*,
void
*);
194
tree
copy_decl_no_change
(
tree
decl
,
copy_body_data
*
id
);
195
int
estimate_move_cost
(
tree
type
);
196
int
estimate_num_insns
(
gimple
,
eni_weights
*);
197
int
estimate_num_insns_fn
(
tree
,
eni_weights
*);
198
int
count_insns_seq
(
gimple_seq
,
eni_weights
*);
199
bool
tree_versionable_function_p
(
tree
);
200
201
extern
tree
remap_decl
(
tree
decl
,
copy_body_data
*
id
);
202
extern
tree
remap_type
(
tree
type
,
copy_body_data
*
id
);
203
extern
gimple_seq
copy_gimple_seq_and_replace_locals
(
gimple_seq
seq);
204
205
extern
HOST_WIDE_INT
estimated_stack_frame_size
(
struct
cgraph_node
*);
206
207
#endif
/* GCC_TREE_INLINE_H */
gcc
tree-inline.h
Generated by
1.8.1.1