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 this statement will need to be regimplified. */
101
bool
regimplify
;
102
103
/* True if trees should not be unshared. */
104
bool
do_not_unshare
;
105
106
/* > 0 if we are remapping a type currently. */
107
int
remapping_type_depth
;
108
109
/* A function to be called when duplicating BLOCK nodes. */
110
void (*
transform_lang_insert_block
) (
tree
);
111
112
/* Statements that might be possibly folded. */
113
struct
pointer_set_t
*
statements_to_fold
;
114
115
/* Entry basic block to currently copied body. */
116
basic_block
entry_bb
;
117
118
/* For partial function versioning, bitmap of bbs to be copied,
119
otherwise NULL. */
120
bitmap
blocks_to_copy
;
121
122
/* Debug statements that need processing. */
123
vec<gimple>
debug_stmts
;
124
125
/* A map from local declarations in the inlined function to
126
equivalents in the function into which it is being inlined, where
127
the originals have been mapped to a value rather than to a
128
variable. */
129
struct
pointer_map_t
*
debug_map
;
130
}
copy_body_data
;
131
132
/* Weights of constructions for estimate_num_insns. */
133
134
typedef
struct
eni_weights_d
135
{
136
/* Cost per call. */
137
unsigned
call_cost
;
138
139
/* Cost per indirect call. */
140
unsigned
indirect_call_cost
;
141
142
/* Cost per call to a target specific builtin */
143
unsigned
target_builtin_call_cost
;
144
145
/* Cost of "expensive" div and mod operations. */
146
unsigned
div_mod_cost
;
147
148
/* Cost for omp construct. */
149
unsigned
omp_cost
;
150
151
/* Cost for tm transaction. */
152
unsigned
tm_cost
;
153
154
/* Cost of return. */
155
unsigned
return_cost
;
156
157
/* True when time of statemnt should be estimated. Thus i.e
158
cost of switch statement is logarithmic rather than linear in number
159
of cases. */
160
bool
time_based
;
161
}
eni_weights
;
162
163
/* Weights that estimate_num_insns uses for heuristics in inlining. */
164
165
extern
eni_weights
eni_inlining_weights
;
166
167
/* Weights that estimate_num_insns uses to estimate the size of the
168
produced code. */
169
170
extern
eni_weights
eni_size_weights
;
171
172
/* Weights that estimate_num_insns uses to estimate the time necessary
173
to execute the produced code. */
174
175
extern
eni_weights
eni_time_weights
;
176
177
/* Function prototypes. */
178
179
extern
tree
copy_tree_body_r
(
tree
*,
int
*,
void
*);
180
extern
void
insert_decl_map
(
copy_body_data
*,
tree
,
tree
);
181
182
unsigned
int
optimize_inline_calls
(
tree
);
183
tree
maybe_inline_call_in_expr
(
tree
);
184
bool
tree_inlinable_function_p
(
tree
);
185
tree
copy_tree_r
(
tree
*,
int
*,
void
*);
186
tree
copy_decl_no_change
(
tree
decl
,
copy_body_data
*
id
);
187
int
estimate_move_cost
(
tree
type
);
188
int
estimate_num_insns
(
gimple
,
eni_weights
*);
189
int
estimate_num_insns_fn
(
tree
,
eni_weights
*);
190
int
count_insns_seq
(
gimple_seq
,
eni_weights
*);
191
bool
tree_versionable_function_p
(
tree
);
192
193
extern
tree
remap_decl
(
tree
decl
,
copy_body_data
*
id
);
194
extern
tree
remap_type
(
tree
type
,
copy_body_data
*
id
);
195
extern
gimple_seq
copy_gimple_seq_and_replace_locals
(
gimple_seq
seq);
196
197
extern
HOST_WIDE_INT
estimated_stack_frame_size
(
struct
cgraph_node
*);
198
199
#endif
/* GCC_TREE_INLINE_H */
gcc
tree-inline.h
Generated by
1.8.1.1