1 //===- LEB128.cpp - LEB128 utility functions implementation -----*- 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 implements some utility functions for encoding SLEB128 and
11 // ULEB128 values.
12 //
13 //===----------------------------------------------------------------------===//
14 
15 #include "llvm/Support/LEB128.h"
16 
17 namespace llvm {
18 
19 /// Utility function to get the size of the ULEB128-encoded value.
getULEB128Size(uint64_t Value)20 unsigned getULEB128Size(uint64_t Value) {
21   unsigned Size = 0;
22   do {
23     Value >>= 7;
24     Size += sizeof(int8_t);
25   } while (Value);
26   return Size;
27 }
28 
29 /// Utility function to get the size of the SLEB128-encoded value.
getSLEB128Size(int64_t Value)30 unsigned getSLEB128Size(int64_t Value) {
31   unsigned Size = 0;
32   int Sign = Value >> (8 * sizeof(Value) - 1);
33   bool IsMore;
34 
35   do {
36     unsigned Byte = Value & 0x7f;
37     Value >>= 7;
38     IsMore = Value != Sign || ((Byte ^ Sign) & 0x40) != 0;
39     Size += sizeof(int8_t);
40   } while (IsMore);
41   return Size;
42 }
43 
44 }  // namespace llvm
45