1/* Generic streaming support for basic data types.
2
3   Copyright (C) 2011-2015 Free Software Foundation, Inc.
4   Contributed by Diego Novillo <dnovillo@google.com>
5
6This file is part of GCC.
7
8GCC is free software; you can redistribute it and/or modify it under
9the terms of the GNU General Public License as published by the Free
10Software Foundation; either version 3, or (at your option) any later
11version.
12
13GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14WARRANTY; without even the implied warranty of MERCHANTABILITY or
15FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16for more details.
17
18You should have received a copy of the GNU General Public License
19along with GCC; see the file COPYING3.  If not see
20<http://www.gnu.org/licenses/>.  */
21
22#include "config.h"
23#include "system.h"
24#include "coretypes.h"
25#include "hash-set.h"
26#include "machmode.h"
27#include "vec.h"
28#include "double-int.h"
29#include "input.h"
30#include "alias.h"
31#include "symtab.h"
32#include "options.h"
33#include "wide-int.h"
34#include "inchash.h"
35#include "tree.h"
36#include "fold-const.h"
37#include "predict.h"
38#include "tm.h"
39#include "hard-reg-set.h"
40#include "input.h"
41#include "function.h"
42#include "basic-block.h"
43#include "tree-ssa-alias.h"
44#include "internal-fn.h"
45#include "gimple-expr.h"
46#include "is-a.h"
47#include "gimple.h"
48#include "hash-map.h"
49#include "plugin-api.h"
50#include "ipa-ref.h"
51#include "cgraph.h"
52#include "data-streamer.h"
53
54/* Pack WORK into BP in a variant of uleb format.  */
55
56void
57bp_pack_var_len_unsigned (struct bitpack_d *bp, unsigned HOST_WIDE_INT work)
58{
59  do
60    {
61      unsigned int half_byte = (work & 0x7);
62      work >>= 3;
63      if (work != 0)
64	/* More half_bytes to follow.  */
65	half_byte |= 0x8;
66
67      bp_pack_value (bp, half_byte, 4);
68    }
69  while (work != 0);
70}
71
72
73/* Pack WORK into BP in a variant of sleb format.  */
74
75void
76bp_pack_var_len_int (struct bitpack_d *bp, HOST_WIDE_INT work)
77{
78  int more, half_byte;
79
80  do
81    {
82      half_byte = (work & 0x7);
83      /* arithmetic shift */
84      work >>= 3;
85      more = !((work == 0 && (half_byte & 0x4) == 0)
86	       || (work == -1 && (half_byte & 0x4) != 0));
87      if (more)
88	half_byte |= 0x8;
89
90      bp_pack_value (bp, half_byte, 4);
91    }
92  while (more);
93}
94
95
96/* Unpack VAL from BP in a variant of uleb format.  */
97
98unsigned HOST_WIDE_INT
99bp_unpack_var_len_unsigned (struct bitpack_d *bp)
100{
101  unsigned HOST_WIDE_INT result = 0;
102  int shift = 0;
103  unsigned HOST_WIDE_INT half_byte;
104
105  while (true)
106    {
107      half_byte = bp_unpack_value (bp, 4);
108      result |= (half_byte & 0x7) << shift;
109      shift += 3;
110      if ((half_byte & 0x8) == 0)
111	return result;
112    }
113}
114
115
116/* Unpack VAL from BP in a variant of sleb format.  */
117
118HOST_WIDE_INT
119bp_unpack_var_len_int (struct bitpack_d *bp)
120{
121  HOST_WIDE_INT result = 0;
122  int shift = 0;
123  unsigned HOST_WIDE_INT half_byte;
124
125  while (true)
126    {
127      half_byte = bp_unpack_value (bp, 4);
128      result |= (half_byte & 0x7) << shift;
129      shift += 3;
130      if ((half_byte & 0x8) == 0)
131	{
132	  if ((shift < HOST_BITS_PER_WIDE_INT) && (half_byte & 0x4))
133	    result |= - (HOST_WIDE_INT_1U << shift);
134
135	  return result;
136	}
137    }
138}
139