streamer_write_uhwi_stream (struct lto_output_stream *obs,
unsigned HOST_WIDE_INT work)
{
+ if (obs->left_in_block == 0)
+ lto_append_block (obs);
+ char *current_pointer = obs->current_pointer;
+ unsigned int left_in_block = obs->left_in_block;
+ unsigned int size = 0;
do
{
unsigned int byte = (work & 0x7f);
/* More bytes to follow. */
byte |= 0x80;
- streamer_write_char_stream (obs, byte);
+ *(current_pointer++) = byte;
+ left_in_block--;
+ size++;
}
- while (work != 0);
+ while (work != 0 && left_in_block > 0);
+ if (work != 0)
+ {
+ obs->left_in_block = 0;
+ lto_append_block (obs);
+ current_pointer = obs->current_pointer;
+ left_in_block = obs->left_in_block;
+ do
+ {
+ unsigned int byte = (work & 0x7f);
+ work >>= 7;
+ if (work != 0)
+ /* More bytes to follow. */
+ byte |= 0x80;
+
+ *(current_pointer++) = byte;
+ left_in_block--;
+ size++;
+ }
+ while (work != 0);
+ }
+ obs->current_pointer = current_pointer;
+ obs->left_in_block = left_in_block;
+ obs->total_size += size;
}
void
streamer_write_hwi_stream (struct lto_output_stream *obs, HOST_WIDE_INT work)
{
- int more, byte;
-
+ if (obs->left_in_block == 0)
+ lto_append_block (obs);
+ char *current_pointer = obs->current_pointer;
+ unsigned int left_in_block = obs->left_in_block;
+ unsigned int size = 0;
+ bool more;
do
{
- byte = (work & 0x7f);
- /* arithmetic shift */
- work >>= 7;
- more = !((work == 0 && (byte & 0x40) == 0)
- || (work == -1 && (byte & 0x40) != 0));
+ unsigned int byte = (work & 0x7f);
+ /* If the lower 7-bits are sign-extended 0 or -1 we are finished. */
+ work >>= 6;
+ more = !(work == 0 || work == -1);
if (more)
- byte |= 0x80;
-
- streamer_write_char_stream (obs, byte);
+ {
+ /* More bits to follow. */
+ work >>= 1;
+ byte |= 0x80;
+ }
+
+ *(current_pointer++) = byte;
+ left_in_block--;
+ size++;
+ }
+ while (more && left_in_block > 0);
+ if (more)
+ {
+ obs->left_in_block = 0;
+ lto_append_block (obs);
+ current_pointer = obs->current_pointer;
+ left_in_block = obs->left_in_block;
+ do
+ {
+ unsigned int byte = (work & 0x7f);
+ work >>= 6;
+ more = !(work == 0 || work == -1);
+ if (more)
+ {
+ work >>= 1;
+ byte |= 0x80;
+ }
+
+ *(current_pointer++) = byte;
+ left_in_block--;
+ size++;
+ }
+ while (more);
}
- while (more);
+ obs->current_pointer = current_pointer;
+ obs->left_in_block = left_in_block;
+ obs->total_size += size;
}
/* Write a GCOV counter value WORK to OBS. */