aboutsummaryrefslogtreecommitdiff
path: root/gold/merge.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gold/merge.cc')
-rw-r--r--gold/merge.cc51
1 files changed, 15 insertions, 36 deletions
diff --git a/gold/merge.cc b/gold/merge.cc
index 093b6fc..dde43e9 100644
--- a/gold/merge.cc
+++ b/gold/merge.cc
@@ -406,27 +406,16 @@ bool
Output_merge_data::do_add_input_section(Relobj* object, unsigned int shndx)
{
section_size_type len;
- section_size_type uncompressed_size = 0;
- unsigned char* uncompressed_data = NULL;
- const unsigned char* p = object->section_contents(shndx, &len, false);
-
- if (object->section_is_compressed(shndx, &uncompressed_size))
- {
- uncompressed_data = new unsigned char[uncompressed_size];
- if (!decompress_input_section(p, len, uncompressed_data,
- uncompressed_size))
- object->error(_("could not decompress section %s"),
- object->section_name(shndx).c_str());
- p = uncompressed_data;
- len = uncompressed_size;
- }
+ bool is_new;
+ const unsigned char* p = object->decompressed_section_contents(shndx, &len,
+ &is_new);
section_size_type entsize = convert_to_section_size_type(this->entsize());
if (len % entsize != 0)
{
- if (uncompressed_data != NULL)
- delete[] uncompressed_data;
+ if (is_new)
+ delete[] p;
return false;
}
@@ -457,8 +446,8 @@ Output_merge_data::do_add_input_section(Relobj* object, unsigned int shndx)
if (this->keeps_input_sections())
record_input_section(object, shndx);
- if (uncompressed_data != NULL)
- delete[] uncompressed_data;
+ if (is_new)
+ delete[] p;
return true;
}
@@ -517,20 +506,10 @@ Output_merge_string<Char_type>::do_add_input_section(Relobj* object,
unsigned int shndx)
{
section_size_type len;
- section_size_type uncompressed_size = 0;
- unsigned char* uncompressed_data = NULL;
- const unsigned char* pdata = object->section_contents(shndx, &len, false);
-
- if (object->section_is_compressed(shndx, &uncompressed_size))
- {
- uncompressed_data = new unsigned char[uncompressed_size];
- if (!decompress_input_section(pdata, len, uncompressed_data,
- uncompressed_size))
- object->error(_("could not decompress section %s"),
- object->section_name(shndx).c_str());
- pdata = uncompressed_data;
- len = uncompressed_size;
- }
+ bool is_new;
+ const unsigned char* pdata = object->decompressed_section_contents(shndx,
+ &len,
+ &is_new);
const Char_type* p = reinterpret_cast<const Char_type*>(pdata);
const Char_type* pend = p + len / sizeof(Char_type);
@@ -540,8 +519,8 @@ Output_merge_string<Char_type>::do_add_input_section(Relobj* object,
{
object->error(_("mergeable string section length not multiple of "
"character size"));
- if (uncompressed_data != NULL)
- delete[] uncompressed_data;
+ if (is_new)
+ delete[] pdata;
return false;
}
@@ -606,8 +585,8 @@ Output_merge_string<Char_type>::do_add_input_section(Relobj* object,
if (this->keeps_input_sections())
record_input_section(object, shndx);
- if (uncompressed_data != NULL)
- delete[] uncompressed_data;
+ if (is_new)
+ delete[] pdata;
return true;
}