Nguyen Anh Quynh | 26ee41a | 2013-11-27 12:11:31 +0800 | [diff] [blame] | 1 | //===- llvm/Support/LEB128.h - [SU]LEB128 utility functions -----*- C++ -*-===// |
| 2 | // |
| 3 | // The LLVM Compiler Infrastructure |
| 4 | // |
| 5 | // This file is distributed under the University of Illinois Open Source |
| 6 | // License. See LICENSE.TXT for details. |
| 7 | // |
| 8 | //===----------------------------------------------------------------------===// |
| 9 | // |
| 10 | // This file declares some utility functions for encoding SLEB128 and |
| 11 | // ULEB128 values. |
| 12 | // |
| 13 | //===----------------------------------------------------------------------===// |
| 14 | |
| 15 | /* Capstone Disassembler Engine */ |
| 16 | /* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013> */ |
| 17 | |
| 18 | #ifndef CS_LLVM_SUPPORT_LEB128_H |
| 19 | #define CS_LLVM_SUPPORT_LEB128_H |
| 20 | |
| 21 | #include <stdint.h> |
| 22 | |
| 23 | /// Utility function to decode a ULEB128 value. |
| 24 | static inline uint64_t decodeULEB128(const uint8_t *p, unsigned *n) |
| 25 | { |
| 26 | const uint8_t *orig_p = p; |
| 27 | uint64_t Value = 0; |
| 28 | unsigned Shift = 0; |
| 29 | do { |
| 30 | Value += (*p & 0x7f) << Shift; |
| 31 | Shift += 7; |
| 32 | } while (*p++ >= 128); |
| 33 | if (n) |
| 34 | *n = (unsigned)(p - orig_p); |
| 35 | return Value; |
| 36 | } |
| 37 | |
| 38 | #endif // LLVM_SYSTEM_LEB128_H |