1dbed91ecSLogan Chien //===- LEB128.cpp - LEB128 utility functions implementation -----*- C++ -*-===// 2dbed91ecSLogan Chien // 3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6dbed91ecSLogan Chien // 7dbed91ecSLogan Chien //===----------------------------------------------------------------------===// 8dbed91ecSLogan Chien // 9dbed91ecSLogan Chien // This file implements some utility functions for encoding SLEB128 and 10dbed91ecSLogan Chien // ULEB128 values. 11dbed91ecSLogan Chien // 12dbed91ecSLogan Chien //===----------------------------------------------------------------------===// 13dbed91ecSLogan Chien 14dbed91ecSLogan Chien #include "llvm/Support/LEB128.h" 15dbed91ecSLogan Chien 16dbed91ecSLogan Chien namespace llvm { 17dbed91ecSLogan Chien 18dbed91ecSLogan Chien /// Utility function to get the size of the ULEB128-encoded value. getULEB128Size(uint64_t Value)19dbed91ecSLogan Chienunsigned getULEB128Size(uint64_t Value) { 20dbed91ecSLogan Chien unsigned Size = 0; 21dbed91ecSLogan Chien do { 22dbed91ecSLogan Chien Value >>= 7; 23dbed91ecSLogan Chien Size += sizeof(int8_t); 24dbed91ecSLogan Chien } while (Value); 25dbed91ecSLogan Chien return Size; 26dbed91ecSLogan Chien } 27dbed91ecSLogan Chien 28dbed91ecSLogan Chien /// Utility function to get the size of the SLEB128-encoded value. getSLEB128Size(int64_t Value)29dbed91ecSLogan Chienunsigned getSLEB128Size(int64_t Value) { 30dbed91ecSLogan Chien unsigned Size = 0; 31dbed91ecSLogan Chien int Sign = Value >> (8 * sizeof(Value) - 1); 32dbed91ecSLogan Chien bool IsMore; 33dbed91ecSLogan Chien 34dbed91ecSLogan Chien do { 35dbed91ecSLogan Chien unsigned Byte = Value & 0x7f; 36dbed91ecSLogan Chien Value >>= 7; 37dbed91ecSLogan Chien IsMore = Value != Sign || ((Byte ^ Sign) & 0x40) != 0; 38dbed91ecSLogan Chien Size += sizeof(int8_t); 39dbed91ecSLogan Chien } while (IsMore); 40dbed91ecSLogan Chien return Size; 41dbed91ecSLogan Chien } 42dbed91ecSLogan Chien 43dbed91ecSLogan Chien } // namespace llvm 44