118a6956b76a071097fc658c5fe13ef010e31864aDmitriy Ivanov/* 218a6956b76a071097fc658c5fe13ef010e31864aDmitriy Ivanov * Copyright (C) 2015 The Android Open Source Project 3bcc4da9b752f0def46d63ed7b31f3f49cc2435adDimitry Ivanov * All rights reserved. 418a6956b76a071097fc658c5fe13ef010e31864aDmitriy Ivanov * 5bcc4da9b752f0def46d63ed7b31f3f49cc2435adDimitry Ivanov * Redistribution and use in source and binary forms, with or without 6bcc4da9b752f0def46d63ed7b31f3f49cc2435adDimitry Ivanov * modification, are permitted provided that the following conditions 7bcc4da9b752f0def46d63ed7b31f3f49cc2435adDimitry Ivanov * are met: 8bcc4da9b752f0def46d63ed7b31f3f49cc2435adDimitry Ivanov * * Redistributions of source code must retain the above copyright 9bcc4da9b752f0def46d63ed7b31f3f49cc2435adDimitry Ivanov * notice, this list of conditions and the following disclaimer. 10bcc4da9b752f0def46d63ed7b31f3f49cc2435adDimitry Ivanov * * Redistributions in binary form must reproduce the above copyright 11bcc4da9b752f0def46d63ed7b31f3f49cc2435adDimitry Ivanov * notice, this list of conditions and the following disclaimer in 12bcc4da9b752f0def46d63ed7b31f3f49cc2435adDimitry Ivanov * the documentation and/or other materials provided with the 13bcc4da9b752f0def46d63ed7b31f3f49cc2435adDimitry Ivanov * distribution. 1418a6956b76a071097fc658c5fe13ef010e31864aDmitriy Ivanov * 15bcc4da9b752f0def46d63ed7b31f3f49cc2435adDimitry Ivanov * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16bcc4da9b752f0def46d63ed7b31f3f49cc2435adDimitry Ivanov * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17bcc4da9b752f0def46d63ed7b31f3f49cc2435adDimitry Ivanov * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 18bcc4da9b752f0def46d63ed7b31f3f49cc2435adDimitry Ivanov * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 19bcc4da9b752f0def46d63ed7b31f3f49cc2435adDimitry Ivanov * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 20bcc4da9b752f0def46d63ed7b31f3f49cc2435adDimitry Ivanov * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 21bcc4da9b752f0def46d63ed7b31f3f49cc2435adDimitry Ivanov * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 22bcc4da9b752f0def46d63ed7b31f3f49cc2435adDimitry Ivanov * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 23bcc4da9b752f0def46d63ed7b31f3f49cc2435adDimitry Ivanov * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24bcc4da9b752f0def46d63ed7b31f3f49cc2435adDimitry Ivanov * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 25bcc4da9b752f0def46d63ed7b31f3f49cc2435adDimitry Ivanov * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26bcc4da9b752f0def46d63ed7b31f3f49cc2435adDimitry Ivanov * SUCH DAMAGE. 2718a6956b76a071097fc658c5fe13ef010e31864aDmitriy Ivanov */ 2818a6956b76a071097fc658c5fe13ef010e31864aDmitriy Ivanov 29cbc80ba9d839675a0c4891e2ab33f39ba51b04b2Elliott Hughes#pragma once 3018a6956b76a071097fc658c5fe13ef010e31864aDmitriy Ivanov 3118a6956b76a071097fc658c5fe13ef010e31864aDmitriy Ivanov#include <stdint.h> 3218a6956b76a071097fc658c5fe13ef010e31864aDmitriy Ivanov 337a3681e5b6c39bc2b3b62031ca5941dbf7bc4e63Christopher Ferris#include <async_safe/log.h> 347a3681e5b6c39bc2b3b62031ca5941dbf7bc4e63Christopher Ferris 35fa4aeed2c60fb97a06e2550481b9ef4d0e100b7eDimitry Ivanov#include "linker_debug.h" 36fa4aeed2c60fb97a06e2550481b9ef4d0e100b7eDimitry Ivanov 3718a6956b76a071097fc658c5fe13ef010e31864aDmitriy Ivanov// Helper classes for decoding LEB128, used in packed relocation data. 3818a6956b76a071097fc658c5fe13ef010e31864aDmitriy Ivanov// http://en.wikipedia.org/wiki/LEB128 3918a6956b76a071097fc658c5fe13ef010e31864aDmitriy Ivanov 4018a6956b76a071097fc658c5fe13ef010e31864aDmitriy Ivanovclass sleb128_decoder { 4118a6956b76a071097fc658c5fe13ef010e31864aDmitriy Ivanov public: 4218a6956b76a071097fc658c5fe13ef010e31864aDmitriy Ivanov sleb128_decoder(const uint8_t* buffer, size_t count) 4318a6956b76a071097fc658c5fe13ef010e31864aDmitriy Ivanov : current_(buffer), end_(buffer+count) { } 4418a6956b76a071097fc658c5fe13ef010e31864aDmitriy Ivanov 4518a6956b76a071097fc658c5fe13ef010e31864aDmitriy Ivanov size_t pop_front() { 4618a6956b76a071097fc658c5fe13ef010e31864aDmitriy Ivanov size_t value = 0; 4718a6956b76a071097fc658c5fe13ef010e31864aDmitriy Ivanov static const size_t size = CHAR_BIT * sizeof(value); 4818a6956b76a071097fc658c5fe13ef010e31864aDmitriy Ivanov 4918a6956b76a071097fc658c5fe13ef010e31864aDmitriy Ivanov size_t shift = 0; 5018a6956b76a071097fc658c5fe13ef010e31864aDmitriy Ivanov uint8_t byte; 5118a6956b76a071097fc658c5fe13ef010e31864aDmitriy Ivanov 5218a6956b76a071097fc658c5fe13ef010e31864aDmitriy Ivanov do { 5318a6956b76a071097fc658c5fe13ef010e31864aDmitriy Ivanov if (current_ >= end_) { 547a3681e5b6c39bc2b3b62031ca5941dbf7bc4e63Christopher Ferris async_safe_fatal("sleb128_decoder ran out of bounds"); 5518a6956b76a071097fc658c5fe13ef010e31864aDmitriy Ivanov } 5618a6956b76a071097fc658c5fe13ef010e31864aDmitriy Ivanov byte = *current_++; 5718a6956b76a071097fc658c5fe13ef010e31864aDmitriy Ivanov value |= (static_cast<size_t>(byte & 127) << shift); 5818a6956b76a071097fc658c5fe13ef010e31864aDmitriy Ivanov shift += 7; 5918a6956b76a071097fc658c5fe13ef010e31864aDmitriy Ivanov } while (byte & 128); 6018a6956b76a071097fc658c5fe13ef010e31864aDmitriy Ivanov 6118a6956b76a071097fc658c5fe13ef010e31864aDmitriy Ivanov if (shift < size && (byte & 64)) { 6218a6956b76a071097fc658c5fe13ef010e31864aDmitriy Ivanov value |= -(static_cast<size_t>(1) << shift); 6318a6956b76a071097fc658c5fe13ef010e31864aDmitriy Ivanov } 6418a6956b76a071097fc658c5fe13ef010e31864aDmitriy Ivanov 6518a6956b76a071097fc658c5fe13ef010e31864aDmitriy Ivanov return value; 6618a6956b76a071097fc658c5fe13ef010e31864aDmitriy Ivanov } 6718a6956b76a071097fc658c5fe13ef010e31864aDmitriy Ivanov 6818a6956b76a071097fc658c5fe13ef010e31864aDmitriy Ivanov private: 6918a6956b76a071097fc658c5fe13ef010e31864aDmitriy Ivanov const uint8_t* current_; 7018a6956b76a071097fc658c5fe13ef010e31864aDmitriy Ivanov const uint8_t* const end_; 7118a6956b76a071097fc658c5fe13ef010e31864aDmitriy Ivanov}; 72