xref: /llvm-project/llvm/lib/Support/LEB128.cpp (revision 2946cd701067404b99c39fb29dc9c74bd7193eb3)
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 Chien unsigned 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 Chien unsigned 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