This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: powerpc gold work in progress


Formatting fixes to bring powerpc.cc in line with other gold sources,
some other minor changes, and a bug fix Output_data_glink::add_entry.

In http://sourceware.org/ml/binutils/2012-08/msg00188.html I said that
support for ppc32 -fPIC shared libs and pies was missing.  That wasn't
true.  It's there but wasn't working due to the add_entry bug.

OK to apply?

	* powerpc.cc: Whitespace fixes.  Wrap overly long lines.
	(glink insn constants): Make them uint32_t.
	(Output_data_glink::add_entry): Use insert, not [] operator.

Index: gold/powerpc.cc
===================================================================
RCS file: /cvs/src/src/gold/powerpc.cc,v
retrieving revision 1.45
diff -u -p -r1.45 powerpc.cc
--- gold/powerpc.cc	11 Aug 2012 04:41:28 -0000	1.45
+++ gold/powerpc.cc	11 Aug 2012 12:53:22 -0000
@@ -95,7 +95,8 @@ template<int size, bool big_endian>
 class Target_powerpc : public Sized_target<size, big_endian>
 {
  public:
-  typedef Output_data_reloc<elfcpp::SHT_RELA, true, size, big_endian> Reloc_section;
+  typedef
+    Output_data_reloc<elfcpp::SHT_RELA, true, size, big_endian> Reloc_section;
 
   Target_powerpc()
     : Sized_target<size, big_endian>(&powerpc_info),
@@ -684,7 +685,7 @@ public:
 	   typename elfcpp::Elf_types<size>::Elf_Addr value,
 	   typename elfcpp::Elf_types<size>::Elf_Addr addend,
 	   typename elfcpp::Elf_types<size>::Elf_Addr address)
-  { 
+  {
     This::template rela<16>(view, 16, 0xffff, value - address, addend);
   }
 
@@ -696,7 +697,7 @@ public:
 	   typename elfcpp::Elf_types<size>::Elf_Addr value,
 	   typename elfcpp::Elf_types<size>::Elf_Addr addend,
 	   typename elfcpp::Elf_types<size>::Elf_Addr address)
-  { 
+  {
     This::rel16_hi(view, value + 0x8000, addend, address);
   }
 };
@@ -930,7 +931,10 @@ class Output_data_plt_powerpc : public O
   // Return the number of PLT entries.
   unsigned int
   entry_count() const
-  { return (this->current_data_size() - initial_plt_entry_size) / plt_entry_size; }
+  {
+    return ((this->current_data_size() - initial_plt_entry_size)
+	    / plt_entry_size);
+  }
 
   // Return the offset of the first non-reserved PLT entry.
   static unsigned int
@@ -968,8 +972,9 @@ class Output_data_plt_powerpc : public O
 // Create the PLT section.
 
 template<int size, bool big_endian>
-Output_data_plt_powerpc<size, big_endian>::Output_data_plt_powerpc(Layout* layout,
-								   Target_powerpc<size, big_endian>* targ)
+Output_data_plt_powerpc<size, big_endian>::Output_data_plt_powerpc(
+    Layout* layout,
+    Target_powerpc<size, big_endian>* targ)
   : Output_section_data_build(size == 32 ? 4 : 8),
     targ_(targ)
 {
@@ -999,45 +1004,45 @@ Output_data_plt_powerpc<size, big_endian
     }
 }
 
