2010-04-08 Doug Kwan <dougkwan@google.com>

* merge.cc (Output_merge_data::set_final_data_size): Handle empty
	Output_merge_data.
	* output.cc (Output_section::add_merge_input_section): Simplify
	code and return status of Output_merge_base::add_input_section.
	Update merge section map only if Output_merge_base::add_input_section
	returns true.
This commit is contained in:
Doug Kwan 2010-04-09 00:04:30 +00:00
parent 1c1955e565
commit 6bf924b0ab
3 changed files with 50 additions and 41 deletions

View File

@ -1,3 +1,12 @@
2010-04-08 Doug Kwan <dougkwan@google.com>
* merge.cc (Output_merge_data::set_final_data_size): Handle empty
Output_merge_data.
* output.cc (Output_section::add_merge_input_section): Simplify
code and return status of Output_merge_base::add_input_section.
Update merge section map only if Output_merge_base::add_input_section
returns true.
2010-04-07 Doug Kwan <dougkwan@google.com> 2010-04-07 Doug Kwan <dougkwan@google.com>
* arm.cc (Arm_relobj::scan_section_for_cortex_a8_erratum): Warn * arm.cc (Arm_relobj::scan_section_for_cortex_a8_erratum): Warn

View File

@ -425,7 +425,10 @@ Output_merge_data::set_final_data_size()
{ {
// Release the memory we don't need. // Release the memory we don't need.
this->p_ = static_cast<unsigned char*>(realloc(this->p_, this->len_)); this->p_ = static_cast<unsigned char*>(realloc(this->p_, this->len_));
gold_assert(this->p_ != NULL); // An Output_merge_data object may be empty and realloc is allowed
// to return a NULL pointer in this case. An Output_merge_data is empty
// if all its input sections have sizes that are not multiples of entsize.
gold_assert(this->p_ != NULL || this->len_ == 0);
this->set_data_size(this->len_); this->set_data_size(this->len_);
} }

View File

@ -2154,58 +2154,55 @@ Output_section::add_merge_input_section(Relobj* object, unsigned int shndx,
gold_assert(this->checkpoint_ == NULL); gold_assert(this->checkpoint_ == NULL);
// Look up merge sections by required properties. // Look up merge sections by required properties.
Output_merge_base* pomb;
Merge_section_properties msp(is_string, entsize, addralign); Merge_section_properties msp(is_string, entsize, addralign);
Merge_section_by_properties_map::const_iterator p = Merge_section_by_properties_map::const_iterator p =
this->merge_section_by_properties_map_.find(msp); this->merge_section_by_properties_map_.find(msp);
if (p != this->merge_section_by_properties_map_.end()) if (p != this->merge_section_by_properties_map_.end())
{ {
Output_merge_base* merge_section = p->second; pomb = p->second;
merge_section->add_input_section(object, shndx); gold_assert(pomb->is_string() == is_string
gold_assert(merge_section->is_string() == is_string && pomb->entsize() == entsize
&& merge_section->entsize() == entsize && pomb->addralign() == addralign);
&& merge_section->addralign() == addralign);
// Link input section to found merge section.
Const_section_id csid(object, shndx);
this->merge_section_map_[csid] = merge_section;
return true;
} }
// We handle the actual constant merging in Output_merge_data or
// Output_merge_string_data.
Output_merge_base* pomb;
if (!is_string)
pomb = new Output_merge_data(entsize, addralign);
else else
{ {
switch (entsize) // Create a new Output_merge_data or Output_merge_string_data.
if (!is_string)
pomb = new Output_merge_data(entsize, addralign);
else
{ {
case 1: switch (entsize)
pomb = new Output_merge_string<char>(addralign); {
break; case 1:
case 2: pomb = new Output_merge_string<char>(addralign);
pomb = new Output_merge_string<uint16_t>(addralign); break;
break; case 2:
case 4: pomb = new Output_merge_string<uint16_t>(addralign);
pomb = new Output_merge_string<uint32_t>(addralign); break;
break; case 4:
default: pomb = new Output_merge_string<uint32_t>(addralign);
return false; break;
default:
return false;
}
} }
// Add new merge section to this output section and link merge
// section properties to new merge section in map.
this->add_output_merge_section(pomb, is_string, entsize);
this->merge_section_by_properties_map_[msp] = pomb;
} }
// Add new merge section to this output section and link merge section if (pomb->add_input_section(object, shndx))
// properties to new merge section in map. {
this->add_output_merge_section(pomb, is_string, entsize); // Add input section to new merge section and link input section to new
this->merge_section_by_properties_map_[msp] = pomb; // merge section in map.
Const_section_id csid(object, shndx);
// Add input section to new merge section and link input section to new this->merge_section_map_[csid] = pomb;
// merge section in map. return true;
pomb->add_input_section(object, shndx); }
Const_section_id csid(object, shndx); else
this->merge_section_map_[csid] = pomb; return false;
return true;
} }
// Build a relaxation map to speed up relaxation of existing input sections. // Build a relaxation map to speed up relaxation of existing input sections.