aboutsummaryrefslogtreecommitdiff
path: root/gold/i386.cc
diff options
context:
space:
mode:
authorCary Coutant <ccoutant@google.com>2011-05-24 21:41:10 +0000
committerCary Coutant <ccoutant@google.com>2011-05-24 21:41:10 +0000
commit6fa2a40bf45fcc738eb580a6b644ac74b42c2d6a (patch)
tree41ae0a8dbe33a58e626c8fbcaa13f0b435b193bf /gold/i386.cc
parent2e21250dbcb81b1909ba3fbda8931a47c7215beb (diff)
downloadfsf-binutils-gdb-6fa2a40bf45fcc738eb580a6b644ac74b42c2d6a.zip
fsf-binutils-gdb-6fa2a40bf45fcc738eb580a6b644ac74b42c2d6a.tar.gz
fsf-binutils-gdb-6fa2a40bf45fcc738eb580a6b644ac74b42c2d6a.tar.bz2
* incremental-dump.cc (dump_incremental_inputs): Print dynamic reloc
info; adjust display of GOT entries. * incremental.cc (Sized_incremental_binary::setup_readers): Allocate vector of input objects; remove file_status_. (Sized_incremental_binary::do_reserve_layout): Remove file_status_. (Sized_incremental_binary::do_process_got_plt): Adjust calls to got_plt reader; call target hooks to reserve GOT entries. (Output_section_incremental_inputs::set_final_data_size): Adjust size of input file info header and GOT info entry. (Output_section_incremental_inputs::write_info_blocks): Write dynamic relocation info. (Got_plt_view_info::got_descriptor): Remove. (Got_plt_view_info::sym_index): New data member. (Got_plt_view_info::input_index): New data member. (Local_got_offset_visitor::visit): Write input file index. (Global_got_offset_visitor::visit): Write 0 for input file index. (Global_symbol_visitor_got_plt::operator()): Replace got_descriptor with sym_index and input_index. (Output_section_incremental_inputs::write_got_plt): Adjust size of incremental info GOT entry; replace got_descriptor with input_index. (Sized_relobj_incr::Sized_relobj_incr): Adjust initializers; record map from input file index to object. (Sized_relobj_incr::do_layout): Replace direct data member reference with accessor function. (Sized_relobj_incr::do_for_all_local_got_entries): Move to base class. * incremental.h (Incremental_input_entry_reader::get_symbol_offset): Adjust size of input file info header. (Incremental_input_entry_reader::get_first_dyn_reloc): New function. (Incremental_input_entry_reader::get_dyn_reloc_count): New function. (Incremental_input_entry_reader::get_input_section): Adjust size of input file info header. (Incremental_got_plt_reader::Incremental_got_plt_reader): Adjust size of incremental info GOT entry. (Incremental_got_plt_reader::get_got_desc): Remove. (Incremental_got_plt_reader::get_got_symndx): New function. (Incremental_got_plt_reader::get_got_input_index): New function. (Sized_incremental_binary::Sized_incremental_binary): Remove file_status_; add input_objects_. (Sized_incremental_binary::~Sized_incremental_binary): Remove. (Sized_incremental_binary::set_file_is_unchanged): Remove. (Sized_incremental_binary::file_is_unchanged): Remove. (Sized_incremental_binary::set_input_object): New function. (Sized_incremental_binary::input_object): New function. (Sized_incremental_binary::file_status_): Remove. (Sized_incremental_binary::input_objects_): New data member. (Sized_relobj_incr): Rename Sized_incr_relobj to this; adjust all references. (Sized_relobj_incr::invalid_address): Move to base class. (Sized_relobj_incr::is_output_section_offset_invalid): Move to base class. (Sized_relobj_incr::do_output_section_offset): Likewise. (Sized_relobj_incr::do_for_all_local_got_entries): Likewise. (Sized_relobj_incr::section_offsets_): Likewise. * object.cc (Sized_relobj::do_for_all_local_got_entries): New function. (Sized_relobj_file::Sized_relobj_file): Remove local_got_offsets_. (Sized_relobj_file::layout_section): Replace refs to section_offsets_ with accessor function. (Sized_relobj_file::do_layout): Likewise. (Sized_relobj_file::do_layout_deferred_sections): Likewise. (Sized_relobj_file::do_for_all_local_got_entries): Move to base class. (Sized_relobj_file::compute_final_local_value): Replace refs to section_offsets_ with accessor function. (Sized_relobj_file::do_finalize_local_symbols): Likewise. * object.h (Relobj::Relobj): Initialize new data members. (Relobj::add_dyn_reloc): New function. (Relobj::first_dyn_reloc): New function. (Relobj::dyn_reloc_count): New function. (Relobj::first_dyn_reloc_): New data member. (Relobj::dyn_reloc_count_): New data member. (Sized_relobj): Rename Sized_relobj_base to this; adjust all references. (Sized_relobj::Address): New typedef. (Sized_relobj::invalid_address): Move here from child class. (Sized_relobj::Sized_relobj): Initialize new data members. (Sized_relobj::sized_relobj): New function. (Sized_relobj::is_output_section_offset_invalid): Move here from child class. (Sized_relobj::get_output_section_offset): Likewise. (Sized_relobj::local_has_got_offset): Likewise. (Sized_relobj::local_got_offset): Likewise. (Sized_relobj::set_local_got_offset): Likewise. (Sized_relobj::do_for_all_local_got_entries): Likewise. (Sized_relobj::clear_got_offsets): New function. (Sized_relobj::section_offsets): Move here from child class. (Sized_relobj::do_output_section_offset): Likewise. (Sized_relobj::do_set_section_offset): Likewise. (Sized_relobj::Local_got_offsets): Likewise. (Sized_relobj::local_got_offsets_): Likewise. (Sized_relobj::section_offsets_): Likewise. (Sized_relobj_file): Rename Sized_relobj to this; adjust all references. (Sized_relobj_file::is_output_section_offset_invalid): Move to base class. (Sized_relobj_file::sized_relobj): New function (Sized_relobj_file::local_has_got_offset): Move to base class. (Sized_relobj_file::local_got_offset): Likewise. (Sized_relobj_file::set_local_got_offset): Likewise. (Sized_relobj_file::get_output_section_offset): Likewise. (Sized_relobj_file::do_for_all_local_got_entries): Likewise. (Sized_relobj_file::do_output_section_offset): Likewise. (Sized_relobj_file::do_set_section_offset): Likewise. (Sized_relobj_file::Local_got_offsets): Likewise. (Sized_relobj_file::local_got_offsets_): Likewise. (Sized_relobj_file::section_offsets_): Likewise. * output.cc (Output_reloc::Output_reloc): Adjust type of relobj (all constructors). (set_needs_dynsym_index): Convert relobj to derived class pointer. (Output_reloc::get_symbol_index): Likewise. (Output_reloc::local_section_offset): Likewise. (Output_reloc::get_address): Likewise. (Output_reloc::symbol_value): Likewise. (Output_data_got::reserve_slot): Move to class definition. (Output_data_got::reserve_local): New function. (Output_data_got::reserve_slot_for_global): Remove. (Output_data_got::reserve_global): New function. * output.h (Output_reloc::Output_reloc): Adjust type of relobj (all constructors, two instantiations). (Output_reloc::get_relobj): New function (two instantiations). (Output_reloc::u1_.relobj, Output_reloc::u2_.relobj): Adjust type. (Output_data_reloc_base::add): Convert relobj to derived class pointer. (Output_data_reloc::add_global): Adjust type of relobj. (Output_data_reloc::add_global_relative): Likewise. (Output_data_reloc::add_symbolless_global_addend): Likewise. (Output_data_reloc::add_local): Likewise. (Output_data_reloc::add_local_relative): Likewise. (Output_data_reloc::add_symbolless_local_addend): Likewise. (Output_data_reloc::add_local_section): Likewise. (Output_data_reloc::add_output_section): Likewise. (Output_data_reloc::add_absolute): Likewise. (Output_data_reloc::add_target_specific): Likewise. (Output_data_got::reserve_slot): Move definition here. (Output_data_got::reserve_local): New function. (Output_data_got::reserve_global): New function. * reloc.cc (Sized_relobj_file::do_read_relocs): Replace refs to section_offsets_ with accessor function. (Sized_relobj_file::write_sections): Likewise. (Sized_relobj_file::do_relocate_sections): Likewise. * target.h (Sized_target::reserve_local_got_entry): New function. (Sized_target::reserve_global_got_entry): New function. * x86_64.cc (Target_x86_64::reserve_local_got_entry): New function. (Target_x86_64::reserve_global_got_entry): New function. (Target_x86_64::init_got_plt_for_update): Create rela_dyn section.
Diffstat (limited to 'gold/i386.cc')
-rw-r--r--gold/i386.cc72
1 files changed, 38 insertions, 34 deletions
diff --git a/gold/i386.cc b/gold/i386.cc
index a137b2e..d60ac22 100644
--- a/gold/i386.cc
+++ b/gold/i386.cc
@@ -60,7 +60,7 @@ class Output_data_plt_i386 : public Output_section_data
// Add an entry to the PLT for a local STT_GNU_IFUNC symbol.
unsigned int
- add_local_ifunc_entry(Sized_relobj<32, false>* relobj,
+ add_local_ifunc_entry(Sized_relobj_file<32, false>* relobj,
unsigned int local_sym_index);
// Return the .rel.plt section data.
@@ -133,7 +133,7 @@ class Output_data_plt_i386 : public Output_section_data
// offset in the GOT.
struct Local_ifunc
{
- Sized_relobj<32, false>* object;
+ Sized_relobj_file<32, false>* object;
unsigned int local_sym_index;
unsigned int got_offset;
};
@@ -184,7 +184,7 @@ class Target_i386 : public Target_freebsd<32, false>
void
gc_process_relocs(Symbol_table* symtab,
Layout* layout,
- Sized_relobj<32, false>* object,
+ Sized_relobj_file<32, false>* object,
unsigned int data_shndx,
unsigned int sh_type,
const unsigned char* prelocs,
@@ -198,7 +198,7 @@ class Target_i386 : public Target_freebsd<32, false>
void
scan_relocs(Symbol_table* symtab,
Layout* layout,
- Sized_relobj<32, false>* object,
+ Sized_relobj_file<32, false>* object,
unsigned int data_shndx,
unsigned int sh_type,
const unsigned char* prelocs,
@@ -234,7 +234,7 @@ class Target_i386 : public Target_freebsd<32, false>
void
scan_relocatable_relocs(Symbol_table* symtab,
Layout* layout,
- Sized_relobj<32, false>* object,
+ Sized_relobj_file<32, false>* object,
unsigned int data_shndx,
unsigned int sh_type,
const unsigned char* prelocs,
@@ -341,7 +341,7 @@ class Target_i386 : public Target_freebsd<32, false>
inline void
local(Symbol_table* symtab, Layout* layout, Target_i386* target,
- Sized_relobj<32, false>* object,
+ Sized_relobj_file<32, false>* object,
unsigned int data_shndx,
Output_section* output_section,
const elfcpp::Rel<32, false>& reloc, unsigned int r_type,
@@ -349,7 +349,7 @@ class Target_i386 : public Target_freebsd<32, false>
inline void
global(Symbol_table* symtab, Layout* layout, Target_i386* target,
- Sized_relobj<32, false>* object,
+ Sized_relobj_file<32, false>* object,
unsigned int data_shndx,
Output_section* output_section,
const elfcpp::Rel<32, false>& reloc, unsigned int r_type,
@@ -358,7 +358,7 @@ class Target_i386 : public Target_freebsd<32, false>
inline bool
local_reloc_may_be_function_pointer(Symbol_table* symtab, Layout* layout,
Target_i386* target,
- Sized_relobj<32, false>* object,
+ Sized_relobj_file<32, false>* object,
unsigned int data_shndx,
Output_section* output_section,
const elfcpp::Rel<32, false>& reloc,
@@ -368,7 +368,7 @@ class Target_i386 : public Target_freebsd<32, false>
inline bool
global_reloc_may_be_function_pointer(Symbol_table* symtab, Layout* layout,
Target_i386* target,
- Sized_relobj<32, false>* object,
+ Sized_relobj_file<32, false>* object,
unsigned int data_shndx,
Output_section* output_section,
const elfcpp::Rel<32, false>& reloc,
@@ -379,13 +379,14 @@ class Target_i386 : public Target_freebsd<32, false>
possible_function_pointer_reloc(unsigned int r_type);
bool
- reloc_needs_plt_for_ifunc(Sized_relobj<32, false>*, unsigned int r_type);
+ reloc_needs_plt_for_ifunc(Sized_relobj_file<32, false>*,
+ unsigned int r_type);
static void
- unsupported_reloc_local(Sized_relobj<32, false>*, unsigned int r_type);
+ unsupported_reloc_local(Sized_relobj_file<32, false>*, unsigned int r_type);
static void
- unsupported_reloc_global(Sized_relobj<32, false>*, unsigned int r_type,
+ unsupported_reloc_global(Sized_relobj_file<32, false>*, unsigned int r_type,
Symbol*);
};
@@ -552,7 +553,7 @@ class Target_i386 : public Target_freebsd<32, false>
// Create a PLT entry for a local STT_GNU_IFUNC symbol.
void
make_local_ifunc_plt_entry(Symbol_table*, Layout*,
- Sized_relobj<32, false>* relobj,
+ Sized_relobj_file<32, false>* relobj,
unsigned int local_sym_index);
// Define the _TLS_MODULE_BASE_ symbol in the TLS segment.
@@ -562,7 +563,7 @@ class Target_i386 : public Target_freebsd<32, false>
// Create a GOT entry for the TLS module index.
unsigned int
got_mod_index_entry(Symbol_table* symtab, Layout* layout,
- Sized_relobj<32, false>* object);
+ Sized_relobj_file<32, false>* object);
// Get the PLT section.
Output_data_plt_i386*
@@ -583,7 +584,7 @@ class Target_i386 : public Target_freebsd<32, false>
// Add a potential copy relocation.
void
copy_reloc(Symbol_table* symtab, Layout* layout,
- Sized_relobj<32, false>* object,
+ Sized_relobj_file<32, false>* object,
unsigned int shndx, Output_section* output_section,
Symbol* sym, const elfcpp::Rel<32, false>& reloc)
{
@@ -811,8 +812,9 @@ Output_data_plt_i386::add_entry(Symbol* gsym)
// the PLT offset.
unsigned int
-Output_data_plt_i386::add_local_ifunc_entry(Sized_relobj<32, false>* relobj,
- unsigned int local_sym_index)
+Output_data_plt_i386::add_local_ifunc_entry(
+ Sized_relobj_file<32, false>* relobj,
+ unsigned int local_sym_index)
{
unsigned int plt_offset = (this->count_ + 1) * plt_entry_size;
++this->count_;
@@ -1046,7 +1048,7 @@ Target_i386::make_plt_entry(Symbol_table* symtab, Layout* layout, Symbol* gsym)
void
Target_i386::make_local_ifunc_plt_entry(Symbol_table* symtab, Layout* layout,
- Sized_relobj<32, false>* relobj,
+ Sized_relobj_file<32, false>* relobj,
unsigned int local_sym_index)
{
if (relobj->local_has_plt_offset(local_sym_index))
@@ -1122,7 +1124,7 @@ Target_i386::define_tls_base_symbol(Symbol_table* symtab, Layout* layout)
unsigned int
Target_i386::got_mod_index_entry(Symbol_table* symtab, Layout* layout,
- Sized_relobj<32, false>* object)
+ Sized_relobj_file<32, false>* object)
{
if (this->got_mod_index_offset_ == -1U)
{
@@ -1268,7 +1270,7 @@ Target_i386::Scan::get_reference_flags(unsigned int r_type)
// Report an unsupported relocation against a local symbol.
void
-Target_i386::Scan::unsupported_reloc_local(Sized_relobj<32, false>* object,
+Target_i386::Scan::unsupported_reloc_local(Sized_relobj_file<32, false>* object,
unsigned int r_type)
{
gold_error(_("%s: unsupported reloc %u against local symbol"),
@@ -1279,8 +1281,9 @@ Target_i386::Scan::unsupported_reloc_local(Sized_relobj<32, false>* object,
// given type against a STT_GNU_IFUNC symbol.
bool
-Target_i386::Scan::reloc_needs_plt_for_ifunc(Sized_relobj<32, false>* object,
- unsigned int r_type)
+Target_i386::Scan::reloc_needs_plt_for_ifunc(
+ Sized_relobj_file<32, false>* object,
+ unsigned int r_type)
{
int flags = Scan::get_reference_flags(r_type);
if (flags & Symbol::TLS_REF)
@@ -1295,7 +1298,7 @@ inline void
Target_i386::Scan::local(Symbol_table* symtab,
Layout* layout,
Target_i386* target,
- Sized_relobj<32, false>* object,
+ Sized_relobj_file<32, false>* object,
unsigned int data_shndx,
Output_section* output_section,
const elfcpp::Rel<32, false>& reloc,
@@ -1597,9 +1600,10 @@ Target_i386::Scan::local(Symbol_table* symtab,
// Report an unsupported relocation against a global symbol.
void
-Target_i386::Scan::unsupported_reloc_global(Sized_relobj<32, false>* object,
- unsigned int r_type,
- Symbol* gsym)
+Target_i386::Scan::unsupported_reloc_global(
+ Sized_relobj_file<32, false>* object,
+ unsigned int r_type,
+ Symbol* gsym)
{
gold_error(_("%s: unsupported reloc %u against global symbol %s"),
object->name().c_str(), r_type, gsym->demangled_name().c_str());
@@ -1629,7 +1633,7 @@ Target_i386::Scan::local_reloc_may_be_function_pointer(
Symbol_table* ,
Layout* ,
Target_i386* ,
- Sized_relobj<32, false>* ,
+ Sized_relobj_file<32, false>* ,
unsigned int ,
Output_section* ,
const elfcpp::Rel<32, false>& ,
@@ -1644,7 +1648,7 @@ Target_i386::Scan::global_reloc_may_be_function_pointer(
Symbol_table* ,
Layout* ,
Target_i386* ,
- Sized_relobj<32, false>* ,
+ Sized_relobj_file<32, false>* ,
unsigned int ,
Output_section* ,
const elfcpp::Rel<32, false>& ,
@@ -1660,7 +1664,7 @@ inline void
Target_i386::Scan::global(Symbol_table* symtab,
Layout* layout,
Target_i386* target,
- Sized_relobj<32, false>* object,
+ Sized_relobj_file<32, false>* object,
unsigned int data_shndx,
Output_section* output_section,
const elfcpp::Rel<32, false>& reloc,
@@ -2025,7 +2029,7 @@ Target_i386::Scan::global(Symbol_table* symtab,
void
Target_i386::gc_process_relocs(Symbol_table* symtab,
Layout* layout,
- Sized_relobj<32, false>* object,
+ Sized_relobj_file<32, false>* object,
unsigned int data_shndx,
unsigned int,
const unsigned char* prelocs,
@@ -2056,7 +2060,7 @@ Target_i386::gc_process_relocs(Symbol_table* symtab,
void
Target_i386::scan_relocs(Symbol_table* symtab,
Layout* layout,
- Sized_relobj<32, false>* object,
+ Sized_relobj_file<32, false>* object,
unsigned int data_shndx,
unsigned int sh_type,
const unsigned char* prelocs,
@@ -2187,7 +2191,7 @@ Target_i386::Relocate::relocate(const Relocate_info<32, false>* relinfo,
}
}
- const Sized_relobj<32, false>* object = relinfo->object;
+ const Sized_relobj_file<32, false>* object = relinfo->object;
// Pick the value to use for symbols defined in shared objects.
Symbol_value<32> symval;
@@ -2388,7 +2392,7 @@ Target_i386::Relocate::relocate_tls(const Relocate_info<32, false>* relinfo,
{
Output_segment* tls_segment = relinfo->layout->tls_segment();
- const Sized_relobj<32, false>* object = relinfo->object;
+ const Sized_relobj_file<32, false>* object = relinfo->object;
elfcpp::Elf_types<32>::Elf_Addr value = psymval->value(object, 0);
@@ -3066,7 +3070,7 @@ Target_i386::Relocatable_size_for_reloc::get_size_for_reloc(
void
Target_i386::scan_relocatable_relocs(Symbol_table* symtab,
Layout* layout,
- Sized_relobj<32, false>* object,
+ Sized_relobj_file<32, false>* object,
unsigned int data_shndx,
unsigned int sh_type,
const unsigned char* prelocs,