]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/lto-section-in.c
* doc/install.texi (Specific, alpha): Remove note to use
[thirdparty/gcc.git] / gcc / lto-section-in.c
CommitLineData
7bfefa9d 1/* Input functions for reading LTO sections.
2
fbd26352 3 Copyright (C) 2009-2019 Free Software Foundation, Inc.
7bfefa9d 4 Contributed by Kenneth Zadeck <zadeck@naturalbridge.com>
5
6This file is part of GCC.
7
8GCC is free software; you can redistribute it and/or modify it under
9the terms of the GNU General Public License as published by the Free
10Software Foundation; either version 3, or (at your option) any later
11version.
12
13GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14WARRANTY; without even the implied warranty of MERCHANTABILITY or
15FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16for more details.
17
18You should have received a copy of the GNU General Public License
19along with GCC; see the file COPYING3. If not see
20<http://www.gnu.org/licenses/>. */
21
22#include "config.h"
23#include "system.h"
24#include "coretypes.h"
9ef16211 25#include "backend.h"
7c29e30e 26#include "rtl.h"
b20a8bb4 27#include "tree.h"
b23fb4cb 28#include "gimple.h"
7c29e30e 29#include "cgraph.h"
30#include "lto-streamer.h"
7bfefa9d 31#include "lto-compress.h"
32
33/* Section names. These must correspond to the values of
34 enum lto_section_type. */
35const char *lto_section_name[LTO_N_SECTION_TYPES] =
36{
37 "decls",
38 "function_body",
2e295599 39 "statics",
02b699d5 40 "symtab",
8d810329 41 "refs",
65d1b157 42 "asm",
2e295599 43 "jmpfuncs",
44 "pureconst",
45 "reference",
9e179a64 46 "profile",
341eb035 47 "symbol_nodes",
1bf41320 48 "opts",
c7b2cc59 49 "cgraphopt",
803a7988 50 "inline",
52200d03 51 "ipcp_trans",
dccabdd1 52 "icf",
2e971afd 53 "offload_table",
56686608 54 "mode_table",
96a0ca19 55 "hsa",
56 "lto"
7bfefa9d 57};
58
7bfefa9d 59/* Hooks so that the ipa passes can call into the lto front end to get
60 sections. */
61
48e1416a 62static struct lto_file_decl_data ** file_decl_data;
7bfefa9d 63static lto_get_section_data_f* get_section_f;
64static lto_free_section_data_f* free_section_f;
65
66
67/* This is called from the lto front end to set up the hooks that are
68 used by the ipa passes to get the data that they will
69 deserialize. */
70
48e1416a 71void
72lto_set_in_hooks (struct lto_file_decl_data ** data,
7bfefa9d 73 lto_get_section_data_f* get_f,
74 lto_free_section_data_f* free_f)
75{
76 file_decl_data = data;
77 get_section_f = get_f;
78 free_section_f = free_f;
79}
80
81
82/* Return an array of file decl datas for all of the files passed to
83 this compilation. */
84
85struct lto_file_decl_data **
86lto_get_file_decl_data (void)
87{
88 gcc_assert (file_decl_data);
89 return file_decl_data;
90}
91
92/* Buffer structure for accumulating data from compression callbacks. */
93
94struct lto_buffer
95{
96 char *data;
97 size_t length;
98};
99
100/* Compression callback, append LENGTH bytes from DATA to the buffer pointed
101 to by OPAQUE. */
102
103static void
104lto_append_data (const char *data, unsigned length, void *opaque)
105{
106 struct lto_buffer *buffer = (struct lto_buffer *) opaque;
107
108 buffer->data = (char *) xrealloc (buffer->data, buffer->length + length);
109 memcpy (buffer->data + buffer->length, data, length);
110 buffer->length += length;
111}
112
113/* Header placed in returned uncompressed data streams. Allows the
114 uncompressed allocated data to be mapped back to the underlying
115 compressed data for use with free_section_f. */
116
117struct lto_data_header
118{
119 const char *data;
120 size_t len;
121};
122
123/* Return a char pointer to the start of a data stream for an LTO pass
124 or function. FILE_DATA indicates where to obtain the data.
125 SECTION_TYPE is the type of information to be obtained. NAME is
126 the name of the function and is only used when finding a function
127 body; otherwise it is NULL. LEN is the size of the data
128 returned. */
129
130const char *
48e1416a 131lto_get_section_data (struct lto_file_decl_data *file_data,
7bfefa9d 132 enum lto_section_type section_type,
48e1416a 133 const char *name,
6cbd82a6 134 size_t *len, bool decompress)
7bfefa9d 135{
136 const char *data = (get_section_f) (file_data, section_type, name, len);
137 const size_t header_length = sizeof (struct lto_data_header);
138 struct lto_data_header *header;
139 struct lto_buffer buffer;
140 struct lto_compression_stream *stream;
141 lto_stats.section_size[section_type] += *len;
142
143 if (data == NULL)
144 return NULL;
145
6cbd82a6 146 /* WPA->ltrans streams are not compressed with exception of function bodies
147 and variable initializers that has been verbatim copied from earlier
148 compilations. */
96a0ca19 149 if ((!flag_ltrans || decompress) && section_type != LTO_section_lto)
baa4a2c6 150 {
151 /* Create a mapping header containing the underlying data and length,
152 and prepend this to the uncompression buffer. The uncompressed data
153 then follows, and a pointer to the start of the uncompressed data is
154 returned. */
155 header = (struct lto_data_header *) xmalloc (header_length);
156 header->data = data;
157 header->len = *len;
158
159 buffer.data = (char *) header;
160 buffer.length = header_length;
161
162 stream = lto_start_uncompression (lto_append_data, &buffer);
163 lto_uncompress_block (stream, data, *len);
88a70657 164 lto_end_uncompression (stream,
165 file_data->lto_section_header.get_compression ());
baa4a2c6 166
167 *len = buffer.length - header_length;
168 data = buffer.data + header_length;
169 }
170
baa4a2c6 171 return data;
7bfefa9d 172}
173
6cbd82a6 174/* Get the section data without any header parsing or uncompression. */
175
176const char *
177lto_get_raw_section_data (struct lto_file_decl_data *file_data,
178 enum lto_section_type section_type,
179 const char *name,
180 size_t *len)
181{
182 return (get_section_f) (file_data, section_type, name, len);
183}
7bfefa9d 184
185/* Free the data found from the above call. The first three
186 parameters are the same as above. DATA is the data to be freed and
187 LEN is the length of that data. */
188
48e1416a 189void
190lto_free_section_data (struct lto_file_decl_data *file_data,
7bfefa9d 191 enum lto_section_type section_type,
192 const char *name,
193 const char *data,
6cbd82a6 194 size_t len, bool decompress)
7bfefa9d 195{
196 const size_t header_length = sizeof (struct lto_data_header);
197 const char *real_data = data - header_length;
198 const struct lto_data_header *header
199 = (const struct lto_data_header *) real_data;
200
201 gcc_assert (free_section_f);
202
6cbd82a6 203 if (flag_ltrans && !decompress)
7bfefa9d 204 {
205 (free_section_f) (file_data, section_type, name, data, len);
206 return;
207 }
208
209 /* The underlying data address has been extracted from the mapping header.
210 Free that, then free the allocated uncompression buffer. */
211 (free_section_f) (file_data, section_type, name, header->data, header->len);
212 free (CONST_CAST (char *, real_data));
213}
214
6cbd82a6 215/* Free data allocated by lto_get_raw_section_data. */
216
217void
218lto_free_raw_section_data (struct lto_file_decl_data *file_data,
219 enum lto_section_type section_type,
220 const char *name,
221 const char *data,
222 size_t len)
223{
224 (free_section_f) (file_data, section_type, name, data, len);
225}
7bfefa9d 226
227/* Load a section of type SECTION_TYPE from FILE_DATA, parse the
228 header and then return an input block pointing to the section. The
229 raw pointer to the section is returned in DATAR and LEN. These are
230 used to free the section. Return NULL if the section is not present. */
231
2e966e2a 232class lto_input_block *
48e1416a 233lto_create_simple_input_block (struct lto_file_decl_data *file_data,
7bfefa9d 234 enum lto_section_type section_type,
235 const char **datar, size_t *len)
236{
237 const char *data = lto_get_section_data (file_data, section_type, NULL, len);
48e1416a 238 const struct lto_simple_header * header
7bfefa9d 239 = (const struct lto_simple_header *) data;
240
949e5786 241 int main_offset = sizeof (struct lto_simple_header);
7bfefa9d 242
243 if (!data)
244 return NULL;
245
7bfefa9d 246 *datar = data;
2e971afd 247 return new lto_input_block (data + main_offset, header->main_size,
248 file_data->mode_table);
7bfefa9d 249}
250
251
252/* Close the section returned from a call to
253 LTO_CREATE_SIMPLE_INPUT_BLOCK. IB is the input block returned from
254 that call. The FILE_DATA and SECTION_TYPE are the same as what was
255 passed to that call and the DATA and LEN are what was returned from
256 that call. */
257
258void
48e1416a 259lto_destroy_simple_input_block (struct lto_file_decl_data *file_data,
7bfefa9d 260 enum lto_section_type section_type,
2e966e2a 261 class lto_input_block *ib,
7bfefa9d 262 const char *data, size_t len)
263{
472ca566 264 delete ib;
7bfefa9d 265 lto_free_section_data (file_data, section_type, NULL, data, len);
266}
267
268/*****************************************************************************/
269/* Record renamings of static declarations */
270/*****************************************************************************/
271
272struct lto_renaming_slot
273{
274 const char *old_name;
275 const char *new_name;
276};
277
278/* Returns a hash code for P. */
279
280static hashval_t
281hash_name (const void *p)
282{
283 const struct lto_renaming_slot *ds = (const struct lto_renaming_slot *) p;
284 return (hashval_t) htab_hash_string (ds->new_name);
285}
286
287/* Returns nonzero if P1 and P2 are equal. */
288
289static int
290eq_name (const void *p1, const void *p2)
291{
292 const struct lto_renaming_slot *s1 =
293 (const struct lto_renaming_slot *) p1;
294 const struct lto_renaming_slot *s2 =
295 (const struct lto_renaming_slot *) p2;
296
297 return strcmp (s1->new_name, s2->new_name) == 0;
298}
299
300/* Free a renaming table entry. */
301
302static void
303renaming_slot_free (void *slot)
304{
305 struct lto_renaming_slot *s = (struct lto_renaming_slot *) slot;
306
307 free (CONST_CAST (void *, (const void *) s->old_name));
308 free (CONST_CAST (void *, (const void *) s->new_name));
309 free ((void *) s);
310}
311
312/* Create an empty hash table for recording declaration renamings. */
313
314htab_t
315lto_create_renaming_table (void)
316{
317 return htab_create (37, hash_name, eq_name, renaming_slot_free);
318}
319
320/* Record a declaration name mapping OLD_NAME -> NEW_NAME. DECL_DATA
321 holds the renaming hash table to use. */
322
323void
324lto_record_renamed_decl (struct lto_file_decl_data *decl_data,
325 const char *old_name, const char *new_name)
326{
327 void **slot;
328 struct lto_renaming_slot r_slot;
329
330 r_slot.new_name = new_name;
331 slot = htab_find_slot (decl_data->renaming_hash_table, &r_slot, INSERT);
332 if (*slot == NULL)
333 {
334 struct lto_renaming_slot *new_slot = XNEW (struct lto_renaming_slot);
335 new_slot->old_name = xstrdup (old_name);
336 new_slot->new_name = xstrdup (new_name);
337 *slot = new_slot;
338 }
339 else
340 gcc_unreachable ();
341}
342
343
344/* Given a string NAME, return the string that it has been mapped to
345 by lto_record_renamed_decl. If NAME was not renamed, it is
346 returned unchanged. DECL_DATA holds the renaming hash table to use. */
347
348const char *
349lto_get_decl_name_mapping (struct lto_file_decl_data *decl_data,
350 const char *name)
351{
352 htab_t renaming_hash_table = decl_data->renaming_hash_table;
353 struct lto_renaming_slot *slot;
354 struct lto_renaming_slot r_slot;
355
356 r_slot.new_name = name;
357 slot = (struct lto_renaming_slot *) htab_find (renaming_hash_table, &r_slot);
358 if (slot)
359 return slot->old_name;
360 else
361 return name;
362}
363
364/*****************************************************************************/
365/* Input decl state object. */
366/*****************************************************************************/
367
368/* Return a newly created in-decl state object. */
369
370struct lto_in_decl_state *
371lto_new_in_decl_state (void)
372{
25a27413 373 return ggc_cleared_alloc<lto_in_decl_state> ();
7bfefa9d 374}
375
376/* Delete STATE and its components. */
377
378void
379lto_delete_in_decl_state (struct lto_in_decl_state *state)
380{
381 int i;
382
383 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
5ecbd52e 384 vec_free (state->streams[i]);
57305941 385 ggc_free (state);
7bfefa9d 386}
387
7bfefa9d 388/* Search the in-decl state of a function FUNC contained in the file
389 associated with FILE_DATA. Return NULL if not found. */
390
391struct lto_in_decl_state*
392lto_get_function_in_decl_state (struct lto_file_decl_data *file_data,
393 tree func)
394{
395 struct lto_in_decl_state temp;
9f9f871f 396 lto_in_decl_state **slot;
7bfefa9d 397
398 temp.fn_decl = func;
9f9f871f 399 slot = file_data->function_decl_states->find_slot (&temp, NO_INSERT);
400 return slot? *slot : NULL;
7bfefa9d 401}
673ca05f 402
5f74a074 403/* Free decl_states. */
404
405void
406lto_free_function_in_decl_state (struct lto_in_decl_state *state)
407{
408 int i;
409 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
5ecbd52e 410 vec_free (state->streams[i]);
5f74a074 411 ggc_free (state);
412}
413
414/* Free decl_states associated with NODE. This makes it possible to furhter
415 release trees needed by the NODE's body. */
416
417void
452659af 418lto_free_function_in_decl_state_for_node (symtab_node *node)
5f74a074 419{
420 struct lto_in_decl_state temp;
9f9f871f 421 lto_in_decl_state **slot;
5f74a074 422
02774f2d 423 if (!node->lto_file_data)
5f74a074 424 return;
425
02774f2d 426 temp.fn_decl = node->decl;
9f9f871f 427 slot
428 = node->lto_file_data->function_decl_states->find_slot (&temp, NO_INSERT);
5f74a074 429 if (slot && *slot)
430 {
9f9f871f 431 lto_free_function_in_decl_state (*slot);
432 node->lto_file_data->function_decl_states->clear_slot (slot);
5f74a074 433 }
02774f2d 434 node->lto_file_data = NULL;
5f74a074 435}
436
673ca05f 437
438/* Report read pass end of the section. */
439
440void
2e966e2a 441lto_section_overrun (class lto_input_block *ib)
673ca05f 442{
c05be867 443 fatal_error (input_location, "bytecode stream: trying to read %d bytes "
5f8d4adf 444 "after the end of the input buffer", ib->p - ib->len);
445}
446
447/* Report out of range value. */
448
449void
450lto_value_range_error (const char *purpose, HOST_WIDE_INT val,
451 HOST_WIDE_INT min, HOST_WIDE_INT max)
452{
c05be867 453 fatal_error (input_location,
454 "%s out of range: Range is %i to %i, value is %i",
5f8d4adf 455 purpose, (int)min, (int)max, (int)val);
673ca05f 456}