-static const unsigned int addis_11_11     = 0x3d6b0000;
-static const unsigned int addis_11_30     = 0x3d7e0000;
-static const unsigned int addis_12_12     = 0x3d8c0000;
-static const unsigned int addi_11_11      = 0x396b0000;
-static const unsigned int add_0_11_11     = 0x7c0b5a14;
-static const unsigned int add_11_0_11     = 0x7d605a14;
-static const unsigned int b               = 0x48000000;
-static const unsigned int bcl_20_31       = 0x429f0005;
-static const unsigned int bctr            = 0x4e800420;
-static const unsigned int blrl            = 0x4e800021;
-static const unsigned int lis_11          = 0x3d600000;
-static const unsigned int lis_12          = 0x3d800000;
-static const unsigned int lwzu_0_12       = 0x840c0000;
-static const unsigned int lwz_0_12        = 0x800c0000;
-static const unsigned int lwz_11_11       = 0x816b0000;
-static const unsigned int lwz_11_30       = 0x817e0000;
-static const unsigned int lwz_12_12       = 0x818c0000;
-static const unsigned int mflr_0          = 0x7c0802a6;
-static const unsigned int mflr_12         = 0x7d8802a6;
-static const unsigned int mtctr_0         = 0x7c0903a6;
-static const unsigned int mtctr_11        = 0x7d6903a6;
-static const unsigned int mtlr_0          = 0x7c0803a6;
-static const unsigned int nop             = 0x60000000;
-static const unsigned int sub_11_11_12    = 0x7d6c5850;
-static const unsigned int addis_12_2      = 0x3d820000;
-static const unsigned int std_2_1         = 0xf8410000;
-static const unsigned int ld_11_12        = 0xe96c0000;
-static const unsigned int ld_2_12         = 0xe84c0000;
-static const unsigned int addi_12_12      = 0x398c0000;
-static const unsigned int ld_11_2         = 0xe9620000;
-static const unsigned int addi_2_2        = 0x38420000;
-static const unsigned int ld_2_2          = 0xe8420000;
-static const unsigned int mflr_11         = 0x7d6802a6;
-static const unsigned int ld_2_11         = 0xe84b0000;
-static const unsigned int mtlr_12         = 0x7d8803a6;
-static const unsigned int add_12_2_11     = 0x7d825a14;
-static const unsigned int li_0_0          = 0x38000000;
-static const unsigned int lis_0_0         = 0x3c000000;
-static const unsigned int ori_0_0_0       = 0x60000000;
+static const uint32_t addis_11_11       = 0x3d6b0000;
+static const uint32_t addis_11_30       = 0x3d7e0000;
+static const uint32_t addis_12_12       = 0x3d8c0000;
+static const uint32_t addi_11_11        = 0x396b0000;
+static const uint32_t add_0_11_11       = 0x7c0b5a14;
+static const uint32_t add_11_0_11       = 0x7d605a14;
+static const uint32_t b                 = 0x48000000;
+static const uint32_t bcl_20_31         = 0x429f0005;
+static const uint32_t bctr              = 0x4e800420;
+static const uint32_t blrl              = 0x4e800021;
+static const uint32_t lis_11            = 0x3d600000;
+static const uint32_t lis_12            = 0x3d800000;
+static const uint32_t lwzu_0_12         = 0x840c0000;
+static const uint32_t lwz_0_12          = 0x800c0000;
+static const uint32_t lwz_11_11         = 0x816b0000;
+static const uint32_t lwz_11_30         = 0x817e0000;
+static const uint32_t lwz_12_12         = 0x818c0000;
+static const uint32_t mflr_0            = 0x7c0802a6;
+static const uint32_t mflr_12           = 0x7d8802a6;
+static const uint32_t mtctr_0           = 0x7c0903a6;
+static const uint32_t mtctr_11          = 0x7d6903a6;
+static const uint32_t mtlr_0            = 0x7c0803a6;
+static const uint32_t nop               = 0x60000000;
+static const uint32_t sub_11_11_12      = 0x7d6c5850;
+static const uint32_t addis_12_2        = 0x3d820000;
+static const uint32_t std_2_1           = 0xf8410000;
+static const uint32_t ld_11_12          = 0xe96c0000;
+static const uint32_t ld_2_12           = 0xe84c0000;
+static const uint32_t addi_12_12        = 0x398c0000;
+static const uint32_t ld_11_2           = 0xe9620000;
+static const uint32_t addi_2_2          = 0x38420000;
+static const uint32_t ld_2_2            = 0xe8420000;
+static const uint32_t mflr_11           = 0x7d6802a6;
+static const uint32_t ld_2_11           = 0xe84b0000;
+static const uint32_t mtlr_12           = 0x7d8803a6;
+static const uint32_t add_12_2_11       = 0x7d825a14;
+static const uint32_t li_0_0            = 0x38000000;
+static const uint32_t lis_0_0           = 0x3c000000;
+static const uint32_t ori_0_0_0         = 0x60000000;
 
 // Write out the PLT.
 
@@ -1207,7 +1212,8 @@ class Output_data_glink : public Output_
 // Create the glink section.
 
 template<int size, bool big_endian>
