X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gold%2Fint_encoding.h;h=467d2244ce72c33ba1867df8883a49d3cf81f9b5;hb=7903e5309890633911c91539e23a407e1f74b959;hp=b60e969f8d59243154e35c3fadcd786f5b12892d;hpb=4f7872716e8b73149e9024e1b95db6c3cfa66bd1;p=deliverable%2Fbinutils-gdb.git diff --git a/gold/int_encoding.h b/gold/int_encoding.h index b60e969f8d..467d2244ce 100644 --- a/gold/int_encoding.h +++ b/gold/int_encoding.h @@ -38,16 +38,48 @@ namespace gold // // Read a ULEB 128 encoded integer from BUFFER. Return the length of the -// encoded integer at the location PLEN. +// encoded integer at the location PLEN. The common case of a single-byte +// value is handled inline, and multi-byte values are processed by the _x +// routine, where BYTE is the first byte of the value. uint64_t -read_unsigned_LEB_128(const unsigned char* buffer, size_t* plen); +read_unsigned_LEB_128_x(const unsigned char* buffer, size_t* plen, + unsigned char byte); + +inline uint64_t +read_unsigned_LEB_128(const unsigned char* buffer, size_t* plen) +{ + unsigned char byte = *buffer++; + + if ((byte & 0x80) != 0) + return read_unsigned_LEB_128_x(buffer, plen, byte); + + *plen = 1; + return static_cast(byte); +} // Read an SLEB 128 encoded integer from BUFFER. Return the length of the -// encoded integer at the location PLEN. +// encoded integer at the location PLEN. The common case of a single-byte +// value is handled inline, and multi-byte values are processed by the _x +// routine, where BYTE is the first byte of the value. int64_t -read_signed_LEB_128(const unsigned char* buffer, size_t* plen); +read_signed_LEB_128_x(const unsigned char* buffer, size_t* plen, + unsigned char byte); + +inline int64_t +read_signed_LEB_128(const unsigned char* buffer, size_t* plen) +{ + unsigned char byte = *buffer++; + + if ((byte & 0x80) != 0) + return read_signed_LEB_128_x(buffer, plen, byte); + + *plen = 1; + if (byte & 0x40) + return -(static_cast(1) << 7) | static_cast(byte); + return static_cast(byte); +} // Write a ULEB 128 encoded VALUE to BUFFER. @@ -77,6 +109,20 @@ void insert_into_vector(std::vector* destination, destination->insert(destination->end(), buffer, buffer + valsize / 8); } +// Read a possibly unaligned integer of SIZE from SOURCE. + +template +typename elfcpp::Valtype_base::Valtype +read_from_pointer(const unsigned char* source) +{ + typename elfcpp::Valtype_base::Valtype return_value; + if (parameters->target().is_big_endian()) + return_value = elfcpp::Swap_unaligned::readval(source); + else + return_value = elfcpp::Swap_unaligned::readval(source); + return return_value; +} + // Read a possibly unaligned integer of SIZE. Update SOURCE after read. template