Patchwork Fix PR56231

login
register
mail settings
Submitter Richard Guenther
Date Feb. 8, 2013, 12:18 p.m.
Message ID <alpine.LNX.2.00.1302081314450.6889@zhemvz.fhfr.qr>
Download mbox | patch
Permalink /patch/219127/
State New
Headers show

Comments

Richard Guenther - Feb. 8, 2013, 12:18 p.m.
This fixes broken include information printed on diagnostics from the
LTO frontend.  We fail to properly leave the file we're still in
after processing one data_in.  Instead of figuring out where exactly
we miss a clear_line_info call the following simply caches the
current file/line/column at the single point in LTO that creates
new linemap entries, lto_input_location.

We also for no good purpose (even though the comment suggests
otherwise) enter a dummy file at LTO start, which causes another
broken included from message.

The following changes location streaming to stream the changed
bits en-block, which allows for compiler-optimized bitstream
input/output.

LTO bootstrapped on x86_64-unknown-linux-gnu, testing in progress.

Richard.

2013-02-08  Richard Biener  <rguenther@suse.de>

	PR lto/56231
	* lto-streamer.h (struct data_in): Remove current_file, current_line
	and current_col members.
	* lto-streamer-out.c (lto_output_location): Stream changed bits
	en-block for efficiency.
	* lto-streamer-in.c (clear_line_info): Remove.
	(lto_input_location): Cache current file, line and column
	globally via local statics.  Read changed bits en-block.
	(input_function): Do not call clear_line_info.
	(lto_read_body): Likewise.
	(lto_input_toplevel_asms): Likewise.

	lto/
	* lto-lang.c (lto_init): Do not enter a dummy file.
Andi Kleen - Feb. 10, 2013, 4:22 a.m.
Richard Biener <rguenther@suse.de> writes:

> This fixes broken include information printed on diagnostics from the
> LTO frontend.  We fail to properly leave the file we're still in
> after processing one data_in.  Instead of figuring out where exactly
> we miss a clear_line_info call the following simply caches the
> current file/line/column at the single point in LTO that creates
> new linemap entries, lto_input_location.

Great! This has been annoying me for quite some time, but never 
enough to track it down.

-Andi

Patch

Index: gcc/lto-streamer.h
===================================================================
--- gcc/lto-streamer.h	(revision 195879)
+++ gcc/lto-streamer.h	(working copy)
@@ -691,10 +691,6 @@  struct data_in
   /* Number of unnamed labels.  */
   unsigned int num_unnamed_labels;
 
-  const char *current_file;
-  int current_line;
-  int current_col;
-
   /* Maps each reference number to the resolution done by the linker. */
   vec<ld_plugin_symbol_resolution_t> globals_resolution;
 
