aboutsummaryrefslogtreecommitdiff
path: root/gold/int_encoding.h
diff options
context:
space:
mode:
authorCary Coutant <ccoutant@google.com>2012-01-25 07:34:55 +0000
committerCary Coutant <ccoutant@google.com>2012-01-25 07:34:55 +0000
commitc2c7840a42aaab8354bb1997d141149d30316603 (patch)
treed9314a7c096f70d4c290eb753c80bf372498901d /gold/int_encoding.h
parent21abe33a9bdebefa7f917bcc99e946eb464cc67f (diff)
downloadgdb-c2c7840a42aaab8354bb1997d141149d30316603.zip
gdb-c2c7840a42aaab8354bb1997d141149d30316603.tar.gz
gdb-c2c7840a42aaab8354bb1997d141149d30316603.tar.bz2
* 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.
Diffstat (limited to 'gold/int_encoding.h')
-rw-r--r--gold/int_encoding.h40
1 files changed, 36 insertions, 4 deletions
diff --git a/gold/int_encoding.h b/gold/int_encoding.h
index 6485a93..467d224 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<uint64_t>(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<int64_t>(1) << 7) | static_cast<int64_t>(byte);
+ return static_cast<int64_t>(byte);
+}
// Write a ULEB 128 encoded VALUE to BUFFER.