#include <libunwind.h> unw_word_t _ReadSLEB (unsigned char **dpp) { unsigned shift = 0; unw_word_t byte, result = 0; unsigned char *bp = *dpp; while (1) { byte = *bp++; result |= (byte & 0x7f) << shift; shift += 7; if ((byte & 0x80) == 0) break; } if (shift < 8 * sizeof (unw_word_t) && (byte & 0x40) != 0) /* sign-extend negative value */ result |= ((unw_word_t) -1) << shift; *dpp = bp; return result; }