X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gold%2Fmerge.cc;h=8c60f50f3665f54b46c635437174ab7aa4bf4e25;hb=121b3efd49f98e4049281b3ba7a258e650e40b38;hp=d3953125005c87693dca3d4819a997b730bea120;hpb=0916f9e741d6fd9dab4b0602bef034d01fa71650;p=deliverable%2Fbinutils-gdb.git diff --git a/gold/merge.cc b/gold/merge.cc index d395312500..8c60f50f36 100644 --- a/gold/merge.cc +++ b/gold/merge.cc @@ -1,6 +1,6 @@ // merge.cc -- handle section merging for gold -// Copyright (C) 2006-2015 Free Software Foundation, Inc. +// Copyright (C) 2006-2020 Free Software Foundation, Inc. // Written by Ian Lance Taylor . // This file is part of gold. @@ -49,13 +49,13 @@ const Object_merge_map::Input_merge_map* Object_merge_map::get_input_merge_map(unsigned int shndx) const { gold_assert(shndx != -1U); - if (shndx == this->first_shnum_) - return &this->first_map_; - if (shndx == this->second_shnum_) - return &this->second_map_; - Section_merge_maps::const_iterator p = this->section_merge_maps_.find(shndx); - if (p != this->section_merge_maps_.end()) - return p->second; + const Section_merge_maps &maps = this->section_merge_maps_; + for (Section_merge_maps::const_iterator i = maps.begin(), e = maps.end(); + i != e; ++i) + { + if (i->first == shndx) + return i->second; + } return NULL; } @@ -73,23 +73,10 @@ Object_merge_map::get_or_make_input_merge_map( return map; } - // We need to create a new entry. - if (this->first_shnum_ == -1U) - { - this->first_shnum_ = shndx; - this->first_map_.output_data = output_data; - return &this->first_map_; - } - if (this->second_shnum_ == -1U) - { - this->second_shnum_ = shndx; - this->second_map_.output_data = output_data; - return &this->second_map_; - } - Input_merge_map* new_map = new Input_merge_map; new_map->output_data = output_data; - this->section_merge_maps_[shndx] = new_map; + Section_merge_maps &maps = this->section_merge_maps_; + maps.push_back(std::make_pair(shndx, new_map)); return new_map; } @@ -453,9 +440,11 @@ Output_merge_string::do_add_input_section(Relobj* object, { section_size_type sec_len; bool is_new; + uint64_t addralign = this->addralign(); const unsigned char* pdata = object->decompressed_section_contents(shndx, &sec_len, - &is_new); + &is_new, + &addralign); const Char_type* p = reinterpret_cast(pdata); const Char_type* pend = p + sec_len / sizeof(Char_type); @@ -507,7 +496,7 @@ Output_merge_string::do_add_input_section(Relobj* object, // aligned, so each string within the section must retain the same // modulo. uintptr_t init_align_modulo = (reinterpret_cast(pdata) - & (this->addralign() - 1)); + & (addralign - 1)); bool has_misaligned_strings = false; while (p < pend) @@ -516,7 +505,7 @@ Output_merge_string::do_add_input_section(Relobj* object, // Within merge input section each string must be aligned. if (len != 0 - && ((reinterpret_cast(p) & (this->addralign() - 1)) + && ((reinterpret_cast(p) & (addralign - 1)) != init_align_modulo)) has_misaligned_strings = true;