Home | History | Annotate | Download | only in src
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 // SLEB128 encoder and decoder for packed relative relocations.
      6 //
      7 // Packed relocations consist of a large number of relatively small
      8 // integer values.  Encoding these as LEB128 saves space.
      9 //
     10 // For more on LEB128 see http://en.wikipedia.org/wiki/LEB128.
     11 
     12 #ifndef TOOLS_RELOCATION_PACKER_SRC_SLEB128_H_
     13 #define TOOLS_RELOCATION_PACKER_SRC_SLEB128_H_
     14 
     15 #include <stdint.h>
     16 #include <unistd.h>
     17 #include <vector>
     18 
     19 #include "elf_traits.h"
     20 
     21 namespace relocation_packer {
     22 
     23 // Encode packed words as a signed LEB128 byte stream.
     24 template<typename int_t>
     25 class Sleb128Encoder {
     26  public:
     27   // Explicit (but empty) constructor and destructor, for chromium-style.
     28   Sleb128Encoder();
     29   ~Sleb128Encoder();
     30 
     31   // Add a value to the encoding stream.
     32   // |value| is the signed int to add.
     33   void Enqueue(int_t value);
     34 
     35   // Add a vector of values to the encoding stream.
     36   // |values| is the vector of signed ints to add.
     37   void EnqueueAll(const std::vector<int_t>& values);
     38 
     39   // Retrieve the encoded representation of the values.
     40   // |encoding| is the returned vector of encoded data.
     41   void GetEncoding(std::vector<uint8_t>* encoding) { *encoding = encoding_; }
     42 
     43  private:
     44   // Growable vector holding the encoded LEB128 stream.
     45   std::vector<uint8_t> encoding_;
     46 };
     47 
     48 // Decode a LEB128 byte stream to produce packed words.
     49 template <typename int_t>
     50 class Sleb128Decoder {
     51  public:
     52   // Create a new decoder for the given encoded stream.
     53   // |encoding| is the vector of encoded data.
     54   explicit Sleb128Decoder(const std::vector<uint8_t>& encoding, size_t start_with);
     55 
     56   // Explicit (but empty) destructor, for chromium-style.
     57   ~Sleb128Decoder();
     58 
     59   // Retrieve the next value from the encoded stream.
     60   int_t Dequeue();
     61 
     62   // Retrieve all remaining values from the encoded stream.
     63   // |values| is the vector of decoded data.
     64   void DequeueAll(std::vector<int_t>* values);
     65 
     66  private:
     67   // Encoded LEB128 stream.
     68   std::vector<uint8_t> encoding_;
     69 
     70   // Cursor indicating the current stream retrieval point.
     71   size_t cursor_;
     72 };
     73 
     74 }  // namespace relocation_packer
     75 
     76 #endif  // TOOLS_RELOCATION_PACKER_SRC_SLEB128_H_
     77