annotate gcc/tree-streamer-out.c @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children 84e7813d76e9
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
kono
parents:
diff changeset
3 Copyright (C) 2011-2017 Free Software Foundation, Inc.
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);
kono
parents:
diff changeset
214 bp_pack_value (bp, expr->decl_common.off_align, 8);
kono
parents:
diff changeset
215 }
kono
parents:
diff changeset
216
kono
parents:
diff changeset
217 if (VAR_P (expr))
kono
parents:
diff changeset
218 {
kono
parents:
diff changeset
219 bp_pack_value (bp, DECL_HAS_DEBUG_EXPR_P (expr), 1);
kono
parents:
diff changeset
220 bp_pack_value (bp, DECL_NONLOCAL_FRAME (expr), 1);
kono
parents:
diff changeset
221 }
kono
parents:
diff changeset
222
kono
parents:
diff changeset
223 if (TREE_CODE (expr) == RESULT_DECL
kono
parents:
diff changeset
224 || TREE_CODE (expr) == PARM_DECL
kono
parents:
diff changeset
225 || VAR_P (expr))
kono
parents:
diff changeset
226 {
kono
parents:
diff changeset
227 bp_pack_value (bp, DECL_BY_REFERENCE (expr), 1);
kono
parents:
diff changeset
228 if (VAR_P (expr) || TREE_CODE (expr) == PARM_DECL)
kono
parents:
diff changeset
229 bp_pack_value (bp, DECL_HAS_VALUE_EXPR_P (expr), 1);
kono
parents:
diff changeset
230 }
kono
parents:
diff changeset
231 }
kono
parents:
diff changeset
232
kono
parents:
diff changeset
233
kono
parents:
diff changeset
234 /* Pack all the non-pointer fields of the TS_DECL_WRTL structure
kono
parents:
diff changeset
235 of expression EXPR into bitpack BP. */
kono
parents:
diff changeset
236
kono
parents:
diff changeset
237 static void
kono
parents:
diff changeset
238 pack_ts_decl_wrtl_value_fields (struct bitpack_d *bp, tree expr)
kono
parents:
diff changeset
239 {
kono
parents:
diff changeset
240 bp_pack_value (bp, DECL_REGISTER (expr), 1);
kono
parents:
diff changeset
241 }
kono
parents:
diff changeset
242
kono
parents:
diff changeset
243
kono
parents:
diff changeset
244 /* Pack all the non-pointer fields of the TS_DECL_WITH_VIS structure
kono
parents:
diff changeset
245 of expression EXPR into bitpack BP. */
kono
parents:
diff changeset
246
kono
parents:
diff changeset
247 static void
kono
parents:
diff changeset
248 pack_ts_decl_with_vis_value_fields (struct bitpack_d *bp, tree expr)
kono
parents:
diff changeset
249 {
kono
parents:
diff changeset
250 bp_pack_value (bp, DECL_COMMON (expr), 1);
kono
parents:
diff changeset
251 bp_pack_value (bp, DECL_DLLIMPORT_P (expr), 1);
kono
parents:
diff changeset
252 bp_pack_value (bp, DECL_WEAK (expr), 1);
kono
parents:
diff changeset
253 bp_pack_value (bp, DECL_SEEN_IN_BIND_EXPR_P (expr), 1);
kono
parents:
diff changeset
254 bp_pack_value (bp, DECL_COMDAT (expr), 1);
kono
parents:
diff changeset
255 bp_pack_value (bp, DECL_VISIBILITY (expr), 2);
kono
parents:
diff changeset
256 bp_pack_value (bp, DECL_VISIBILITY_SPECIFIED (expr), 1);
kono
parents:
diff changeset
257
kono
parents:
diff changeset
258 if (VAR_P (expr))
kono
parents:
diff changeset
259 {
kono
parents:
diff changeset
260 bp_pack_value (bp, DECL_HARD_REGISTER (expr), 1);
kono
parents:
diff changeset
261 /* DECL_IN_TEXT_SECTION is set during final asm output only. */
kono
parents:
diff changeset
262 bp_pack_value (bp, DECL_IN_CONSTANT_POOL (expr), 1);
kono
parents:
diff changeset
263 }
kono
parents:
diff changeset
264
kono
parents:
diff changeset
265 if (TREE_CODE (expr) == FUNCTION_DECL)
kono
parents:
diff changeset
266 {
kono
parents:
diff changeset
267 bp_pack_value (bp, DECL_FINAL_P (expr), 1);
kono
parents:
diff changeset
268 bp_pack_value (bp, DECL_CXX_CONSTRUCTOR_P (expr), 1);
kono
parents:
diff changeset
269 bp_pack_value (bp, DECL_CXX_DESTRUCTOR_P (expr), 1);
kono
parents:
diff changeset
270 }
kono
parents:
diff changeset
271 }
kono
parents:
diff changeset
272
kono
parents:
diff changeset
273
kono
parents:
diff changeset
274 /* Pack all the non-pointer fields of the TS_FUNCTION_DECL structure
kono
parents:
diff changeset
275 of expression EXPR into bitpack BP. */
kono
parents:
diff changeset
276
kono
parents:
diff changeset
277 static void
kono
parents:
diff changeset
278 pack_ts_function_decl_value_fields (struct bitpack_d *bp, tree expr)
kono
parents:
diff changeset
279 {
kono
parents:
diff changeset
280 bp_pack_enum (bp, built_in_class, BUILT_IN_LAST,
kono
parents:
diff changeset
281 DECL_BUILT_IN_CLASS (expr));
kono
parents:
diff changeset
282 bp_pack_value (bp, DECL_STATIC_CONSTRUCTOR (expr), 1);
kono
parents:
diff changeset
283 bp_pack_value (bp, DECL_STATIC_DESTRUCTOR (expr), 1);
kono
parents:
diff changeset
284 bp_pack_value (bp, DECL_UNINLINABLE (expr), 1);
kono
parents:
diff changeset
285 bp_pack_value (bp, DECL_POSSIBLY_INLINED (expr), 1);
kono
parents:
diff changeset
286 bp_pack_value (bp, DECL_IS_NOVOPS (expr), 1);
kono
parents:
diff changeset
287 bp_pack_value (bp, DECL_IS_RETURNS_TWICE (expr), 1);
kono
parents:
diff changeset
288 bp_pack_value (bp, DECL_IS_MALLOC (expr), 1);
kono
parents:
diff changeset
289 bp_pack_value (bp, DECL_IS_OPERATOR_NEW (expr), 1);
kono
parents:
diff changeset
290 bp_pack_value (bp, DECL_DECLARED_INLINE_P (expr), 1);
kono
parents:
diff changeset
291 bp_pack_value (bp, DECL_STATIC_CHAIN (expr), 1);
kono
parents:
diff changeset
292 bp_pack_value (bp, DECL_NO_INLINE_WARNING_P (expr), 1);
kono
parents:
diff changeset
293 bp_pack_value (bp, DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (expr), 1);
kono
parents:
diff changeset
294 bp_pack_value (bp, DECL_NO_LIMIT_STACK (expr), 1);
kono
parents:
diff changeset
295 bp_pack_value (bp, DECL_DISREGARD_INLINE_LIMITS (expr), 1);
kono
parents:
diff changeset
296 bp_pack_value (bp, DECL_PURE_P (expr), 1);
kono
parents:
diff changeset
297 bp_pack_value (bp, DECL_LOOPING_CONST_OR_PURE_P (expr), 1);
kono
parents:
diff changeset
298 if (DECL_BUILT_IN_CLASS (expr) != NOT_BUILT_IN)
kono
parents:
diff changeset
299 bp_pack_value (bp, DECL_FUNCTION_CODE (expr), 12);
kono
parents:
diff changeset
300 }
kono
parents:
diff changeset
301
kono
parents:
diff changeset
302
kono
parents:
diff changeset
303 /* Pack all the non-pointer fields of the TS_TYPE_COMMON structure
kono
parents:
diff changeset
304 of expression EXPR into bitpack BP. */
kono
parents:
diff changeset
305
kono
parents:
diff changeset
306 static void
kono
parents:
diff changeset
307 pack_ts_type_common_value_fields (struct bitpack_d *bp, tree expr)
kono
parents:
diff changeset
308 {
kono
parents:
diff changeset
309 /* for VECTOR_TYPE, TYPE_MODE reevaluates the mode using target_flags
kono
parents:
diff changeset
310 not necessary valid in a global context.
kono
parents:
diff changeset
311 Use the raw value previously set by layout_type. */
kono
parents:
diff changeset
312 bp_pack_machine_mode (bp, TYPE_MODE_RAW (expr));
kono
parents:
diff changeset
313 bp_pack_value (bp, TYPE_STRING_FLAG (expr), 1);
kono
parents:
diff changeset
314 /* TYPE_NO_FORCE_BLK is private to stor-layout and need
kono
parents:
diff changeset
315 no streaming. */
kono
parents:
diff changeset
316 bp_pack_value (bp, TYPE_NEEDS_CONSTRUCTING (expr), 1);
kono
parents:
diff changeset
317 bp_pack_value (bp, TYPE_PACKED (expr), 1);
kono
parents:
diff changeset
318 bp_pack_value (bp, TYPE_RESTRICT (expr), 1);
kono
parents:
diff changeset
319 bp_pack_value (bp, TYPE_USER_ALIGN (expr), 1);
kono
parents:
diff changeset
320 bp_pack_value (bp, TYPE_READONLY (expr), 1);
kono
parents:
diff changeset
321 /* We used to stream TYPE_ALIAS_SET == 0 information to let frontends mark
kono
parents:
diff changeset
322 types that are opaque for TBAA. This however did not work as intended,
kono
parents:
diff changeset
323 because TYPE_ALIAS_SET == 0 was regularly lost in type merging. */
kono
parents:
diff changeset
324 if (RECORD_OR_UNION_TYPE_P (expr))
kono
parents:
diff changeset
325 {
kono
parents:
diff changeset
326 bp_pack_value (bp, TYPE_TRANSPARENT_AGGR (expr), 1);
kono
parents:
diff changeset
327 bp_pack_value (bp, TYPE_FINAL_P (expr), 1);
kono
parents:
diff changeset
328 }
kono
parents:
diff changeset
329 else if (TREE_CODE (expr) == ARRAY_TYPE)
kono
parents:
diff changeset
330 bp_pack_value (bp, TYPE_NONALIASED_COMPONENT (expr), 1);
kono
parents:
diff changeset
331 if (AGGREGATE_TYPE_P (expr))
kono
parents:
diff changeset
332 bp_pack_value (bp, TYPE_TYPELESS_STORAGE (expr), 1);
kono
parents:
diff changeset
333 bp_pack_var_len_unsigned (bp, TYPE_PRECISION (expr));
kono
parents:
diff changeset
334 bp_pack_var_len_unsigned (bp, TYPE_ALIGN (expr));
kono
parents:
diff changeset
335 }
kono
parents:
diff changeset
336
kono
parents:
diff changeset
337
kono
parents:
diff changeset
338 /* Pack all the non-pointer fields of the TS_BLOCK structure
kono
parents:
diff changeset
339 of expression EXPR into bitpack BP. */
kono
parents:
diff changeset
340
kono
parents:
diff changeset
341 static void
kono
parents:
diff changeset
342 pack_ts_block_value_fields (struct output_block *ob,
kono
parents:
diff changeset
343 struct bitpack_d *bp, tree expr)
kono
parents:
diff changeset
344 {
kono
parents:
diff changeset
345 bp_pack_value (bp, BLOCK_ABSTRACT (expr), 1);
kono
parents:
diff changeset
346 /* BLOCK_NUMBER is recomputed. */
kono
parents:
diff changeset
347 /* Stream BLOCK_SOURCE_LOCATION for the limited cases we can handle - those
kono
parents:
diff changeset
348 that represent inlined function scopes.
kono
parents:
diff changeset
349 For the rest them on the floor instead of ICEing in dwarf2out.c. */
kono
parents:
diff changeset
350 if (inlined_function_outer_scope_p (expr))
kono
parents:
diff changeset
351 stream_output_location (ob, bp, BLOCK_SOURCE_LOCATION (expr));
kono
parents:
diff changeset
352 else
kono
parents:
diff changeset
353 stream_output_location (ob, bp, UNKNOWN_LOCATION);
kono
parents:
diff changeset
354 }
kono
parents:
diff changeset
355
kono
parents:
diff changeset
356 /* Pack all the non-pointer fields of the TS_TRANSLATION_UNIT_DECL structure
kono
parents:
diff changeset
357 of expression EXPR into bitpack BP. */
kono
parents:
diff changeset
358
kono
parents:
diff changeset
359 static void
kono
parents:
diff changeset
360 pack_ts_translation_unit_decl_value_fields (struct output_block *ob,
kono
parents:
diff changeset
361 struct bitpack_d *bp, tree expr)
kono
parents:
diff changeset
362 {
kono
parents:
diff changeset
363 bp_pack_string (ob, bp, TRANSLATION_UNIT_LANGUAGE (expr), true);
kono
parents:
diff changeset
364 }
kono
parents:
diff changeset
365
kono
parents:
diff changeset
366
kono
parents:
diff changeset
367 /* Pack all the non-pointer fields of the TS_OMP_CLAUSE structure
kono
parents:
diff changeset
368 of expression EXPR into bitpack BP. */
kono
parents:
diff changeset
369
kono
parents:
diff changeset
370 static void
kono
parents:
diff changeset
371 pack_ts_omp_clause_value_fields (struct output_block *ob,
kono
parents:
diff changeset
372 struct bitpack_d *bp, tree expr)
kono
parents:
diff changeset
373 {
kono
parents:
diff changeset
374 stream_output_location (ob, bp, OMP_CLAUSE_LOCATION (expr));
kono
parents:
diff changeset
375 switch (OMP_CLAUSE_CODE (expr))
kono
parents:
diff changeset
376 {
kono
parents:
diff changeset
377 case OMP_CLAUSE_DEFAULT:
kono
parents:
diff changeset
378 bp_pack_enum (bp, omp_clause_default_kind, OMP_CLAUSE_DEFAULT_LAST,
kono
parents:
diff changeset
379 OMP_CLAUSE_DEFAULT_KIND (expr));
kono
parents:
diff changeset
380 break;
kono
parents:
diff changeset
381 case OMP_CLAUSE_SCHEDULE:
kono
parents:
diff changeset
382 bp_pack_enum (bp, omp_clause_schedule_kind, OMP_CLAUSE_SCHEDULE_LAST,
kono
parents:
diff changeset
383 OMP_CLAUSE_SCHEDULE_KIND (expr));
kono
parents:
diff changeset
384 break;
kono
parents:
diff changeset
385 case OMP_CLAUSE_DEPEND:
kono
parents:
diff changeset
386 bp_pack_enum (bp, omp_clause_depend_kind, OMP_CLAUSE_DEPEND_LAST,
kono
parents:
diff changeset
387 OMP_CLAUSE_DEPEND_KIND (expr));
kono
parents:
diff changeset
388 break;
kono
parents:
diff changeset
389 case OMP_CLAUSE_MAP:
kono
parents:
diff changeset
390 bp_pack_enum (bp, gomp_map_kind, GOMP_MAP_LAST,
kono
parents:
diff changeset
391 OMP_CLAUSE_MAP_KIND (expr));
kono
parents:
diff changeset
392 break;
kono
parents:
diff changeset
393 case OMP_CLAUSE_PROC_BIND:
kono
parents:
diff changeset
394 bp_pack_enum (bp, omp_clause_proc_bind_kind, OMP_CLAUSE_PROC_BIND_LAST,
kono
parents:
diff changeset
395 OMP_CLAUSE_PROC_BIND_KIND (expr));
kono
parents:
diff changeset
396 break;
kono
parents:
diff changeset
397 case OMP_CLAUSE_REDUCTION:
kono
parents:
diff changeset
398 bp_pack_enum (bp, tree_code, MAX_TREE_CODES,
kono
parents:
diff changeset
399 OMP_CLAUSE_REDUCTION_CODE (expr));
kono
parents:
diff changeset
400 break;
kono
parents:
diff changeset
401 default:
kono
parents:
diff changeset
402 break;
kono
parents:
diff changeset
403 }
kono
parents:
diff changeset
404 }
kono
parents:
diff changeset
405
kono
parents:
diff changeset
406
kono
parents:
diff changeset
407 /* Pack all the bitfields in EXPR into a bit pack. */
kono
parents:
diff changeset
408
kono
parents:
diff changeset
409 void
kono
parents:
diff changeset
410 streamer_write_tree_bitfields (struct output_block *ob, tree expr)
kono
parents:
diff changeset
411 {
kono
parents:
diff changeset
412 bitpack_d bp = bitpack_create (ob->main_stream);
kono
parents:
diff changeset
413 enum tree_code code;
kono
parents:
diff changeset
414
kono
parents:
diff changeset
415 code = TREE_CODE (expr);
kono
parents:
diff changeset
416
kono
parents:
diff changeset
417 /* Note that all these functions are highly sensitive to changes in
kono
parents:
diff changeset
418 the types and sizes of each of the fields being packed. */
kono
parents:
diff changeset
419 pack_ts_base_value_fields (&bp, expr);
kono
parents:
diff changeset
420
kono
parents:
diff changeset
421 if (CODE_CONTAINS_STRUCT (code, TS_INT_CST))
kono
parents:
diff changeset
422 pack_ts_int_cst_value_fields (&bp, expr);
kono
parents:
diff changeset
423
kono
parents:
diff changeset
424 if (CODE_CONTAINS_STRUCT (code, TS_REAL_CST))
kono
parents:
diff changeset
425 pack_ts_real_cst_value_fields (&bp, expr);
kono
parents:
diff changeset
426
kono
parents:
diff changeset
427 if (CODE_CONTAINS_STRUCT (code, TS_FIXED_CST))
kono
parents:
diff changeset
428 pack_ts_fixed_cst_value_fields (&bp, expr);
kono
parents:
diff changeset
429
kono
parents:
diff changeset
430 if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
kono
parents:
diff changeset
431 stream_output_location (ob, &bp, DECL_SOURCE_LOCATION (expr));
kono
parents:
diff changeset
432
kono
parents:
diff changeset
433 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
kono
parents:
diff changeset
434 pack_ts_decl_common_value_fields (&bp, expr);
kono
parents:
diff changeset
435
kono
parents:
diff changeset
436 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL))
kono
parents:
diff changeset
437 pack_ts_decl_wrtl_value_fields (&bp, expr);
kono
parents:
diff changeset
438
kono
parents:
diff changeset
439 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
kono
parents:
diff changeset
440 pack_ts_decl_with_vis_value_fields (&bp, expr);
kono
parents:
diff changeset
441
kono
parents:
diff changeset
442 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
kono
parents:
diff changeset
443 pack_ts_function_decl_value_fields (&bp, expr);
kono
parents:
diff changeset
444
kono
parents:
diff changeset
445 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
kono
parents:
diff changeset
446 pack_ts_type_common_value_fields (&bp, expr);
kono
parents:
diff changeset
447
kono
parents:
diff changeset
448 if (CODE_CONTAINS_STRUCT (code, TS_EXP))
kono
parents:
diff changeset
449 {
kono
parents:
diff changeset
450 stream_output_location (ob, &bp, EXPR_LOCATION (expr));
kono
parents:
diff changeset
451 if (code == MEM_REF
kono
parents:
diff changeset
452 || code == TARGET_MEM_REF)
kono
parents:
diff changeset
453 {
kono
parents:
diff changeset
454 bp_pack_value (&bp, MR_DEPENDENCE_CLIQUE (expr), sizeof (short) * 8);
kono
parents:
diff changeset
455 if (MR_DEPENDENCE_CLIQUE (expr) != 0)
kono
parents:
diff changeset
456 bp_pack_value (&bp, MR_DEPENDENCE_BASE (expr), sizeof (short) * 8);
kono
parents:
diff changeset
457 }
kono
parents:
diff changeset
458 }
kono
parents:
diff changeset
459
kono
parents:
diff changeset
460 if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
kono
parents:
diff changeset
461 pack_ts_block_value_fields (ob, &bp, expr);
kono
parents:
diff changeset
462
kono
parents:
diff changeset
463 if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL))
kono
parents:
diff changeset
464 pack_ts_translation_unit_decl_value_fields (ob, &bp, expr);
kono
parents:
diff changeset
465
kono
parents:
diff changeset
466 if (CODE_CONTAINS_STRUCT (code, TS_OPTIMIZATION))
kono
parents:
diff changeset
467 cl_optimization_stream_out (&bp, TREE_OPTIMIZATION (expr));
kono
parents:
diff changeset
468
kono
parents:
diff changeset
469 if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
kono
parents:
diff changeset
470 bp_pack_var_len_unsigned (&bp, vec_safe_length (BINFO_BASE_ACCESSES (expr)));
kono
parents:
diff changeset
471
kono
parents:
diff changeset
472 if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
kono
parents:
diff changeset
473 bp_pack_var_len_unsigned (&bp, CONSTRUCTOR_NELTS (expr));
kono
parents:
diff changeset
474
kono
parents:
diff changeset
475 if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION)
kono
parents:
diff changeset
476 /* Don't stream these when passing things to a different target. */
kono
parents:
diff changeset
477 && !lto_stream_offload_p)
kono
parents:
diff changeset
478 cl_target_option_stream_out (ob, &bp, TREE_TARGET_OPTION (expr));
kono
parents:
diff changeset
479
kono
parents:
diff changeset
480 if (code == OMP_CLAUSE)
kono
parents:
diff changeset
481 pack_ts_omp_clause_value_fields (ob, &bp, expr);
kono
parents:
diff changeset
482
kono
parents:
diff changeset
483 streamer_write_bitpack (&bp);
kono
parents:
diff changeset
484 }
kono
parents:
diff changeset
485
kono
parents:
diff changeset
486
kono
parents:
diff changeset
487 /* Emit the chain of tree nodes starting at T. OB is the output block
kono
parents:
diff changeset
488 to write to. REF_P is true if chain elements should be emitted
kono
parents:
diff changeset
489 as references. */
kono
parents:
diff changeset
490
kono
parents:
diff changeset
491 void
kono
parents:
diff changeset
492 streamer_write_chain (struct output_block *ob, tree t, bool ref_p)
kono
parents:
diff changeset
493 {
kono
parents:
diff changeset
494 while (t)
kono
parents:
diff changeset
495 {
kono
parents:
diff changeset
496 /* We avoid outputting external vars or functions by reference
kono
parents:
diff changeset
497 to the global decls section as we do not want to have them
kono
parents:
diff changeset
498 enter decl merging. This is, of course, only for the call
kono
parents:
diff changeset
499 for streaming BLOCK_VARS, but other callers are safe.
kono
parents:
diff changeset
500 See also lto-streamer-out.c:DFS_write_tree_body. */
kono
parents:
diff changeset
501 if (VAR_OR_FUNCTION_DECL_P (t)
kono
parents:
diff changeset
502 && DECL_EXTERNAL (t))
kono
parents:
diff changeset
503 stream_write_tree_shallow_non_ref (ob, t, ref_p);
kono
parents:
diff changeset
504 else
kono
parents:
diff changeset
505 stream_write_tree (ob, t, ref_p);
kono
parents:
diff changeset
506
kono
parents:
diff changeset
507 t = TREE_CHAIN (t);
kono
parents:
diff changeset
508 }
kono
parents:
diff changeset
509
kono
parents:
diff changeset
510 /* Write a sentinel to terminate the chain. */
kono
parents:
diff changeset
511 stream_write_tree (ob, NULL_TREE, ref_p);
kono
parents:
diff changeset
512 }
kono
parents:
diff changeset
513
kono
parents:
diff changeset
514
kono
parents:
diff changeset
515 /* Write all pointer fields in the TS_COMMON structure of EXPR to output
kono
parents:
diff changeset
516 block OB. If REF_P is true, write a reference to EXPR's pointer
kono
parents:
diff changeset
517 fields. */
kono
parents:
diff changeset
518
kono
parents:
diff changeset
519 static void
kono
parents:
diff changeset
520 write_ts_common_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
kono
parents:
diff changeset
521 {
kono
parents:
diff changeset
522 if (TREE_CODE (expr) != IDENTIFIER_NODE)
kono
parents:
diff changeset
523 stream_write_tree (ob, TREE_TYPE (expr), ref_p);
kono
parents:
diff changeset
524 }
kono
parents:
diff changeset
525
kono
parents:
diff changeset
526
kono
parents:
diff changeset
527 /* Write all pointer fields in the TS_VECTOR structure of EXPR to output
kono
parents:
diff changeset
528 block OB. If REF_P is true, write a reference to EXPR's pointer
kono
parents:
diff changeset
529 fields. */
kono
parents:
diff changeset
530
kono
parents:
diff changeset
531 static void
kono
parents:
diff changeset
532 write_ts_vector_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
kono
parents:
diff changeset
533 {
kono
parents:
diff changeset
534 unsigned i;
kono
parents:
diff changeset
535 /* Note that the number of elements for EXPR has already been emitted
kono
parents:
diff changeset
536 in EXPR's header (see streamer_write_tree_header). */
kono
parents:
diff changeset
537 for (i = 0; i < VECTOR_CST_NELTS (expr); ++i)
kono
parents:
diff changeset
538 stream_write_tree (ob, VECTOR_CST_ELT (expr, i), ref_p);
kono
parents:
diff changeset
539 }
kono
parents:
diff changeset
540
kono
parents:
diff changeset
541
kono
parents:
diff changeset
542 /* Write all pointer fields in the TS_COMPLEX structure of EXPR to output
kono
parents:
diff changeset
543 block OB. If REF_P is true, write a reference to EXPR's pointer
kono
parents:
diff changeset
544 fields. */
kono
parents:
diff changeset
545
kono
parents:
diff changeset
546 static void
kono
parents:
diff changeset
547 write_ts_complex_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
kono
parents:
diff changeset
548 {
kono
parents:
diff changeset
549 stream_write_tree (ob, TREE_REALPART (expr), ref_p);
kono
parents:
diff changeset
550 stream_write_tree (ob, TREE_IMAGPART (expr), ref_p);
kono
parents:
diff changeset
551 }
kono
parents:
diff changeset
552
kono
parents:
diff changeset
553
kono
parents:
diff changeset
554 /* Write all pointer fields in the TS_DECL_MINIMAL structure of EXPR
kono
parents:
diff changeset
555 to output block OB. If REF_P is true, write a reference to EXPR's
kono
parents:
diff changeset
556 pointer fields. */
kono
parents:
diff changeset
557
kono
parents:
diff changeset
558 static void
kono
parents:
diff changeset
559 write_ts_decl_minimal_tree_pointers (struct output_block *ob, tree expr,
kono
parents:
diff changeset
560 bool ref_p)
kono
parents:
diff changeset
561 {
kono
parents:
diff changeset
562 /* Drop names that were created for anonymous entities. */
kono
parents:
diff changeset
563 if (DECL_NAME (expr)
kono
parents:
diff changeset
564 && TREE_CODE (DECL_NAME (expr)) == IDENTIFIER_NODE
kono
parents:
diff changeset
565 && anon_aggrname_p (DECL_NAME (expr)))
kono
parents:
diff changeset
566 stream_write_tree (ob, NULL_TREE, ref_p);
kono
parents:
diff changeset
567 else
kono
parents:
diff changeset
568 stream_write_tree (ob, DECL_NAME (expr), ref_p);
kono
parents:
diff changeset
569 if (TREE_CODE (expr) != TRANSLATION_UNIT_DECL
kono
parents:
diff changeset
570 && ! DECL_CONTEXT (expr))
kono
parents:
diff changeset
571 stream_write_tree (ob, (*all_translation_units)[0], ref_p);
kono
parents:
diff changeset
572 else
kono
parents:
diff changeset
573 stream_write_tree (ob, DECL_CONTEXT (expr), ref_p);
kono
parents:
diff changeset
574 }
kono
parents:
diff changeset
575
kono
parents:
diff changeset
576
kono
parents:
diff changeset
577 /* Write all pointer fields in the TS_DECL_COMMON structure of EXPR to
kono
parents:
diff changeset
578 output block OB. If REF_P is true, write a reference to EXPR's
kono
parents:
diff changeset
579 pointer fields. */
kono
parents:
diff changeset
580
kono
parents:
diff changeset
581 static void
kono
parents:
diff changeset
582 write_ts_decl_common_tree_pointers (struct output_block *ob, tree expr,
kono
parents:
diff changeset
583 bool ref_p)
kono
parents:
diff changeset
584 {
kono
parents:
diff changeset
585 stream_write_tree (ob, DECL_SIZE (expr), ref_p);
kono
parents:
diff changeset
586 stream_write_tree (ob, DECL_SIZE_UNIT (expr), ref_p);
kono
parents:
diff changeset
587
kono
parents:
diff changeset
588 /* Note, DECL_INITIAL is not handled here. Since DECL_INITIAL needs
kono
parents:
diff changeset
589 special handling in LTO, it must be handled by streamer hooks. */
kono
parents:
diff changeset
590
kono
parents:
diff changeset
591 stream_write_tree (ob, DECL_ATTRIBUTES (expr), ref_p);
kono
parents:
diff changeset
592 stream_write_tree (ob, DECL_ABSTRACT_ORIGIN (expr), ref_p);
kono
parents:
diff changeset
593
kono
parents:
diff changeset
594 if ((VAR_P (expr) || TREE_CODE (expr) == PARM_DECL)
kono
parents:
diff changeset
595 && DECL_HAS_VALUE_EXPR_P (expr))
kono
parents:
diff changeset
596 stream_write_tree (ob, DECL_VALUE_EXPR (expr), ref_p);
kono
parents:
diff changeset
597
kono
parents:
diff changeset
598 if (VAR_P (expr))
kono
parents:
diff changeset
599 stream_write_tree (ob, DECL_DEBUG_EXPR (expr), ref_p);
kono
parents:
diff changeset
600 }
kono
parents:
diff changeset
601
kono
parents:
diff changeset
602
kono
parents:
diff changeset
603 /* Write all pointer fields in the TS_DECL_NON_COMMON structure of
kono
parents:
diff changeset
604 EXPR to output block OB. If REF_P is true, write a reference to EXPR's
kono
parents:
diff changeset
605 pointer fields. */
kono
parents:
diff changeset
606
kono
parents:
diff changeset
607 static void
kono
parents:
diff changeset
608 write_ts_decl_non_common_tree_pointers (struct output_block *ob, tree expr,
kono
parents:
diff changeset
609 bool ref_p)
kono
parents:
diff changeset
610 {
kono
parents:
diff changeset
611 if (TREE_CODE (expr) == TYPE_DECL)
kono
parents:
diff changeset
612 stream_write_tree (ob, DECL_ORIGINAL_TYPE (expr), ref_p);
kono
parents:
diff changeset
613 }
kono
parents:
diff changeset
614
kono
parents:
diff changeset
615
kono
parents:
diff changeset
616 /* Write all pointer fields in the TS_DECL_WITH_VIS structure of EXPR
kono
parents:
diff changeset
617 to output block OB. If REF_P is true, write a reference to EXPR's
kono
parents:
diff changeset
618 pointer fields. */
kono
parents:
diff changeset
619
kono
parents:
diff changeset
620 static void
kono
parents:
diff changeset
621 write_ts_decl_with_vis_tree_pointers (struct output_block *ob, tree expr,
kono
parents:
diff changeset
622 bool ref_p)
kono
parents:
diff changeset
623 {
kono
parents:
diff changeset
624 /* Make sure we don't inadvertently set the assembler name. */
kono
parents:
diff changeset
625 if (DECL_ASSEMBLER_NAME_SET_P (expr))
kono
parents:
diff changeset
626 stream_write_tree (ob, DECL_ASSEMBLER_NAME (expr), ref_p);
kono
parents:
diff changeset
627 else
kono
parents:
diff changeset
628 stream_write_tree (ob, NULL_TREE, false);
kono
parents:
diff changeset
629 }
kono
parents:
diff changeset
630
kono
parents:
diff changeset
631
kono
parents:
diff changeset
632 /* Write all pointer fields in the TS_FIELD_DECL structure of EXPR to
kono
parents:
diff changeset
633 output block OB. If REF_P is true, write a reference to EXPR's
kono
parents:
diff changeset
634 pointer fields. */
kono
parents:
diff changeset
635
kono
parents:
diff changeset
636 static void
kono
parents:
diff changeset
637 write_ts_field_decl_tree_pointers (struct output_block *ob, tree expr,
kono
parents:
diff changeset
638 bool ref_p)
kono
parents:
diff changeset
639 {
kono
parents:
diff changeset
640 stream_write_tree (ob, DECL_FIELD_OFFSET (expr), ref_p);
kono
parents:
diff changeset
641 stream_write_tree (ob, DECL_BIT_FIELD_TYPE (expr), ref_p);
kono
parents:
diff changeset
642 stream_write_tree (ob, DECL_BIT_FIELD_REPRESENTATIVE (expr), ref_p);
kono
parents:
diff changeset
643 stream_write_tree (ob, DECL_FIELD_BIT_OFFSET (expr), ref_p);
kono
parents:
diff changeset
644 stream_write_tree (ob, DECL_FCONTEXT (expr), ref_p);
kono
parents:
diff changeset
645 }
kono
parents:
diff changeset
646
kono
parents:
diff changeset
647
kono
parents:
diff changeset
648 /* Write all pointer fields in the TS_FUNCTION_DECL structure of EXPR
kono
parents:
diff changeset
649 to output block OB. If REF_P is true, write a reference to EXPR's
kono
parents:
diff changeset
650 pointer fields. */
kono
parents:
diff changeset
651
kono
parents:
diff changeset
652 static void
kono
parents:
diff changeset
653 write_ts_function_decl_tree_pointers (struct output_block *ob, tree expr,
kono
parents:
diff changeset
654 bool ref_p)
kono
parents:
diff changeset
655 {
kono
parents:
diff changeset
656 stream_write_tree (ob, DECL_VINDEX (expr), ref_p);
kono
parents:
diff changeset
657 /* DECL_STRUCT_FUNCTION is handled by lto_output_function. */
kono
parents:
diff changeset
658 stream_write_tree (ob, DECL_FUNCTION_PERSONALITY (expr), ref_p);
kono
parents:
diff changeset
659 /* Don't stream these when passing things to a different target. */
kono
parents:
diff changeset
660 if (!lto_stream_offload_p)
kono
parents:
diff changeset
661 stream_write_tree (ob, DECL_FUNCTION_SPECIFIC_TARGET (expr), ref_p);
kono
parents:
diff changeset
662 stream_write_tree (ob, DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr), ref_p);
kono
parents:
diff changeset
663 }
kono
parents:
diff changeset
664
kono
parents:
diff changeset
665
kono
parents:
diff changeset
666 /* Write all pointer fields in the TS_TYPE_COMMON structure of EXPR to
kono
parents:
diff changeset
667 output block OB. If REF_P is true, write a reference to EXPR's
kono
parents:
diff changeset
668 pointer fields. */
kono
parents:
diff changeset
669
kono
parents:
diff changeset
670 static void
kono
parents:
diff changeset
671 write_ts_type_common_tree_pointers (struct output_block *ob, tree expr,
kono
parents:
diff changeset
672 bool ref_p)
kono
parents:
diff changeset
673 {
kono
parents:
diff changeset
674 stream_write_tree (ob, TYPE_SIZE (expr), ref_p);
kono
parents:
diff changeset
675 stream_write_tree (ob, TYPE_SIZE_UNIT (expr), ref_p);
kono
parents:
diff changeset
676 stream_write_tree (ob, TYPE_ATTRIBUTES (expr), ref_p);
kono
parents:
diff changeset
677 stream_write_tree (ob, TYPE_NAME (expr), ref_p);
kono
parents:
diff changeset
678 /* Do not stream TYPE_POINTER_TO or TYPE_REFERENCE_TO. They will be
kono
parents:
diff changeset
679 reconstructed during fixup. */
kono
parents:
diff changeset
680 /* Do not stream TYPE_NEXT_VARIANT, we reconstruct the variant lists
kono
parents:
diff changeset
681 during fixup. */
kono
parents:
diff changeset
682 stream_write_tree (ob, TYPE_MAIN_VARIANT (expr), ref_p);
kono
parents:
diff changeset
683 stream_write_tree (ob, TYPE_CONTEXT (expr), ref_p);
kono
parents:
diff changeset
684 /* TYPE_CANONICAL is re-computed during type merging, so no need
kono
parents:
diff changeset
685 to stream it here. */
kono
parents:
diff changeset
686 stream_write_tree (ob, TYPE_STUB_DECL (expr), ref_p);
kono
parents:
diff changeset
687 }
kono
parents:
diff changeset
688
kono
parents:
diff changeset
689 /* Write all pointer fields in the TS_TYPE_NON_COMMON structure of EXPR
kono
parents:
diff changeset
690 to output block OB. If REF_P is true, write a reference to EXPR's
kono
parents:
diff changeset
691 pointer fields. */
kono
parents:
diff changeset
692
kono
parents:
diff changeset
693 static void
kono
parents:
diff changeset
694 write_ts_type_non_common_tree_pointers (struct output_block *ob, tree expr,
kono
parents:
diff changeset
695 bool ref_p)
kono
parents:
diff changeset
696 {
kono
parents:
diff changeset
697 if (TREE_CODE (expr) == ENUMERAL_TYPE)
kono
parents:
diff changeset
698 stream_write_tree (ob, TYPE_VALUES (expr), ref_p);
kono
parents:
diff changeset
699 else if (TREE_CODE (expr) == ARRAY_TYPE)
kono
parents:
diff changeset
700 stream_write_tree (ob, TYPE_DOMAIN (expr), ref_p);
kono
parents:
diff changeset
701 else if (RECORD_OR_UNION_TYPE_P (expr))
kono
parents:
diff changeset
702 streamer_write_chain (ob, TYPE_FIELDS (expr), ref_p);
kono
parents:
diff changeset
703 else if (TREE_CODE (expr) == FUNCTION_TYPE
kono
parents:
diff changeset
704 || TREE_CODE (expr) == METHOD_TYPE)
kono
parents:
diff changeset
705 stream_write_tree (ob, TYPE_ARG_TYPES (expr), ref_p);
kono
parents:
diff changeset
706
kono
parents:
diff changeset
707 if (!POINTER_TYPE_P (expr))
kono
parents:
diff changeset
708 stream_write_tree (ob, TYPE_MIN_VALUE_RAW (expr), ref_p);
kono
parents:
diff changeset
709 stream_write_tree (ob, TYPE_MAX_VALUE_RAW (expr), ref_p);
kono
parents:
diff changeset
710 }
kono
parents:
diff changeset
711
kono
parents:
diff changeset
712
kono
parents:
diff changeset
713 /* Write all pointer fields in the TS_LIST structure of EXPR to output
kono
parents:
diff changeset
714 block OB. If REF_P is true, write a reference to EXPR's pointer
kono
parents:
diff changeset
715 fields. */
kono
parents:
diff changeset
716
kono
parents:
diff changeset
717 static void
kono
parents:
diff changeset
718 write_ts_list_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
kono
parents:
diff changeset
719 {
kono
parents:
diff changeset
720 stream_write_tree (ob, TREE_PURPOSE (expr), ref_p);
kono
parents:
diff changeset
721 stream_write_tree (ob, TREE_VALUE (expr), ref_p);
kono
parents:
diff changeset
722 stream_write_tree (ob, TREE_CHAIN (expr), ref_p);
kono
parents:
diff changeset
723 }
kono
parents:
diff changeset
724
kono
parents:
diff changeset
725
kono
parents:
diff changeset
726 /* Write all pointer fields in the TS_VEC structure of EXPR to output
kono
parents:
diff changeset
727 block OB. If REF_P is true, write a reference to EXPR's pointer
kono
parents:
diff changeset
728 fields. */
kono
parents:
diff changeset
729
kono
parents:
diff changeset
730 static void
kono
parents:
diff changeset
731 write_ts_vec_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
kono
parents:
diff changeset
732 {
kono
parents:
diff changeset
733 int i;
kono
parents:
diff changeset
734
kono
parents:
diff changeset
735 /* Note that the number of slots for EXPR has already been emitted
kono
parents:
diff changeset
736 in EXPR's header (see streamer_write_tree_header). */
kono
parents:
diff changeset
737 for (i = 0; i < TREE_VEC_LENGTH (expr); i++)
kono
parents:
diff changeset
738 stream_write_tree (ob, TREE_VEC_ELT (expr, i), ref_p);
kono
parents:
diff changeset
739 }
kono
parents:
diff changeset
740
kono
parents:
diff changeset
741
kono
parents:
diff changeset
742 /* Write all pointer fields in the TS_EXP structure of EXPR to output
kono
parents:
diff changeset
743 block OB. If REF_P is true, write a reference to EXPR's pointer
kono
parents:
diff changeset
744 fields. */
kono
parents:
diff changeset
745
kono
parents:
diff changeset
746 static void
kono
parents:
diff changeset
747 write_ts_exp_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
kono
parents:
diff changeset
748 {
kono
parents:
diff changeset
749 int i;
kono
parents:
diff changeset
750
kono
parents:
diff changeset
751 for (i = 0; i < TREE_OPERAND_LENGTH (expr); i++)
kono
parents:
diff changeset
752 stream_write_tree (ob, TREE_OPERAND (expr, i), ref_p);
kono
parents:
diff changeset
753 stream_write_tree (ob, TREE_BLOCK (expr), ref_p);
kono
parents:
diff changeset
754 }
kono
parents:
diff changeset
755
kono
parents:
diff changeset
756
kono
parents:
diff changeset
757 /* Write all pointer fields in the TS_BLOCK structure of EXPR to output
kono
parents:
diff changeset
758 block OB. If REF_P is true, write a reference to EXPR's pointer
kono
parents:
diff changeset
759 fields. */
kono
parents:
diff changeset
760
kono
parents:
diff changeset
761 static void
kono
parents:
diff changeset
762 write_ts_block_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
kono
parents:
diff changeset
763 {
kono
parents:
diff changeset
764 streamer_write_chain (ob, BLOCK_VARS (expr), ref_p);
kono
parents:
diff changeset
765
kono
parents:
diff changeset
766 stream_write_tree (ob, BLOCK_SUPERCONTEXT (expr), ref_p);
kono
parents:
diff changeset
767
kono
parents:
diff changeset
768 /* Stream BLOCK_ABSTRACT_ORIGIN for the limited cases we can handle - those
kono
parents:
diff changeset
769 that represent inlined function scopes.
kono
parents:
diff changeset
770 For the rest them on the floor instead of ICEing in dwarf2out.c, but
kono
parents:
diff changeset
771 keep the notion of whether the block is an inlined block by refering
kono
parents:
diff changeset
772 to itself for the sake of tree_nonartificial_location. */
kono
parents:
diff changeset
773 if (inlined_function_outer_scope_p (expr))
kono
parents:
diff changeset
774 {
kono
parents:
diff changeset
775 tree ultimate_origin = block_ultimate_origin (expr);
kono
parents:
diff changeset
776 stream_write_tree (ob, ultimate_origin, ref_p);
kono
parents:
diff changeset
777 }
kono
parents:
diff changeset
778 else
kono
parents:
diff changeset
779 stream_write_tree (ob, (BLOCK_ABSTRACT_ORIGIN (expr)
kono
parents:
diff changeset
780 ? expr : NULL_TREE), ref_p);
kono
parents:
diff changeset
781 /* Do not stream BLOCK_NONLOCALIZED_VARS. We cannot handle debug information
kono
parents:
diff changeset
782 for early inlined BLOCKs so drop it on the floor instead of ICEing in
kono
parents:
diff changeset
783 dwarf2out.c. */
kono
parents:
diff changeset
784
kono
parents:
diff changeset
785 /* BLOCK_FRAGMENT_ORIGIN and BLOCK_FRAGMENT_CHAIN is not live at LTO
kono
parents:
diff changeset
786 streaming time. */
kono
parents:
diff changeset
787
kono
parents:
diff changeset
788 /* Do not output BLOCK_SUBBLOCKS. Instead on streaming-in this
kono
parents:
diff changeset
789 list is re-constructed from BLOCK_SUPERCONTEXT. */
kono
parents:
diff changeset
790 }
kono
parents:
diff changeset
791
kono
parents:
diff changeset
792
kono
parents:
diff changeset
793 /* Write all pointer fields in the TS_BINFO structure of EXPR to output
kono
parents:
diff changeset
794 block OB. If REF_P is true, write a reference to EXPR's pointer
kono
parents:
diff changeset
795 fields. */
kono
parents:
diff changeset
796
kono
parents:
diff changeset
797 static void
kono
parents:
diff changeset
798 write_ts_binfo_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
kono
parents:
diff changeset
799 {
kono
parents:
diff changeset
800 unsigned i;
kono
parents:
diff changeset
801 tree t;
kono
parents:
diff changeset
802
kono
parents:
diff changeset
803 /* Note that the number of BINFO slots has already been emitted in
kono
parents:
diff changeset
804 EXPR's header (see streamer_write_tree_header) because this length
kono
parents:
diff changeset
805 is needed to build the empty BINFO node on the reader side. */
kono
parents:
diff changeset
806 FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (expr), i, t)
kono
parents:
diff changeset
807 stream_write_tree (ob, t, ref_p);
kono
parents:
diff changeset
808 stream_write_tree (ob, NULL_TREE, false);
kono
parents:
diff changeset
809
kono
parents:
diff changeset
810 stream_write_tree (ob, BINFO_OFFSET (expr), ref_p);
kono
parents:
diff changeset
811 stream_write_tree (ob, BINFO_VTABLE (expr), ref_p);
kono
parents:
diff changeset
812 stream_write_tree (ob, BINFO_VPTR_FIELD (expr), ref_p);
kono
parents:
diff changeset
813
kono
parents:
diff changeset
814 /* The number of BINFO_BASE_ACCESSES has already been emitted in
kono
parents:
diff changeset
815 EXPR's bitfield section. */
kono
parents:
diff changeset
816 FOR_EACH_VEC_SAFE_ELT (BINFO_BASE_ACCESSES (expr), i, t)
kono
parents:
diff changeset
817 stream_write_tree (ob, t, ref_p);
kono
parents:
diff changeset
818
kono
parents:
diff changeset
819 /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX
kono
parents:
diff changeset
820 and BINFO_VPTR_INDEX; these are used by C++ FE only. */
kono
parents:
diff changeset
821 }
kono
parents:
diff changeset
822
kono
parents:
diff changeset
823
kono
parents:
diff changeset
824 /* Write all pointer fields in the TS_CONSTRUCTOR structure of EXPR to
kono
parents:
diff changeset
825 output block OB. If REF_P is true, write a reference to EXPR's
kono
parents:
diff changeset
826 pointer fields. */
kono
parents:
diff changeset
827
kono
parents:
diff changeset
828 static void
kono
parents:
diff changeset
829 write_ts_constructor_tree_pointers (struct output_block *ob, tree expr,
kono
parents:
diff changeset
830 bool ref_p)
kono
parents:
diff changeset
831 {
kono
parents:
diff changeset
832 unsigned i;
kono
parents:
diff changeset
833 tree index, value;
kono
parents:
diff changeset
834
kono
parents:
diff changeset
835 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (expr), i, index, value)
kono
parents:
diff changeset
836 {
kono
parents:
diff changeset
837 stream_write_tree (ob, index, ref_p);
kono
parents:
diff changeset
838 stream_write_tree (ob, value, ref_p);
kono
parents:
diff changeset
839 }
kono
parents:
diff changeset
840 }
kono
parents:
diff changeset
841
kono
parents:
diff changeset
842
kono
parents:
diff changeset
843 /* Write all pointer fields in the TS_OMP_CLAUSE structure of EXPR
kono
parents:
diff changeset
844 to output block OB. If REF_P is true, write a reference to EXPR's
kono
parents:
diff changeset
845 pointer fields. */
kono
parents:
diff changeset
846
kono
parents:
diff changeset
847 static void
kono
parents:
diff changeset
848 write_ts_omp_clause_tree_pointers (struct output_block *ob, tree expr,
kono
parents:
diff changeset
849 bool ref_p)
kono
parents:
diff changeset
850 {
kono
parents:
diff changeset
851 int i;
kono
parents:
diff changeset
852 for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (expr)]; i++)
kono
parents:
diff changeset
853 stream_write_tree (ob, OMP_CLAUSE_OPERAND (expr, i), ref_p);
kono
parents:
diff changeset
854 if (OMP_CLAUSE_CODE (expr) == OMP_CLAUSE_REDUCTION)
kono
parents:
diff changeset
855 {
kono
parents:
diff changeset
856 /* We don't stream these right now, handle it if streaming
kono
parents:
diff changeset
857 of them is needed. */
kono
parents:
diff changeset
858 gcc_assert (OMP_CLAUSE_REDUCTION_GIMPLE_INIT (expr) == NULL);
kono
parents:
diff changeset
859 gcc_assert (OMP_CLAUSE_REDUCTION_GIMPLE_MERGE (expr) == NULL);
kono
parents:
diff changeset
860 }
kono
parents:
diff changeset
861 stream_write_tree (ob, OMP_CLAUSE_CHAIN (expr), ref_p);
kono
parents:
diff changeset
862 }
kono
parents:
diff changeset
863
kono
parents:
diff changeset
864
kono
parents:
diff changeset
865 /* Write all pointer fields in EXPR to output block OB. If REF_P is true,
kono
parents:
diff changeset
866 the leaves of EXPR are emitted as references. */
kono
parents:
diff changeset
867
kono
parents:
diff changeset
868 void
kono
parents:
diff changeset
869 streamer_write_tree_body (struct output_block *ob, tree expr, bool ref_p)
kono
parents:
diff changeset
870 {
kono
parents:
diff changeset
871 enum tree_code code;
kono
parents:
diff changeset
872
kono
parents:
diff changeset
873 lto_stats.num_tree_bodies_output++;
kono
parents:
diff changeset
874
kono
parents:
diff changeset
875 code = TREE_CODE (expr);
kono
parents:
diff changeset
876
kono
parents:
diff changeset
877 if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
kono
parents:
diff changeset
878 write_ts_common_tree_pointers (ob, expr, ref_p);
kono
parents:
diff changeset
879
kono
parents:
diff changeset
880 if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
kono
parents:
diff changeset
881 write_ts_vector_tree_pointers (ob, expr, ref_p);
kono
parents:
diff changeset
882
kono
parents:
diff changeset
883 if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX))
kono
parents:
diff changeset
884 write_ts_complex_tree_pointers (ob, expr, ref_p);
kono
parents:
diff changeset
885
kono
parents:
diff changeset
886 if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
kono
parents:
diff changeset
887 write_ts_decl_minimal_tree_pointers (ob, expr, ref_p);
kono
parents:
diff changeset
888
kono
parents:
diff changeset
889 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
kono
parents:
diff changeset
890 write_ts_decl_common_tree_pointers (ob, expr, ref_p);
kono
parents:
diff changeset
891
kono
parents:
diff changeset
892 if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON))
kono
parents:
diff changeset
893 write_ts_decl_non_common_tree_pointers (ob, expr, ref_p);
kono
parents:
diff changeset
894
kono
parents:
diff changeset
895 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
kono
parents:
diff changeset
896 write_ts_decl_with_vis_tree_pointers (ob, expr, ref_p);
kono
parents:
diff changeset
897
kono
parents:
diff changeset
898 if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
kono
parents:
diff changeset
899 write_ts_field_decl_tree_pointers (ob, expr, ref_p);
kono
parents:
diff changeset
900
kono
parents:
diff changeset
901 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
kono
parents:
diff changeset
902 write_ts_function_decl_tree_pointers (ob, expr, ref_p);
kono
parents:
diff changeset
903
kono
parents:
diff changeset
904 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
kono
parents:
diff changeset
905 write_ts_type_common_tree_pointers (ob, expr, ref_p);
kono
parents:
diff changeset
906
kono
parents:
diff changeset
907 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON))
kono
parents:
diff changeset
908 write_ts_type_non_common_tree_pointers (ob, expr, ref_p);
kono
parents:
diff changeset
909
kono
parents:
diff changeset
910 if (CODE_CONTAINS_STRUCT (code, TS_LIST))
kono
parents:
diff changeset
911 write_ts_list_tree_pointers (ob, expr, ref_p);
kono
parents:
diff changeset
912
kono
parents:
diff changeset
913 if (CODE_CONTAINS_STRUCT (code, TS_VEC))
kono
parents:
diff changeset
914 write_ts_vec_tree_pointers (ob, expr, ref_p);
kono
parents:
diff changeset
915
kono
parents:
diff changeset
916 if (CODE_CONTAINS_STRUCT (code, TS_EXP))
kono
parents:
diff changeset
917 write_ts_exp_tree_pointers (ob, expr, ref_p);
kono
parents:
diff changeset
918
kono
parents:
diff changeset
919 if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
kono
parents:
diff changeset
920 write_ts_block_tree_pointers (ob, expr, ref_p);
kono
parents:
diff changeset
921
kono
parents:
diff changeset
922 if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
kono
parents:
diff changeset
923 write_ts_binfo_tree_pointers (ob, expr, ref_p);
kono
parents:
diff changeset
924
kono
parents:
diff changeset
925 if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
kono
parents:
diff changeset
926 write_ts_constructor_tree_pointers (ob, expr, ref_p);
kono
parents:
diff changeset
927
kono
parents:
diff changeset
928 if (code == OMP_CLAUSE)
kono
parents:
diff changeset
929 write_ts_omp_clause_tree_pointers (ob, expr, ref_p);
kono
parents:
diff changeset
930 }
kono
parents:
diff changeset
931
kono
parents:
diff changeset
932
kono
parents:
diff changeset
933 /* Emit header information for tree EXPR to output block OB. The header
kono
parents:
diff changeset
934 contains everything needed to instantiate an empty skeleton for
kono
parents:
diff changeset
935 EXPR on the reading side. IX is the index into the streamer cache
kono
parents:
diff changeset
936 where EXPR is stored. */
kono
parents:
diff changeset
937
kono
parents:
diff changeset
938 void
kono
parents:
diff changeset
939 streamer_write_tree_header (struct output_block *ob, tree expr)
kono
parents:
diff changeset
940 {
kono
parents:
diff changeset
941 enum LTO_tags tag;
kono
parents:
diff changeset
942 enum tree_code code;
kono
parents:
diff changeset
943
kono
parents:
diff changeset
944 /* We should not see any tree nodes not handled by the streamer. */
kono
parents:
diff changeset
945 code = TREE_CODE (expr);
kono
parents:
diff changeset
946
kono
parents:
diff changeset
947 /* The header of a tree node consists of its tag, the size of
kono
parents:
diff changeset
948 the node, and any other information needed to instantiate
kono
parents:
diff changeset
949 EXPR on the reading side (such as the number of slots in
kono
parents:
diff changeset
950 variable sized nodes). */
kono
parents:
diff changeset
951 tag = lto_tree_code_to_tag (code);
kono
parents:
diff changeset
952 streamer_write_record_start (ob, tag);
kono
parents:
diff changeset
953
kono
parents:
diff changeset
954 /* The text in strings and identifiers are completely emitted in
kono
parents:
diff changeset
955 the header. */
kono
parents:
diff changeset
956 if (CODE_CONTAINS_STRUCT (code, TS_STRING))
kono
parents:
diff changeset
957 streamer_write_string_cst (ob, ob->main_stream, expr);
kono
parents:
diff changeset
958 else if (CODE_CONTAINS_STRUCT (code, TS_IDENTIFIER))
kono
parents:
diff changeset
959 write_identifier (ob, ob->main_stream, expr);
kono
parents:
diff changeset
960 else if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
kono
parents:
diff changeset
961 streamer_write_hwi (ob, VECTOR_CST_NELTS (expr));
kono
parents:
diff changeset
962 else if (CODE_CONTAINS_STRUCT (code, TS_VEC))
kono
parents:
diff changeset
963 streamer_write_hwi (ob, TREE_VEC_LENGTH (expr));
kono
parents:
diff changeset
964 else if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
kono
parents:
diff changeset
965 streamer_write_uhwi (ob, BINFO_N_BASE_BINFOS (expr));
kono
parents:
diff changeset
966 else if (TREE_CODE (expr) == CALL_EXPR)
kono
parents:
diff changeset
967 streamer_write_uhwi (ob, call_expr_nargs (expr));
kono
parents:
diff changeset
968 else if (TREE_CODE (expr) == OMP_CLAUSE)
kono
parents:
diff changeset
969 streamer_write_uhwi (ob, OMP_CLAUSE_CODE (expr));
kono
parents:
diff changeset
970 else if (CODE_CONTAINS_STRUCT (code, TS_INT_CST))
kono
parents:
diff changeset
971 {
kono
parents:
diff changeset
972 gcc_checking_assert (TREE_INT_CST_NUNITS (expr));
kono
parents:
diff changeset
973 streamer_write_uhwi (ob, TREE_INT_CST_NUNITS (expr));
kono
parents:
diff changeset
974 streamer_write_uhwi (ob, TREE_INT_CST_EXT_NUNITS (expr));
kono
parents:
diff changeset
975 }
kono
parents:
diff changeset
976 }
kono
parents:
diff changeset
977
kono
parents:
diff changeset
978
kono
parents:
diff changeset
979 /* Emit the integer constant CST to output block OB. If REF_P is true,
kono
parents:
diff changeset
980 CST's type will be emitted as a reference. */
kono
parents:
diff changeset
981
kono
parents:
diff changeset
982 void
kono
parents:
diff changeset
983 streamer_write_integer_cst (struct output_block *ob, tree cst, bool ref_p)
kono
parents:
diff changeset
984 {
kono
parents:
diff changeset
985 int i;
kono
parents:
diff changeset
986 int len = TREE_INT_CST_NUNITS (cst);
kono
parents:
diff changeset
987 gcc_assert (!TREE_OVERFLOW (cst));
kono
parents:
diff changeset
988 streamer_write_record_start (ob, LTO_integer_cst);
kono
parents:
diff changeset
989 stream_write_tree (ob, TREE_TYPE (cst), ref_p);
kono
parents:
diff changeset
990 /* We're effectively streaming a non-sign-extended wide_int here,
kono
parents:
diff changeset
991 so there's no need to stream TREE_INT_CST_EXT_NUNITS or any
kono
parents:
diff changeset
992 array members beyond LEN. We'll recreate the tree from the
kono
parents:
diff changeset
993 wide_int and the type. */
kono
parents:
diff changeset
994 streamer_write_uhwi (ob, len);
kono
parents:
diff changeset
995 for (i = 0; i < len; i++)
kono
parents:
diff changeset
996 streamer_write_hwi (ob, TREE_INT_CST_ELT (cst, i));
kono
parents:
diff changeset
997 }