X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gold%2Fstringpool.cc;h=02f0da9f3b19b5cbd2668501939573ebdda7bdc0;hb=d8e34cd3ac4303e82ff9de51b7909b6ffde5b9c6;hp=10d6d274e399d82c1cce24914f0bf81d695ae479;hpb=d099120c64430117a80fc95c0bff2da9ff5d8657;p=platform%2Fupstream%2Fbinutils.git diff --git a/gold/stringpool.cc b/gold/stringpool.cc index 10d6d27..02f0da9 100644 --- a/gold/stringpool.cc +++ b/gold/stringpool.cc @@ -1,6 +1,6 @@ // stringpool.cc -- a string pool for gold -// Copyright 2006, 2007, 2008 Free Software Foundation, Inc. +// Copyright (C) 2006-2014 Free Software Foundation, Inc. // Written by Ian Lance Taylor . // This file is part of gold. @@ -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; @@ -72,7 +73,10 @@ Stringpool_template::reserve(unsigned int n) { this->key_to_offset_.reserve(n); -#if defined(HAVE_TR1_UNORDERED_MAP) +#if defined(HAVE_UNORDERED_MAP) + this->string_set_.rehash(this->string_set_.size() + n); + return; +#elif defined(HAVE_TR1_UNORDERED_MAP) // rehash() implementation is broken in gcc 4.0.3's stl //this->string_set_.rehash(this->string_set_.size() + n); //return; @@ -87,28 +91,6 @@ Stringpool_template::reserve(unsigned int n) this->string_set_.swap(new_string_set); } -// Return the length of a string of arbitrary character type. - -template -size_t -Stringpool_template::string_length(const Stringpool_char* p) -{ - size_t len = 0; - for (; *p != 0; ++p) - ++len; - return len; -} - -// Specialize string_length for char. Maybe we could just use -// std::char_traits<>::length? - -template<> -inline size_t -Stringpool_template::string_length(const char* p) -{ - return strlen(p); -} - // Compare two strings of arbitrary character type for equality. template @@ -191,7 +173,7 @@ Stringpool_template::add_string(const Stringpool_char* s, alc = sizeof(Stringdata) + buffer_size; else { - Stringdata *psd = this->strings_.front(); + Stringdata* psd = this->strings_.front(); if (len > psd->alc - psd->len) alc = sizeof(Stringdata) + buffer_size; else @@ -207,7 +189,7 @@ Stringpool_template::add_string(const Stringpool_char* s, } } - Stringdata *psd = reinterpret_cast(new char[alc]); + Stringdata* psd = reinterpret_cast(new char[alc]); psd->alc = alc - sizeof(Stringdata); memcpy(psd->data, s, len - sizeof(Stringpool_char)); memset(psd->data + len - sizeof(Stringpool_char), 0, @@ -244,7 +226,10 @@ Stringpool_template::new_key_offset(size_t length) else { offset = this->offset_; - this->offset_ += (length + 1) * sizeof(Stringpool_char); + // Align non-zero length strings. + if (length != 0) + offset = align_address(offset, this->addralign_); + this->offset_ = offset + (length + 1) * sizeof(Stringpool_char); } this->key_to_offset_.push_back(offset); } @@ -443,8 +428,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; @@ -521,7 +506,7 @@ template void Stringpool_template::print_stats(const char* name) const { -#if defined(HAVE_TR1_UNORDERED_MAP) || defined(HAVE_EXT_HASH_MAP) +#if defined(HAVE_UNORDERED_MAP) || defined(HAVE_TR1_UNORDERED_MAP) || defined(HAVE_EXT_HASH_MAP) fprintf(stderr, _("%s: %s entries: %zu; buckets: %zu\n"), program_name, name, this->string_set_.size(), this->string_set_.bucket_count());