diff mbox

[lto] Fix streaming of multi-byte enums (issue4526099)

Message ID 20110601194135.C1ECD1DA1C9@topo.tor.corp.google.com
State New
Headers show

Commit Message

Diego Novillo June 1, 2011, 7:41 p.m. UTC
This patch (split out of
http://gcc.gnu.org/ml/gcc-patches/2011-06/msg00004.html), fixes the
streaming of enum values when they are larger than a single byte.

Tested with LTO profiledbootstrap on x86_64.

OK for trunk?


Diego.

	* lto-streamer-out.c (lto_output_ts_decl_with_vis_tree_pointers): Call
	output_record_start with LTO_null instead of output_zero.
	(lto_output_ts_binfo_tree_pointers): Likewise.
	(lto_output_tree): Likewise.
	(output_eh_try_list): Likewise.
	(output_eh_region): Likewise.
	(output_eh_lp): Likewise.
	(output_eh_regions): Likewise.
	(output_bb): Likewise.
	(output_function): Likewise.
	(output_unreferenced_globals): Likewise.
	* lto-streamer.h (enum LTO_tags): Reserve MAX_TREE_CODES
	instead of NUM_TREE_CODES.
	(lto_tag_is_tree_code_p): Check max value against MAX_TREE_CODES.
	(lto_output_int_in_range): Change << to >> when shifting VAL.


--
This patch is available for review at http://codereview.appspot.com/4526099

Comments

Richard Biener June 1, 2011, 8:33 p.m. UTC | #1
On Wed, 1 Jun 2011, Diego Novillo wrote:

> 
> This patch (split out of
> http://gcc.gnu.org/ml/gcc-patches/2011-06/msg00004.html), fixes the
> streaming of enum values when they are larger than a single byte.
> 
> Tested with LTO profiledbootstrap on x86_64.
> 
> OK for trunk?

Ok.

Thanks,
Richard.

> 
> Diego.
> 
> 	* lto-streamer-out.c (lto_output_ts_decl_with_vis_tree_pointers): Call
> 	output_record_start with LTO_null instead of output_zero.
> 	(lto_output_ts_binfo_tree_pointers): Likewise.
> 	(lto_output_tree): Likewise.
> 	(output_eh_try_list): Likewise.
> 	(output_eh_region): Likewise.
> 	(output_eh_lp): Likewise.
> 	(output_eh_regions): Likewise.
> 	(output_bb): Likewise.
> 	(output_function): Likewise.
> 	(output_unreferenced_globals): Likewise.
> 	* lto-streamer.h (enum LTO_tags): Reserve MAX_TREE_CODES
> 	instead of NUM_TREE_CODES.
> 	(lto_tag_is_tree_code_p): Check max value against MAX_TREE_CODES.
> 	(lto_output_int_in_range): Change << to >> when shifting VAL.
> 
> diff --git a/gcc/lto-streamer-out.c b/gcc/lto-streamer-out.c
> index b3b81bd..3d42483 100644
> --- a/gcc/lto-streamer-out.c
> +++ b/gcc/lto-streamer-out.c
> @@ -955,7 +950,7 @@ lto_output_ts_decl_with_vis_tree_pointers (struct output_block *ob, tree expr,
>    if (DECL_ASSEMBLER_NAME_SET_P (expr))
>      lto_output_tree_or_ref (ob, DECL_ASSEMBLER_NAME (expr), ref_p);
>    else
> -    output_zero (ob);
> +    output_record_start (ob, LTO_null);
>  
>    lto_output_tree_or_ref (ob, DECL_SECTION_NAME (expr), ref_p);
>    lto_output_tree_or_ref (ob, DECL_COMDAT_GROUP (expr), ref_p);
> @@ -1136,7 +1131,7 @@ lto_output_ts_binfo_tree_pointers (struct output_block *ob, tree expr,
>       is needed to build the empty BINFO node on the reader side.  */
>    FOR_EACH_VEC_ELT (tree, BINFO_BASE_BINFOS (expr), i, t)
>      lto_output_tree_or_ref (ob, t, ref_p);
> -  output_zero (ob);
> +  output_record_start (ob, LTO_null);
>  
>    lto_output_tree_or_ref (ob, BINFO_OFFSET (expr), ref_p);
>    lto_output_tree_or_ref (ob, BINFO_VTABLE (expr), ref_p);
> @@ -1430,7 +1425,7 @@ lto_output_tree (struct output_block *ob, tree expr, bool ref_p)
>  
>    if (expr == NULL_TREE)
>      {
> -      output_zero (ob);
> +      output_record_start (ob, LTO_null);
>        return;
>      }
>  
> @@ -1486,7 +1481,7 @@ output_eh_try_list (struct output_block *ob, eh_catch first)
>        lto_output_tree_ref (ob, n->label);
>      }
>  
> -  output_zero (ob);
> +  output_record_start (ob, LTO_null);
>  }
>  
>  
> @@ -1501,7 +1496,7 @@ output_eh_region (struct output_block *ob, eh_region r)
>  
>    if (r == NULL)
>      {
> -      output_zero (ob);
> +      output_record_start (ob, LTO_null);
>        return;
>      }
>  
> @@ -1564,7 +1559,7 @@ output_eh_lp (struct output_block *ob, eh_landing_pad lp)
>  {
>    if (lp == NULL)
>      {
> -      output_zero (ob);
> +      output_record_start (ob, LTO_null);
>        return;
>      }
>  
> @@ -1633,9 +1628,9 @@ output_eh_regions (struct output_block *ob, struct function *fn)
>  	}
>      }
>  
> -  /* The 0 either terminates the record or indicates that there are no
> -     eh_records at all.  */
> -  output_zero (ob);
> +  /* The LTO_null either terminates the record or indicates that there
> +     are no eh_records at all.  */
> +  output_record_start (ob, LTO_null);
>  }
>  
>  
> @@ -1880,10 +1875,10 @@ output_bb (struct output_block *ob, basic_block bb, struct function *fn)
>  	      output_sleb128 (ob, region);
>  	    }
>  	  else
> -	    output_zero (ob);
> +	    output_record_start (ob, LTO_null);
>  	}
>  
> -      output_zero (ob);
> +      output_record_start (ob, LTO_null);
>  
>        for (bsi = gsi_start_phis (bb); !gsi_end_p (bsi); gsi_next (&bsi))
>  	{
> @@ -1896,7 +1891,7 @@ output_bb (struct output_block *ob, basic_block bb, struct function *fn)
>  	    output_phi (ob, phi);
>  	}
>  
> -      output_zero (ob);
> +      output_record_start (ob, LTO_null);
>      }
>  }
>  
> @@ -2053,7 +2048,7 @@ output_function (struct cgraph_node *node)
>      output_bb (ob, bb, fn);
>  
>    /* The terminator for this function.  */
> -  output_zero (ob);
> +  output_record_start (ob, LTO_null);
>  
>    output_cfg (ob, fn);
>  
> @@ -2167,7 +2162,7 @@ output_unreferenced_globals (cgraph_node_set set, varpool_node_set vset)
>        }
>    symbol_alias_set_destroy (defined);
>  
> -  output_zero (ob);
> +  output_record_start (ob, LTO_null);
>  
>    produce_asm (ob, NULL);
>    destroy_output_block (ob);
> diff --git a/gcc/lto-streamer.h b/gcc/lto-streamer.h
> index e8410d4..9de24ff 100644
> --- a/gcc/lto-streamer.h
> +++ b/gcc/lto-streamer.h
> @@ -186,7 +186,7 @@ enum LTO_tags
>  
>       Conversely, to map between LTO tags and tree/gimple codes, the
>       reverse operation must be applied.  */
> -  LTO_bb0 = 1 + NUM_TREE_CODES + LAST_AND_UNUSED_GIMPLE_CODE,
> +  LTO_bb0 = 1 + MAX_TREE_CODES + LAST_AND_UNUSED_GIMPLE_CODE,
>    LTO_bb1,
>  
>    /* EH region holding the previous statement.  */
> @@ -957,7 +957,7 @@ extern VEC(lto_out_decl_state_ptr, heap) *lto_function_decl_states;
>  static inline bool
>  lto_tag_is_tree_code_p (enum LTO_tags tag)
>  {
> -  return tag > LTO_null && (unsigned) tag <= NUM_TREE_CODES;
> +  return tag > LTO_null && (unsigned) tag <= MAX_TREE_CODES;
>  }
>  
>  
> @@ -1226,11 +1226,11 @@ lto_output_int_in_range (struct lto_output_stream *obs,
>    val -= min;
>    lto_output_1_stream (obs, val & 255);
>    if (range >= 0xff)
> -    lto_output_1_stream (obs, (val << 8) & 255);
> +    lto_output_1_stream (obs, (val >> 8) & 255);
>    if (range >= 0xffff)
> -    lto_output_1_stream (obs, (val << 16) & 255);
> +    lto_output_1_stream (obs, (val >> 16) & 255);
>    if (range >= 0xffffff)
> -    lto_output_1_stream (obs, (val << 24) & 255);
> +    lto_output_1_stream (obs, (val >> 24) & 255);
>  }
>  
>  /* Input VAL into OBS and verify it is in range MIN...MAX that is supposed
> 
> --
> This patch is available for review at http://codereview.appspot.com/4526099
> 
>
diff mbox

Patch

diff --git a/gcc/lto-streamer-out.c b/gcc/lto-streamer-out.c
index b3b81bd..3d42483 100644
--- a/gcc/lto-streamer-out.c
+++ b/gcc/lto-streamer-out.c
@@ -955,7 +950,7 @@  lto_output_ts_decl_with_vis_tree_pointers (struct output_block *ob, tree expr,
   if (DECL_ASSEMBLER_NAME_SET_P (expr))
     lto_output_tree_or_ref (ob, DECL_ASSEMBLER_NAME (expr), ref_p);
   else
-    output_zero (ob);
+    output_record_start (ob, LTO_null);
 
   lto_output_tree_or_ref (ob, DECL_SECTION_NAME (expr), ref_p);
   lto_output_tree_or_ref (ob, DECL_COMDAT_GROUP (expr), ref_p);
@@ -1136,7 +1131,7 @@  lto_output_ts_binfo_tree_pointers (struct output_block *ob, tree expr,
      is needed to build the empty BINFO node on the reader side.  */
   FOR_EACH_VEC_ELT (tree, BINFO_BASE_BINFOS (expr), i, t)
     lto_output_tree_or_ref (ob, t, ref_p);
