summaryrefslogtreecommitdiff
path: root/gold/merge.cc
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@google.com>2007-12-15 01:01:48 +0000
committerIan Lance Taylor <iant@google.com>2007-12-15 01:01:48 +0000
commit281b8327ae1f49929a1f7a3c0bba5dec54eeeec2 (patch)
treec3b15f664f788fc916ac7101969efce2f896ba66 /gold/merge.cc
parent46da5588d0782c0ed48397465310c1153b33fc18 (diff)
downloadbinutils-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.cc15
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;
}