annotate gcc/ipa-param-manipulation.h @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1 /* Manipulation of formal and actual parameters of functions and function
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
2 calls.
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
3 Copyright (C) 2017-2020 Free Software Foundation, Inc.
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
4
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
5 This file is part of GCC.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
6
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
7 GCC is free software; you can redistribute it and/or modify it under
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
8 the terms of the GNU General Public License as published by the Free
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
9 Software Foundation; either version 3, or (at your option) any later
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
10 version.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
11
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
15 for more details.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
16
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
18 along with GCC; see the file COPYING3. If not see
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
19 <http://www.gnu.org/licenses/>.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
20
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
21
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
22
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
23 This file defines classes and other data structures that are used to manipulate
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
24 the prototype of a function, especially to create, remove or split its formal
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
25 parameters, but also to remove its return value, and also its call statements
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
26 correspondingly.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
27
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
28 The most basic one is a vector of structures ipa_adjusted_param. It is simply
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
29 a description how the new parameters should look like after the transformation
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
30 in what way they relate to the previous ones (if in any). Such relation to an
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
31 old parameter can be an outright copy or an IPA-SRA replacement. If an old
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
32 parameter is not listed or otherwise mentioned, it is removed as unused or at
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
33 least unnecessary. Note that this most basic structure does not work for
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
34 modifying calls of functions with variable number of arguments.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
35
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
36 Class ipa_param_adjustments is only a little more than a thin encapsulation of
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
37 a vector of ipa_param_adjustments. Along with this vector it contains an index
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
38 of the first potential vararg argument and a boolean flag whether the return
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
39 value should be removed or not. Moreover, the class contains method
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
40 modify_call which can transform a call statement so that it correctly calls a
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
41 modified function. These two data structures were designed to have a small
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
42 memory footprint because they are allocated for each clone of a call graph node
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
43 that has its prototype changed and live until the end of IPA clone
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
44 materialization and call redirection phase.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
45
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
46 On the other hand, class ipa_param_body_adjustments can afford to allocate more
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
47 data because its life span is much smaller, it is allocated and destroyed in
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
48 the course of materialization of each single clone that needs it or only when a
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
49 particular pass needs to change a function it is operating on. This class has
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
50 various methods required to change function declaration and the body of the
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
51 function according to instructions given either by class ipa_param_adjustments
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
52 or only a vector of ipa_adjusted_params.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
53
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
54 When these classes are used in the context of call graph clone materialization
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
55 and subsequent call statement redirection - which is the point at which we
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
56 modify arguments in call statements - they need to cooperate with each other in
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
57 order to handle what we refer to as transitive (IPA-SRA) splits. These are
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
58 situations when a formal parameter of one function is split into several
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
59 smaller ones and some of them are then passed on in a call to another function
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
60 because the formal parameter of this callee has also been split.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
61
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
62 Consider a simple example:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
63
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
64 struct S {int a, b, c;};
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
65 struct Z {int x; S s;};
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
66
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
67 foo (S s)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
68 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
69 use (s.b);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
70 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
71
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
72 bar (Z z)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
73 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
74 use (z.s.a);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
75 foo (z.s);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
76 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
77
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
78 baz ()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
79 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
80 bar (*global);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
81 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
82
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
83 Both bar and foo would have their parameter split. Foo would receive one
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
84 replacement representing s.b. Function bar would see its parameter split into
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
85 one replacement representing z.s.a and another representing z.s.b which would
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
86 be passed on to foo. It would be a so called transitive split IPA-SRA
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
87 replacement, one which is passed in a call as an actual argument to another
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
88 IPA-SRA replacement in another function.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
89
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
90 Note that the call chain the example can be arbitrarily long and recursive and
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
91 that any function in it can be cloned by another IPA pass and any number of
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
92 adjacent functions in the call chain can be inlined into each other. Call
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
93 redirection takes place only after bodies of the function have been modified by
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
94 all of the above.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
95
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
96 Call redirection has to be able to find the right decl or SSA_NAME that
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
97 corresponds to the transitive split in the caller. The SSA names are assigned
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
98 right after clone materialization/ modification and cannot be "added"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
99 afterwards. Moreover, if the caller has been inlined the SSA_NAMEs in question
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
100 no longer belong to PARM_DECLs but to VAR_DECLs, indistinguishable from any
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
101 others.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
102
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
103 Therefore, when clone materialization finds a call statement which it knows is
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
104 a part of a transitive split, it will modify it into:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
105
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
106 foo (DUMMY_Z_VAR.s, repl_for_a, repl_for_b, <rest of original arguments>);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
107
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
108 It will also store {DUMMY_S_VAR, 32} and {DUMMY_S_VAR, 64} representing offsets
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
109 of z.s.a and z.s.b (assuming a 32-bit int) into foo's cgraph node
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
110 clone->performed_splits vector (which is storing structures of type
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
111 ipa_param_performed_split also defined in this header file).
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
112
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
113 Call redirection will identify that expression DUMMY_Z_VAR.s is based on a
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
114 variable stored in performed_splits vector and learn that the following
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
115 arguments, already in SSA form, represent offsets 32 and 64 in a split original
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
116 parameter. It subtracts offset of DUMMY_Z_VAR.s from 32 and 64 and arrives at
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
117 offsets 0 and 32 within callee's original parameter. At this point it also
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
118 knows from the call graph that only the bit with offset 32 is needed and so
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
119 changes the call statement into final:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
120
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
121 bar (repl_for_b, <rest of original arguments>); */
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
122
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
123 #ifndef IPA_PARAM_MANIPULATION_H
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
124 #define IPA_PARAM_MANIPULATION_H
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
125
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
126 /* Indices into ipa_param_prefixes to identify a human-readable prefix for newly
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
127 synthesized parameters. Keep in sync with the array. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
128 enum ipa_param_name_prefix_indices
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
129 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
130 IPA_PARAM_PREFIX_SYNTH,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
131 IPA_PARAM_PREFIX_ISRA,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
132 IPA_PARAM_PREFIX_SIMD,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
133 IPA_PARAM_PREFIX_MASK,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
134 IPA_PARAM_PREFIX_COUNT
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
135 };
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
136
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
137 /* We do not support manipulating functions with more than
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
138 1<<IPA_PARAM_MAX_INDEX_BITS parameters. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
139 #define IPA_PARAM_MAX_INDEX_BITS 16
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
140
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
141 /* Operation to be performed for the parameter in ipa_parm_adjustment
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
142 below. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
143
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
144 enum ipa_parm_op
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
145 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
146 /* Do not use or you will trigger an assert. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
147 IPA_PARAM_OP_UNDEFINED,
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
148
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
149 /* This new parameter is an unmodified parameter at index base_index. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
150 IPA_PARAM_OP_COPY,
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
151
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
152 /* This describes a brand new parameter. If it somehow relates to any
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
153 original parameters, the user needs to manage the transition itself. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
154 IPA_PARAM_OP_NEW,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
155
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
156 /* Split parameter as indicated by fields base_index, offset and type. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
157 IPA_PARAM_OP_SPLIT
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
158 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
159
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
160 /* Structure that describes one parameter of a function after transformation.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
161 Omitted parameters will be removed. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
162
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
163 struct GTY(()) ipa_adjusted_param
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
164 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
165 /* Type of the new parameter. Required for all operations except
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
166 IPA_PARM_OP_COPY when the original type will be preserved. */
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
167 tree type;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
168
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
169 /* Alias reference type to be used in MEM_REFs when adjusting caller
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
170 arguments. Required for IPA_PARM_OP_SPLIT operation. */
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
171 tree alias_ptr_type;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
172
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
173 /* Offset into the original parameter (for the cases when the new parameter
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
174 is a component of an original one). Required for IPA_PARM_OP_SPLIT
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
175 operation. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
176 unsigned unit_offset;
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
177
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
178 /* Zero based index of the original parameter this one is based on. Required
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
179 for IPA_PARAM_OP_COPY and IPA_PARAM_OP_SPLIT, users of IPA_PARAM_OP_NEW
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
180 only need to specify it if they use replacement lookup provided by
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
181 ipa_param_body_adjustments. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
182 unsigned base_index : IPA_PARAM_MAX_INDEX_BITS;
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
183
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
184 /* Zero based index of the parameter this one is based on in the previous
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
185 clone. If there is no previous clone, it must be equal to base_index. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
186 unsigned prev_clone_index : IPA_PARAM_MAX_INDEX_BITS;
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
187
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
188 /* Specify the operation, if any, to be performed on the parameter. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
189 enum ipa_parm_op op : 2;
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
190
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
191 /* If set, this structure describes a parameter copied over from a previous
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
192 IPA clone, any transformations are thus not to be re-done. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
193 unsigned prev_clone_adjustment : 1;
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
194
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
195 /* Index into ipa_param_prefixes specifying a prefix to be used with
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
196 DECL_NAMEs of newly synthesized parameters. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
197 unsigned param_prefix_index : 2;
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
198
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
199 /* Storage order of the original parameter (for the cases when the new
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
200 parameter is a component of an original one). */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
201 unsigned reverse : 1;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
202
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
203 /* A bit free for the user. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
204 unsigned user_flag : 1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
205 };
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
206
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
207 void ipa_dump_adjusted_parameters (FILE *f,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
208 vec<ipa_adjusted_param, va_gc> *adj_params);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
209
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
210 /* Structure to remember the split performed on a node so that edge redirection
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
211 (i.e. splitting arguments of call statements) know how split formal
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
212 parameters of the caller are represented. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
213
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
214 struct GTY(()) ipa_param_performed_split
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
215 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
216 /* The dummy VAR_DECL that was created instead of the split parameter that
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
217 sits in the call in the meantime between clone materialization and call
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
218 redirection. All entries in a vector of performed splits that correspond
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
219 to the same dumy decl must be grouped together. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
220 tree dummy_decl;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
221 /* Offset into the original parameter. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
222 unsigned unit_offset;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
223 };
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
224
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
225 /* Class used to record planned modifications to parameters of a function and
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
226 also to perform necessary modifications at the caller side at the gimple
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
227 level. Used to describe all cgraph node clones that have their parameters
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
228 changed, therefore the class should only have a small memory footprint. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
229
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
230 class GTY(()) ipa_param_adjustments
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
231 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
232 public:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
233 /* Constructor from NEW_PARAMS showing how new parameters should look like
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
234 plus copying any pre-existing actual arguments starting from argument
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
235 with index ALWAYS_COPY_START (if non-negative, negative means do not copy
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
236 anything beyond what is described in NEW_PARAMS), and SKIP_RETURN, which
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
237 indicates that the function should return void after transformation. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
238
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
239 ipa_param_adjustments (vec<ipa_adjusted_param, va_gc> *new_params,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
240 int always_copy_start, bool skip_return)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
241 : m_adj_params (new_params), m_always_copy_start (always_copy_start),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
242 m_skip_return (skip_return)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
243 {}
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
244
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
245 /* Modify a call statement arguments (and possibly remove the return value)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
246 as described in the data fields of this class. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
247 gcall *modify_call (gcall *stmt,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
248 vec<ipa_param_performed_split, va_gc> *performed_splits,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
249 tree callee_decl, bool update_references);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
250 /* Return if the first parameter is left intact. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
251 bool first_param_intact_p ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
252 /* Build a function type corresponding to the modified call. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
253 tree build_new_function_type (tree old_type, bool type_is_original_p);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
254 /* Build a declaration corresponding to the target of the modified call. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
255 tree adjust_decl (tree orig_decl);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
256 /* Fill a vector marking which parameters are intact by the described
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
257 modifications. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
258 void get_surviving_params (vec<bool> *surviving_params);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
259 /* Fill a vector with new indices of surviving original parameters. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
260 void get_updated_indices (vec<int> *new_indices);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
261 /* Return the original index for the given new parameter index. Return a
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
262 negative number if not available. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
263 int get_original_index (int newidx);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
264
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
265 void dump (FILE *f);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
266 void debug ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
267
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
268 /* How the known part of arguments should look like. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
269 vec<ipa_adjusted_param, va_gc> *m_adj_params;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
270
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
271 /* If non-negative, copy any arguments starting at this offset without any
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
272 modifications so that functions with variable number of arguments can be
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
273 modified. This number should be equal to the number of original forma
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
274 parameters. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
275 int m_always_copy_start;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
276 /* If true, make the function not return any value. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
277 bool m_skip_return;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
278
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
279 private:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
280 ipa_param_adjustments () {}
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
281
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
282 void init (vec<tree> *cur_params);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
283 int get_max_base_index ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
284 bool method2func_p (tree orig_type);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
285 };
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
286
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
287 /* Structure used to map expressions accessing split or replaced parameters to
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
288 new PARM_DECLs. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
289
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
290 struct ipa_param_body_replacement
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
291 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
292 /* The old decl of the original parameter. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
293 tree base;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
294 /* The new decl it should be replaced with. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
295 tree repl;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
296 /* When modifying clones during IPA clone materialization, this is a dummy
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
297 decl used to mark calls in which we need to apply transitive splitting,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
298 these dummy delcls are inserted as arguments to such calls and then
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
299 followed by all the replacements with offset info stored in
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
300 ipa_param_performed_split.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
301
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
302 Users of ipa_param_body_adjustments that modify standalone functions
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
303 outside of IPA clone materialization can use this field for their internal
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
304 purposes. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
305 tree dummy;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
306 /* The offset within BASE that REPL represents. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
307 unsigned unit_offset;
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
308 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
309
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
310 struct ipa_replace_map;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
311
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
312 /* Class used when actually performing adjustments to formal parameters of a
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
313 function to map accesses that need to be replaced to replacements. The
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
314 class attempts to work in two very different sets of circumstances: as a
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
315 part of tree-inine.c's tree_function_versioning machinery to clone functions
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
316 (when M_ID is not NULL) and in s standalone fashion, modifying an existing
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
317 function in place (when M_ID is NULL). While a lot of stuff handled in a
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
318 unified way in both modes, there are many aspects of the processs that
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
319 requires distinct paths. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
320
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
321 class ipa_param_body_adjustments
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
322 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
323 public:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
324 /* Constructor to use from within tree-inline. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
325 ipa_param_body_adjustments (ipa_param_adjustments *adjustments,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
326 tree fndecl, tree old_fndecl,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
327 struct copy_body_data *id, tree *vars,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
328 vec<ipa_replace_map *, va_gc> *tree_map);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
329 /* Constructor to use for modifying a function outside of tree-inline from an
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
330 instance of ipa_param_adjustments. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
331 ipa_param_body_adjustments (ipa_param_adjustments *adjustments,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
332 tree fndecl);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
333 /* Constructor to use for modifying a function outside of tree-inline from a
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
334 simple vector of desired parameter modification. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
335 ipa_param_body_adjustments (vec<ipa_adjusted_param, va_gc> *adj_params,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
336 tree fndecl);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
337
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
338 /* The do-it-all function for modifying a function outside of
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
339 tree-inline. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
340 bool perform_cfun_body_modifications ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
341
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
342 /* Change the PARM_DECLs. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
343 void modify_formal_parameters ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
344 /* Register a replacement decl for the transformation done in APM. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
345 void register_replacement (ipa_adjusted_param *apm, tree replacement,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
346 tree dummy = NULL_TREE);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
347 /* Lookup a replacement for a given offset within a given parameter. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
348 tree lookup_replacement (tree base, unsigned unit_offset);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
349 /* Lookup a replacement for an expression, if there is one. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
350 ipa_param_body_replacement *get_expr_replacement (tree expr,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
351 bool ignore_default_def);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
352 /* Lookup the new base for surviving names previously belonging to a
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
353 parameter. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
354 tree get_replacement_ssa_base (tree old_decl);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
355 /* Modify a statement. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
356 bool modify_gimple_stmt (gimple **stmt, gimple_seq *extra_stmts);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
357 /* Return the new chain of parameters. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
358 tree get_new_param_chain ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
359
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
360 /* Pointers to data structures defining how the function should be
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
361 modified. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
362 vec<ipa_adjusted_param, va_gc> *m_adj_params;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
363 ipa_param_adjustments *m_adjustments;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
364
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
365 /* Vector of old parameter declarations that must have their debug bind
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
366 statements re-mapped and debug decls created. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
367
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
368 auto_vec<tree, 16> m_reset_debug_decls;
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
369
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
370 /* Set to true if there are any IPA_PARAM_OP_SPLIT adjustments among stored
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
371 adjustments. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
372 bool m_split_modifications_p;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
373 private:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
374 void common_initialization (tree old_fndecl, tree *vars,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
375 vec<ipa_replace_map *, va_gc> *tree_map);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
376 tree carry_over_param (tree t);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
377 unsigned get_base_index (ipa_adjusted_param *apm);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
378 ipa_param_body_replacement *lookup_replacement_1 (tree base,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
379 unsigned unit_offset);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
380 tree replace_removed_params_ssa_names (tree old_name, gimple *stmt);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
381 bool modify_expression (tree *expr_p, bool convert);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
382 bool modify_assignment (gimple *stmt, gimple_seq *extra_stmts);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
383 bool modify_call_stmt (gcall **stmt_p);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
384 bool modify_cfun_body ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
385 void reset_debug_stmts ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
386
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
387 /* Declaration of the function that is being transformed. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
388
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
389 tree m_fndecl;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
390
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
391 /* If non-NULL, the tree-inline master data structure guiding materialization
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
392 of the current clone. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
393 struct copy_body_data *m_id;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
394
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
395 /* Vector of old parameter declarations (before changing them). */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
396
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
397 auto_vec<tree, 16> m_oparms;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
398
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
399 /* Vector of parameter declarations the function will have after
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
400 transformation. */
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
401
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
402 auto_vec<tree, 16> m_new_decls;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
403
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
404 /* If the function type has non-NULL TYPE_ARG_TYPES, this is the vector of
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
405 these types after transformation, otherwise an empty one. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
406
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
407 auto_vec<tree, 16> m_new_types;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
408
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
409 /* Vector of structures telling how to replace old parameters in in the
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
410 function body. TODO: Even though there usually be only few, but should we
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
411 use a hash? */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
412
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
413 auto_vec<ipa_param_body_replacement, 16> m_replacements;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
414
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
415 /* Vector for remapping SSA_BASES from old parameter declarations that are
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
416 being removed as a part of the transformation. Before a new VAR_DECL is
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
417 created, it holds the old PARM_DECL, once the variable is built it is
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
418 stored here. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
419
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
420 auto_vec<tree> m_removed_decls;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
421
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
422 /* Hash to quickly lookup the item in m_removed_decls given the old decl. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
423
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
424 hash_map<tree, unsigned> m_removed_map;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
425
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
426 /* True iff the transformed function is a class method that is about to loose
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
427 its this pointer and must be converted to a normal function. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
428
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
429 bool m_method2func;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
430 };
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
431
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
432 void push_function_arg_decls (vec<tree> *args, tree fndecl);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
433 void push_function_arg_types (vec<tree> *types, tree fntype);
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
434
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
435 #endif /* IPA_PARAM_MANIPULATION_H */