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