Index: gcc/lto-streamer-out.c
===================================================================
--- gcc/lto-streamer-out.c	(revision 195879)
+++ gcc/lto-streamer-out.c	(working copy)
@@ -162,6 +162,9 @@  lto_output_location (struct output_block
   xloc = expand_location (loc);
 
   bp_pack_value (bp, ob->current_file != xloc.file, 1);
+  bp_pack_value (bp, ob->current_line != xloc.line, 1);
+  bp_pack_value (bp, ob->current_col != xloc.column, 1);
+
   if (ob->current_file != xloc.file)
     bp_pack_var_len_unsigned (bp,
 	                      streamer_string_index (ob, xloc.file,
@@ -169,12 +172,10 @@  lto_output_location (struct output_block
 						     true));
   ob->current_file = xloc.file;
 
-  bp_pack_value (bp, ob->current_line != xloc.line, 1);
   if (ob->current_line != xloc.line)
     bp_pack_var_len_unsigned (bp, xloc.line);
   ob->current_line = xloc.line;
 
-  bp_pack_value (bp, ob->current_col != xloc.column, 1);
   if (ob->current_col != xloc.column)
     bp_pack_var_len_unsigned (bp, xloc.column);
   ob->current_col = xloc.column;
Index: gcc/lto-streamer-in.c
===================================================================
--- gcc/lto-streamer-in.c	(revision 195879)
+++ gcc/lto-streamer-in.c	(working copy)
@@ -123,58 +123,48 @@  canon_file_name (const char *string)
 }
 
 
-/* Clear the line info stored in DATA_IN.  */
-
-static void
-clear_line_info (struct data_in *data_in)
-{
-  if (data_in->current_file)
-    linemap_add (line_table, LC_LEAVE, false, NULL, 0);
-  data_in->current_file = NULL;
-  data_in->current_line = 0;
-  data_in->current_col = 0;
-}
-
-
 /* Read a location bitpack from input block IB.  */
 
 location_t
 lto_input_location (struct bitpack_d *bp, struct data_in *data_in)
 {
+  static const char *current_file;
+  static int current_line;
+  static int current_col;
   bool file_change, line_change, column_change;
   unsigned len;
-  bool prev_file = data_in->current_file != NULL;
+  bool prev_file = current_file != NULL;
 
   if (bp_unpack_value (bp, 1))
     return UNKNOWN_LOCATION;
 
   file_change = bp_unpack_value (bp, 1);
+  line_change = bp_unpack_value (bp, 1);
+  column_change = bp_unpack_value (bp, 1);
+
   if (file_change)
-    data_in->current_file = canon_file_name
-			      (string_for_index (data_in,
-						 bp_unpack_var_len_unsigned (bp),
-					         &len));
+    current_file = canon_file_name
+		     (string_for_index (data_in,
+					bp_unpack_var_len_unsigned (bp),
+					&len));
 
-  line_change = bp_unpack_value (bp, 1);
   if (line_change)
-    data_in->current_line = bp_unpack_var_len_unsigned (bp);
+    current_line = bp_unpack_var_len_unsigned (bp);
 
-  column_change = bp_unpack_value (bp, 1);
   if (column_change)
-    data_in->current_col = bp_unpack_var_len_unsigned (bp);
+    current_col = bp_unpack_var_len_unsigned (bp);
 
   if (file_change)
     {
       if (prev_file)
 	linemap_add (line_table, LC_LEAVE, false, NULL, 0);
 
-      linemap_add (line_table, LC_ENTER, false, data_in->current_file,
-		   data_in->current_line);
+      linemap_add (line_table, LC_ENTER, false, current_file, current_line);
     }
   else if (line_change)
-    linemap_line_start (line_table, data_in->current_line, data_in->current_col);
+    linemap_line_start (line_table, current_line, current_col);
 
-  return linemap_position_for_column (line_table, data_in->current_col);
+  return linemap_position_for_column (line_table, current_col);
 }
 
 
@@ -806,7 +796,6 @@  input_function (tree fn_decl, struct dat
 
   fn = DECL_STRUCT_FUNCTION (fn_decl);
   tag = streamer_read_record_start (ib);
-  clear_line_info (data_in);
 
   gimple_register_cfg_hooks ();
   lto_tag_check (tag, LTO_function);
@@ -987,7 +976,6 @@  lto_read_body (struct lto_file_decl_data
       pop_cfun ();
     }
 
-  clear_line_info (data_in);
   lto_data_in_delete (data_in);
 }
 
@@ -1137,7 +1125,6 @@  lto_input_toplevel_asms (struct lto_file
 	symtab_order = node->order + 1;
     }
 
-  clear_line_info (data_in);
   lto_data_in_delete (data_in);
 
   lto_free_section_data (file_data, LTO_section_asm, NULL, data, len);
Index: gcc/lto/lto-lang.c
===================================================================
--- gcc/lto/lto-lang.c	(revision 195879)
+++ gcc/lto/lto-lang.c	(working copy)
@@ -1156,9 +1156,6 @@  lto_init (void)
   /* We need to generate LTO if running in WPA mode.  */
   flag_generate_lto = flag_wpa;
 
-  /* Initialize libcpp line maps for gcc_assert to work.  */
-  linemap_add (line_table, LC_ENTER, 0, NULL, 0);
-
   /* Create the basic integer types.  */
   build_common_tree_nodes (flag_signed_char, /*short_double=*/false);