| //===- llvm/Support/LEB128.h - [SU]LEB128 utility functions -----*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file declares some utility functions for encoding SLEB128 and |
| // ULEB128 values. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| /* Capstone Disassembly Engine */ |
| /* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2014 */ |
| |
| #ifndef CS_LLVM_SUPPORT_LEB128_H |
| #define CS_LLVM_SUPPORT_LEB128_H |
| |
| #if !defined(_MSC_VER) || !defined(_KERNEL_MODE) |
| #include <stdint.h> |
| #endif |
| |
| /// Utility function to decode a ULEB128 value. |
| static inline uint64_t decodeULEB128(const uint8_t *p, unsigned *n) |
| { |
| const uint8_t *orig_p = p; |
| uint64_t Value = 0; |
| unsigned Shift = 0; |
| do { |
| Value += (*p & 0x7f) << Shift; |
| Shift += 7; |
| } while (*p++ >= 128); |
| if (n) |
| *n = (unsigned)(p - orig_p); |
| return Value; |
| } |
| |
| #endif // LLVM_SYSTEM_LEB128_H |