1 // Copyright 2006 Google Inc. All Rights Reserved. 2 // 3 // Redistribution and use in source and binary forms, with or without 4 // modification, are permitted provided that the following conditions are 5 // met: 6 // 7 // * Redistributions of source code must retain the above copyright 8 // notice, this list of conditions and the following disclaimer. 9 // * Redistributions in binary form must reproduce the above 10 // copyright notice, this list of conditions and the following disclaimer 11 // in the documentation and/or other materials provided with the 12 // distribution. 13 // * Neither the name of Google Inc. nor the names of its 14 // contributors may be used to endorse or promote products derived from 15 // this software without specific prior written permission. 16 // 17 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 29 #ifndef UTIL_DEBUGINFO_BYTEREADER_INL_H__ 30 #define UTIL_DEBUGINFO_BYTEREADER_INL_H__ 31 32 #include "common/dwarf/bytereader.h" 33 34 #include <assert.h> 35 36 namespace dwarf2reader { 37 38 inline uint8 ByteReader::ReadOneByte(const char* buffer) const { 39 return buffer[0]; 40 } 41 42 inline uint16 ByteReader::ReadTwoBytes(const char* signed_buffer) const { 43 const unsigned char *buffer 44 = reinterpret_cast<const unsigned char *>(signed_buffer); 45 const uint16 buffer0 = buffer[0]; 46 const uint16 buffer1 = buffer[1]; 47 if (endian_ == ENDIANNESS_LITTLE) { 48 return buffer0 | buffer1 << 8; 49 } else { 50 return buffer1 | buffer0 << 8; 51 } 52 } 53 54 inline uint64 ByteReader::ReadFourBytes(const char* signed_buffer) const { 55 const unsigned char *buffer 56 = reinterpret_cast<const unsigned char *>(signed_buffer); 57 const uint32 buffer0 = buffer[0]; 58 const uint32 buffer1 = buffer[1]; 59 const uint32 buffer2 = buffer[2]; 60 const uint32 buffer3 = buffer[3]; 61 if (endian_ == ENDIANNESS_LITTLE) { 62 return buffer0 | buffer1 << 8 | buffer2 << 16 | buffer3 << 24; 63 } else { 64 return buffer3 | buffer2 << 8 | buffer1 << 16 | buffer0 << 24; 65 } 66 } 67 68 inline uint64 ByteReader::ReadEightBytes(const char* signed_buffer) const { 69 const unsigned char *buffer 70 = reinterpret_cast<const unsigned char *>(signed_buffer); 71 const uint64 buffer0 = buffer[0]; 72 const uint64 buffer1 = buffer[1]; 73 const uint64 buffer2 = buffer[2]; 74 const uint64 buffer3 = buffer[3]; 75 const uint64 buffer4 = buffer[4]; 76 const uint64 buffer5 = buffer[5]; 77 const uint64 buffer6 = buffer[6]; 78 const uint64 buffer7 = buffer[7]; 79 if (endian_ == ENDIANNESS_LITTLE) { 80 return buffer0 | buffer1 << 8 | buffer2 << 16 | buffer3 << 24 | 81 buffer4 << 32 | buffer5 << 40 | buffer6 << 48 | buffer7 << 56; 82 } else { 83 return buffer7 | buffer6 << 8 | buffer5 << 16 | buffer4 << 24 | 84 buffer3 << 32 | buffer2 << 40 | buffer1 << 48 | buffer0 << 56; 85 } 86 } 87 88 // Read an unsigned LEB128 number. Each byte contains 7 bits of 89 // information, plus one bit saying whether the number continues or 90 // not. 91 92 inline uint64 ByteReader::ReadUnsignedLEB128(const char* buffer, 93 size_t* len) const { 94 uint64 result = 0; 95 size_t num_read = 0; 96 unsigned int shift = 0; 97 unsigned char byte; 98 99 do { 100 byte = *buffer++; 101 num_read++; 102 103 result |= (static_cast<uint64>(byte & 0x7f)) << shift; 104 105 shift += 7; 106 107 } while (byte & 0x80); 108 109 *len = num_read; 110 111 return result; 112 } 113 114 // Read a signed LEB128 number. These are like regular LEB128 115 // numbers, except the last byte may have a sign bit set. 116 117 inline int64 ByteReader::ReadSignedLEB128(const char* buffer, 118 size_t* len) const { 119 int64 result = 0; 120 unsigned int shift = 0; 121 size_t num_read = 0; 122 unsigned char byte; 123 124 do { 125 byte = *buffer++; 126 num_read++; 127 result |= (static_cast<uint64>(byte & 0x7f) << shift); 128 shift += 7; 129 } while (byte & 0x80); 130 131 if ((shift < 8 * sizeof (result)) && (byte & 0x40)) 132 result |= -((static_cast<int64>(1)) << shift); 133 *len = num_read; 134 return result; 135 } 136 137 inline uint64 ByteReader::ReadOffset(const char* buffer) const { 138 assert(this->offset_reader_); 139 return (this->*offset_reader_)(buffer); 140 } 141 142 inline uint64 ByteReader::ReadAddress(const char* buffer) const { 143 assert(this->address_reader_); 144 return (this->*address_reader_)(buffer); 145 } 146 147 inline void ByteReader::SetCFIDataBase(uint64 section_base, 148 const char *buffer_base) { 149 section_base_ = section_base; 150 buffer_base_ = buffer_base; 151 have_section_base_ = true; 152 } 153 154 inline void ByteReader::SetTextBase(uint64 text_base) { 155 text_base_ = text_base; 156 have_text_base_ = true; 157 } 158 159 inline void ByteReader::SetDataBase(uint64 data_base) { 160 data_base_ = data_base; 161 have_data_base_ = true; 162 } 163 164 inline void ByteReader::SetFunctionBase(uint64 function_base) { 165 function_base_ = function_base; 166 have_function_base_ = true; 167 } 168 169 inline void ByteReader::ClearFunctionBase() { 170 have_function_base_ = false; 171 } 172 173 } // namespace dwarf2reader 174 175 #endif // UTIL_DEBUGINFO_BYTEREADER_INL_H__ 176