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