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