summaryrefslogtreecommitdiff
path: root/gold/int_encoding.h
diff options
context:
space:
mode:
authorDoug Kwan <dougkwan@google.com>2009-12-09 03:02:28 +0000
committerDoug Kwan <dougkwan@google.com>2009-12-09 03:02:28 +0000
commit4f7872716e8b73149e9024e1b95db6c3cfa66bd1 (patch)
treec33f338158eadac574de9434ef24c217bfb2cb08 /gold/int_encoding.h
parent829da89821d7f0b7663b8314128fa06878d228e0 (diff)
2009-12-08 Doug Kwan <dougkwan@google.com>
* Makefile.am (CCFILES): Add attributes.cc and int_encoding.cc. (HFILES): Add attributes.h and int_encoding.h. * Makefile.in: Regenerate. * dwarf_reader.cc (read_unsigned_LEB_128, read_signed_LEB_128): Move function definitions to int_encoding.cc * dwarf_reader.h (read_unsigned_LEB_128, read_signed_LEB_128): Move prototypes to int_encoding.h * reduced_debug_output.cc (int_encoding.h): New include. (write_unsigned_LEB_128, get_length_as_unsigned_LEB_128): Move function definitions to int_encoding.cc (insert_into_vector, read_from_pointer): Move template definitions to int_encoding.h * attributes.cc: New file. * attributes.h: New file. * int_encoding.cc: New file. * int_encoding.h: New file.
Diffstat (limited to 'gold/int_encoding.h')
-rw-r--r--gold/int_encoding.h112
1 files changed, 112 insertions, 0 deletions
diff --git a/gold/int_encoding.h b/gold/int_encoding.h
new file mode 100644
index 0000000000..b60e969f8d
--- /dev/null
+++ b/gold/int_encoding.h
@@ -0,0 +1,112 @@
+// int_encoding.h -- variable length and unaligned integers -*- C++ -*-
+
+// Copyright 2009 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>.
+
+// This file is part of gold.
+
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+// MA 02110-1301, USA.
+
+#ifndef GOLD_INT_ENCODING_H
+#define GOLD_INT_ENCODING_H
+
+#include <vector>
+#include "elfcpp.h"
+#include "target.h"
+#include "parameters.h"
+
+namespace gold
+{
+
+//
+// LEB 128 encoding support.
+//
+
+// Read a ULEB 128 encoded integer from BUFFER. Return the length of the
+// encoded integer at the location PLEN.
+
+uint64_t
+read_unsigned_LEB_128(const unsigned char* buffer, size_t* plen);
+
+// Read an SLEB 128 encoded integer from BUFFER. Return the length of the
+// encoded integer at the location PLEN.
+
+int64_t
+read_signed_LEB_128(const unsigned char* buffer, size_t* plen);
+
+// Write a ULEB 128 encoded VALUE to BUFFER.
+
+void
+write_unsigned_LEB_128(std::vector<unsigned char>* buffer, uint64_t value);
+
+// Return the ULEB 128 encoded size of VALUE.
+
+size_t
+get_length_as_unsigned_LEB_128(uint64_t value);
+
+//
+// Unaligned integer encoding support.
+//
+
+// Insert VALSIZE-bit integer VALUE into DESTINATION.
+
+template <int valsize>
+void insert_into_vector(std::vector<unsigned char>* destination,
+ typename elfcpp::Valtype_base<valsize>::Valtype value)
+{
+ unsigned char buffer[valsize / 8];
+ if (parameters->target().is_big_endian())
+ elfcpp::Swap_unaligned<valsize, true>::writeval(buffer, value);
+ else
+ elfcpp::Swap_unaligned<valsize, false>::writeval(buffer, value);
+ destination->insert(destination->end(), buffer, buffer + valsize / 8);
+}
+
+// Read a possibly unaligned integer of SIZE. Update SOURCE after read.
+
+template <int valsize>
+typename elfcpp::Valtype_base<valsize>::Valtype
+read_from_pointer(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);
+ *source += valsize / 8;
+ return return_value;
+}
+
+// Same as the above except for use with const unsigned char data.
+
+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);
+ *source += valsize / 8;
+ return return_value;
+}
+
+} // End namespace gold.
+
+#endif // !defined(GOLD_INT_ENCODING_H)