diff options
Diffstat (limited to 'gold/powerpc.cc')
-rw-r--r-- | gold/powerpc.cc | 72 |
1 files changed, 70 insertions, 2 deletions
diff --git a/gold/powerpc.cc b/gold/powerpc.cc index 88bc378..aca75f2 100644 --- a/gold/powerpc.cc +++ b/gold/powerpc.cc @@ -1,6 +1,6 @@ // powerpc.cc -- powerpc target support for gold. -// Copyright 2008, 2009 Free Software Foundation, Inc. +// Copyright 2008, 2009, 2010 Free Software Foundation, Inc. // Written by David S. Miller <davem@davemloft.net> // and David Edelsohn <edelsohn@gnu.org> @@ -151,12 +151,33 @@ class Target_powerpc : public Sized_target<size, big_endian> // Return the size of the GOT section. section_size_type - got_size() + got_size() const { gold_assert(this->got_ != NULL); return this->got_->data_size(); } + // Return the number of entries in the GOT. + unsigned int + got_entry_count() const + { + if (this->got_ == NULL) + return 0; + return this->got_size() / (size / 8); + } + + // Return the number of entries in the PLT. + unsigned int + plt_entry_count() const; + + // Return the offset of the first non-reserved PLT entry. + unsigned int + first_plt_entry_offset() const; + + // Return the size of each PLT entry. + unsigned int + plt_entry_size() const; + private: // The class which scans relocations. @@ -321,6 +342,9 @@ class Target_powerpc : public Sized_target<size, big_endian> static Target::Target_info powerpc_info; // The types of GOT entries needed for this platform. + // These values are exposed to the ABI in an incremental link. + // Do not renumber existing values without changing the version + // number of the .gnu_incremental_inputs section. enum Got_type { GOT_TYPE_STANDARD = 0, // GOT entry for a regular symbol @@ -808,6 +832,21 @@ class Output_data_plt_powerpc : public Output_section_data return this->rel_; } + // Return the number of PLT entries. + unsigned int + entry_count() const + { return this->count_; } + + // Return the offset of the first non-reserved PLT entry. + static unsigned int + first_plt_entry_offset() + { return 4 * base_plt_entry_size; } + + // Return the size of a PLT entry. + static unsigned int + get_plt_entry_size() + { return base_plt_entry_size; } + protected: void do_adjust_output_section(Output_section* os); @@ -993,6 +1032,35 @@ Target_powerpc<size, big_endian>::make_plt_entry(Symbol_table* symtab, this->plt_->add_entry(gsym); } +// Return the number of entries in the PLT. + +template<int size, bool big_endian> +unsigned int +Target_powerpc<size, big_endian>::plt_entry_count() const +{ + if (this->plt_ == NULL) + return 0; + return this->plt_->entry_count(); +} + +// Return the offset of the first non-reserved PLT entry. + +template<int size, bool big_endian> +unsigned int +Target_powerpc<size, big_endian>::first_plt_entry_offset() const +{ + return Output_data_plt_powerpc<size, big_endian>::first_plt_entry_offset(); +} + +// Return the size of each PLT entry. + +template<int size, bool big_endian> +unsigned int +Target_powerpc<size, big_endian>::plt_entry_size() const +{ + return Output_data_plt_powerpc<size, big_endian>::get_plt_entry_size(); +} + // Create a GOT entry for the TLS module index. template<int size, bool big_endian> |