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// LEB128 encoder and decoder for packed relative relocations. 6// 7// Run-length encoded relative relocations consist of a large number 8// of pairs of relatively small positive integer values. Encoding these as 9// LEB128 saves space. 10// 11// For more on LEB128 see http://en.wikipedia.org/wiki/LEB128. 12 13#ifndef TOOLS_RELOCATION_PACKER_SRC_LEB128_H_ 14#define TOOLS_RELOCATION_PACKER_SRC_LEB128_H_ 15 16#include <stdint.h> 17#include <vector> 18 19#include "elf_traits.h" 20 21namespace relocation_packer { 22 23// Encode packed words as a LEB128 byte stream. 24class Leb128Encoder { 25 public: 26 // Explicit (but empty) constructor and destructor, for chromium-style. 27 Leb128Encoder(); 28 ~Leb128Encoder(); 29 30 // Add a value to the encoding stream. 31 // |value| is the unsigned int to add. 32 void Enqueue(ELF::Xword value); 33 34 // Add a vector of values to the encoding stream. 35 // |values| is the vector of unsigned ints to add. 36 void EnqueueAll(const std::vector<ELF::Xword>& values); 37 38 // Retrieve the encoded representation of the values. 39 // |encoding| is the returned vector of encoded data. 40 void GetEncoding(std::vector<uint8_t>* encoding) { *encoding = encoding_; } 41 42 private: 43 // Growable vector holding the encoded LEB128 stream. 44 std::vector<uint8_t> encoding_; 45}; 46 47// Decode a LEB128 byte stream to produce packed words. 48class Leb128Decoder { 49 public: 50 // Create a new decoder for the given encoded stream. 51 // |encoding| is the vector of encoded data. 52 explicit Leb128Decoder(const std::vector<uint8_t>& encoding); 53 54 // Explicit (but empty) destructor, for chromium-style. 55 ~Leb128Decoder(); 56 57 // Retrieve the next value from the encoded stream. 58 ELF::Xword Dequeue(); 59 60 // Retrieve all remaining values from the encoded stream. 61 // |values| is the vector of decoded data. 62 void DequeueAll(std::vector<ELF::Xword>* values); 63 64 private: 65 // Encoded LEB128 stream. 66 std::vector<uint8_t> encoding_; 67 68 // Cursor indicating the current stream retrieval point. 69 size_t cursor_; 70}; 71 72} // namespace relocation_packer 73 74#endif // TOOLS_RELOCATION_PACKER_SRC_LEB128_H_ 75