-Output_data_glink<size, big_endian>::Output_data_glink(Target_powerpc<size, big_endian>* targ)
+Output_data_glink<size, big_endian>::Output_data_glink(
+    Target_powerpc<size, big_endian>* targ)
   : Output_section_data(16),
     pltresolve_(0), targ_(targ)
 {
@@ -1218,24 +1224,24 @@ Output_data_glink<size, big_endian>::Out
 
 template<int size, bool big_endian>
 void
-Output_data_glink<size, big_endian>
-::add_entry(const Symbol* gsym,
-	    const elfcpp::Rela<size, big_endian>& reloc,
-	    const Sized_relobj<size, big_endian>* object,
-	    unsigned int shndx)
+Output_data_glink<size, big_endian>::add_entry(
+    const Symbol* gsym,
+    const elfcpp::Rela<size, big_endian>& reloc,
+    const Sized_relobj<size, big_endian>* object,
+    unsigned int shndx)
 {
   Glink_sym_ent ent(gsym, reloc, object, shndx);
   unsigned int indx = this->glink_entries_.size();
-  this->glink_entries_[ent] = indx;
+  this->glink_entries_.insert(std::make_pair(ent, indx));
 }
 
 template<int size, bool big_endian>
 unsigned int
-Output_data_glink<size, big_endian>
-::find_entry(const Symbol* gsym,
-	     const elfcpp::Rela<size, big_endian>& reloc,
-	     const Sized_relobj<size, big_endian>* object,
-	     unsigned int shndx) const
+Output_data_glink<size, big_endian>::find_entry(
+    const Symbol* gsym,
+    const elfcpp::Rela<size, big_endian>& reloc,
+    const Sized_relobj<size, big_endian>* object,
+    unsigned int shndx) const
 {
   Glink_sym_ent ent(gsym, reloc, object, shndx);
   typename Glink_entries::const_iterator p = this->glink_entries_.find(ent);
@@ -1427,9 +1433,10 @@ Output_data_glink<size, big_endian>::do_
 	  p = oview + g->second * this->glink_entry_size();
 	  if (parameters->options().output_is_position_independent())
 	    {
-	      if (g->first.shndx_)
-		got_addr = (g->first.object_->output_section(g->first.shndx_)->address()
-			    + g->first.object_->output_section_offset(g->first.shndx_)
+	      unsigned int got2 = g->first.shndx_;
+	      if (got2)
+		got_addr = (g->first.object_->output_section(got2)->address()
+			    + g->first.object_->output_section_offset(got2)
 			    + g->first.addend_);
 	      else
 		got_addr = g_o_t;
@@ -1554,10 +1561,11 @@ Target_powerpc<size, big_endian>::make_g
 
 template<int size, bool big_endian>
 void
-Target_powerpc<size, big_endian>::make_plt_entry(Layout* layout,
-						 Symbol* gsym,
-						 const elfcpp::Rela<size, big_endian>& reloc,
-						 const Sized_relobj<size, big_endian>* object)
+Target_powerpc<size, big_endian>::make_plt_entry(
+    Layout* layout,
+    Symbol* gsym,
+    const elfcpp::Rela<size, big_endian>& reloc,
+    const Sized_relobj<size, big_endian>* object)
 {
   if (this->plt_ == NULL)
     this->make_plt_section(layout);
@@ -1650,8 +1658,7 @@ Target_powerpc<size, big_endian>::optimi
 
 template<int size, bool big_endian>
 int
-Target_powerpc<size, big_endian>::Scan::get_reference_flags(
-			unsigned int r_type)
+Target_powerpc<size, big_endian>::Scan::get_reference_flags(unsigned int r_type)
 {
   switch (r_type)
     {
@@ -1714,8 +1721,8 @@ Target_powerpc<size, big_endian>::Scan::
 template<int size, bool big_endian>
 void
 Target_powerpc<size, big_endian>::Scan::unsupported_reloc_local(
-			Sized_relobj_file<size, big_endian>* object,
-			unsigned int r_type)
+    Sized_relobj_file<size, big_endian>* object,
+    unsigned int r_type)
 {
   gold_error(_("%s: unsupported reloc %u against local symbol"),
 	     object->name().c_str(), r_type);
@@ -1819,15 +1826,15 @@ Target_powerpc<size, big_endian>::Scan::
 template<int size, bool big_endian>
 inline void
 Target_powerpc<size, big_endian>::Scan::local(
-			Symbol_table* symtab,
-			Layout* layout,
-			Target_powerpc<size, big_endian>* target,
-			Sized_relobj_file<size, big_endian>* object,
-			unsigned int data_shndx,
-			Output_section* output_section,
-			const elfcpp::Rela<size, big_endian>& reloc,
-			unsigned int r_type,
-			const elfcpp::Sym<size, big_endian>& lsym)
+    Symbol_table* symtab,
+    Layout* layout,
+    Target_powerpc<size, big_endian>* target,
+    Sized_relobj_file<size, big_endian>* object,
+    unsigned int data_shndx,
+    Output_section* output_section,
+    const elfcpp::Rela<size, big_endian>& reloc,
+    unsigned int r_type,
+    const elfcpp::Sym<size, big_endian>& lsym)
 {
   switch (r_type)
     {
@@ -1940,9 +1947,9 @@ Target_powerpc<size, big_endian>::Scan::
 template<int size, bool big_endian>
 void
 Target_powerpc<size, big_endian>::Scan::unsupported_reloc_global(
-			Sized_relobj_file<size, big_endian>* object,
-			unsigned int r_type,
-			Symbol* gsym)
+    Sized_relobj_file<size, big_endian>* 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());
@@ -1953,15 +1960,15 @@ Target_powerpc<size, big_endian>::Scan::
 template<int size, bool big_endian>
 inline void
 Target_powerpc<size, big_endian>::Scan::global(
-				Symbol_table* symtab,
-				Layout* layout,
-				Target_powerpc<size, big_endian>* target,
-				Sized_relobj_file<size, big_endian>* object,
-				unsigned int data_shndx,
-				Output_section* output_section,
-				const elfcpp::Rela<size, big_endian>& reloc,
-				unsigned int r_type,
-				Symbol* gsym)
+    Symbol_table* symtab,
+    Layout* layout,
+    Target_powerpc<size, big_endian>* target,
+    Sized_relobj_file<size, big_endian>* object,
+    unsigned int data_shndx,
+    Output_section* output_section,
+    const elfcpp::Rela<size, big_endian>& reloc,
+    unsigned int r_type,
+    Symbol* gsym)
 {
   switch (r_type)
     {
@@ -2143,17 +2150,17 @@ Target_powerpc<size, big_endian>::Scan::
 template<int size, bool big_endian>
 void
 Target_powerpc<size, big_endian>::gc_process_relocs(
-			Symbol_table* symtab,
-			Layout* layout,
-			Sized_relobj_file<size, big_endian>* object,
-			unsigned int data_shndx,
-			unsigned int,
-			const unsigned char* prelocs,
-			size_t reloc_count,
-			Output_section* output_section,
-			bool needs_special_offset_handling,
-			size_t local_symbol_count,
-			const unsigned char* plocal_symbols)
+    Symbol_table* symtab,
+    Layout* layout,
+    Sized_relobj_file<size, big_endian>* object,
+    unsigned int data_shndx,
+    unsigned int,
+    const unsigned char* prelocs,
+    size_t reloc_count,
+    Output_section* output_section,
+    bool needs_special_offset_handling,
+    size_t local_symbol_count,
+    const unsigned char* plocal_symbols)
 {
   typedef Target_powerpc<size, big_endian> Powerpc;
   typedef typename Target_powerpc<size, big_endian>::Scan Scan;
@@ -2178,17 +2185,17 @@ Target_powerpc<size, big_endian>::gc_pro
 template<int size, bool big_endian>
 void
 Target_powerpc<size, big_endian>::scan_relocs(
-			Symbol_table* symtab,
-			Layout* layout,
-			Sized_relobj_file<size, big_endian>* object,
-			unsigned int data_shndx,
-			unsigned int sh_type,
-			const unsigned char* prelocs,
-			size_t reloc_count,
-			Output_section* output_section,
-			bool needs_special_offset_handling,
-			size_t local_symbol_count,
-			const unsigned char* plocal_symbols)
+    Symbol_table* symtab,
+    Layout* layout,
+    Sized_relobj_file<size, big_endian>* object,
+    unsigned int data_shndx,
+    unsigned int sh_type,
+    const unsigned char* prelocs,
+    size_t reloc_count,
+    Output_section* output_section,
+    bool needs_special_offset_handling,
+    size_t local_symbol_count,
+    const unsigned char* plocal_symbols)
 {
   typedef Target_powerpc<size, big_endian> Powerpc;
   typedef typename Target_powerpc<size, big_endian>::Scan Scan;
@@ -2271,17 +2278,17 @@ Target_powerpc<size, big_endian>::do_fin
 template<int size, bool big_endian>
 inline bool
 Target_powerpc<size, big_endian>::Relocate::relocate(
-			const Relocate_info<size, big_endian>* relinfo,
-			Target_powerpc* target,
-			Output_section* os,
-			size_t relnum,
-			const elfcpp::Rela<size, big_endian>& rela,
-			unsigned int r_type,
-			const Sized_symbol<size>* gsym,
-			const Symbol_value<size>* psymval,
-			unsigned char* view,
-			typename elfcpp::Elf_types<size>::Elf_Addr address,
-			section_size_type /* view_size */)
+    const Relocate_info<size, big_endian>* relinfo,
+    Target_powerpc* target,
+    Output_section* os,
+    size_t relnum,
+    const elfcpp::Rela<size, big_endian>& rela,
+    unsigned int r_type,
+    const Sized_symbol<size>* gsym,
+    const Symbol_value<size>* psymval,
+    unsigned char* view,
+    typename elfcpp::Elf_types<size>::Elf_Addr address,
+    section_size_type /* view_size */)
 {
   const unsigned int toc_base_offset = 0x8000;
   typedef Powerpc_relocate_functions<size, big_endian> Reloc;
@@ -2469,16 +2476,16 @@ Target_powerpc<size, big_endian>::Reloca
 template<int size, bool big_endian>
 inline void
 Target_powerpc<size, big_endian>::Relocate::relocate_tls(
-			const Relocate_info<size, big_endian>* relinfo,
-			Target_powerpc<size, big_endian>* target,
-			size_t relnum,
-			const elfcpp::Rela<size, big_endian>& rela,
-			unsigned int r_type,
-			const Sized_symbol<size>* gsym,
-			const Symbol_value<size>* psymval,
-			unsigned char* view,
-			typename elfcpp::Elf_types<size>::Elf_Addr address,
-			section_size_type)
+    const Relocate_info<size, big_endian>* relinfo,
+    Target_powerpc<size, big_endian>* target,
+    size_t relnum,
+    const elfcpp::Rela<size, big_endian>& rela,
+    unsigned int r_type,
+    const Sized_symbol<size>* gsym,
+    const Symbol_value<size>* psymval,
+    unsigned char* view,
+    typename elfcpp::Elf_types<size>::Elf_Addr address,
+    section_size_type)
 {
   Output_segment* tls_segment = relinfo->layout->tls_segment();
   const Sized_relobj_file<size, big_endian>* object = relinfo->object;
@@ -2502,16 +2509,16 @@ Target_powerpc<size, big_endian>::Reloca
 template<int size, bool big_endian>
 void
 Target_powerpc<size, big_endian>::relocate_section(
-			const Relocate_info<size, big_endian>* relinfo,
-			unsigned int sh_type,
-			const unsigned char* prelocs,
-			size_t reloc_count,
-			Output_section* output_section,
-			bool needs_special_offset_handling,
-			unsigned char* view,
-			typename elfcpp::Elf_types<size>::Elf_Addr address,
-			section_size_type view_size,
-			const Reloc_symbol_changes* reloc_symbol_changes)
+    const Relocate_info<size, big_endian>* relinfo,
+    unsigned int sh_type,
+    const unsigned char* prelocs,
+    size_t reloc_count,
+    Output_section* output_section,
+    bool needs_special_offset_handling,
+    unsigned char* view,
+    typename elfcpp::Elf_types<size>::Elf_Addr address,
+    section_size_type view_size,
+    const Reloc_symbol_changes* reloc_symbol_changes)
 {
   typedef Target_powerpc<size, big_endian> Powerpc;
   typedef typename Target_powerpc<size, big_endian>::Relocate Powerpc_relocate;
@@ -2519,7 +2526,7 @@ Target_powerpc<size, big_endian>::reloca
   gold_assert(sh_type == elfcpp::SHT_RELA);
 
   gold::relocate_section<size, big_endian, Powerpc, elfcpp::SHT_RELA,
-    Powerpc_relocate>(
+			 Powerpc_relocate>(
     relinfo,
     this,
     prelocs,
@@ -2569,23 +2576,23 @@ public:
 template<int size, bool big_endian>
 void
 Target_powerpc<size, big_endian>::scan_relocatable_relocs(
-			Symbol_table* symtab,
-			Layout* layout,
-			Sized_relobj_file<size, big_endian>* object,
-			unsigned int data_shndx,
-			unsigned int sh_type,
-			const unsigned char* prelocs,
-			size_t reloc_count,
-			Output_section* output_section,
-			bool needs_special_offset_handling,
-			size_t local_symbol_count,
-			const unsigned char* plocal_symbols,
-			Relocatable_relocs* rr)
+    Symbol_table* symtab,
+    Layout* layout,
+    Sized_relobj_file<size, big_endian>* object,
+    unsigned int data_shndx,
+    unsigned int sh_type,
+    const unsigned char* prelocs,
+    size_t reloc_count,
+    Output_section* output_section,
+    bool needs_special_offset_handling,
+    size_t local_symbol_count,
+    const unsigned char* plocal_symbols,
+    Relocatable_relocs* rr)
 {
   gold_assert(sh_type == elfcpp::SHT_RELA);
 
   gold::scan_relocatable_relocs<size, big_endian, elfcpp::SHT_RELA,
-    Powerpc_scan_relocatable_reloc>(
+				Powerpc_scan_relocatable_reloc>(
     symtab,
     layout,
     object,

-- 
Alan Modra
Australia Development Lab, IBM


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]