diff options
author | Cary Coutant <ccoutant@google.com> | 2011-10-10 17:38:07 +0000 |
---|---|---|
committer | Cary Coutant <ccoutant@google.com> | 2011-10-10 17:38:07 +0000 |
commit | 53bbcc1bb8246868a785a77201a3245b07af87e0 (patch) | |
tree | 36e725a68ab2ae377b1c391a90fd58100ef0954f | |
parent | 397b129b2a1e3d186e62ff37ecdbc329bf6bbc53 (diff) | |
download | binutils-gdb-53bbcc1bb8246868a785a77201a3245b07af87e0.tar.gz |
* gold/incremental.cc (Sized_relobj_incr::Sized_relobj_incr):
Initialize defined_count_.
(Sized_relobj_incr::do_add_symbols): Count defined symbols.
(Sized_relobj_incr::do_get_global_symbol_counts): Rewrite.
(Sized_incr_dynobj::Sized_incr_dynobj): Initialize defined_count_.
(Sized_incr_dynobj::do_add_symbols): Count defined symbols.
(Sized_incr_dynobj::do_get_global_symbol_counts): Rewrite.
* gold/incremental.h (Sized_relobj_incr::defined_count_): New data
member.
(Sized_incr_dynobj::defined_count_): New data member.
* gold/plugin.cc (Sized_pluginobj::do_get_global_symbol_counts):
Return zeroes instead of internal error.
-rw-r--r-- | gold/ChangeLog | 15 | ||||
-rw-r--r-- | gold/incremental.cc | 48 | ||||
-rw-r--r-- | gold/incremental.h | 4 | ||||
-rw-r--r-- | gold/plugin.cc | 12 |
4 files changed, 66 insertions, 13 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog index 318e5156d28..1d128a6e539 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,5 +1,20 @@ 2011-10-10 Cary Coutant <ccoutant@google.com> + * gold/incremental.cc (Sized_relobj_incr::Sized_relobj_incr): + Initialize defined_count_. + (Sized_relobj_incr::do_add_symbols): Count defined symbols. + (Sized_relobj_incr::do_get_global_symbol_counts): Rewrite. + (Sized_incr_dynobj::Sized_incr_dynobj): Initialize defined_count_. + (Sized_incr_dynobj::do_add_symbols): Count defined symbols. + (Sized_incr_dynobj::do_get_global_symbol_counts): Rewrite. + * gold/incremental.h (Sized_relobj_incr::defined_count_): New data + member. + (Sized_incr_dynobj::defined_count_): New data member. + * gold/plugin.cc (Sized_pluginobj::do_get_global_symbol_counts): + Return zeroes instead of internal error. + +2011-10-10 Cary Coutant <ccoutant@google.com> + PR gold/13249 * gold/output.cc (Output_reloc::Output_reloc): Add use_plt_offset flag. (Output_reloc::symbol_value): Return PLT offset if flag is set. diff --git a/gold/incremental.cc b/gold/incremental.cc index cbf6fbaae28..75e44c5707f 100644 --- a/gold/incremental.cc +++ b/gold/incremental.cc @@ -1966,8 +1966,9 @@ Sized_relobj_incr<size, big_endian>::Sized_relobj_incr( input_reader_(ibase->inputs_reader().input_file(input_file_index)), local_symbol_count_(0), output_local_dynsym_count_(0), local_symbol_index_(0), local_symbol_offset_(0), local_dynsym_offset_(0), - symbols_(), incr_reloc_offset_(-1U), incr_reloc_count_(0), - incr_reloc_output_index_(0), incr_relocs_(NULL), local_symbols_() + symbols_(), defined_count_(0), incr_reloc_offset_(-1U), + incr_reloc_count_(0), incr_reloc_output_index_(0), incr_relocs_(NULL), + local_symbols_() { if (this->input_reader_.is_in_system_directory()) this->set_is_in_system_directory(); @@ -2120,6 +2121,9 @@ Sized_relobj_incr<size, big_endian>::do_add_symbols( Symbol* res = symtab->add_from_incrobj(this, name, NULL, &sym); + if (shndx != elfcpp::SHN_UNDEF) + ++this->defined_count_; + // If this is a linker-defined symbol that hasn't yet been defined, // define it now. if (input_shndx == -1U && !res->is_defined()) @@ -2283,9 +2287,21 @@ Sized_relobj_incr<size, big_endian>::do_initialize_xindex() template<int size, bool big_endian> void Sized_relobj_incr<size, big_endian>::do_get_global_symbol_counts( - const Symbol_table*, size_t*, size_t*) const -{ - gold_unreachable(); + const Symbol_table*, + size_t* defined, + size_t* used) const +{ + *defined = this->defined_count_; + size_t count = 0; + for (typename Symbols::const_iterator p = this->symbols_.begin(); + p != this->symbols_.end(); + ++p) + if (*p != NULL + && (*p)->source() == Symbol::FROM_OBJECT + && (*p)->object() == this + && (*p)->is_defined()) + ++count; + *used = count; } // Read the relocs. @@ -2579,7 +2595,7 @@ Sized_incr_dynobj<size, big_endian>::Sized_incr_dynobj( : Dynobj(name, NULL), ibase_(ibase), input_file_index_(input_file_index), input_reader_(ibase->inputs_reader().input_file(input_file_index)), - symbols_() + symbols_(), defined_count_(0) { if (this->input_reader_.is_in_system_directory()) this->set_is_in_system_directory(); @@ -2677,6 +2693,7 @@ Sized_incr_dynobj<size, big_endian>::do_add_symbols( // is meaningless, as long as it's not SHN_UNDEF. shndx = 1; v = gsym.get_st_value(); + ++this->defined_count_; } osym.put_st_name(0); @@ -2845,9 +2862,22 @@ Sized_incr_dynobj<size, big_endian>::do_initialize_xindex() template<int size, bool big_endian> void Sized_incr_dynobj<size, big_endian>::do_get_global_symbol_counts( - const Symbol_table*, size_t*, size_t*) const -{ - gold_unreachable(); + const Symbol_table*, + size_t* defined, + size_t* used) const +{ + *defined = this->defined_count_; + size_t count = 0; + for (typename Symbols::const_iterator p = this->symbols_.begin(); + p != this->symbols_.end(); + ++p) + if (*p != NULL + && (*p)->source() == Symbol::FROM_OBJECT + && (*p)->object() == this + && (*p)->is_defined() + && (*p)->dynsym_index() != -1U) + ++count; + *used = count; } // Allocate an incremental object of the appropriate size and endianness. diff --git a/gold/incremental.h b/gold/incremental.h index e6732df5ac9..56fc52b7533 100644 --- a/gold/incremental.h +++ b/gold/incremental.h @@ -1996,6 +1996,8 @@ class Sized_relobj_incr : public Sized_relobj<size, big_endian> unsigned int local_dynsym_offset_; // The entries in the symbol table for the external symbols. Symbols symbols_; + // Number of symbols defined in object file itself. + size_t defined_count_; // The offset of the first incremental relocation for this object. unsigned int incr_reloc_offset_; // The number of incremental relocations for this object. @@ -2127,6 +2129,8 @@ class Sized_incr_dynobj : public Dynobj Input_entry_reader input_reader_; // The entries in the symbol table for the external symbols. Symbols symbols_; + // Number of symbols defined in object file itself. + size_t defined_count_; }; // Allocate an incremental object of the appropriate size and endianness. diff --git a/gold/plugin.cc b/gold/plugin.cc index b5880a102c1..ebda0aff152 100644 --- a/gold/plugin.cc +++ b/gold/plugin.cc @@ -1244,14 +1244,18 @@ Sized_pluginobj<size, big_endian>::do_initialize_xindex() return NULL; } -// Get symbol counts. Not used for plugin objects. +// Get symbol counts. Don't count plugin objects; the replacement +// files will provide the counts. template<int size, bool big_endian> void -Sized_pluginobj<size, big_endian>::do_get_global_symbol_counts(const Symbol_table*, - size_t*, size_t*) const +Sized_pluginobj<size, big_endian>::do_get_global_symbol_counts( + const Symbol_table*, + size_t* defined, + size_t* used) const { - gold_unreachable(); + *defined = 0; + *used = 0; } // Get symbols. Not used for plugin objects. |