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 R_ARM_RELATIVE relocations. 6 // 7 // Run-length encoded R_ARM_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 <unistd.h> 18 #include <vector> 19 20 namespace relocation_packer { 21 22 // Encode packed words as a LEB128 byte stream. 23 class Leb128Encoder { 24 public: 25 // Add a value to the encoding stream. 26 // |value| is the unsigned int to add. 27 void Enqueue(uint32_t value); 28 29 // Add a vector of values to the encoding stream. 30 // |values| is the vector of unsigned ints to add. 31 void EnqueueAll(const std::vector<uint32_t>& values); 32 33 // Retrieve the encoded representation of the values. 34 // |encoding| is the returned vector of encoded data. GetEncoding(std::vector<uint8_t> * encoding)35 void GetEncoding(std::vector<uint8_t>* encoding) { *encoding = encoding_; } 36 37 private: 38 // Growable vector holding the encoded LEB128 stream. 39 std::vector<uint8_t> encoding_; 40 }; 41 42 // Decode a LEB128 byte stream to produce packed words. 43 class Leb128Decoder { 44 public: 45 // Create a new decoder for the given encoded stream. 46 // |encoding| is the vector of encoded data. Leb128Decoder(const std::vector<uint8_t> & encoding)47 explicit Leb128Decoder(const std::vector<uint8_t>& encoding) 48 : encoding_(encoding), cursor_(0) { } 49 50 // Retrieve the next value from the encoded stream. 51 uint32_t Dequeue(); 52 53 // Retrieve all remaining values from the encoded stream. 54 // |values| is the vector of decoded data. 55 void DequeueAll(std::vector<uint32_t>* values); 56 57 private: 58 // Encoded LEB128 stream. 59 std::vector<uint8_t> encoding_; 60 61 // Cursor indicating the current stream retrieval point. 62 size_t cursor_; 63 }; 64 65 } // namespace relocation_packer 66 67 #endif // TOOLS_RELOCATION_PACKER_SRC_LEB128_H_ 68