diff options
author | Ian Lance Taylor <iant@google.com> | 2007-12-15 01:01:48 +0000 |
---|---|---|
committer | Ian Lance Taylor <iant@google.com> | 2007-12-15 01:01:48 +0000 |
commit | 281b8327ae1f49929a1f7a3c0bba5dec54eeeec2 (patch) | |
tree | c3b15f664f788fc916ac7101969efce2f896ba66 /gold/merge.cc | |
parent | 46da5588d0782c0ed48397465310c1153b33fc18 (diff) | |
download | binutils-gdb-281b8327ae1f49929a1f7a3c0bba5dec54eeeec2.tar.gz |
Minor speedup to Output_merge_string::do_add_input_section.
Diffstat (limited to 'gold/merge.cc')
-rw-r--r-- | gold/merge.cc | 15 |
1 files changed, 7 insertions, 8 deletions
diff --git a/gold/merge.cc b/gold/merge.cc index 98ea89e1340..3eb7c3ea216 100644 --- a/gold/merge.cc +++ b/gold/merge.cc @@ -466,6 +466,7 @@ Output_merge_string<Char_type>::do_add_input_section(Relobj* object, const unsigned char* pdata = object->section_contents(shndx, &len, false); const Char_type* p = reinterpret_cast<const Char_type*>(pdata); + const Char_type* pend = p + len; if (len % sizeof(Char_type) != 0) { @@ -478,12 +479,10 @@ Output_merge_string<Char_type>::do_add_input_section(Relobj* object, off_t i = 0; while (i < len) { - off_t plen = 0; - for (const Char_type* pl = p; *pl != 0; ++pl) + const Char_type* pl; + for (pl = p; *pl != 0; ++pl) { - // The length PLEN is in characters, not bytes. - ++plen; - if (i + plen * static_cast<off_t>(sizeof(Char_type)) >= len) + if (pl >= pend) { object->error(_("entry in mergeable string section " "not null terminated")); @@ -491,13 +490,13 @@ Output_merge_string<Char_type>::do_add_input_section(Relobj* object, } } - const Char_type* str = this->stringpool_.add(p, true, NULL); + const Char_type* str = this->stringpool_.add_prefix(p, pl - p, NULL); - off_t bytelen_with_null = (plen + 1) * sizeof(Char_type); + size_t bytelen_with_null = ((pl - p) + 1) * sizeof(Char_type); this->merged_strings_.push_back(Merged_string(object, shndx, i, str, bytelen_with_null)); - p += plen + 1; + p = pl + 1; i += bytelen_with_null; } |