annotate gcc/tree-streamer-out.c @ 131:84e7813d76e9

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