const char * lto_get_section_data (struct lto_file_decl_data *file_data, enum lto_section_type section_type, const char *name, size_t *len, bool decompress) { const char *data = (get_section_f) (file_data, section_type, name, len); const size_t header_length = sizeof (struct lto_data_header); struct lto_data_header *header; struct lto_buffer buffer; struct lto_compression_stream *stream; lto_stats.section_size[section_type] += *len; if (data == NULL) return NULL; /* WPA->ltrans streams are not compressed with exception of function bodies and variable initializers that has been verbatim copied from earlier compilations. */ if (!flag_ltrans || decompress) { /* Create a mapping header containing the underlying data and length, and prepend this to the uncompression buffer. The uncompressed data then follows, and a pointer to the start of the uncompressed data is returned. */ header = (struct lto_data_header *) xmalloc (header_length); header->data = data; header->len = *len; buffer.data = (char *) header; buffer.length = header_length; stream = lto_start_uncompression (lto_append_data, &buffer); lto_uncompress_block (stream, data, *len); lto_end_uncompression (stream); *len = buffer.length - header_length; data = buffer.data + header_length; } lto_check_version (((const lto_header *)data)->major_version, ((const lto_header *)data)->minor_version); return data; }
const char * lto_get_section_data (struct lto_file_decl_data *file_data, enum lto_section_type section_type, const char *name, size_t *len) { const char *data = (get_section_f) (file_data, section_type, name, len); const size_t header_length = sizeof (struct lto_data_header); struct lto_data_header *header; struct lto_buffer buffer; struct lto_compression_stream *stream; lto_stats.section_size[section_type] += *len; if (data == NULL) return NULL; /* FIXME lto: WPA mode does not write compressed sections, so for now suppress uncompression if flag_ltrans. */ if (!flag_ltrans) { /* Create a mapping header containing the underlying data and length, and prepend this to the uncompression buffer. The uncompressed data then follows, and a pointer to the start of the uncompressed data is returned. */ header = (struct lto_data_header *) xmalloc (header_length); header->data = data; header->len = *len; buffer.data = (char *) header; buffer.length = header_length; stream = lto_start_uncompression (lto_append_data, &buffer); lto_uncompress_block (stream, data, *len); lto_end_uncompression (stream); *len = buffer.length - header_length; data = buffer.data + header_length; } lto_check_version (((const lto_header *)data)->major_version, ((const lto_header *)data)->minor_version); return data; }