126ee41aa673b03494292229c6e4e331a668ce7b2Nguyen Anh Quynh//===- llvm/Support/LEB128.h - [SU]LEB128 utility functions -----*- C++ -*-===//
226ee41aa673b03494292229c6e4e331a668ce7b2Nguyen Anh Quynh//
326ee41aa673b03494292229c6e4e331a668ce7b2Nguyen Anh Quynh//                     The LLVM Compiler Infrastructure
426ee41aa673b03494292229c6e4e331a668ce7b2Nguyen Anh Quynh//
526ee41aa673b03494292229c6e4e331a668ce7b2Nguyen Anh Quynh// This file is distributed under the University of Illinois Open Source
626ee41aa673b03494292229c6e4e331a668ce7b2Nguyen Anh Quynh// License. See LICENSE.TXT for details.
726ee41aa673b03494292229c6e4e331a668ce7b2Nguyen Anh Quynh//
826ee41aa673b03494292229c6e4e331a668ce7b2Nguyen Anh Quynh//===----------------------------------------------------------------------===//
926ee41aa673b03494292229c6e4e331a668ce7b2Nguyen Anh Quynh//
1026ee41aa673b03494292229c6e4e331a668ce7b2Nguyen Anh Quynh// This file declares some utility functions for encoding SLEB128 and
1126ee41aa673b03494292229c6e4e331a668ce7b2Nguyen Anh Quynh// ULEB128 values.
1226ee41aa673b03494292229c6e4e331a668ce7b2Nguyen Anh Quynh//
1326ee41aa673b03494292229c6e4e331a668ce7b2Nguyen Anh Quynh//===----------------------------------------------------------------------===//
1426ee41aa673b03494292229c6e4e331a668ce7b2Nguyen Anh Quynh
156023ef7843d97bb882b055ab834e6d0485c71e55Nguyen Anh Quynh/* Capstone Disassembly Engine */
166023ef7843d97bb882b055ab834e6d0485c71e55Nguyen Anh Quynh/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2014 */
1726ee41aa673b03494292229c6e4e331a668ce7b2Nguyen Anh Quynh
1826ee41aa673b03494292229c6e4e331a668ce7b2Nguyen Anh Quynh#ifndef CS_LLVM_SUPPORT_LEB128_H
1926ee41aa673b03494292229c6e4e331a668ce7b2Nguyen Anh Quynh#define CS_LLVM_SUPPORT_LEB128_H
2026ee41aa673b03494292229c6e4e331a668ce7b2Nguyen Anh Quynh
21e51eeaef39a97779980c0bc55bf379988f331d35tandasat#if !defined(_MSC_VER) || !defined(_KERNEL_MODE)
2226ee41aa673b03494292229c6e4e331a668ce7b2Nguyen Anh Quynh#include <stdint.h>
23e51eeaef39a97779980c0bc55bf379988f331d35tandasat#endif
2426ee41aa673b03494292229c6e4e331a668ce7b2Nguyen Anh Quynh
2526ee41aa673b03494292229c6e4e331a668ce7b2Nguyen Anh Quynh/// Utility function to decode a ULEB128 value.
2626ee41aa673b03494292229c6e4e331a668ce7b2Nguyen Anh Quynhstatic inline uint64_t decodeULEB128(const uint8_t *p, unsigned *n)
2726ee41aa673b03494292229c6e4e331a668ce7b2Nguyen Anh Quynh{
2826ee41aa673b03494292229c6e4e331a668ce7b2Nguyen Anh Quynh	const uint8_t *orig_p = p;
2926ee41aa673b03494292229c6e4e331a668ce7b2Nguyen Anh Quynh	uint64_t Value = 0;
3026ee41aa673b03494292229c6e4e331a668ce7b2Nguyen Anh Quynh	unsigned Shift = 0;
3126ee41aa673b03494292229c6e4e331a668ce7b2Nguyen Anh Quynh	do {
3226ee41aa673b03494292229c6e4e331a668ce7b2Nguyen Anh Quynh		Value += (*p & 0x7f) << Shift;
3326ee41aa673b03494292229c6e4e331a668ce7b2Nguyen Anh Quynh		Shift += 7;
3426ee41aa673b03494292229c6e4e331a668ce7b2Nguyen Anh Quynh	} while (*p++ >= 128);
3526ee41aa673b03494292229c6e4e331a668ce7b2Nguyen Anh Quynh	if (n)
3626ee41aa673b03494292229c6e4e331a668ce7b2Nguyen Anh Quynh		*n = (unsigned)(p - orig_p);
3726ee41aa673b03494292229c6e4e331a668ce7b2Nguyen Anh Quynh	return Value;
3826ee41aa673b03494292229c6e4e331a668ce7b2Nguyen Anh Quynh}
3926ee41aa673b03494292229c6e4e331a668ce7b2Nguyen Anh Quynh
4026ee41aa673b03494292229c6e4e331a668ce7b2Nguyen Anh Quynh#endif  // LLVM_SYSTEM_LEB128_H
41