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 Andricunsigned 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 Andricunsigned 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