tree-streamer-out.cc revision 1.1 1 1.1 mrg /* Routines for emitting trees to a file stream.
2 1.1 mrg
3 1.1 mrg Copyright (C) 2011-2022 Free Software Foundation, Inc.
4 1.1 mrg Contributed by Diego Novillo <dnovillo (at) google.com>
5 1.1 mrg
6 1.1 mrg This file is part of GCC.
7 1.1 mrg
8 1.1 mrg GCC is free software; you can redistribute it and/or modify it under
9 1.1 mrg the terms of the GNU General Public License as published by the Free
10 1.1 mrg Software Foundation; either version 3, or (at your option) any later
11 1.1 mrg version.
12 1.1 mrg
13 1.1 mrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 1.1 mrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 1.1 mrg FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 1.1 mrg for more details.
17 1.1 mrg
18 1.1 mrg You should have received a copy of the GNU General Public License
19 1.1 mrg along with GCC; see the file COPYING3. If not see
20 1.1 mrg <http://www.gnu.org/licenses/>. */
21 1.1 mrg
22 1.1 mrg #include "config.h"
23 1.1 mrg #include "system.h"
24 1.1 mrg #include "coretypes.h"
25 1.1 mrg #include "backend.h"
26 1.1 mrg #include "target.h"
27 1.1 mrg #include "tree.h"
28 1.1 mrg #include "gimple.h"
29 1.1 mrg #include "tree-streamer.h"
30 1.1 mrg #include "cgraph.h"
31 1.1 mrg #include "alias.h"
32 1.1 mrg #include "stor-layout.h"
33 1.1 mrg #include "gomp-constants.h"
34 1.1 mrg #include "print-tree.h"
35 1.1 mrg
36 1.1 mrg
37 1.1 mrg /* Output the STRING constant to the string
38 1.1 mrg table in OB. Then put the index onto the INDEX_STREAM. */
39 1.1 mrg
40 1.1 mrg void
41 1.1 mrg streamer_write_string_cst (struct output_block *ob,
42 1.1 mrg struct lto_output_stream *index_stream,
43 1.1 mrg tree string)
44 1.1 mrg {
45 1.1 mrg streamer_write_string_with_length (ob, index_stream,
46 1.1 mrg string ? TREE_STRING_POINTER (string)
47 1.1 mrg : NULL,
48 1.1 mrg string ? TREE_STRING_LENGTH (string) : 0,
49 1.1 mrg true);
50 1.1 mrg }
51 1.1 mrg
52 1.1 mrg
53 1.1 mrg /* Output the identifier ID to the string
54 1.1 mrg table in OB. Then put the index onto the INDEX_STREAM. */
55 1.1 mrg
56 1.1 mrg static void
57 1.1 mrg write_identifier (struct output_block *ob,
58 1.1 mrg struct lto_output_stream *index_stream,
59 1.1 mrg tree id)
60 1.1 mrg {
61 1.1 mrg streamer_write_string_with_length (ob, index_stream,
62 1.1 mrg IDENTIFIER_POINTER (id),
63 1.1 mrg IDENTIFIER_LENGTH (id),
64 1.1 mrg true);
65 1.1 mrg }
66 1.1 mrg
67 1.1 mrg
68 1.1 mrg /* Pack all the non-pointer fields of the TS_BASE structure of
69 1.1 mrg expression EXPR into bitpack BP. */
70 1.1 mrg
71 1.1 mrg static inline void
72 1.1 mrg pack_ts_base_value_fields (struct bitpack_d *bp, tree expr)
73 1.1 mrg {
74 1.1 mrg if (streamer_debugging)
75 1.1 mrg bp_pack_value (bp, TREE_CODE (expr), 16);
76 1.1 mrg if (!TYPE_P (expr))
77 1.1 mrg {
78 1.1 mrg bp_pack_value (bp, TREE_SIDE_EFFECTS (expr), 1);
79 1.1 mrg bp_pack_value (bp, TREE_CONSTANT (expr), 1);
80 1.1 mrg bp_pack_value (bp, TREE_READONLY (expr), 1);
81 1.1 mrg
82 1.1 mrg /* TREE_PUBLIC is used on types to indicate that the type
83 1.1 mrg has a TYPE_CACHED_VALUES vector. This is not streamed out,
84 1.1 mrg so we skip it here. */
85 1.1 mrg bp_pack_value (bp, TREE_PUBLIC (expr), 1);
86 1.1 mrg }
87 1.1 mrg else
88 1.1 mrg bp_pack_value (bp, 0, 4);
89 1.1 mrg bp_pack_value (bp, TREE_ADDRESSABLE (expr), 1);
90 1.1 mrg bp_pack_value (bp, TREE_THIS_VOLATILE (expr), 1);
91 1.1 mrg if (DECL_P (expr))
92 1.1 mrg {
93 1.1 mrg bp_pack_value (bp, DECL_UNSIGNED (expr), 1);
94 1.1 mrg bp_pack_value (bp, DECL_NAMELESS (expr), 1);
95 1.1 mrg }
96 1.1 mrg else if (TYPE_P (expr))
97 1.1 mrg bp_pack_value (bp, TYPE_UNSIGNED (expr), 1);
98 1.1 mrg else
99 1.1 mrg bp_pack_value (bp, 0, 1);
100 1.1 mrg /* We write debug info two times, do not confuse the second one.
101 1.1 mrg The only relevant TREE_ASM_WRITTEN use is on SSA names. */
102 1.1 mrg bp_pack_value (bp, (TREE_CODE (expr) != SSA_NAME
103 1.1 mrg ? 0 : TREE_ASM_WRITTEN (expr)), 1);
104 1.1 mrg if (TYPE_P (expr))
105 1.1 mrg bp_pack_value (bp, TYPE_ARTIFICIAL (expr), 1);
106 1.1 mrg else
107 1.1 mrg bp_pack_value (bp, TREE_NO_WARNING (expr), 1);
108 1.1 mrg bp_pack_value (bp, TREE_NOTHROW (expr), 1);
109 1.1 mrg bp_pack_value (bp, TREE_STATIC (expr), 1);
110 1.1 mrg if (TREE_CODE (expr) != TREE_BINFO)
111 1.1 mrg bp_pack_value (bp, TREE_PRIVATE (expr), 1);
112 1.1 mrg else
113 1.1 mrg bp_pack_value (bp, 0, 1);
114 1.1 mrg bp_pack_value (bp, TREE_PROTECTED (expr), 1);
115 1.1 mrg bp_pack_value (bp, TREE_DEPRECATED (expr), 1);
116 1.1 mrg if (TYPE_P (expr))
117 1.1 mrg {
118 1.1 mrg if (AGGREGATE_TYPE_P (expr))
119 1.1 mrg bp_pack_value (bp, TYPE_REVERSE_STORAGE_ORDER (expr), 1);
120 1.1 mrg else
121 1.1 mrg bp_pack_value (bp, TYPE_SATURATING (expr), 1);
122 1.1 mrg if (lto_stream_offload_p)
123 1.1 mrg /* Host and offload targets have no common meaning of address
124 1.1 mrg spaces. */
125 1.1 mrg ;
126 1.1 mrg else
127 1.1 mrg bp_pack_value (bp, TYPE_ADDR_SPACE (expr), 8);
128 1.1 mrg }
129 1.1 mrg else if (TREE_CODE (expr) == BIT_FIELD_REF || TREE_CODE (expr) == MEM_REF)
130 1.1 mrg {
131 1.1 mrg bp_pack_value (bp, REF_REVERSE_STORAGE_ORDER (expr), 1);
132 1.1 mrg bp_pack_value (bp, 0, 8);
133 1.1 mrg }
134 1.1 mrg else if (TREE_CODE (expr) == SSA_NAME)
135 1.1 mrg {
136 1.1 mrg bp_pack_value (bp, SSA_NAME_IS_DEFAULT_DEF (expr), 1);
137 1.1 mrg bp_pack_value (bp, 0, 8);
138 1.1 mrg }
139 1.1 mrg else if (TREE_CODE (expr) == CALL_EXPR)
140 1.1 mrg {
141 1.1 mrg bp_pack_value (bp, CALL_EXPR_BY_DESCRIPTOR (expr), 1);
142 1.1 mrg bp_pack_value (bp, 0, 8);
143 1.1 mrg }
144 1.1 mrg else
145 1.1 mrg bp_pack_value (bp, 0, 9);
146 1.1 mrg }
147 1.1 mrg
148 1.1 mrg
149 1.1 mrg /* Pack all the non-pointer fields of the TS_INTEGER_CST structure of
150 1.1 mrg expression EXPR into bitpack BP. */
151 1.1 mrg
152 1.1 mrg static void
153 1.1 mrg pack_ts_int_cst_value_fields (struct bitpack_d *bp, tree expr)
154 1.1 mrg {
155 1.1 mrg int i;
156 1.1 mrg /* Note that the number of elements has already been written out in
157 1.1 mrg streamer_write_tree_header. */
158 1.1 mrg for (i = 0; i < TREE_INT_CST_EXT_NUNITS (expr); i++)
159 1.1 mrg bp_pack_var_len_int (bp, TREE_INT_CST_ELT (expr, i));
160 1.1 mrg }
161 1.1 mrg
162 1.1 mrg
163 1.1 mrg /* Pack all the non-pointer fields of the TS_REAL_CST structure of
164 1.1 mrg expression EXPR into bitpack BP. */
165 1.1 mrg
166 1.1 mrg static void
167 1.1 mrg pack_ts_real_cst_value_fields (struct bitpack_d *bp, tree expr)
168 1.1 mrg {
169 1.1 mrg unsigned i;
170 1.1 mrg REAL_VALUE_TYPE r;
171 1.1 mrg
172 1.1 mrg r = TREE_REAL_CST (expr);
173 1.1 mrg bp_pack_value (bp, r.cl, 2);
174 1.1 mrg bp_pack_value (bp, r.decimal, 1);
175 1.1 mrg bp_pack_value (bp, r.sign, 1);
176 1.1 mrg bp_pack_value (bp, r.signalling, 1);
177 1.1 mrg bp_pack_value (bp, r.canonical, 1);
178 1.1 mrg bp_pack_value (bp, r.uexp, EXP_BITS);
179 1.1 mrg for (i = 0; i < SIGSZ; i++)
180 1.1 mrg bp_pack_value (bp, r.sig[i], HOST_BITS_PER_LONG);
181 1.1 mrg }
182 1.1 mrg
183 1.1 mrg
184 1.1 mrg /* Pack all the non-pointer fields of the TS_FIXED_CST structure of
185 1.1 mrg expression EXPR into bitpack BP. */
186 1.1 mrg
187 1.1 mrg static void
188 1.1 mrg pack_ts_fixed_cst_value_fields (struct bitpack_d *bp, tree expr)
189 1.1 mrg {
190 1.1 mrg struct fixed_value fv = TREE_FIXED_CST (expr);
191 1.1 mrg bp_pack_machine_mode (bp, fv.mode);
192 1.1 mrg bp_pack_var_len_int (bp, fv.data.low);
193 1.1 mrg bp_pack_var_len_int (bp, fv.data.high);
194 1.1 mrg }
195 1.1 mrg
196 1.1 mrg /* Pack all the non-pointer fields of the TS_DECL_COMMON structure
197 1.1 mrg of expression EXPR into bitpack BP. */
198 1.1 mrg
199 1.1 mrg static void
200 1.1 mrg pack_ts_decl_common_value_fields (struct bitpack_d *bp, tree expr)
201 1.1 mrg {
202 1.1 mrg bp_pack_machine_mode (bp, DECL_MODE (expr));
203 1.1 mrg bp_pack_value (bp, DECL_NONLOCAL (expr), 1);
204 1.1 mrg bp_pack_value (bp, DECL_VIRTUAL_P (expr), 1);
205 1.1 mrg bp_pack_value (bp, DECL_IGNORED_P (expr), 1);
206 1.1 mrg bp_pack_value (bp, DECL_ABSTRACT_P (expr), 1);
207 1.1 mrg bp_pack_value (bp, DECL_ARTIFICIAL (expr), 1);
208 1.1 mrg bp_pack_value (bp, DECL_USER_ALIGN (expr), 1);
209 1.1 mrg bp_pack_value (bp, DECL_PRESERVE_P (expr), 1);
210 1.1 mrg bp_pack_value (bp, DECL_EXTERNAL (expr), 1);
211 1.1 mrg bp_pack_value (bp, DECL_NOT_GIMPLE_REG_P (expr), 1);
212 1.1 mrg bp_pack_var_len_unsigned (bp, DECL_ALIGN (expr));
213 1.1 mrg
214 1.1 mrg if (TREE_CODE (expr) == LABEL_DECL)
215 1.1 mrg {
216 1.1 mrg /* Note that we do not write LABEL_DECL_UID. The reader will
217 1.1 mrg always assume an initial value of -1 so that the
218 1.1 mrg label_to_block_map is recreated by gimple_set_bb. */
219 1.1 mrg bp_pack_var_len_unsigned (bp, EH_LANDING_PAD_NR (expr));
220 1.1 mrg }
221 1.1 mrg
222 1.1 mrg else if (TREE_CODE (expr) == FIELD_DECL)
223 1.1 mrg {
224 1.1 mrg bp_pack_value (bp, DECL_PACKED (expr), 1);
225 1.1 mrg bp_pack_value (bp, DECL_NONADDRESSABLE_P (expr), 1);
226 1.1 mrg bp_pack_value (bp, DECL_PADDING_P (expr), 1);
227 1.1 mrg if (DECL_BIT_FIELD (expr))
228 1.1 mrg bp_pack_value (bp, DECL_FIELD_CXX_ZERO_WIDTH_BIT_FIELD (expr), 1);
229 1.1 mrg else
230 1.1 mrg bp_pack_value (bp, DECL_FIELD_ABI_IGNORED (expr), 1);
231 1.1 mrg bp_pack_value (bp, expr->decl_common.off_align, 8);
232 1.1 mrg }
233 1.1 mrg
234 1.1 mrg else if (VAR_P (expr))
235 1.1 mrg {
236 1.1 mrg bp_pack_value (bp, DECL_HAS_DEBUG_EXPR_P (expr), 1);
237 1.1 mrg bp_pack_value (bp, DECL_NONLOCAL_FRAME (expr), 1);
238 1.1 mrg }
239 1.1 mrg
240 1.1 mrg else if (TREE_CODE (expr) == PARM_DECL)
241 1.1 mrg bp_pack_value (bp, DECL_HIDDEN_STRING_LENGTH (expr), 1);
242 1.1 mrg
243 1.1 mrg if (TREE_CODE (expr) == RESULT_DECL
244 1.1 mrg || TREE_CODE (expr) == PARM_DECL
245 1.1 mrg || VAR_P (expr))
246 1.1 mrg {
247 1.1 mrg bp_pack_value (bp, DECL_BY_REFERENCE (expr), 1);
248 1.1 mrg if (VAR_P (expr) || TREE_CODE (expr) == PARM_DECL)
249 1.1 mrg bp_pack_value (bp, DECL_HAS_VALUE_EXPR_P (expr), 1);
250 1.1 mrg }
251 1.1 mrg }
252 1.1 mrg
253 1.1 mrg
254 1.1 mrg /* Pack all the non-pointer fields of the TS_DECL_WRTL structure
255 1.1 mrg of expression EXPR into bitpack BP. */
256 1.1 mrg
257 1.1 mrg static void
258 1.1 mrg pack_ts_decl_wrtl_value_fields (struct bitpack_d *bp, tree expr)
259 1.1 mrg {
260 1.1 mrg bp_pack_value (bp, DECL_REGISTER (expr), 1);
261 1.1 mrg }
262 1.1 mrg
263 1.1 mrg
264 1.1 mrg /* Pack all the non-pointer fields of the TS_DECL_WITH_VIS structure
265 1.1 mrg of expression EXPR into bitpack BP. */
266 1.1 mrg
267 1.1 mrg static void
268 1.1 mrg pack_ts_decl_with_vis_value_fields (struct bitpack_d *bp, tree expr)
269 1.1 mrg {
270 1.1 mrg bp_pack_value (bp, DECL_COMMON (expr), 1);
271 1.1 mrg bp_pack_value (bp, DECL_DLLIMPORT_P (expr), 1);
272 1.1 mrg bp_pack_value (bp, DECL_WEAK (expr), 1);
273 1.1 mrg bp_pack_value (bp, DECL_SEEN_IN_BIND_EXPR_P (expr), 1);
274 1.1 mrg bp_pack_value (bp, DECL_COMDAT (expr), 1);
275 1.1 mrg bp_pack_value (bp, DECL_VISIBILITY (expr), 2);
276 1.1 mrg bp_pack_value (bp, DECL_VISIBILITY_SPECIFIED (expr), 1);
277 1.1 mrg
278 1.1 mrg if (VAR_P (expr))
279 1.1 mrg {
280 1.1 mrg bp_pack_value (bp, DECL_HARD_REGISTER (expr), 1);
281 1.1 mrg /* DECL_IN_TEXT_SECTION is set during final asm output only. */
282 1.1 mrg bp_pack_value (bp, DECL_IN_CONSTANT_POOL (expr), 1);
283 1.1 mrg }
284 1.1 mrg
285 1.1 mrg if (TREE_CODE (expr) == FUNCTION_DECL)
286 1.1 mrg {
287 1.1 mrg bp_pack_value (bp, DECL_FINAL_P (expr), 1);
288 1.1 mrg bp_pack_value (bp, DECL_CXX_CONSTRUCTOR_P (expr), 1);
289 1.1 mrg bp_pack_value (bp, DECL_CXX_DESTRUCTOR_P (expr), 1);
290 1.1 mrg }
291 1.1 mrg }
292 1.1 mrg
293 1.1 mrg
294 1.1 mrg /* Pack all the non-pointer fields of the TS_FUNCTION_DECL structure
295 1.1 mrg of expression EXPR into bitpack BP. */
296 1.1 mrg
297 1.1 mrg static void
298 1.1 mrg pack_ts_function_decl_value_fields (struct bitpack_d *bp, tree expr)
299 1.1 mrg {
300 1.1 mrg bp_pack_enum (bp, built_in_class, BUILT_IN_LAST,
301 1.1 mrg DECL_BUILT_IN_CLASS (expr));
302 1.1 mrg bp_pack_value (bp, DECL_STATIC_CONSTRUCTOR (expr), 1);
303 1.1 mrg bp_pack_value (bp, DECL_STATIC_DESTRUCTOR (expr), 1);
304 1.1 mrg bp_pack_value (bp, DECL_UNINLINABLE (expr), 1);
305 1.1 mrg bp_pack_value (bp, DECL_POSSIBLY_INLINED (expr), 1);
306 1.1 mrg bp_pack_value (bp, DECL_IS_NOVOPS (expr), 1);
307 1.1 mrg bp_pack_value (bp, DECL_IS_RETURNS_TWICE (expr), 1);
308 1.1 mrg bp_pack_value (bp, DECL_IS_MALLOC (expr), 1);
309 1.1 mrg bp_pack_value (bp, FUNCTION_DECL_DECL_TYPE (expr), 2);
310 1.1 mrg bp_pack_value (bp, DECL_IS_OPERATOR_DELETE_P (expr), 1);
311 1.1 mrg bp_pack_value (bp, DECL_DECLARED_INLINE_P (expr), 1);
312 1.1 mrg bp_pack_value (bp, DECL_STATIC_CHAIN (expr), 1);
313 1.1 mrg bp_pack_value (bp, DECL_NO_INLINE_WARNING_P (expr), 1);
314 1.1 mrg bp_pack_value (bp, DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (expr), 1);
315 1.1 mrg bp_pack_value (bp, DECL_NO_LIMIT_STACK (expr), 1);
316 1.1 mrg bp_pack_value (bp, DECL_DISREGARD_INLINE_LIMITS (expr), 1);
317 1.1 mrg bp_pack_value (bp, DECL_PURE_P (expr), 1);
318 1.1 mrg bp_pack_value (bp, DECL_LOOPING_CONST_OR_PURE_P (expr), 1);
319 1.1 mrg bp_pack_value (bp, DECL_IS_REPLACEABLE_OPERATOR (expr), 1);
320 1.1 mrg if (DECL_BUILT_IN_CLASS (expr) != NOT_BUILT_IN)
321 1.1 mrg bp_pack_value (bp, DECL_UNCHECKED_FUNCTION_CODE (expr), 32);
322 1.1 mrg }
323 1.1 mrg
324 1.1 mrg
325 1.1 mrg /* Pack all the non-pointer fields of the TS_TYPE_COMMON structure
326 1.1 mrg of expression EXPR into bitpack BP. */
327 1.1 mrg
328 1.1 mrg static void
329 1.1 mrg pack_ts_type_common_value_fields (struct bitpack_d *bp, tree expr)
330 1.1 mrg {
331 1.1 mrg /* for VECTOR_TYPE, TYPE_MODE reevaluates the mode using target_flags
332 1.1 mrg not necessary valid in a global context.
333 1.1 mrg Use the raw value previously set by layout_type. */
334 1.1 mrg bp_pack_machine_mode (bp, TYPE_MODE_RAW (expr));
335 1.1 mrg /* TYPE_NO_FORCE_BLK is private to stor-layout and need
336 1.1 mrg no streaming. */
337 1.1 mrg bp_pack_value (bp, TYPE_PACKED (expr), 1);
338 1.1 mrg bp_pack_value (bp, TYPE_RESTRICT (expr), 1);
339 1.1 mrg bp_pack_value (bp, TYPE_USER_ALIGN (expr), 1);
340 1.1 mrg bp_pack_value (bp, TYPE_READONLY (expr), 1);
341 1.1 mrg unsigned vla_p;
342 1.1 mrg if (in_lto_p)
343 1.1 mrg vla_p = TYPE_LANG_FLAG_0 (TYPE_MAIN_VARIANT (expr));
344 1.1 mrg else
345 1.1 mrg vla_p = variably_modified_type_p (expr, NULL_TREE);
346 1.1 mrg bp_pack_value (bp, vla_p, 1);
347 1.1 mrg /* We used to stream TYPE_ALIAS_SET == 0 information to let frontends mark
348 1.1 mrg types that are opaque for TBAA. This however did not work as intended,
349 1.1 mrg because TYPE_ALIAS_SET == 0 was regularly lost in type merging. */
350 1.1 mrg if (RECORD_OR_UNION_TYPE_P (expr))
351 1.1 mrg {
352 1.1 mrg bp_pack_value (bp, TYPE_TRANSPARENT_AGGR (expr), 1);
353 1.1 mrg bp_pack_value (bp, TYPE_FINAL_P (expr), 1);
354 1.1 mrg /* alias_ptr_types_compatible_p relies on fact that during LTO
355 1.1 mrg types do not get refined from WPA time to ltrans. */
356 1.1 mrg bp_pack_value (bp, flag_wpa && TYPE_CANONICAL (expr)
357 1.1 mrg ? TYPE_CXX_ODR_P (TYPE_CANONICAL (expr))
358 1.1 mrg : TYPE_CXX_ODR_P (expr), 1);
359 1.1 mrg }
360 1.1 mrg else if (TREE_CODE (expr) == ARRAY_TYPE)
361 1.1 mrg bp_pack_value (bp, TYPE_NONALIASED_COMPONENT (expr), 1);
362 1.1 mrg if (TREE_CODE (expr) == ARRAY_TYPE || TREE_CODE (expr) == INTEGER_TYPE)
363 1.1 mrg bp_pack_value (bp, TYPE_STRING_FLAG (expr), 1);
364 1.1 mrg if (AGGREGATE_TYPE_P (expr))
365 1.1 mrg bp_pack_value (bp, TYPE_TYPELESS_STORAGE (expr), 1);
366 1.1 mrg bp_pack_value (bp, TYPE_EMPTY_P (expr), 1);
367 1.1 mrg bp_pack_var_len_unsigned (bp, TYPE_PRECISION (expr));
368 1.1 mrg bp_pack_var_len_unsigned (bp, TYPE_ALIGN (expr));
369 1.1 mrg }
370 1.1 mrg
371 1.1 mrg
372 1.1 mrg /* Pack all the non-pointer fields of the TS_BLOCK structure
373 1.1 mrg of expression EXPR into bitpack BP. */
374 1.1 mrg
375 1.1 mrg static void
376 1.1 mrg pack_ts_block_value_fields (struct output_block *ob,
377 1.1 mrg struct bitpack_d *bp, tree expr)
378 1.1 mrg {
379 1.1 mrg /* BLOCK_NUMBER is recomputed. */
380 1.1 mrg /* Stream BLOCK_SOURCE_LOCATION for the limited cases we can handle - those
381 1.1 mrg that represent inlined function scopes.
382 1.1 mrg For the rest them on the floor instead of ICEing in dwarf2out.cc. */
383 1.1 mrg if (inlined_function_outer_scope_p (expr))
384 1.1 mrg stream_output_location (ob, bp, BLOCK_SOURCE_LOCATION (expr));
385 1.1 mrg else
386 1.1 mrg stream_output_location (ob, bp, UNKNOWN_LOCATION);
387 1.1 mrg }
388 1.1 mrg
389 1.1 mrg /* Pack all the non-pointer fields of the TS_TRANSLATION_UNIT_DECL structure
390 1.1 mrg of expression EXPR into bitpack BP. */
391 1.1 mrg
392 1.1 mrg static void
393 1.1 mrg pack_ts_translation_unit_decl_value_fields (struct output_block *ob,
394 1.1 mrg struct bitpack_d *bp, tree expr)
395 1.1 mrg {
396 1.1 mrg bp_pack_string (ob, bp, TRANSLATION_UNIT_LANGUAGE (expr), true);
397 1.1 mrg }
398 1.1 mrg
399 1.1 mrg
400 1.1 mrg /* Pack all the non-pointer fields of the TS_OMP_CLAUSE structure
401 1.1 mrg of expression EXPR into bitpack BP. */
402 1.1 mrg
403 1.1 mrg static void
404 1.1 mrg pack_ts_omp_clause_value_fields (struct output_block *ob,
405 1.1 mrg struct bitpack_d *bp, tree expr)
406 1.1 mrg {
407 1.1 mrg stream_output_location (ob, bp, OMP_CLAUSE_LOCATION (expr));
408 1.1 mrg switch (OMP_CLAUSE_CODE (expr))
409 1.1 mrg {
410 1.1 mrg case OMP_CLAUSE_DEFAULT:
411 1.1 mrg bp_pack_enum (bp, omp_clause_default_kind, OMP_CLAUSE_DEFAULT_LAST,
412 1.1 mrg OMP_CLAUSE_DEFAULT_KIND (expr));
413 1.1 mrg break;
414 1.1 mrg case OMP_CLAUSE_SCHEDULE:
415 1.1 mrg bp_pack_enum (bp, omp_clause_schedule_kind, OMP_CLAUSE_SCHEDULE_LAST,
416 1.1 mrg OMP_CLAUSE_SCHEDULE_KIND (expr));
417 1.1 mrg break;
418 1.1 mrg case OMP_CLAUSE_DEPEND:
419 1.1 mrg bp_pack_enum (bp, omp_clause_depend_kind, OMP_CLAUSE_DEPEND_LAST,
420 1.1 mrg OMP_CLAUSE_DEPEND_KIND (expr));
421 1.1 mrg break;
422 1.1 mrg case OMP_CLAUSE_MAP:
423 1.1 mrg bp_pack_enum (bp, gomp_map_kind, GOMP_MAP_LAST,
424 1.1 mrg OMP_CLAUSE_MAP_KIND (expr));
425 1.1 mrg break;
426 1.1 mrg case OMP_CLAUSE_PROC_BIND:
427 1.1 mrg bp_pack_enum (bp, omp_clause_proc_bind_kind, OMP_CLAUSE_PROC_BIND_LAST,
428 1.1 mrg OMP_CLAUSE_PROC_BIND_KIND (expr));
429 1.1 mrg break;
430 1.1 mrg case OMP_CLAUSE_REDUCTION:
431 1.1 mrg case OMP_CLAUSE_TASK_REDUCTION:
432 1.1 mrg case OMP_CLAUSE_IN_REDUCTION:
433 1.1 mrg bp_pack_enum (bp, tree_code, MAX_TREE_CODES,
434 1.1 mrg OMP_CLAUSE_REDUCTION_CODE (expr));
435 1.1 mrg break;
436 1.1 mrg default:
437 1.1 mrg break;
438 1.1 mrg }
439 1.1 mrg }
440 1.1 mrg
441 1.1 mrg
442 1.1 mrg /* Pack all the bitfields in EXPR into a bit pack. */
443 1.1 mrg
444 1.1 mrg void
445 1.1 mrg streamer_write_tree_bitfields (struct output_block *ob, tree expr)
446 1.1 mrg {
447 1.1 mrg bitpack_d bp = bitpack_create (ob->main_stream);
448 1.1 mrg enum tree_code code;
449 1.1 mrg
450 1.1 mrg code = TREE_CODE (expr);
451 1.1 mrg
452 1.1 mrg /* Note that all these functions are highly sensitive to changes in
453 1.1 mrg the types and sizes of each of the fields being packed. */
454 1.1 mrg pack_ts_base_value_fields (&bp, expr);
455 1.1 mrg
456 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_INT_CST))
457 1.1 mrg pack_ts_int_cst_value_fields (&bp, expr);
458 1.1 mrg
459 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_REAL_CST))
460 1.1 mrg pack_ts_real_cst_value_fields (&bp, expr);
461 1.1 mrg
462 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_FIXED_CST))
463 1.1 mrg pack_ts_fixed_cst_value_fields (&bp, expr);
464 1.1 mrg
465 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
466 1.1 mrg stream_output_location (ob, &bp, DECL_SOURCE_LOCATION (expr));
467 1.1 mrg
468 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
469 1.1 mrg pack_ts_decl_common_value_fields (&bp, expr);
470 1.1 mrg
471 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL))
472 1.1 mrg pack_ts_decl_wrtl_value_fields (&bp, expr);
473 1.1 mrg
474 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
475 1.1 mrg pack_ts_decl_with_vis_value_fields (&bp, expr);
476 1.1 mrg
477 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
478 1.1 mrg pack_ts_function_decl_value_fields (&bp, expr);
479 1.1 mrg
480 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
481 1.1 mrg pack_ts_type_common_value_fields (&bp, expr);
482 1.1 mrg
483 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_EXP))
484 1.1 mrg {
485 1.1 mrg stream_output_location (ob, &bp, EXPR_LOCATION (expr));
486 1.1 mrg if (code == MEM_REF
487 1.1 mrg || code == TARGET_MEM_REF)
488 1.1 mrg {
489 1.1 mrg bp_pack_value (&bp, MR_DEPENDENCE_CLIQUE (expr), sizeof (short) * 8);
490 1.1 mrg if (MR_DEPENDENCE_CLIQUE (expr) != 0)
491 1.1 mrg bp_pack_value (&bp, MR_DEPENDENCE_BASE (expr), sizeof (short) * 8);
492 1.1 mrg }
493 1.1 mrg else if (code == CALL_EXPR)
494 1.1 mrg bp_pack_enum (&bp, internal_fn, IFN_LAST, CALL_EXPR_IFN (expr));
495 1.1 mrg }
496 1.1 mrg
497 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
498 1.1 mrg pack_ts_block_value_fields (ob, &bp, expr);
499 1.1 mrg
500 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL))
501 1.1 mrg pack_ts_translation_unit_decl_value_fields (ob, &bp, expr);
502 1.1 mrg
503 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_OPTIMIZATION))
504 1.1 mrg cl_optimization_stream_out (ob, &bp, TREE_OPTIMIZATION (expr));
505 1.1 mrg
506 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
507 1.1 mrg {
508 1.1 mrg bp_pack_enum (&bp, clobber_kind, CLOBBER_LAST, CLOBBER_KIND (expr));
509 1.1 mrg bp_pack_var_len_unsigned (&bp, CONSTRUCTOR_NELTS (expr));
510 1.1 mrg }
511 1.1 mrg
512 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION)
513 1.1 mrg /* Don't stream these when passing things to a different target. */
514 1.1 mrg && !lto_stream_offload_p)
515 1.1 mrg cl_target_option_stream_out (ob, &bp, TREE_TARGET_OPTION (expr));
516 1.1 mrg
517 1.1 mrg if (code == OMP_CLAUSE)
518 1.1 mrg pack_ts_omp_clause_value_fields (ob, &bp, expr);
519 1.1 mrg
520 1.1 mrg streamer_write_bitpack (&bp);
521 1.1 mrg }
522 1.1 mrg
523 1.1 mrg
524 1.1 mrg /* Emit the chain of tree nodes starting at T. OB is the output block
525 1.1 mrg to write to. REF_P is true if chain elements should be emitted
526 1.1 mrg as references. */
527 1.1 mrg
528 1.1 mrg static void
529 1.1 mrg streamer_write_chain (struct output_block *ob, tree t)
530 1.1 mrg {
531 1.1 mrg while (t)
532 1.1 mrg {
533 1.1 mrg /* We avoid outputting external vars or functions by reference
534 1.1 mrg to the global decls section as we do not want to have them
535 1.1 mrg enter decl merging. We should not need to do this anymore because
536 1.1 mrg free_lang_data removes them from block scopes. */
537 1.1 mrg gcc_assert (!VAR_OR_FUNCTION_DECL_P (t) || !DECL_EXTERNAL (t));
538 1.1 mrg stream_write_tree_ref (ob, t);
539 1.1 mrg
540 1.1 mrg t = TREE_CHAIN (t);
541 1.1 mrg }
542 1.1 mrg
543 1.1 mrg /* Write a sentinel to terminate the chain. */
544 1.1 mrg stream_write_tree_ref (ob, NULL_TREE);
545 1.1 mrg }
546 1.1 mrg
547 1.1 mrg
548 1.1 mrg /* Write all pointer fields in the TS_COMMON structure of EXPR to output
549 1.1 mrg block OB. If REF_P is true, write a reference to EXPR's pointer
550 1.1 mrg fields. */
551 1.1 mrg
552 1.1 mrg static void
553 1.1 mrg write_ts_common_tree_pointers (struct output_block *ob, tree expr)
554 1.1 mrg {
555 1.1 mrg if (TREE_CODE (expr) != IDENTIFIER_NODE)
556 1.1 mrg stream_write_tree_ref (ob, TREE_TYPE (expr));
557 1.1 mrg }
558 1.1 mrg
559 1.1 mrg
560 1.1 mrg /* Write all pointer fields in the TS_VECTOR structure of EXPR to output
561 1.1 mrg block OB. If REF_P is true, write a reference to EXPR's pointer
562 1.1 mrg fields. */
563 1.1 mrg
564 1.1 mrg static void
565 1.1 mrg write_ts_vector_tree_pointers (struct output_block *ob, tree expr)
566 1.1 mrg {
567 1.1 mrg /* Note that the number of elements for EXPR has already been emitted
568 1.1 mrg in EXPR's header (see streamer_write_tree_header). */
569 1.1 mrg unsigned int count = vector_cst_encoded_nelts (expr);
570 1.1 mrg for (unsigned int i = 0; i < count; ++i)
571 1.1 mrg stream_write_tree_ref (ob, VECTOR_CST_ENCODED_ELT (expr, i));
572 1.1 mrg }
573 1.1 mrg
574 1.1 mrg
575 1.1 mrg /* Write all pointer fields in the TS_POLY_INT_CST structure of EXPR to
576 1.1 mrg output block OB. If REF_P is true, write a reference to EXPR's pointer
577 1.1 mrg fields. */
578 1.1 mrg
579 1.1 mrg static void
580 1.1 mrg write_ts_poly_tree_pointers (struct output_block *ob, tree expr)
581 1.1 mrg {
582 1.1 mrg for (unsigned int i = 0; i < NUM_POLY_INT_COEFFS; ++i)
583 1.1 mrg stream_write_tree_ref (ob, POLY_INT_CST_COEFF (expr, i));
584 1.1 mrg }
585 1.1 mrg
586 1.1 mrg
587 1.1 mrg /* Write all pointer fields in the TS_COMPLEX structure of EXPR to output
588 1.1 mrg block OB. If REF_P is true, write a reference to EXPR's pointer
589 1.1 mrg fields. */
590 1.1 mrg
591 1.1 mrg static void
592 1.1 mrg write_ts_complex_tree_pointers (struct output_block *ob, tree expr)
593 1.1 mrg {
594 1.1 mrg stream_write_tree_ref (ob, TREE_REALPART (expr));
595 1.1 mrg stream_write_tree_ref (ob, TREE_IMAGPART (expr));
596 1.1 mrg }
597 1.1 mrg
598 1.1 mrg
599 1.1 mrg /* Write all pointer fields in the TS_DECL_MINIMAL structure of EXPR
600 1.1 mrg to output block OB. If REF_P is true, write a reference to EXPR's
601 1.1 mrg pointer fields. */
602 1.1 mrg
603 1.1 mrg static void
604 1.1 mrg write_ts_decl_minimal_tree_pointers (struct output_block *ob, tree expr)
605 1.1 mrg {
606 1.1 mrg /* Drop names that were created for anonymous entities. */
607 1.1 mrg if (DECL_NAME (expr)
608 1.1 mrg && TREE_CODE (DECL_NAME (expr)) == IDENTIFIER_NODE
609 1.1 mrg && IDENTIFIER_ANON_P (DECL_NAME (expr)))
610 1.1 mrg stream_write_tree_ref (ob, NULL_TREE);
611 1.1 mrg else
612 1.1 mrg stream_write_tree_ref (ob, DECL_NAME (expr));
613 1.1 mrg if (TREE_CODE (expr) != TRANSLATION_UNIT_DECL
614 1.1 mrg && ! DECL_CONTEXT (expr))
615 1.1 mrg stream_write_tree_ref (ob, (*all_translation_units)[0]);
616 1.1 mrg else
617 1.1 mrg stream_write_tree_ref (ob, DECL_CONTEXT (expr));
618 1.1 mrg }
619 1.1 mrg
620 1.1 mrg
621 1.1 mrg /* Write all pointer fields in the TS_DECL_COMMON structure of EXPR to
622 1.1 mrg output block OB. If REF_P is true, write a reference to EXPR's
623 1.1 mrg pointer fields. */
624 1.1 mrg
625 1.1 mrg static void
626 1.1 mrg write_ts_decl_common_tree_pointers (struct output_block *ob, tree expr)
627 1.1 mrg {
628 1.1 mrg stream_write_tree_ref (ob, DECL_SIZE (expr));
629 1.1 mrg stream_write_tree_ref (ob, DECL_SIZE_UNIT (expr));
630 1.1 mrg
631 1.1 mrg /* Note, DECL_INITIAL is not handled here. Since DECL_INITIAL needs
632 1.1 mrg special handling in LTO, it must be handled by streamer hooks. */
633 1.1 mrg
634 1.1 mrg stream_write_tree_ref (ob, DECL_ATTRIBUTES (expr));
635 1.1 mrg
636 1.1 mrg /* On non-early-LTO enabled targets we claim we compiled with -g0
637 1.1 mrg but dwarf2out still did its set_decl_origin_self game fooling
638 1.1 mrg itself late. Und that here since we won't have access to the
639 1.1 mrg early generated abstract DIEs. */
640 1.1 mrg tree ao = DECL_ABSTRACT_ORIGIN (expr);
641 1.1 mrg if (debug_info_level == DINFO_LEVEL_NONE
642 1.1 mrg && ao == expr)
643 1.1 mrg ao = NULL_TREE;
644 1.1 mrg stream_write_tree_ref (ob, ao);
645 1.1 mrg
646 1.1 mrg if ((VAR_P (expr) || TREE_CODE (expr) == PARM_DECL)
647 1.1 mrg && DECL_HAS_VALUE_EXPR_P (expr))
648 1.1 mrg stream_write_tree_ref (ob, DECL_VALUE_EXPR (expr));
649 1.1 mrg
650 1.1 mrg if (VAR_P (expr)
651 1.1 mrg && DECL_HAS_DEBUG_EXPR_P (expr))
652 1.1 mrg stream_write_tree_ref (ob, DECL_DEBUG_EXPR (expr));
653 1.1 mrg }
654 1.1 mrg
655 1.1 mrg
656 1.1 mrg /* Write all pointer fields in the TS_DECL_NON_COMMON structure of
657 1.1 mrg EXPR to output block OB. If REF_P is true, write a reference to EXPR's
658 1.1 mrg pointer fields. */
659 1.1 mrg
660 1.1 mrg static void
661 1.1 mrg write_ts_decl_non_common_tree_pointers (struct output_block *, tree)
662 1.1 mrg {
663 1.1 mrg }
664 1.1 mrg
665 1.1 mrg
666 1.1 mrg /* Write all pointer fields in the TS_DECL_WITH_VIS structure of EXPR
667 1.1 mrg to output block OB. If REF_P is true, write a reference to EXPR's
668 1.1 mrg pointer fields. */
669 1.1 mrg
670 1.1 mrg static void
671 1.1 mrg write_ts_decl_with_vis_tree_pointers (struct output_block *ob, tree expr)
672 1.1 mrg {
673 1.1 mrg /* Make sure we don't inadvertently set the assembler name. */
674 1.1 mrg if (DECL_ASSEMBLER_NAME_SET_P (expr))
675 1.1 mrg stream_write_tree_ref (ob, DECL_ASSEMBLER_NAME (expr));
676 1.1 mrg else
677 1.1 mrg stream_write_tree_ref (ob, NULL_TREE);
678 1.1 mrg }
679 1.1 mrg
680 1.1 mrg
681 1.1 mrg /* Write all pointer fields in the TS_FIELD_DECL structure of EXPR to
682 1.1 mrg output block OB. If REF_P is true, write a reference to EXPR's
683 1.1 mrg pointer fields. */
684 1.1 mrg
685 1.1 mrg static void
686 1.1 mrg write_ts_field_decl_tree_pointers (struct output_block *ob, tree expr)
687 1.1 mrg {
688 1.1 mrg stream_write_tree_ref (ob, DECL_FIELD_OFFSET (expr));
689 1.1 mrg stream_write_tree_ref (ob, DECL_BIT_FIELD_TYPE (expr));
690 1.1 mrg stream_write_tree_ref (ob, DECL_BIT_FIELD_REPRESENTATIVE (expr));
691 1.1 mrg stream_write_tree_ref (ob, DECL_FIELD_BIT_OFFSET (expr));
692 1.1 mrg }
693 1.1 mrg
694 1.1 mrg
695 1.1 mrg /* Write all pointer fields in the TS_FUNCTION_DECL structure of EXPR
696 1.1 mrg to output block OB. If REF_P is true, write a reference to EXPR's
697 1.1 mrg pointer fields. */
698 1.1 mrg
699 1.1 mrg static void
700 1.1 mrg write_ts_function_decl_tree_pointers (struct output_block *ob, tree expr)
701 1.1 mrg {
702 1.1 mrg /* DECL_STRUCT_FUNCTION is handled by lto_output_function. */
703 1.1 mrg stream_write_tree_ref (ob, DECL_FUNCTION_PERSONALITY (expr));
704 1.1 mrg /* Don't stream these when passing things to a different target. */
705 1.1 mrg if (!lto_stream_offload_p)
706 1.1 mrg stream_write_tree_ref (ob, DECL_FUNCTION_SPECIFIC_TARGET (expr));
707 1.1 mrg stream_write_tree_ref (ob, DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr));
708 1.1 mrg }
709 1.1 mrg
710 1.1 mrg
711 1.1 mrg /* Write all pointer fields in the TS_TYPE_COMMON structure of EXPR to
712 1.1 mrg output block OB. If REF_P is true, write a reference to EXPR's
713 1.1 mrg pointer fields. */
714 1.1 mrg
715 1.1 mrg static void
716 1.1 mrg write_ts_type_common_tree_pointers (struct output_block *ob, tree expr)
717 1.1 mrg {
718 1.1 mrg stream_write_tree_ref (ob, TYPE_SIZE (expr));
719 1.1 mrg stream_write_tree_ref (ob, TYPE_SIZE_UNIT (expr));
720 1.1 mrg stream_write_tree_ref (ob, TYPE_ATTRIBUTES (expr));
721 1.1 mrg stream_write_tree_ref (ob, TYPE_NAME (expr));
722 1.1 mrg /* Do not stream TYPE_POINTER_TO or TYPE_REFERENCE_TO. They will be
723 1.1 mrg reconstructed during fixup. */
724 1.1 mrg /* Do not stream TYPE_NEXT_VARIANT, we reconstruct the variant lists
725 1.1 mrg during fixup. */
726 1.1 mrg stream_write_tree_ref (ob, TYPE_MAIN_VARIANT (expr));
727 1.1 mrg stream_write_tree_ref (ob, TYPE_CONTEXT (expr));
728 1.1 mrg /* TYPE_CANONICAL is re-computed during type merging, so no need
729 1.1 mrg to stream it here. */
730 1.1 mrg /* Do not stream TYPE_STUB_DECL; it is not needed by LTO but currently
731 1.1 mrg it cannot be freed by free_lang_data without triggering ICEs in
732 1.1 mrg langhooks. */
733 1.1 mrg }
734 1.1 mrg
735 1.1 mrg /* Write all pointer fields in the TS_TYPE_NON_COMMON structure of EXPR
736 1.1 mrg to output block OB. If REF_P is true, write a reference to EXPR's
737 1.1 mrg pointer fields. */
738 1.1 mrg
739 1.1 mrg static void
740 1.1 mrg write_ts_type_non_common_tree_pointers (struct output_block *ob, tree expr)
741 1.1 mrg {
742 1.1 mrg if (TREE_CODE (expr) == ARRAY_TYPE)
743 1.1 mrg stream_write_tree_ref (ob, TYPE_DOMAIN (expr));
744 1.1 mrg else if (RECORD_OR_UNION_TYPE_P (expr))
745 1.1 mrg streamer_write_chain (ob, TYPE_FIELDS (expr));
746 1.1 mrg else if (TREE_CODE (expr) == FUNCTION_TYPE
747 1.1 mrg || TREE_CODE (expr) == METHOD_TYPE)
748 1.1 mrg stream_write_tree_ref (ob, TYPE_ARG_TYPES (expr));
749 1.1 mrg
750 1.1 mrg if (!POINTER_TYPE_P (expr))
751 1.1 mrg stream_write_tree_ref (ob, TYPE_MIN_VALUE_RAW (expr));
752 1.1 mrg stream_write_tree_ref (ob, TYPE_MAX_VALUE_RAW (expr));
753 1.1 mrg }
754 1.1 mrg
755 1.1 mrg
756 1.1 mrg /* Write all pointer fields in the TS_LIST structure of EXPR to output
757 1.1 mrg block OB. If REF_P is true, write a reference to EXPR's pointer
758 1.1 mrg fields. */
759 1.1 mrg
760 1.1 mrg static void
761 1.1 mrg write_ts_list_tree_pointers (struct output_block *ob, tree expr)
762 1.1 mrg {
763 1.1 mrg stream_write_tree_ref (ob, TREE_PURPOSE (expr));
764 1.1 mrg stream_write_tree_ref (ob, TREE_VALUE (expr));
765 1.1 mrg stream_write_tree_ref (ob, TREE_CHAIN (expr));
766 1.1 mrg }
767 1.1 mrg
768 1.1 mrg
769 1.1 mrg /* Write all pointer fields in the TS_VEC structure of EXPR to output
770 1.1 mrg block OB. If REF_P is true, write a reference to EXPR's pointer
771 1.1 mrg fields. */
772 1.1 mrg
773 1.1 mrg static void
774 1.1 mrg write_ts_vec_tree_pointers (struct output_block *ob, tree expr)
775 1.1 mrg {
776 1.1 mrg int i;
777 1.1 mrg
778 1.1 mrg /* Note that the number of slots for EXPR has already been emitted
779 1.1 mrg in EXPR's header (see streamer_write_tree_header). */
780 1.1 mrg for (i = 0; i < TREE_VEC_LENGTH (expr); i++)
781 1.1 mrg stream_write_tree_ref (ob, TREE_VEC_ELT (expr, i));
782 1.1 mrg }
783 1.1 mrg
784 1.1 mrg
785 1.1 mrg /* Write all pointer fields in the TS_EXP structure of EXPR to output
786 1.1 mrg block OB. If REF_P is true, write a reference to EXPR's pointer
787 1.1 mrg fields. */
788 1.1 mrg
789 1.1 mrg static void
790 1.1 mrg write_ts_exp_tree_pointers (struct output_block *ob, tree expr)
791 1.1 mrg {
792 1.1 mrg int i;
793 1.1 mrg
794 1.1 mrg for (i = 0; i < TREE_OPERAND_LENGTH (expr); i++)
795 1.1 mrg stream_write_tree_ref (ob, TREE_OPERAND (expr, i));
796 1.1 mrg stream_write_tree_ref (ob, TREE_BLOCK (expr));
797 1.1 mrg }
798 1.1 mrg
799 1.1 mrg
800 1.1 mrg /* Write all pointer fields in the TS_BLOCK structure of EXPR to output
801 1.1 mrg block OB. If REF_P is true, write a reference to EXPR's pointer
802 1.1 mrg fields. */
803 1.1 mrg
804 1.1 mrg static void
805 1.1 mrg write_ts_block_tree_pointers (struct output_block *ob, tree expr)
806 1.1 mrg {
807 1.1 mrg streamer_write_chain (ob, BLOCK_VARS (expr));
808 1.1 mrg
809 1.1 mrg stream_write_tree_ref (ob, BLOCK_SUPERCONTEXT (expr));
810 1.1 mrg stream_write_tree_ref (ob, BLOCK_ABSTRACT_ORIGIN (expr));
811 1.1 mrg
812 1.1 mrg /* Do not stream BLOCK_NONLOCALIZED_VARS. We cannot handle debug information
813 1.1 mrg for early inlined BLOCKs so drop it on the floor instead of ICEing in
814 1.1 mrg dwarf2out.cc. */
815 1.1 mrg
816 1.1 mrg /* BLOCK_FRAGMENT_ORIGIN and BLOCK_FRAGMENT_CHAIN is not live at LTO
817 1.1 mrg streaming time. */
818 1.1 mrg
819 1.1 mrg /* Do not output BLOCK_SUBBLOCKS. Instead on streaming-in this
820 1.1 mrg list is re-constructed from BLOCK_SUPERCONTEXT. */
821 1.1 mrg }
822 1.1 mrg
823 1.1 mrg
824 1.1 mrg /* Write all pointer fields in the TS_BINFO structure of EXPR to output
825 1.1 mrg block OB. If REF_P is true, write a reference to EXPR's pointer
826 1.1 mrg fields. */
827 1.1 mrg
828 1.1 mrg static void
829 1.1 mrg write_ts_binfo_tree_pointers (struct output_block *ob, tree expr)
830 1.1 mrg {
831 1.1 mrg unsigned i;
832 1.1 mrg tree t;
833 1.1 mrg
834 1.1 mrg /* Note that the number of BINFO slots has already been emitted in
835 1.1 mrg EXPR's header (see streamer_write_tree_header) because this length
836 1.1 mrg is needed to build the empty BINFO node on the reader side. */
837 1.1 mrg FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (expr), i, t)
838 1.1 mrg stream_write_tree_ref (ob, t);
839 1.1 mrg stream_write_tree_ref (ob, NULL_TREE);
840 1.1 mrg
841 1.1 mrg stream_write_tree_ref (ob, BINFO_OFFSET (expr));
842 1.1 mrg stream_write_tree_ref (ob, BINFO_VTABLE (expr));
843 1.1 mrg
844 1.1 mrg /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX,
845 1.1 mrg BINFO_BASE_ACCESSES and BINFO_VPTR_INDEX; these are used by C++ FE only. */
846 1.1 mrg }
847 1.1 mrg
848 1.1 mrg
849 1.1 mrg /* Write all pointer fields in the TS_CONSTRUCTOR structure of EXPR to
850 1.1 mrg output block OB. If REF_P is true, write a reference to EXPR's
851 1.1 mrg pointer fields. */
852 1.1 mrg
853 1.1 mrg static void
854 1.1 mrg write_ts_constructor_tree_pointers (struct output_block *ob, tree expr)
855 1.1 mrg {
856 1.1 mrg unsigned i;
857 1.1 mrg tree index, value;
858 1.1 mrg
859 1.1 mrg FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (expr), i, index, value)
860 1.1 mrg {
861 1.1 mrg stream_write_tree_ref (ob, index);
862 1.1 mrg stream_write_tree_ref (ob, value);
863 1.1 mrg }
864 1.1 mrg }
865 1.1 mrg
866 1.1 mrg
867 1.1 mrg /* Write all pointer fields in the TS_OMP_CLAUSE structure of EXPR
868 1.1 mrg to output block OB. If REF_P is true, write a reference to EXPR's
869 1.1 mrg pointer fields. */
870 1.1 mrg
871 1.1 mrg static void
872 1.1 mrg write_ts_omp_clause_tree_pointers (struct output_block *ob, tree expr)
873 1.1 mrg {
874 1.1 mrg int i;
875 1.1 mrg for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (expr)]; i++)
876 1.1 mrg stream_write_tree_ref (ob, OMP_CLAUSE_OPERAND (expr, i));
877 1.1 mrg switch (OMP_CLAUSE_CODE (expr))
878 1.1 mrg {
879 1.1 mrg case OMP_CLAUSE_REDUCTION:
880 1.1 mrg case OMP_CLAUSE_TASK_REDUCTION:
881 1.1 mrg case OMP_CLAUSE_IN_REDUCTION:
882 1.1 mrg /* We don't stream these right now, handle it if streaming
883 1.1 mrg of them is needed. */
884 1.1 mrg gcc_assert (OMP_CLAUSE_REDUCTION_GIMPLE_INIT (expr) == NULL);
885 1.1 mrg gcc_assert (OMP_CLAUSE_REDUCTION_GIMPLE_MERGE (expr) == NULL);
886 1.1 mrg break;
887 1.1 mrg default:
888 1.1 mrg break;
889 1.1 mrg }
890 1.1 mrg stream_write_tree_ref (ob, OMP_CLAUSE_CHAIN (expr));
891 1.1 mrg }
892 1.1 mrg
893 1.1 mrg
894 1.1 mrg /* Write all pointer fields in EXPR to output block OB. If REF_P is true,
895 1.1 mrg the leaves of EXPR are emitted as references. */
896 1.1 mrg
897 1.1 mrg void
898 1.1 mrg streamer_write_tree_body (struct output_block *ob, tree expr)
899 1.1 mrg {
900 1.1 mrg enum tree_code code;
901 1.1 mrg
902 1.1 mrg lto_stats.num_tree_bodies_output++;
903 1.1 mrg
904 1.1 mrg code = TREE_CODE (expr);
905 1.1 mrg
906 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
907 1.1 mrg write_ts_common_tree_pointers (ob, expr);
908 1.1 mrg
909 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
910 1.1 mrg write_ts_vector_tree_pointers (ob, expr);
911 1.1 mrg
912 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_POLY_INT_CST))
913 1.1 mrg write_ts_poly_tree_pointers (ob, expr);
914 1.1 mrg
915 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX))
916 1.1 mrg write_ts_complex_tree_pointers (ob, expr);
917 1.1 mrg
918 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
919 1.1 mrg write_ts_decl_minimal_tree_pointers (ob, expr);
920 1.1 mrg
921 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
922 1.1 mrg write_ts_decl_common_tree_pointers (ob, expr);
923 1.1 mrg
924 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON))
925 1.1 mrg write_ts_decl_non_common_tree_pointers (ob, expr);
926 1.1 mrg
927 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
928 1.1 mrg write_ts_decl_with_vis_tree_pointers (ob, expr);
929 1.1 mrg
930 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
931 1.1 mrg write_ts_field_decl_tree_pointers (ob, expr);
932 1.1 mrg
933 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
934 1.1 mrg write_ts_function_decl_tree_pointers (ob, expr);
935 1.1 mrg
936 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
937 1.1 mrg write_ts_type_common_tree_pointers (ob, expr);
938 1.1 mrg
939 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON))
940 1.1 mrg write_ts_type_non_common_tree_pointers (ob, expr);
941 1.1 mrg
942 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_LIST))
943 1.1 mrg write_ts_list_tree_pointers (ob, expr);
944 1.1 mrg
945 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_VEC))
946 1.1 mrg write_ts_vec_tree_pointers (ob, expr);
947 1.1 mrg
948 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_EXP))
949 1.1 mrg write_ts_exp_tree_pointers (ob, expr);
950 1.1 mrg
951 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
952 1.1 mrg write_ts_block_tree_pointers (ob, expr);
953 1.1 mrg
954 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
955 1.1 mrg write_ts_binfo_tree_pointers (ob, expr);
956 1.1 mrg
957 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
958 1.1 mrg write_ts_constructor_tree_pointers (ob, expr);
959 1.1 mrg
960 1.1 mrg if (code == OMP_CLAUSE)
961 1.1 mrg write_ts_omp_clause_tree_pointers (ob, expr);
962 1.1 mrg }
963 1.1 mrg
964 1.1 mrg
965 1.1 mrg /* Emit header information for tree EXPR to output block OB. The header
966 1.1 mrg contains everything needed to instantiate an empty skeleton for
967 1.1 mrg EXPR on the reading side. IX is the index into the streamer cache
968 1.1 mrg where EXPR is stored. */
969 1.1 mrg
970 1.1 mrg void
971 1.1 mrg streamer_write_tree_header (struct output_block *ob, tree expr)
972 1.1 mrg {
973 1.1 mrg enum LTO_tags tag;
974 1.1 mrg enum tree_code code;
975 1.1 mrg
976 1.1 mrg if (streamer_dump_file)
977 1.1 mrg {
978 1.1 mrg print_node_brief (streamer_dump_file, " Streaming header of ",
979 1.1 mrg expr, 4);
980 1.1 mrg fprintf (streamer_dump_file, " to %s\n",
981 1.1 mrg lto_section_name[ob->section_type]);
982 1.1 mrg }
983 1.1 mrg
984 1.1 mrg /* We should not see any tree nodes not handled by the streamer. */
985 1.1 mrg code = TREE_CODE (expr);
986 1.1 mrg
987 1.1 mrg /* The header of a tree node consists of its tag, the size of
988 1.1 mrg the node, and any other information needed to instantiate
989 1.1 mrg EXPR on the reading side (such as the number of slots in
990 1.1 mrg variable sized nodes). */
991 1.1 mrg tag = lto_tree_code_to_tag (code);
992 1.1 mrg streamer_write_record_start (ob, tag);
993 1.1 mrg
994 1.1 mrg /* The text in strings and identifiers are completely emitted in
995 1.1 mrg the header. */
996 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_STRING))
997 1.1 mrg streamer_write_string_cst (ob, ob->main_stream, expr);
998 1.1 mrg else if (CODE_CONTAINS_STRUCT (code, TS_IDENTIFIER))
999 1.1 mrg write_identifier (ob, ob->main_stream, expr);
1000 1.1 mrg else if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
1001 1.1 mrg {
1002 1.1 mrg bitpack_d bp = bitpack_create (ob->main_stream);
1003 1.1 mrg bp_pack_value (&bp, VECTOR_CST_LOG2_NPATTERNS (expr), 8);
1004 1.1 mrg bp_pack_value (&bp, VECTOR_CST_NELTS_PER_PATTERN (expr), 8);
1005 1.1 mrg streamer_write_bitpack (&bp);
1006 1.1 mrg }
1007 1.1 mrg else if (CODE_CONTAINS_STRUCT (code, TS_VEC))
1008 1.1 mrg streamer_write_hwi (ob, TREE_VEC_LENGTH (expr));
1009 1.1 mrg else if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
1010 1.1 mrg streamer_write_uhwi (ob, BINFO_N_BASE_BINFOS (expr));
1011 1.1 mrg else if (TREE_CODE (expr) == CALL_EXPR)
1012 1.1 mrg streamer_write_uhwi (ob, call_expr_nargs (expr));
1013 1.1 mrg else if (TREE_CODE (expr) == OMP_CLAUSE)
1014 1.1 mrg streamer_write_uhwi (ob, OMP_CLAUSE_CODE (expr));
1015 1.1 mrg else if (CODE_CONTAINS_STRUCT (code, TS_INT_CST))
1016 1.1 mrg {
1017 1.1 mrg gcc_checking_assert (TREE_INT_CST_NUNITS (expr));
1018 1.1 mrg streamer_write_uhwi (ob, TREE_INT_CST_NUNITS (expr));
1019 1.1 mrg streamer_write_uhwi (ob, TREE_INT_CST_EXT_NUNITS (expr));
1020 1.1 mrg }
1021 1.1 mrg }
1022 1.1 mrg
1023 1.1 mrg
1024 1.1 mrg /* Emit the integer constant CST to output block OB. If REF_P is true,
1025 1.1 mrg CST's type will be emitted as a reference. */
1026 1.1 mrg
1027 1.1 mrg void
1028 1.1 mrg streamer_write_integer_cst (struct output_block *ob, tree cst)
1029 1.1 mrg {
1030 1.1 mrg int i;
1031 1.1 mrg int len = TREE_INT_CST_NUNITS (cst);
1032 1.1 mrg gcc_assert (!TREE_OVERFLOW (cst));
1033 1.1 mrg if (streamer_dump_file)
1034 1.1 mrg {
1035 1.1 mrg print_node_brief (streamer_dump_file, " Streaming integer ",
1036 1.1 mrg cst, 4);
1037 1.1 mrg fprintf (streamer_dump_file, "\n");
1038 1.1 mrg }
1039 1.1 mrg streamer_write_record_start (ob, LTO_integer_cst);
1040 1.1 mrg stream_write_tree_ref (ob, TREE_TYPE (cst));
1041 1.1 mrg /* We're effectively streaming a non-sign-extended wide_int here,
1042 1.1 mrg so there's no need to stream TREE_INT_CST_EXT_NUNITS or any
1043 1.1 mrg array members beyond LEN. We'll recreate the tree from the
1044 1.1 mrg wide_int and the type. */
1045 1.1 mrg streamer_write_uhwi (ob, len);
1046 1.1 mrg for (i = 0; i < len; i++)
1047 1.1 mrg streamer_write_hwi (ob, TREE_INT_CST_ELT (cst, i));
1048 1.1 mrg }
1049