-  output_zero (ob);
+  output_record_start (ob, LTO_null);
 
   lto_output_tree_or_ref (ob, BINFO_OFFSET (expr), ref_p);
   lto_output_tree_or_ref (ob, BINFO_VTABLE (expr), ref_p);
@@ -1430,7 +1425,7 @@  lto_output_tree (struct output_block *ob, tree expr, bool ref_p)
 
   if (expr == NULL_TREE)
     {
-      output_zero (ob);
+      output_record_start (ob, LTO_null);
       return;
     }
 
@@ -1486,7 +1481,7 @@  output_eh_try_list (struct output_block *ob, eh_catch first)
       lto_output_tree_ref (ob, n->label);
     }
 
-  output_zero (ob);
+  output_record_start (ob, LTO_null);
 }
 
 
@@ -1501,7 +1496,7 @@  output_eh_region (struct output_block *ob, eh_region r)
 
   if (r == NULL)
     {
-      output_zero (ob);
+      output_record_start (ob, LTO_null);
       return;
     }
 
@@ -1564,7 +1559,7 @@  output_eh_lp (struct output_block *ob, eh_landing_pad lp)
 {
   if (lp == NULL)
     {
-      output_zero (ob);
+      output_record_start (ob, LTO_null);
       return;
     }
 
@@ -1633,9 +1628,9 @@  output_eh_regions (struct output_block *ob, struct function *fn)
 	}
     }
 
