* int_encoding.cc (read_unsigned_LEB_128): Replaced with inline

definition and ...
	(read_unsigned_LEB_128_x): ... this new function.
	(read_signed_LEB_128): Replaced with inline definition and ...
	(read_signed_LEB_128_x): ... this new function.
	* int_encoding.h  (read_unsigned_LEB_128_x): New function.
	(read_unsigned_LEB_128): Add inline definition.
	(read_signed_LEB_128_x): New function.
	(read_signed_LEB_128): Add inline definition.
	* testsuite/Makefile.am (leb128_unittest): New unit test.
	* testsuite/Makefile.in: Regenerate.
	* testsuite/leb128_unittest.cc: New unit test.
This commit is contained in:
Cary Coutant
2012-01-25 07:34:55 +00:00
parent 21abe33a9b
commit c2c7840a42
6 changed files with 177 additions and 20 deletions

View File

@@ -32,19 +32,20 @@ namespace gold {
// Read an unsigned LEB128 number. Each byte contains 7 bits of
// information, plus one bit saying whether the number continues or
// not.
// not. BYTE contains the first byte of the number, and is guaranteed
// to have the continuation bit set.
uint64_t
read_unsigned_LEB_128(const unsigned char* buffer, size_t* len)
read_unsigned_LEB_128_x(const unsigned char* buffer, size_t* len,
unsigned char byte)
{
uint64_t result = 0;
size_t num_read = 0;
unsigned int shift = 0;
unsigned char byte;
uint64_t result = static_cast<uint64_t>(byte & 0x7f);
size_t num_read = 1;
unsigned int shift = 7;
do
{
if (num_read >= 64 / 7)
if (num_read > 64 / 7 + 1)
{
gold_warning(_("Unusually large LEB128 decoded, "
"debug information may be corrupted"));
@@ -64,18 +65,20 @@ read_unsigned_LEB_128(const unsigned char* buffer, size_t* len)
// Read a signed LEB128 number. These are like regular LEB128
// numbers, except the last byte may have a sign bit set.
// BYTE contains the first byte of the number, and is guaranteed
// to have the continuation bit set.
int64_t
read_signed_LEB_128(const unsigned char* buffer, size_t* len)
read_signed_LEB_128_x(const unsigned char* buffer, size_t* len,
unsigned char byte)
{
int64_t result = 0;
int shift = 0;
size_t num_read = 0;
unsigned char byte;
int64_t result = static_cast<uint64_t>(byte & 0x7f);
int shift = 7;
size_t num_read = 1;
do
{
if (num_read >= 64 / 7)
if (num_read > 64 / 7 + 1)
{
gold_warning(_("Unusually large LEB128 decoded, "
"debug information may be corrupted"));