Fix internal error with LTO on ARM.
This prevents the target-specific do_read_symbols methods from being called twice when do_layout_deferred_sections needs to layout an .eh_frame section. gold/ PR gold/15639 * dynobj.h (Sized_dynobj::base_read_symbols): New method. * dynobj.cc (Sized_dynobj::do_read_symbols): Move body to... (Sized_dynobj::base_read_symbols): ...new method. * object.h (Sized_relobj_file::base_read_symbols): New method. * object.cc (Sized_relobj_file::do_read_symbols): Move body to... (Sized_relobj_file::base_read_symbols): ...new method. * arm.cc (Arm_relobj::do_read_symbols): Call base_read_symbols. * mips.cc: (Mips_relobj::do_read_symbols): Likewise. * powerpc.cc (Powerpc_dynobj::do_read_symbols): Likewise.
This commit is contained in:
parent
b484180108
commit
f35c4853cc
@ -1,3 +1,16 @@
|
||||
2014-07-08 Cary Coutant <ccoutant@google.com>
|
||||
|
||||
PR gold/15639
|
||||
* dynobj.h (Sized_dynobj::base_read_symbols): New method.
|
||||
* dynobj.cc (Sized_dynobj::do_read_symbols): Move body to...
|
||||
(Sized_dynobj::base_read_symbols): ...new method.
|
||||
* object.h (Sized_relobj_file::base_read_symbols): New method.
|
||||
* object.cc (Sized_relobj_file::do_read_symbols): Move body to...
|
||||
(Sized_relobj_file::base_read_symbols): ...new method.
|
||||
* arm.cc (Arm_relobj::do_read_symbols): Call base_read_symbols.
|
||||
* mips.cc: (Mips_relobj::do_read_symbols): Likewise.
|
||||
* powerpc.cc (Powerpc_dynobj::do_read_symbols): Likewise.
|
||||
|
||||
2014-07-04 Alan Modra <amodra@gmail.com>
|
||||
|
||||
* po/POTFILES.in: Regenerate.
|
||||
|
@ -6683,7 +6683,7 @@ void
|
||||
Arm_relobj<big_endian>::do_read_symbols(Read_symbols_data* sd)
|
||||
{
|
||||
// Call parent class to read symbol information.
|
||||
Sized_relobj_file<32, big_endian>::do_read_symbols(sd);
|
||||
this->base_read_symbols(sd);
|
||||
|
||||
// If this input file is a binary file, it has no processor
|
||||
// specific flags and attributes section.
|
||||
@ -6974,7 +6974,7 @@ void
|
||||
Arm_dynobj<big_endian>::do_read_symbols(Read_symbols_data* sd)
|
||||
{
|
||||
// Call parent class to read symbol information.
|
||||
Sized_dynobj<32, big_endian>::do_read_symbols(sd);
|
||||
this->base_read_symbols(sd);
|
||||
|
||||
// Read processor-specific flags in ELF file header.
|
||||
const unsigned char* pehdr = this->get_view(elfcpp::file_header_offset,
|
||||
|
@ -335,6 +335,17 @@ Sized_dynobj<size, big_endian>::read_dynamic(const unsigned char* pshdrs,
|
||||
template<int size, bool big_endian>
|
||||
void
|
||||
Sized_dynobj<size, big_endian>::do_read_symbols(Read_symbols_data* sd)
|
||||
{
|
||||
this->base_read_symbols(sd);
|
||||
}
|
||||
|
||||
// Read the symbols and sections from a dynamic object. We read the
|
||||
// dynamic symbols, not the normal symbols. This is common code for
|
||||
// all target-specific overrides of do_read_symbols().
|
||||
|
||||
template<int size, bool big_endian>
|
||||
void
|
||||
Sized_dynobj<size, big_endian>::base_read_symbols(Read_symbols_data* sd)
|
||||
{
|
||||
this->read_section_data(&this->elf_file_, sd);
|
||||
|
||||
|
@ -270,6 +270,12 @@ class Sized_dynobj : public Dynobj
|
||||
do_get_global_symbols() const
|
||||
{ return this->symbols_; }
|
||||
|
||||
protected:
|
||||
// Read the symbols. This is common code for all target-specific
|
||||
// overrides of do_read_symbols().
|
||||
void
|
||||
base_read_symbols(Read_symbols_data*);
|
||||
|
||||
private:
|
||||
// For convenience.
|
||||
typedef Sized_dynobj<size, big_endian> This;
|
||||
|
@ -5857,7 +5857,7 @@ void
|
||||
Mips_relobj<size, big_endian>::do_read_symbols(Read_symbols_data* sd)
|
||||
{
|
||||
// Call parent class to read symbol information.
|
||||
Sized_relobj_file<size, big_endian>::do_read_symbols(sd);
|
||||
this->base_read_symbols(sd);
|
||||
|
||||
// Read processor-specific flags in ELF file header.
|
||||
const unsigned char* pehdr = this->get_view(elfcpp::file_header_offset,
|
||||
|
@ -754,6 +754,16 @@ Sized_relobj_file<size, big_endian>::do_find_special_sections(
|
||||
template<int size, bool big_endian>
|
||||
void
|
||||
Sized_relobj_file<size, big_endian>::do_read_symbols(Read_symbols_data* sd)
|
||||
{
|
||||
this->base_read_symbols(sd);
|
||||
}
|
||||
|
||||
// Read the sections and symbols from an object file. This is common
|
||||
// code for all target-specific overrides of do_read_symbols().
|
||||
|
||||
template<int size, bool big_endian>
|
||||
void
|
||||
Sized_relobj_file<size, big_endian>::base_read_symbols(Read_symbols_data* sd)
|
||||
{
|
||||
this->read_section_data(&this->elf_file_, sd);
|
||||
|
||||
@ -1848,7 +1858,7 @@ Sized_relobj_file<size, big_endian>::do_layout_deferred_sections(Layout* layout)
|
||||
|
||||
// Reading the symbols again here may be slow.
|
||||
Read_symbols_data sd;
|
||||
this->read_symbols(&sd);
|
||||
this->base_read_symbols(&sd);
|
||||
this->layout_eh_frame_section(layout,
|
||||
sd.symbols->data(),
|
||||
sd.symbols_size,
|
||||
|
@ -2214,6 +2214,11 @@ class Sized_relobj_file : public Sized_relobj<size, big_endian>
|
||||
void
|
||||
do_read_symbols(Read_symbols_data*);
|
||||
|
||||
// Read the symbols. This is common code for all target-specific
|
||||
// overrides of do_read_symbols.
|
||||
void
|
||||
base_read_symbols(Read_symbols_data*);
|
||||
|
||||
// Return the value of a local symbol.
|
||||
uint64_t
|
||||
do_local_symbol_value(unsigned int symndx, uint64_t addend) const
|
||||
|
@ -1839,7 +1839,7 @@ template<int size, bool big_endian>
|
||||
void
|
||||
Powerpc_relobj<size, big_endian>::do_read_symbols(Read_symbols_data* sd)
|
||||
{
|
||||
Sized_relobj_file<size, big_endian>::do_read_symbols(sd);
|
||||
this->base_read_symbols(sd);
|
||||
if (size == 64)
|
||||
{
|
||||
const int shdr_size = elfcpp::Elf_sizes<size>::shdr_size;
|
||||
@ -1896,14 +1896,14 @@ Powerpc_dynobj<size, big_endian>::set_abiversion(int ver)
|
||||
}
|
||||
}
|
||||
|
||||
// Call Sized_dynobj::do_read_symbols to read the symbols then
|
||||
// Call Sized_dynobj::base_read_symbols to read the symbols then
|
||||
// read .opd from a dynamic object, filling in opd_ent_ vector,
|
||||
|
||||
template<int size, bool big_endian>
|
||||
void
|
||||
Powerpc_dynobj<size, big_endian>::do_read_symbols(Read_symbols_data* sd)
|
||||
{
|
||||
Sized_dynobj<size, big_endian>::do_read_symbols(sd);
|
||||
this->base_read_symbols(sd);
|
||||
if (size == 64)
|
||||
{
|
||||
const int shdr_size = elfcpp::Elf_sizes<size>::shdr_size;
|
||||
|
Loading…
Reference in New Issue
Block a user