summaryrefslogtreecommitdiff
path: root/gcc/lto-streamer-out.c
diff options
context:
space:
mode:
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2011-05-27 09:57:40 +0000
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2011-05-27 09:57:40 +0000
commita12c248769d216b201337f5898ea6e12c3e58f38 (patch)
tree0714052ce472f19a1f44bab51eb547b0db10018c /gcc/lto-streamer-out.c
parent0b80d316d671568e50dc7dc5cc18d76084529ced (diff)
downloadgcc-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.c96
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;
}