Move `compute_probe_arg' and `compile_probe_arg' to probe.c
[deliverable/binutils-gdb.git] / gold / int_encoding.h
index b60e969f8d59243154e35c3fadcd786f5b12892d..07c5f45f572bb48be7d4a4a1750dca4cbb6541a5 100644 (file)
@@ -1,6 +1,6 @@
 // int_encoding.h -- variable length and unaligned integers -*- C++ -*-
 
-// Copyright 2009 Free Software Foundation, Inc.
+// Copyright (C) 2009-2015 Free Software Foundation, Inc.
 // Written by Doug Kwan <dougkwan@google.com> by refactoring scattered
 // contents from other files in gold.  Original code written by Ian
 // Lance Taylor <iant@google.com> and Caleb Howe  <cshowe@google.com>.
@@ -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.
 
@@ -77,6 +109,20 @@ void insert_into_vector(std::vector<unsigned char>* destination,
   destination->insert(destination->end(), buffer, buffer + valsize / 8);
 }
 
+// Read a possibly unaligned integer of SIZE from SOURCE.
+
+template <int valsize>
+typename elfcpp::Valtype_base<valsize>::Valtype
+read_from_pointer(const unsigned char* source)
+{
+  typename elfcpp::Valtype_base<valsize>::Valtype return_value;
+  if (parameters->target().is_big_endian())
+    return_value = elfcpp::Swap_unaligned<valsize, true>::readval(source);
+  else
+    return_value = elfcpp::Swap_unaligned<valsize, false>::readval(source);
+  return return_value;
+}
+
 // Read a possibly unaligned integer of SIZE.  Update SOURCE after read.
 
 template <int valsize>
This page took 0.025107 seconds and 4 git commands to generate.