[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