diff options
author | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-05-27 09:57:40 +0000 |
---|---|---|
committer | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-05-27 09:57:40 +0000 |
commit | a12c248769d216b201337f5898ea6e12c3e58f38 (patch) | |
tree | 0714052ce472f19a1f44bab51eb547b0db10018c /gcc/lto-streamer-out.c | |
parent | 0b80d316d671568e50dc7dc5cc18d76084529ced (diff) | |
download | gcc-a12c248769d216b201337f5898ea6e12c3e58f38.tar.gz |
* lto-streamer-out.c (lto_string_index): break out from...; offset by 1
so 0 means NULL string.
(lto_output_string_with_length): ... here.
(lto_output_string, output_string_cst, output_identifier): Update handling
of NULL strings.
(lto_output_location_bitpack): New function.
(lto_output_location): Use it.
(lto_output_tree_ref): Use output_record_start.
(pack_ts_type_common_value_fields): Pack aliagn & alias set in var len values.
* lto-streamer-in.c (string_for_index): Break out from ...; offset values by 1.
(input_string_internal): ... here;
(input_string_cst, input_identifier, lto_input_string): Update handling of
NULL strings.
(lto_input_location_bitpack): New function
(lto_input_location): Use it.
(unpack_ts_type_common_value_fields): Pack align & alias in var len values.
* lto-streamer.h (bp_pack_val_len_unsigned, bp_pack_val_len_int,
bp_unpack_val_len_unsigned, bp_unpack_val_len_int): Declare.
(bp_pack_value): Sanity check the value range.
* lto-section-in.c (bp_unpack_val_len_unsigned, bp_unpack_val_len_int):
New functions.
* lto-section-out.h (bp_pack_val_len_unsigned, bp_pack_val_len_int):
New functions.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@174325 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/lto-streamer-out.c')
-rw-r--r-- | gcc/lto-streamer-out.c | 96 |
1 files changed, 65 insertions, 31 deletions
diff --git a/gcc/lto-streamer-out.c b/gcc/lto-streamer-out.c index 0cfe25a5d26..b9ac6d03245 100644 --- a/gcc/lto-streamer-out.c +++ b/gcc/lto-streamer-out.c @@ -143,16 +143,14 @@ destroy_output_block (struct output_block *ob) free (ob); } - -/* Output STRING of LEN characters to the string - table in OB. The string might or might not include a trailing '\0'. +/* Return index used to reference STRING of LEN characters in the string table + in OB. The string might or might not include a trailing '\0'. Then put the index onto the INDEX_STREAM. */ -void -lto_output_string_with_length (struct output_block *ob, - struct lto_output_stream *index_stream, - const char *s, - unsigned int len) +static unsigned +lto_string_index (struct output_block *ob, + const char *s, + unsigned int len) { struct string_slot **slot; struct string_slot s_slot; @@ -164,9 +162,6 @@ lto_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) @@ -180,18 +175,33 @@ lto_output_string_with_length (struct output_block *ob, new_slot->len = len; new_slot->slot_num = start; *slot = new_slot; - lto_output_uleb128_stream (index_stream, start); lto_output_uleb128_stream (string_stream, len); lto_output_data_stream (string_stream, string, len); + return start + 1; } else { struct string_slot *old_slot = *slot; - lto_output_uleb128_stream (index_stream, old_slot->slot_num); free (string); + return old_slot->slot_num + 1; } } + +/* Output STRING of LEN characters to the string + table in OB. The string might or might not include a trailing '\0'. + Then put the index onto the INDEX_STREAM. */ + +void +lto_output_string_with_length (struct output_block *ob, + struct lto_output_stream *index_stream, + const char *s, + unsigned int len) +{ + lto_output_uleb128_stream (index_stream, + lto_string_index (ob, s, len)); +} + /* Output the '\0' terminated STRING to the string table in OB. Then put the index onto the INDEX_STREAM. */ @@ -204,7 +214,7 @@ lto_output_string (struct output_block *ob, lto_output_string_with_length (ob, index_stream, string, strlen (string) + 1); else - lto_output_uleb128_stream (index_stream, 1); + lto_output_1_stream (index_stream, 0); } @@ -221,7 +231,7 @@ output_string_cst (struct output_block *ob, TREE_STRING_POINTER (string), TREE_STRING_LENGTH (string )); else - lto_output_uleb128_stream (index_stream, 1); + lto_output_1_stream (index_stream, 0); } @@ -238,9 +248,10 @@ output_identifier (struct output_block *ob, IDENTIFIER_POINTER (id), IDENTIFIER_LENGTH (id)); else - lto_output_uleb128_stream (index_stream, 1); + lto_output_1_stream (index_stream, 0); } + /* Write a zero to the output stream. */ static void @@ -504,8 +515,8 @@ pack_ts_type_common_value_fields (struct bitpack_d *bp, tree expr) bp_pack_value (bp, TYPE_CONTAINS_PLACEHOLDER_INTERNAL (expr), 2); bp_pack_value (bp, TYPE_USER_ALIGN (expr), 1); bp_pack_value (bp, TYPE_READONLY (expr), 1); - bp_pack_value (bp, TYPE_ALIGN (expr), HOST_BITS_PER_INT); - bp_pack_value (bp, TYPE_ALIAS_SET (expr) == 0 ? 0 : -1, HOST_BITS_PER_INT); + bp_pack_var_len_unsigned (bp, TYPE_ALIGN (expr)); + bp_pack_var_len_int (bp, TYPE_ALIAS_SET (expr) == 0 ? 0 : -1); } @@ -587,32 +598,55 @@ pack_value_fields (struct bitpack_d *bp, tree expr) } -/* Emit location LOC to output block OB. */ +/* Output info about new location into bitpack BP. + After outputting bitpack, lto_output_location_data has + to be done to output actual data. */ -static void -lto_output_location (struct output_block *ob, location_t loc) +static inline void +lto_output_location_bitpack (struct bitpack_d *bp, + struct output_block *ob, + location_t loc) { expanded_location xloc; + bp_pack_value (bp, loc == UNKNOWN_LOCATION, 1); if (loc == UNKNOWN_LOCATION) - { - lto_output_string (ob, ob->main_stream, NULL); - return; - } + return; xloc = expand_location (loc); - lto_output_string (ob, ob->main_stream, xloc.file); - output_sleb128 (ob, xloc.line); - output_sleb128 (ob, xloc.column); - output_sleb128 (ob, xloc.sysp); - + bp_pack_value (bp, ob->current_file != xloc.file, 1); + if (ob->current_file != xloc.file) + bp_pack_var_len_unsigned (bp, lto_string_index (ob, + xloc.file, + strlen (xloc.file) + 1)); 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; } +/* Emit location LOC to output block OB. + When bitpack is handy, it is more space effecient to call + lto_output_location_bitpack with existing bitpack. */ + +static void +lto_output_location (struct output_block *ob, location_t loc) +{ + struct bitpack_d bp = bitpack_create (ob->main_stream); + lto_output_location_bitpack (&bp, ob, loc); + lto_output_bitpack (&bp); +} + + /* Return true if tree node T is written to various tables. For these nodes, we sometimes want to write their phyiscal representation (via lto_output_tree), and sometimes we need to emit an index @@ -642,7 +676,7 @@ lto_output_tree_ref (struct output_block *ob, tree expr) if (expr == NULL_TREE) { - output_zero (ob); + output_record_start (ob, LTO_null); return; } |