-  /* The 0 either terminates the record or indicates that there are no
-     eh_records at all.  */
-  output_zero (ob);
+  /* The LTO_null either terminates the record or indicates that there
+     are no eh_records at all.  */
+  output_record_start (ob, LTO_null);
 }
 
 
@@ -1880,10 +1875,10 @@  output_bb (struct output_block *ob, basic_block bb, struct function *fn)
 	      output_sleb128 (ob, region);
 	    }
 	  else
-	    output_zero (ob);
+	    output_record_start (ob, LTO_null);
 	}
 
-      output_zero (ob);
+      output_record_start (ob, LTO_null);
 
       for (bsi = gsi_start_phis (bb); !gsi_end_p (bsi); gsi_next (&bsi))
 	{
@@ -1896,7 +1891,7 @@  output_bb (struct output_block *ob, basic_block bb, struct function *fn)
 	    output_phi (ob, phi);
 	}
 
-      output_zero (ob);
+      output_record_start (ob, LTO_null);
     }
 }
 
@@ -2053,7 +2048,7 @@  output_function (struct cgraph_node *node)
     output_bb (ob, bb, fn);
 
   /* The terminator for this function.  */
-  output_zero (ob);
+  output_record_start (ob, LTO_null);
 
   output_cfg (ob, fn);
 
