1*91bc56edSDimitry Andric //===- LEB128.cpp - LEB128 utility functions implementation -----*- C++ -*-===//
2*91bc56edSDimitry Andric //
3*91bc56edSDimitry Andric //                     The LLVM Compiler Infrastructure
4*91bc56edSDimitry Andric //
5*91bc56edSDimitry Andric // This file is distributed under the University of Illinois Open Source
6*91bc56edSDimitry Andric // License. See LICENSE.TXT for details.
7*91bc56edSDimitry Andric //
8*91bc56edSDimitry Andric //===----------------------------------------------------------------------===//
9*91bc56edSDimitry Andric //
10*91bc56edSDimitry Andric // This file implements some utility functions for encoding SLEB128 and
11*91bc56edSDimitry Andric // ULEB128 values.
12*91bc56edSDimitry Andric //
13*91bc56edSDimitry Andric //===----------------------------------------------------------------------===//
14*91bc56edSDimitry Andric 
15*91bc56edSDimitry Andric #include "llvm/Support/LEB128.h"
16*91bc56edSDimitry Andric 
17*91bc56edSDimitry Andric namespace llvm {
18*91bc56edSDimitry Andric 
19*91bc56edSDimitry Andric /// Utility function to get the size of the ULEB128-encoded value.
getULEB128Size(uint64_t Value)20*91bc56edSDimitry Andric unsigned getULEB128Size(uint64_t Value) {
21*91bc56edSDimitry Andric   unsigned Size = 0;
22*91bc56edSDimitry Andric   do {
23*91bc56edSDimitry Andric     Value >>= 7;
24*91bc56edSDimitry Andric     Size += sizeof(int8_t);
25*91bc56edSDimitry Andric   } while (Value);
26*91bc56edSDimitry Andric   return Size;
27*91bc56edSDimitry Andric }
28*91bc56edSDimitry Andric 
29*91bc56edSDimitry Andric /// Utility function to get the size of the SLEB128-encoded value.
getSLEB128Size(int64_t Value)30*91bc56edSDimitry Andric unsigned getSLEB128Size(int64_t Value) {
31*91bc56edSDimitry Andric   unsigned Size = 0;
32*91bc56edSDimitry Andric   int Sign = Value >> (8 * sizeof(Value) - 1);
33*91bc56edSDimitry Andric   bool IsMore;
34*91bc56edSDimitry Andric 
35*91bc56edSDimitry Andric   do {
36*91bc56edSDimitry Andric     unsigned Byte = Value & 0x7f;
37*91bc56edSDimitry Andric     Value >>= 7;
38*91bc56edSDimitry Andric     IsMore = Value != Sign || ((Byte ^ Sign) & 0x40) != 0;
39*91bc56edSDimitry Andric     Size += sizeof(int8_t);
40*91bc56edSDimitry Andric   } while (IsMore);
41*91bc56edSDimitry Andric   return Size;
42*91bc56edSDimitry Andric }
43*91bc56edSDimitry Andric 
44*91bc56edSDimitry Andric }  // namespace llvm
45