| #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; | |
| } |