// reduced_debug_output.cc -- output reduced debugging information to save space
-// Copyright 2008 Free Software Foundation, Inc.
+// Copyright 2008, 2010 Free Software Foundation, Inc.
// This file is part of gold.
#include "dwarf.h"
#include "dwarf_reader.h"
#include "reduced_debug_output.h"
+#include "int_encoding.h"
#include <vector>
namespace gold
{
-void
-write_unsigned_LEB_128(std::vector<unsigned char>* buffer, uint64_t value)
-{
- do
- {
- unsigned char current_byte = value & 0x7f;
- value >>= 7;
- if (value != 0)
- {
- current_byte |= 0x80;
- }
- buffer->push_back(current_byte);
- }
- while (value != 0);
-}
-
-size_t
-get_length_as_unsigned_LEB_128(uint64_t value)
-{
- size_t length = 0;
- do
- {
- unsigned char current_byte = value & 0x7f;
- value >>= 7;
- if (value != 0)
- {
- current_byte |= 0x80;
- }
- length++;
- }
- while (value != 0);
- return length;
-}
-
-template <int valsize>
-void Insert_into_vector(std::vector<unsigned char>* destination,
- typename elfcpp::Valtype_base<valsize>::Valtype value)
-{
- union
- {
- unsigned char buffer[valsize / 8];
- long long align;
- } u;
- if (parameters->target().is_big_endian())
- elfcpp::Swap<valsize, true>::writeval(u.buffer, value);
- else
- elfcpp::Swap<valsize, false>::writeval(u.buffer, value);
- destination->insert(destination->end(), u.buffer, u.buffer + valsize / 8);
-}
-
-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;
-}
-
// Given a pointer to the beginning of a die and the beginning of the associated
// abbreviation fills in die_end with the end of the information entry. If
// successful returns true. Get_die_end also takes a pointer to the end of the
abbrev_data += LEB_size;
// Together with the abbreviation number these fields make up
- // the header for each abbreviation
+ // the header for each abbreviation.
uint64_t abbrev_type = read_unsigned_LEB_128(abbrev_data, &LEB_size);
abbrev_data += LEB_size;
// This would ordinarily be the has_children field of the
- // abbreviation. But it's going to be false after reducting the
- // information, so there's no point in storing it
+ // abbreviation. But it's going to be false after reducing the
+ // information, so there's no point in storing it.
abbrev_data++;
- // Read to the end of the current abbreviation
+ // Read to the end of the current abbreviation.
// This is indicated by two zero unsigned LEBs in a row. We don't
// need to parse the data yet, so we just scan through the data
// looking for two consecutive 0 bytes indicating the end of the
- // abbreviation
+ // abbreviation.
unsigned char* current_abbrev;
for (current_abbrev = abbrev_data;
current_abbrev[0] || current_abbrev[1];
return;
}
- Insert_into_vector<32>(&this->data_, 0xFFFFFFFF);
- Insert_into_vector<32>(&this->data_, 0);
- Insert_into_vector<64>(
+ insert_into_vector<32>(&this->data_, 0xFFFFFFFF);
+ insert_into_vector<32>(&this->data_, 0);
+ insert_into_vector<64>(
&this->data_,
(11 + get_length_as_unsigned_LEB_128(abbreviation_number)
+ die_end - debug_info));
- Insert_into_vector<16>(&this->data_, version);
- Insert_into_vector<64>(&this->data_, 0);
- Insert_into_vector<8>(&this->data_, address_size);
+ insert_into_vector<16>(&this->data_, version);
+ insert_into_vector<64>(&this->data_, 0);
+ insert_into_vector<8>(&this->data_, address_size);
write_unsigned_LEB_128(&this->data_, abbreviation_number);
this->data_.insert(this->data_.end(), debug_info, die_end);
}
return;
}
- Insert_into_vector<32>(
+ insert_into_vector<32>(
&this->data_,
(7 + get_length_as_unsigned_LEB_128(abbreviation_number)
+ die_end - debug_info));
- Insert_into_vector<16>(&this->data_, version);
- Insert_into_vector<32>(&this->data_, 0);
- Insert_into_vector<8>(&this->data_, address_size);
+ insert_into_vector<16>(&this->data_, version);
+ insert_into_vector<32>(&this->data_, 0);
+ insert_into_vector<8>(&this->data_, address_size);
write_unsigned_LEB_128(&this->data_, abbreviation_number);
this->data_.insert(this->data_.end(), debug_info, die_end);
}