@@ -2167,7 +2162,7 @@  output_unreferenced_globals (cgraph_node_set set, varpool_node_set vset)
       }
   symbol_alias_set_destroy (defined);
 
-  output_zero (ob);
+  output_record_start (ob, LTO_null);
 
   produce_asm (ob, NULL);
   destroy_output_block (ob);
diff --git a/gcc/lto-streamer.h b/gcc/lto-streamer.h
index e8410d4..9de24ff 100644
--- a/gcc/lto-streamer.h
+++ b/gcc/lto-streamer.h
@@ -186,7 +186,7 @@  enum LTO_tags
 
      Conversely, to map between LTO tags and tree/gimple codes, the
      reverse operation must be applied.  */
-  LTO_bb0 = 1 + NUM_TREE_CODES + LAST_AND_UNUSED_GIMPLE_CODE,
+  LTO_bb0 = 1 + MAX_TREE_CODES + LAST_AND_UNUSED_GIMPLE_CODE,
   LTO_bb1,
 
   /* EH region holding the previous statement.  */
@@ -957,7 +957,7 @@  extern VEC(lto_out_decl_state_ptr, heap) *lto_function_decl_states;
 static inline bool
 lto_tag_is_tree_code_p (enum LTO_tags tag)
 {
-  return tag > LTO_null && (unsigned) tag <= NUM_TREE_CODES;
+  return tag > LTO_null && (unsigned) tag <= MAX_TREE_CODES;
 }
 
 
@@ -1226,11 +1226,11 @@  lto_output_int_in_range (struct lto_output_stream *obs,
   val -= min;
   lto_output_1_stream (obs, val & 255);
   if (range >= 0xff)
-    lto_output_1_stream (obs, (val << 8) & 255);
+    lto_output_1_stream (obs, (val >> 8) & 255);
   if (range >= 0xffff)
-    lto_output_1_stream (obs, (val << 16) & 255);
+    lto_output_1_stream (obs, (val >> 16) & 255);
   if (range >= 0xffffff)
-    lto_output_1_stream (obs, (val << 24) & 255);
+    lto_output_1_stream (obs, (val >> 24) & 255);
 }
 
 /* Input VAL into OBS and verify it is in range MIN...MAX that is supposed