Commit f242c0a5 by Jan Hubicka Committed by Jan Hubicka

lto-streamer-out.c (output_record_start): Use lto_output_enum


	* lto-streamer-out.c (output_record_start): Use lto_output_enum
	(lto_output_tree): Use output_record_start.
	* lto-streamer-in.c (input_record_start): Use lto_input_enum
	(lto_get_pickled_tree): Use input_record_start.
	* lto-section-in.c (lto_section_overrun): Turn into fatal error.
	(lto_value_range_error): New function.
	* lto-streamer.h (lto_value_range_error): Declare.
	(lto_output_int_in_range, lto_input_int_in_range): New functions.
	(lto_output_enum, lto_input_enum): New macros.

From-SVN: r174186
parent 52d0a7ac
2011-05-25 Jan Hubicka <jh@suse.cz>
* lto-streamer-out.c (output_record_start): Use lto_output_enum
(lto_output_tree): Use output_record_start.
* lto-streamer-in.c (input_record_start): Use lto_input_enum
(lto_get_pickled_tree): Use input_record_start.
* lto-section-in.c (lto_section_overrun): Turn into fatal error.
(lto_value_range_error): New function.
* lto-streamer.h (lto_value_range_error): Declare.
(lto_output_int_in_range, lto_input_int_in_range): New functions.
(lto_output_enum, lto_input_enum): New macros.
2011-05-25 Eric Botcazou <ebotcazou@adacore.com> 2011-05-25 Eric Botcazou <ebotcazou@adacore.com>
* common.opt (flag_stack_usage_info): New variable. * common.opt (flag_stack_usage_info): New variable.
......
...@@ -483,6 +483,16 @@ lto_get_function_in_decl_state (struct lto_file_decl_data *file_data, ...@@ -483,6 +483,16 @@ lto_get_function_in_decl_state (struct lto_file_decl_data *file_data,
void void
lto_section_overrun (struct lto_input_block *ib) lto_section_overrun (struct lto_input_block *ib)
{ {
internal_error ("bytecode stream: trying to read %d bytes " fatal_error ("bytecode stream: trying to read %d bytes "
"after the end of the input buffer", ib->p - ib->len); "after the end of the input buffer", ib->p - ib->len);
}
/* Report out of range value. */
void
lto_value_range_error (const char *purpose, HOST_WIDE_INT val,
HOST_WIDE_INT min, HOST_WIDE_INT max)
{
fatal_error ("%s out of range: Range is %i to %i, value is %i",
purpose, (int)min, (int)max, (int)val);
} }
...@@ -231,11 +231,10 @@ lto_input_string (struct data_in *data_in, struct lto_input_block *ib) ...@@ -231,11 +231,10 @@ lto_input_string (struct data_in *data_in, struct lto_input_block *ib)
/* Return the next tag in the input block IB. */ /* Return the next tag in the input block IB. */
static enum LTO_tags static inline enum LTO_tags
input_record_start (struct lto_input_block *ib) input_record_start (struct lto_input_block *ib)
{ {
enum LTO_tags tag = (enum LTO_tags) lto_input_uleb128 (ib); return lto_input_enum (ib, LTO_tags, LTO_NUM_TAGS);
return tag;
} }
...@@ -2558,7 +2557,7 @@ lto_get_pickled_tree (struct lto_input_block *ib, struct data_in *data_in) ...@@ -2558,7 +2557,7 @@ lto_get_pickled_tree (struct lto_input_block *ib, struct data_in *data_in)
enum LTO_tags expected_tag; enum LTO_tags expected_tag;
ix = lto_input_uleb128 (ib); ix = lto_input_uleb128 (ib);
expected_tag = (enum LTO_tags) lto_input_uleb128 (ib); expected_tag = lto_input_enum (ib, LTO_tags, LTO_NUM_TAGS);
result = lto_streamer_cache_get (data_in->reader_cache, ix); result = lto_streamer_cache_get (data_in->reader_cache, ix);
gcc_assert (result gcc_assert (result
......
...@@ -270,12 +270,10 @@ output_sleb128 (struct output_block *ob, HOST_WIDE_INT work) ...@@ -270,12 +270,10 @@ output_sleb128 (struct output_block *ob, HOST_WIDE_INT work)
/* Output the start of a record with TAG to output block OB. */ /* Output the start of a record with TAG to output block OB. */
static void static inline void
output_record_start (struct output_block *ob, enum LTO_tags tag) output_record_start (struct output_block *ob, enum LTO_tags tag)
{ {
/* Make sure TAG fits inside an unsigned int. */ lto_output_enum (ob->main_stream, LTO_tags, LTO_NUM_TAGS, tag);
gcc_assert (tag == (enum LTO_tags) (unsigned) tag);
output_uleb128 (ob, tag);
} }
...@@ -1401,7 +1399,8 @@ lto_output_tree (struct output_block *ob, tree expr, bool ref_p) ...@@ -1401,7 +1399,8 @@ lto_output_tree (struct output_block *ob, tree expr, bool ref_p)
will instantiate two different nodes for the same object. */ will instantiate two different nodes for the same object. */
output_record_start (ob, LTO_tree_pickle_reference); output_record_start (ob, LTO_tree_pickle_reference);
output_uleb128 (ob, ix); output_uleb128 (ob, ix);
output_uleb128 (ob, lto_tree_code_to_tag (TREE_CODE (expr))); lto_output_enum (ob->main_stream, LTO_tags, LTO_NUM_TAGS,
lto_tree_code_to_tag (TREE_CODE (expr)));
} }
else if (lto_stream_as_builtin_p (expr)) else if (lto_stream_as_builtin_p (expr))
{ {
......
...@@ -771,6 +771,9 @@ extern int lto_eq_in_decl_state (const void *, const void *); ...@@ -771,6 +771,9 @@ extern int lto_eq_in_decl_state (const void *, const void *);
extern struct lto_in_decl_state *lto_get_function_in_decl_state ( extern struct lto_in_decl_state *lto_get_function_in_decl_state (
struct lto_file_decl_data *, tree); struct lto_file_decl_data *, tree);
extern void lto_section_overrun (struct lto_input_block *) ATTRIBUTE_NORETURN; extern void lto_section_overrun (struct lto_input_block *) ATTRIBUTE_NORETURN;
extern void lto_value_range_error (const char *,
HOST_WIDE_INT, HOST_WIDE_INT,
HOST_WIDE_INT) ATTRIBUTE_NORETURN;
/* In lto-section-out.c */ /* In lto-section-out.c */
extern hashval_t lto_hash_decl_slot_node (const void *); extern hashval_t lto_hash_decl_slot_node (const void *);
...@@ -1199,4 +1202,66 @@ lto_input_1_unsigned (struct lto_input_block *ib) ...@@ -1199,4 +1202,66 @@ lto_input_1_unsigned (struct lto_input_block *ib)
return (ib->data[ib->p++]); return (ib->data[ib->p++]);
} }
/* Output VAL into OBS and verify it is in range MIN...MAX that is supposed
to be compile time constant.
Be host independent, limit range to 31bits. */
static inline void
lto_output_int_in_range (struct lto_output_stream *obs,
HOST_WIDE_INT min,
HOST_WIDE_INT max,
HOST_WIDE_INT val)
{
HOST_WIDE_INT range = max - min;
gcc_checking_assert (val >= min && val <= max && range > 0
&& range < 0x7fffffff);
val -= min;
lto_output_1_stream (obs, val & 255);
if (range >= 0xff)
lto_output_1_stream (obs, (val << 8) & 255);
if (range >= 0xffff)
lto_output_1_stream (obs, (val << 16) & 255);
if (range >= 0xffffff)
lto_output_1_stream (obs, (val << 24) & 255);
}
/* Input VAL into OBS and verify it is in range MIN...MAX that is supposed
to be compile time constant. PURPOSE is used for error reporting. */
static inline HOST_WIDE_INT
lto_input_int_in_range (struct lto_input_block *ib,
const char *purpose,
HOST_WIDE_INT min,
HOST_WIDE_INT max)
{
HOST_WIDE_INT range = max - min;
HOST_WIDE_INT val = lto_input_1_unsigned (ib);
gcc_checking_assert (range > 0 && range < 0x7fffffff);
if (range >= 0xff)
val |= ((HOST_WIDE_INT)lto_input_1_unsigned (ib)) << 8;
if (range >= 0xffff)
val |= ((HOST_WIDE_INT)lto_input_1_unsigned (ib)) << 16;
if (range >= 0xffffff)
val |= ((HOST_WIDE_INT)lto_input_1_unsigned (ib)) << 24;
val += min;
if (val < min || val > max)
lto_value_range_error (purpose, val, min, max);
return val;
}
/* Output VAL of type "enum enum_name" into OBS.
Assume range 0...ENUM_LAST - 1. */
#define lto_output_enum(obs,enum_name,enum_last,val) \
lto_output_int_in_range ((obs), 0, (int)(enum_last) - 1, (int)(val))
/* Input enum of type "enum enum_name" from IB.
Assume range 0...ENUM_LAST - 1. */
#define lto_input_enum(ib,enum_name,enum_last) \
(enum enum_name)lto_input_int_in_range ((ib), #enum_name, 0, \
(int)(enum_last) - 1)
#endif /* GCC_LTO_STREAMER_H */ #endif /* GCC_LTO_STREAMER_H */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment