From: Alan Modra Date: Sat, 28 Aug 2021 05:15:53 +0000 (+0930) Subject: [GOLD] Output_data_got tidy X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=54721a930e80a635d3cb47c0ad3899ed9680bd78;p=binutils-gdb.git [GOLD] Output_data_got tidy Some Output_data_got methods already have support for addends, but were implemented as separate methods. This removes unnecessary code duplication. Relobj::local_has_got_offset and others there get a similar treatment. Comments are removed since it should be obvious without a comment, and the existing comments are not precisely what the code does. For example, a local_has_got_offset call without an addend does not return whether the local symbol has *a* GOT offset of type GOT_TYPE, it returns whether there is a GOT entry of type GOT_TYPE for the symbol with addend of zero. PR 28192 * output.h (Output_data_got::add_local): Make addend optional. (Output_data_got::add_local_with_rel): Likewise. (Output_data_got::add_local_pair_with_rel): Likewise. * output.cc (Output_data_got::add_local): Delete overload without addend. (Output_data_got::add_local_with_rel): Likewise. (Output_data_got::add_local_pair_with_rel): Likewise. * object.h (Relobj::local_has_got_offset): Make addend optional. Delete overload without addend later. Update comment. (Relobj::local_got_offset): Likewise. (Relobj::set_local_got_offset): Likewise. --- diff --git a/gold/object.h b/gold/object.h index 2dbe4b3e1be..dc089f5a417 100644 --- a/gold/object.h +++ b/gold/object.h @@ -1216,46 +1216,27 @@ class Relobj : public Object local_plt_offset(unsigned int symndx) const { return this->do_local_plt_offset(symndx); } - // Return whether the local symbol SYMNDX has a GOT offset of type - // GOT_TYPE. - bool - local_has_got_offset(unsigned int symndx, unsigned int got_type) const - { return this->do_local_has_got_offset(symndx, got_type, 0); } - - // Return whether the local symbol SYMNDX plus ADDEND has a GOT offset - // of type GOT_TYPE. + // Return whether there is a GOT entry of type GOT_TYPE for the + // local symbol SYMNDX with given ADDEND. bool local_has_got_offset(unsigned int symndx, unsigned int got_type, - uint64_t addend) const + uint64_t addend = 0) const { return this->do_local_has_got_offset(symndx, got_type, addend); } - // Return the GOT offset of type GOT_TYPE of the local symbol - // SYMNDX. It is an error to call this if the symbol does not have - // a GOT offset of the specified type. - unsigned int - local_got_offset(unsigned int symndx, unsigned int got_type) const - { return this->do_local_got_offset(symndx, got_type, 0); } - - // Return the GOT offset of type GOT_TYPE of the local symbol - // SYMNDX plus ADDEND. It is an error to call this if the symbol - // does not have a GOT offset of the specified type. + // Return the GOT offset of the GOT entry with type GOT_TYPE for the + // local symbol SYMNDX with given ADDEND. It is an error to call + // this function if the symbol does not have such a GOT entry. unsigned int local_got_offset(unsigned int symndx, unsigned int got_type, - uint64_t addend) const + uint64_t addend = 0) const { return this->do_local_got_offset(symndx, got_type, addend); } - // Set the GOT offset with type GOT_TYPE of the local symbol SYMNDX - // to GOT_OFFSET. - void - set_local_got_offset(unsigned int symndx, unsigned int got_type, - unsigned int got_offset) - { this->do_set_local_got_offset(symndx, got_type, got_offset, 0); } - - // Set the GOT offset with type GOT_TYPE of the local symbol SYMNDX - // plus ADDEND to GOT_OFFSET. + // Set the GOT offset for a GOT entry with type GOT_TYPE for the + // local symbol SYMNDX with ADDEND to GOT_OFFSET. Create such an + // entry if none exists. void set_local_got_offset(unsigned int symndx, unsigned int got_type, - unsigned int got_offset, uint64_t addend) + unsigned int got_offset, uint64_t addend = 0) { this->do_set_local_got_offset(symndx, got_type, got_offset, addend); } // Return whether the local symbol SYMNDX is a TLS symbol. diff --git a/gold/output.cc b/gold/output.cc index afdba06753e..75f54f02f23 100644 --- a/gold/output.cc +++ b/gold/output.cc @@ -1531,26 +1531,6 @@ Output_data_got::add_global_pair_with_rel( got_offset + got_size / 8, 0); } -// Add an entry for a local symbol to the GOT. This returns true if -// this is a new GOT entry, false if the symbol already has a GOT -// entry. - -template -bool -Output_data_got::add_local( - Relobj* object, - unsigned int symndx, - unsigned int got_type) -{ - if (object->local_has_got_offset(symndx, got_type)) - return false; - - unsigned int got_offset = this->add_got_entry(Got_entry(object, symndx, - false)); - object->set_local_got_offset(symndx, got_type, got_offset); - return true; -} - // Add an entry for a local symbol plus ADDEND to the GOT. This returns // true if this is a new GOT entry, false if the symbol already has a GOT // entry. @@ -1590,26 +1570,6 @@ Output_data_got::add_local_plt( return true; } -// Add an entry for a local symbol to the GOT, and add a dynamic -// relocation of type R_TYPE for the GOT entry. - -template -void -Output_data_got::add_local_with_rel( - Relobj* object, - unsigned int symndx, - unsigned int got_type, - Output_data_reloc_generic* rel_dyn, - unsigned int r_type) -{ - if (object->local_has_got_offset(symndx, got_type)) - return; - - unsigned int got_offset = this->add_got_entry(Got_entry()); - object->set_local_got_offset(symndx, got_type, got_offset); - rel_dyn->add_local_generic(object, symndx, r_type, this, got_offset, 0); -} - // Add an entry for a local symbol plus ADDEND to the GOT, and add a dynamic // relocation of type R_TYPE for the GOT entry. @@ -1631,32 +1591,6 @@ Output_data_got::add_local_with_rel( addend); } -// Add a pair of entries for a local symbol to the GOT, and add -// a dynamic relocation of type R_TYPE using the section symbol of -// the output section to which input section SHNDX maps, on the first. -// The first got entry will have a value of zero, the second the -// value of the local symbol. -template -void -Output_data_got::add_local_pair_with_rel( - Relobj* object, - unsigned int symndx, - unsigned int shndx, - unsigned int got_type, - Output_data_reloc_generic* rel_dyn, - unsigned int r_type) -{ - if (object->local_has_got_offset(symndx, got_type)) - return; - - unsigned int got_offset = - this->add_got_entry_pair(Got_entry(), - Got_entry(object, symndx, false)); - object->set_local_got_offset(symndx, got_type, got_offset); - Output_section* os = object->output_section(shndx); - rel_dyn->add_output_section_generic(os, r_type, this, got_offset, 0); -} - // Add a pair of entries for a local symbol plus ADDEND to the GOT, and add // a dynamic relocation of type R_TYPE using the section symbol of // the output section to which input section SHNDX maps, on the first. diff --git a/gold/output.h b/gold/output.h index 9c44f6259a2..726c93beb5b 100644 --- a/gold/output.h +++ b/gold/output.h @@ -2488,18 +2488,12 @@ class Output_data_got : public Output_data_got_base Output_data_reloc_generic* rel_dyn, unsigned int r_type_1, unsigned int r_type_2); - // Add an entry for a local symbol to the GOT. This returns true if - // this is a new GOT entry, false if the symbol already has a GOT - // entry. - bool - add_local(Relobj* object, unsigned int sym_index, unsigned int got_type); - // Add an entry for a local symbol plus ADDEND to the GOT. This returns // true if this is a new GOT entry, false if the symbol already has a GOT // entry. bool add_local(Relobj* object, unsigned int sym_index, unsigned int got_type, - uint64_t addend); + uint64_t addend = 0); // Like add_local, but use the PLT offset of the local symbol if it // has one. @@ -2512,30 +2506,12 @@ class Output_data_got : public Output_data_got_base add_local_tls(Relobj* object, unsigned int sym_index, unsigned int got_type) { return add_local_plt(object, sym_index, got_type); } - // Add an entry for a local symbol to the GOT, and add a dynamic - // relocation of type R_TYPE for the GOT entry. - void - add_local_with_rel(Relobj* object, unsigned int sym_index, - unsigned int got_type, Output_data_reloc_generic* rel_dyn, - unsigned int r_type); - // Add an entry for a local symbol plus ADDEND to the GOT, and add a dynamic // relocation of type R_TYPE for the GOT entry. void add_local_with_rel(Relobj* object, unsigned int sym_index, unsigned int got_type, Output_data_reloc_generic* rel_dyn, - unsigned int r_type, uint64_t addend); - - // Add a pair of entries for a local symbol to the GOT, and add - // a dynamic relocation of type R_TYPE using the section symbol of - // the output section to which input section SHNDX maps, on the first. - // The first got entry will have a value of zero, the second the - // value of the local symbol. - void - add_local_pair_with_rel(Relobj* object, unsigned int sym_index, - unsigned int shndx, unsigned int got_type, - Output_data_reloc_generic* rel_dyn, - unsigned int r_type); + unsigned int r_type, uint64_t addend = 0); // Add a pair of entries for a local symbol plus ADDEND to the GOT, and add // a dynamic relocation of type R_TYPE using the section symbol of @@ -2546,7 +2522,7 @@ class Output_data_got : public Output_data_got_base add_local_pair_with_rel(Relobj* object, unsigned int sym_index, unsigned int shndx, unsigned int got_type, Output_data_reloc_generic* rel_dyn, - unsigned int r_type, uint64_t addend); + unsigned int r_type, uint64_t addend = 0); // Add a pair of entries for a local symbol to the GOT, and add // a dynamic relocation of type R_TYPE using STN_UNDEF on the first.