X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gold%2Freduced_debug_output.cc;h=30c475666f31c5dda2bb1758d41c5fbdcae73564;hb=d043f8c867f85f1c36cc957da8204fe2907b3aea;hp=48346943dd511a9d68f959a87d5730095b9d3a88;hpb=e0ebcf42c2dfc4e486eb73807806ee813a9a0f50;p=deliverable%2Fbinutils-gdb.git diff --git a/gold/reduced_debug_output.cc b/gold/reduced_debug_output.cc index 48346943dd..30c475666f 100644 --- a/gold/reduced_debug_output.cc +++ b/gold/reduced_debug_output.cc @@ -1,6 +1,6 @@ // reduced_debug_output.cc -- output reduced debugging information to save space -// Copyright 2008 Free Software Foundation, Inc. +// Copyright (C) 2008-2019 Free Software Foundation, Inc. // Written by Caleb Howe . // This file is part of gold. @@ -27,71 +27,13 @@ #include "dwarf.h" #include "dwarf_reader.h" #include "reduced_debug_output.h" +#include "int_encoding.h" #include namespace gold { -void -write_unsigned_LEB_128(std::vector* 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 -void insert_into_vector(std::vector* destination, - typename elfcpp::Valtype_base::Valtype value) -{ - unsigned char buffer[valsize / 8]; - if (parameters->target().is_big_endian()) - elfcpp::Swap_unaligned::writeval(buffer, value); - else - elfcpp::Swap_unaligned::writeval(buffer, value); - destination->insert(destination->end(), buffer, buffer + valsize / 8); -} - -template -typename elfcpp::Valtype_base::Valtype -read_from_pointer(unsigned char** source) -{ - typename elfcpp::Valtype_base::Valtype return_value; - if (parameters->target().is_big_endian()) - return_value = elfcpp::Swap_unaligned::readval(*source); - else - return_value = elfcpp::Swap_unaligned::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 @@ -118,9 +60,10 @@ Output_reduced_debug_info_section::get_die_end( return false; switch(form) { - case elfcpp::DW_FORM_null: + case elfcpp::DW_FORM_flag_present: break; case elfcpp::DW_FORM_strp: + case elfcpp::DW_FORM_sec_offset: die += is64 ? 8 : 4; break; case elfcpp::DW_FORM_addr: @@ -146,6 +89,7 @@ Output_reduced_debug_info_section::get_die_end( break; } case elfcpp::DW_FORM_block: + case elfcpp::DW_FORM_exprloc: LEB_decoded = read_unsigned_LEB_128(die, &LEB_size); die += (LEB_decoded + LEB_size); break; @@ -164,6 +108,7 @@ Output_reduced_debug_info_section::get_die_end( break; case elfcpp::DW_FORM_data8: case elfcpp::DW_FORM_ref8: + case elfcpp::DW_FORM_ref_sig8: die += 8; break; case elfcpp::DW_FORM_ref_udata: @@ -171,14 +116,20 @@ Output_reduced_debug_info_section::get_die_end( read_unsigned_LEB_128(die, &LEB_size); die += LEB_size; break; + case elfcpp::DW_FORM_sdata: + read_signed_LEB_128(die, &LEB_size); + die += LEB_size; + break; case elfcpp::DW_FORM_string: { size_t length = strlen(reinterpret_cast(die)); die += length + 1; break; } - case elfcpp::DW_FORM_sdata: case elfcpp::DW_FORM_indirect: + case elfcpp::DW_FORM_GNU_addr_index: + case elfcpp::DW_FORM_GNU_str_index: + default: return false; } } @@ -212,20 +163,20 @@ Output_reduced_debug_abbrev_section::set_final_data_size() 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];