[PATCH] Properly do the LTO bytecode version check
Richard Biener
rguenther@suse.de
Tue Mar 4 11:23:00 GMT 2014
We're doing the LTO bytecode version check only for two section
types at the moment - specifically _not_ for the first section
we read. Which causes us to crash instead of reporting a
version mismatch ...
Fixed by doing the version check in the most appropriate place.
LTO bootstrapped on x86_64-unknown-linux-gnu, applied.
Richard.
2014-03-04 Richard Biener <rguenther@suse.de>
PR lto/60405
* lto-streamer-in.c (lto_read_body): Remove LTO bytecode version
check.
(lto_input_toplevel_asms): Likewise.
* lto-section-in.c (lto_get_section_data): Instead do it here
for every section.
Index: gcc/lto-streamer-in.c
===================================================================
*** gcc/lto-streamer-in.c (revision 208305)
--- gcc/lto-streamer-in.c (working copy)
*************** lto_read_body (struct lto_file_decl_data
*** 1059,1068 ****
data_in = lto_data_in_create (file_data, data + string_offset,
header->string_size, vNULL);
- /* Make sure the file was generated by the exact same compiler. */
- lto_check_version (header->lto_header.major_version,
- header->lto_header.minor_version);
-
if (section_type == LTO_section_function_body)
{
struct lto_in_decl_state *decl_state;
--- 1059,1064 ----
*************** lto_input_toplevel_asms (struct lto_file
*** 1331,1340 ****
data_in = lto_data_in_create (file_data, data + string_offset,
header->string_size, vNULL);
- /* Make sure the file was generated by the exact same compiler. */
- lto_check_version (header->lto_header.major_version,
- header->lto_header.minor_version);
-
while ((str = streamer_read_string_cst (data_in, &ib)))
{
struct asm_node *node = add_asm_node (str);
--- 1327,1332 ----
Index: gcc/lto-section-in.c
===================================================================
*** gcc/lto-section-in.c (revision 208305)
--- gcc/lto-section-in.c (working copy)
*************** lto_get_section_data (struct lto_file_de
*** 153,178 ****
/* FIXME lto: WPA mode does not write compressed sections, so for now
suppress uncompression if flag_ltrans. */
! if (flag_ltrans)
! return data;
!
! /* 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;
! return buffer.data + header_length;
}
--- 153,182 ----
/* 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 (((lto_header *)data)->major_version,
! ((lto_header *)data)->minor_version);
! return data;
}
More information about the Gcc-patches
mailing list