xref: /aosp_15_r20/external/llvm/lib/Support/LEB128.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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 Worker unsigned 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 Worker unsigned 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