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