1#include <libunwind.h>
2
3unw_word_t
4_ReadSLEB (unsigned char **dpp)
5{
6  unsigned shift = 0;
7  unw_word_t byte, result = 0;
8  unsigned char *bp = *dpp;
9
10  while (1)
11    {
12      byte = *bp++;
13      result |= (byte & 0x7f) << shift;
14      shift += 7;
15      if ((byte & 0x80) == 0)
16	break;
17    }
18
19  if (shift < 8 * sizeof (unw_word_t) && (byte & 0x40) != 0)
20    /* sign-extend negative value */
21    result |= ((unw_word_t) -1) << shift;
22
23  *dpp = bp;
24  return result;
25}
26