From e31908b642bf3602c06fe64ab574a865307e45b0 Mon Sep 17 00:00:00 2001 From: Cary Coutant Date: Mon, 29 Apr 2013 17:15:09 +0000 Subject: 2013-04-29 Alexander Ivchenko gold/ * output.cc (Output_section::add_merge_input_section): Allow to merge sections if the alignment is more than character size. * merge.h (Output_merge_string::Output_merge_string): Remove assert. * merge.cc (Output_merge_string::do_add_input_section): Count only not-null strings. Check the alignment of strings. * stringpool.h (Stringpool_template::Stringpool_template): Add alignment as the argument. (Stringpool_template::addralign_): New class member. * stringpool.cc (Stringpool_template::new_key_offset): Align non-zero length strings according to the addralign_. (Stringpool_template::set_string_offsets): Updating offsets according to the given alignment. * testsuite/Makefile.am (text_section_grouping): Test if string literals are getting merged. * testsuite/Makefile.in: Regenerate. * testsuite/merge_string_literals_1.c: New file. * testsuite/merge_string_literals_2.c: Ditto. * testsuite/merge_string_literals.sh: Ditto. --- gold/stringpool.cc | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) (limited to 'gold/stringpool.cc') diff --git a/gold/stringpool.cc b/gold/stringpool.cc index 434b2d6..072b00d 100644 --- a/gold/stringpool.cc +++ b/gold/stringpool.cc @@ -34,9 +34,10 @@ namespace gold { template -Stringpool_template::Stringpool_template() +Stringpool_template::Stringpool_template(uint64_t addralign) : string_set_(), key_to_offset_(), strings_(), strtab_size_(0), - zero_null_(true), optimize_(false), offset_(sizeof(Stringpool_char)) + zero_null_(true), optimize_(false), offset_(sizeof(Stringpool_char)), + addralign_(addralign) { if (parameters->options_valid() && parameters->options().optimize() >= 2) this->optimize_ = true; @@ -221,8 +222,10 @@ Stringpool_template::new_key_offset(size_t length) offset = 0; else { - offset = this->offset_; - this->offset_ += (length + 1) * sizeof(Stringpool_char); + // Align non-zero length strings. + if (length != 0) + offset = align_address(this->offset_, this->addralign_); + this->offset_ = offset + (length + 1) * sizeof(Stringpool_char); } this->key_to_offset_.push_back(offset); } @@ -421,8 +424,8 @@ Stringpool_template::set_string_offsets() * charsize)); else { - this_offset = offset; - offset += ((*curr)->first.length + 1) * charsize; + this_offset = align_address(offset, this->addralign_); + offset = this_offset + ((*curr)->first.length + 1) * charsize; } this->key_to_offset_[(*curr)->second - 1] = this_offset; last_offset = this_offset; -- cgit v1.1