On Wed, Mar 23, 2011 at 10:24 PM, Diego Novillo <dnovi...@google.com> wrote: > > This patch has a few cleanups and exports 5 functions from the LTO streamer > that we are using from PPH. > > - When calling output_string_with_length, every caller would first > write a 0 to indicate that the string is not NULL before writing the > actual string. I moved that into output_string_with_length. > - The functions to read/write raw data blocks was private to > lto-opts.c. I moved it as a general available function into > lto-streamer-*.c. > - Similarly, the functions to read/write strings and the code to emit > decl streams and references were private. I made them extern so > they can be called from pph. > > None of the above changes behaviour in LTO. The patch bootstrap and > tests on x86_64. OK for trunk? >
Ok. Thanks, Richard. > Diego. > > > * lto-opts.c (input_data_block): Move to lto-streamer-in.c. > * lto-streamer-in.c (input_string_internal): Add clarifying > comments. > (lto_input_data_block): Move from lto-opts.c. Make extern. > Update all users. > (lto_input_string): Rename from input_string. Make extern. > Update all users. > * lto-streamer-out.c (lto_output_string_with_length): Rename from > output_string_with_length. > Output 0 to indicate a non-NULL string. Update all callers to > not emit 0. > (lto_output_string): Rename from output_string. Make extern. > Update all users. > (lto_output_decl_state_streams): Make extern. > (lto_output_decl_state_refs): Make extern. > * lto-streamer.h (lto_input_string): Declare. > (lto_input_data_block): Declare. > (lto_output_string): Declare. > (lto_output_string_with_length): Declare. > (lto_output_decl_state_streams): Declare. > (lto_output_decl_state_refs): Declare. > > diff --git a/gcc/lto-opts.c b/gcc/lto-opts.c > index ec4e78d..9979e8d 100644 > --- a/gcc/lto-opts.c > +++ b/gcc/lto-opts.c > @@ -162,18 +162,6 @@ output_string_stream (struct lto_output_stream *stream, > const char *string) > output_data_stream (stream, &flag, sizeof (flag)); > } > > -/* Read LENGTH bytes from STREAM to ADDR. */ > - > -static void > -input_data_block (struct lto_input_block *ib, void *addr, size_t length) > -{ > - size_t i; > - unsigned char *const buffer = (unsigned char *const) addr; > - > - for (i = 0; i < length; i++) > - buffer[i] = lto_input_1_unsigned (ib); > -} > - > /* Return a string from IB. The string is allocated, and the caller is > responsible for freeing it. */ > > @@ -182,15 +170,15 @@ input_string_block (struct lto_input_block *ib) > { > bool flag; > > - input_data_block (ib, &flag, sizeof (flag)); > + lto_input_data_block (ib, &flag, sizeof (flag)); > if (flag) > { > size_t length; > char *string; > > - input_data_block (ib, &length, sizeof (length)); > + lto_input_data_block (ib, &length, sizeof (length)); > string = (char *) xcalloc (1, length + 1); > - input_data_block (ib, string, length); > + lto_input_data_block (ib, string, length); > > return string; > } > @@ -336,16 +324,16 @@ input_options (struct lto_input_block *ib) > { > size_t length, i; > > - input_data_block (ib, &length, sizeof (length)); > + lto_input_data_block (ib, &length, sizeof (length)); > > for (i = 0; i < length; i++) > { > opt_t o; > > - input_data_block (ib, &o.type, sizeof (o.type)); > - input_data_block (ib, &o.code, sizeof (o.code)); > + lto_input_data_block (ib, &o.type, sizeof (o.type)); > + lto_input_data_block (ib, &o.code, sizeof (o.code)); > o.arg = input_string_block (ib); > - input_data_block (ib, &o.value, sizeof (o.value)); > + lto_input_data_block (ib, &o.value, sizeof (o.value)); > VEC_safe_push (opt_t, heap, file_options, &o); > } > } > diff --git a/gcc/lto-streamer-in.c b/gcc/lto-streamer-in.c > index a873258..383bfc2 100644 > --- a/gcc/lto-streamer-in.c > +++ b/gcc/lto-streamer-in.c > @@ -140,7 +140,10 @@ input_string_internal (struct data_in *data_in, struct > lto_input_block *ib, > unsigned int loc; > const char *result; > > + /* Read the location of the string from IB. */ > loc = lto_input_uleb128 (ib); > + > + /* Get the string stored at location LOC in DATA_IN->STRINGS. */ > LTO_INIT_INPUT_BLOCK (str_tab, data_in->strings, loc, data_in->strings_len); > len = lto_input_uleb128 (&str_tab); > *rlen = len; > @@ -191,10 +194,24 @@ input_identifier (struct data_in *data_in, struct > lto_input_block *ib) > return get_identifier_with_length (ptr, len); > } > > + > +/* Read LENGTH bytes from STREAM to ADDR. */ > + > +void > +lto_input_data_block (struct lto_input_block *ib, void *addr, size_t length) > +{ > + size_t i; > + unsigned char *const buffer = (unsigned char *const) addr; > + > + for (i = 0; i < length; i++) > + buffer[i] = lto_input_1_unsigned (ib); > +} > + > + > /* Read a NULL terminated string from the string table in DATA_IN. */ > > -static const char * > -input_string (struct data_in *data_in, struct lto_input_block *ib) > +const char * > +lto_input_string (struct data_in *data_in, struct lto_input_block *ib) > { > unsigned int len; > const char *ptr; > @@ -275,7 +292,7 @@ lto_input_location (struct lto_input_block *ib, struct > data_in *data_in) > { > expanded_location xloc; > > - xloc.file = input_string (data_in, ib); > + xloc.file = lto_input_string (data_in, ib); > if (xloc.file == NULL) > return UNKNOWN_LOCATION; > > @@ -2307,7 +2324,7 @@ lto_input_ts_translation_unit_decl_tree_pointers > (struct lto_input_block *ib, > struct data_in *data_in, > tree expr) > { > - TRANSLATION_UNIT_LANGUAGE (expr) = xstrdup (input_string (data_in, ib)); > + TRANSLATION_UNIT_LANGUAGE (expr) = xstrdup (lto_input_string (data_in, > ib)); > VEC_safe_push (tree, gc, all_translation_units, expr); > } > > @@ -2590,7 +2607,7 @@ lto_get_builtin_tree (struct lto_input_block *ib, > struct data_in *data_in) > else > gcc_unreachable (); > > - asmname = input_string (data_in, ib); > + asmname = lto_input_string (data_in, ib); > if (asmname) > set_builtin_user_assembler_name (result, asmname); > > diff --git a/gcc/lto-streamer-out.c b/gcc/lto-streamer-out.c > index ba916b6..4857947 100644 > --- a/gcc/lto-streamer-out.c > +++ b/gcc/lto-streamer-out.c > @@ -154,11 +154,11 @@ destroy_output_block (struct output_block *ob) > table in OB. The string might or might not include a trailing '\0'. > Then put the index onto the INDEX_STREAM. */ > > -static void > -output_string_with_length (struct output_block *ob, > - struct lto_output_stream *index_stream, > - const char *s, > - unsigned int len) > +void > +lto_output_string_with_length (struct output_block *ob, > + struct lto_output_stream *index_stream, > + const char *s, > + unsigned int len) > { > struct string_slot **slot; > struct string_slot s_slot; > @@ -170,6 +170,9 @@ output_string_with_length (struct output_block *ob, > s_slot.len = len; > s_slot.slot_num = 0; > > + /* Indicate that this is not a NULL string. */ > + lto_output_uleb128_stream (index_stream, 0); > + > slot = (struct string_slot **) htab_find_slot (ob->string_hash_table, > &s_slot, INSERT); > if (*slot == NULL) > @@ -200,16 +203,14 @@ output_string_with_length (struct output_block *ob, > /* Output the '\0' terminated STRING to the string > table in OB. Then put the index onto the INDEX_STREAM. */ > > -static void > -output_string (struct output_block *ob, > - struct lto_output_stream *index_stream, > - const char *string) > +void > +lto_output_string (struct output_block *ob, > + struct lto_output_stream *index_stream, > + const char *string) > { > if (string) > - { > - lto_output_uleb128_stream (index_stream, 0); > - output_string_with_length (ob, index_stream, string, strlen (string) + > 1); > - } > + lto_output_string_with_length (ob, index_stream, string, > + strlen (string) + 1); > else > lto_output_uleb128_stream (index_stream, 1); > } > @@ -224,12 +225,9 @@ output_string_cst (struct output_block *ob, > tree string) > { > if (string) > - { > - lto_output_uleb128_stream (index_stream, 0); > - output_string_with_length (ob, index_stream, > - TREE_STRING_POINTER (string), > - TREE_STRING_LENGTH (string)); > - } > + lto_output_string_with_length (ob, index_stream, > + TREE_STRING_POINTER (string), > + TREE_STRING_LENGTH (string )); > else > lto_output_uleb128_stream (index_stream, 1); > } > @@ -244,12 +242,9 @@ output_identifier (struct output_block *ob, > tree id) > { > if (id) > - { > - lto_output_uleb128_stream (index_stream, 0); > - output_string_with_length (ob, index_stream, > - IDENTIFIER_POINTER (id), > - IDENTIFIER_LENGTH (id)); > - } > + lto_output_string_with_length (ob, index_stream, > + IDENTIFIER_POINTER (id), > + IDENTIFIER_LENGTH (id)); > else > lto_output_uleb128_stream (index_stream, 1); > } > @@ -611,13 +606,13 @@ lto_output_location (struct output_block *ob, > location_t loc) > > if (loc == UNKNOWN_LOCATION) > { > - output_string (ob, ob->main_stream, NULL); > + lto_output_string (ob, ob->main_stream, NULL); > return; > } > > xloc = expand_location (loc); > > - output_string (ob, ob->main_stream, xloc.file); > + lto_output_string (ob, ob->main_stream, xloc.file); > output_sleb128 (ob, xloc.line); > output_sleb128 (ob, xloc.column); > output_sleb128 (ob, xloc.sysp); > @@ -1155,7 +1150,7 @@ static void > lto_output_ts_translation_unit_decl_tree_pointers (struct output_block *ob, > tree expr) > { > - output_string (ob, ob->main_stream, TRANSLATION_UNIT_LANGUAGE (expr)); > + lto_output_string (ob, ob->main_stream, TRANSLATION_UNIT_LANGUAGE (expr)); > } > > /* Helper for lto_output_tree. Write all pointer fields in EXPR to output > @@ -1320,12 +1315,12 @@ lto_output_builtin_tree (struct output_block *ob, > tree expr, int ix) > reader side from adding a second '*', we omit it here. */ > const char *str = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (expr)); > if (strlen (str) > 1 && str[0] == '*') > - output_string (ob, ob->main_stream, &str[1]); > + lto_output_string (ob, ob->main_stream, &str[1]); > else > - output_string (ob, ob->main_stream, NULL); > + lto_output_string (ob, ob->main_stream, NULL); > } > else > - output_string (ob, ob->main_stream, NULL); > + lto_output_string (ob, ob->main_stream, NULL); > } > > > @@ -1745,7 +1740,7 @@ output_gimple_stmt (struct output_block *ob, gimple > stmt) > lto_output_uleb128_stream (ob->main_stream, gimple_asm_noutputs (stmt)); > lto_output_uleb128_stream (ob->main_stream, gimple_asm_nclobbers > (stmt)); > lto_output_uleb128_stream (ob->main_stream, gimple_asm_nlabels (stmt)); > - output_string (ob, ob->main_stream, gimple_asm_string (stmt)); > + lto_output_string (ob, ob->main_stream, gimple_asm_string (stmt)); > /* Fallthru */ > > case GIMPLE_ASSIGN: > @@ -2342,7 +2337,7 @@ write_global_references (struct output_block *ob, > /* Write all the streams in an lto_out_decl_state STATE using > output block OB and output stream OUT_STREAM. */ > > -static void > +void > lto_output_decl_state_streams (struct output_block *ob, > struct lto_out_decl_state *state) > { > @@ -2356,7 +2351,7 @@ lto_output_decl_state_streams (struct output_block *ob, > /* Write all the references in an lto_out_decl_state STATE using > output block OB and output stream OUT_STREAM. */ > > -static void > +void > lto_output_decl_state_refs (struct output_block *ob, > struct lto_output_stream *out_stream, > struct lto_out_decl_state *state) > diff --git a/gcc/lto-streamer.h b/gcc/lto-streamer.h > index d8669a2..c7c865d 100644 > --- a/gcc/lto-streamer.h > +++ b/gcc/lto-streamer.h > @@ -862,6 +862,9 @@ extern struct data_in *lto_data_in_create (struct > lto_file_decl_data *, > const char *, unsigned, > VEC(ld_plugin_symbol_resolution_t,heap) *); > extern void lto_data_in_delete (struct data_in *); > +extern const char *lto_input_string (struct data_in *, > + struct lto_input_block *); > +extern void lto_input_data_block (struct lto_input_block *, void *, size_t); > > > /* In lto-streamer-out.c */ > @@ -870,6 +873,18 @@ extern struct output_block *create_output_block (enum > lto_section_type); > extern void destroy_output_block (struct output_block *); > extern void lto_output_tree (struct output_block *, tree, bool); > extern void produce_asm (struct output_block *ob, tree fn); > +extern void lto_output_string (struct output_block *, > + struct lto_output_stream *, > + const char *); > +extern void lto_output_string_with_length (struct output_block *, > + struct lto_output_stream *, > + const char *, > + unsigned int); > +void lto_output_decl_state_streams (struct output_block *, > + struct lto_out_decl_state *); > +void lto_output_decl_state_refs (struct output_block *, > + struct lto_output_stream *, > + struct lto_out_decl_state *); > > > /* In lto-cgraph.c */ > > -- > This patch is available for review at http://codereview.appspot.com/4272068 >