[PATCH 14/15] s390: Use elf_append_rela helper

Jens Remus jremus@linux.ibm.com
Fri Nov 7 16:34:57 GMT 2025


This simplifies the code.  Inspired by x86-64.

bfd/
	* elf64-s390.c (elf_s390_relocate_section,
	elf_s390_finish_dynamic_symbol): Use elf_append_rela helper.
	* elf32-s390.c (elf_s390_relocate_section,
	elf_s390_finish_dynamic_symbol): Likewise.

Signed-off-by: Jens Remus <jremus@linux.ibm.com>
---
 bfd/elf32-s390.c | 52 +++++++++++++++---------------------------------
 bfd/elf64-s390.c | 52 +++++++++++++++---------------------------------
 2 files changed, 32 insertions(+), 72 deletions(-)

diff --git a/bfd/elf32-s390.c b/bfd/elf32-s390.c
index 8ad7ca5a729a..c5cba3ef02c1 100644
--- a/bfd/elf32-s390.c
+++ b/bfd/elf32-s390.c
@@ -2343,7 +2343,6 @@ elf_s390_relocate_section (bfd *output_bfd,
 		    {
 		      asection *srelgot;
 		      Elf_Internal_Rela outrel;
-		      bfd_byte *loc;
 
 		      srelgot = htab->elf.srelgot;
 		      if (srelgot == NULL)
@@ -2354,9 +2353,7 @@ elf_s390_relocate_section (bfd *output_bfd,
 					 + off);
 		      outrel.r_info = ELF32_R_INFO (0, R_390_RELATIVE);
 		      outrel.r_addend = relocation;
-		      loc = srelgot->contents;
-		      loc += srelgot->reloc_count++ * sizeof (Elf32_External_Rela);
-		      bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
+		      elf_append_rela (output_bfd, srelgot, &outrel);
 		    }
 
 		  local_got_offsets[r_symndx] |= 1;
@@ -2590,7 +2587,6 @@ elf_s390_relocate_section (bfd *output_bfd,
 	      Elf_Internal_Rela outrel;
 	      bool skip, relocate;
 	      asection *sreloc;
-	      bfd_byte *loc;
 
 	      /* When generating a shared object, these relocations
 		 are copied into the output file to be resolved at run
@@ -2673,9 +2669,7 @@ elf_s390_relocate_section (bfd *output_bfd,
 	      if (sreloc == NULL)
 		abort ();
 
-	      loc = sreloc->contents;
-	      loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
-	      bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
+	      elf_append_rela (output_bfd, sreloc, &outrel);
 
 	      /* If this reloc is against an external symbol, we do
 		 not want to fiddle with the addend.  Otherwise, we
@@ -2692,7 +2686,6 @@ elf_s390_relocate_section (bfd *output_bfd,
 	    {
 	      Elf_Internal_Rela outrel;
 	      asection *sreloc;
-	      bfd_byte *loc;
 
 	      outrel.r_offset = rel->r_offset
 				+ input_section->output_section->vma
@@ -2701,9 +2694,7 @@ elf_s390_relocate_section (bfd *output_bfd,
 	      sreloc = elf_section_data (input_section)->sreloc;
 	      if (sreloc == NULL)
 		abort ();
-	      loc = sreloc->contents;
-	      loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
-	      bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
+	      elf_append_rela (output_bfd, sreloc, &outrel);
 	    }
 	  /* Fall through.  */
 
@@ -2754,12 +2745,14 @@ elf_s390_relocate_section (bfd *output_bfd,
 	  else
 	    {
 	      Elf_Internal_Rela outrel;
-	      bfd_byte *loc;
 	      int dr_type, indx;
+	      asection *sreloc;
 
 	      if (htab->elf.srelgot == NULL)
 		abort ();
 
+	      sreloc = htab->elf.srelgot;
+
 	      outrel.r_offset = (htab->elf.sgot->output_section->vma
 				 + htab->elf.sgot->output_offset + off);
 
@@ -2773,10 +2766,7 @@ elf_s390_relocate_section (bfd *output_bfd,
 	      else
 		outrel.r_addend = 0;
 	      outrel.r_info = ELF32_R_INFO (indx, dr_type);
-	      loc = htab->elf.srelgot->contents;
-	      loc += htab->elf.srelgot->reloc_count++
-		* sizeof (Elf32_External_Rela);
-	      bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
+	      elf_append_rela (output_bfd, sreloc, &outrel);
 
 	      if (r_type == R_390_TLS_GD32)
 		{
@@ -2792,9 +2782,7 @@ elf_s390_relocate_section (bfd *output_bfd,
 		      outrel.r_info = ELF32_R_INFO (indx, R_390_TLS_DTPOFF);
 		      outrel.r_offset += GOT_ENTRY_SIZE;
 		      outrel.r_addend = 0;
-		      htab->elf.srelgot->reloc_count++;
-		      loc += sizeof (Elf32_External_Rela);
-		      bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
+		      elf_append_rela (output_bfd, sreloc, &outrel);
 		    }
 		}
 
@@ -2870,11 +2858,13 @@ elf_s390_relocate_section (bfd *output_bfd,
 	  else
 	    {
 	      Elf_Internal_Rela outrel;
-	      bfd_byte *loc;
+	      asection *sreloc;
 
 	      if (htab->elf.srelgot == NULL)
 		abort ();
 
+	      sreloc = htab->elf.srelgot;
+
 	      outrel.r_offset = (htab->elf.sgot->output_section->vma
 				 + htab->elf.sgot->output_offset + off);
 
@@ -2882,10 +2872,7 @@ elf_s390_relocate_section (bfd *output_bfd,
 			  htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
 	      outrel.r_info = ELF32_R_INFO (0, R_390_TLS_DTPMOD);
 	      outrel.r_addend = 0;
-	      loc = htab->elf.srelgot->contents;
-	      loc += htab->elf.srelgot->reloc_count++
-		* sizeof (Elf32_External_Rela);
-	      bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
+	      elf_append_rela (output_bfd, sreloc, &outrel);
 	      htab->tls_ldm_got.offset |= 1;
 	    }
 	  relocation = htab->elf.sgot->output_offset + off;
@@ -2899,7 +2886,6 @@ elf_s390_relocate_section (bfd *output_bfd,
 		 a R_390_TLS_TPOFF relocation.  */
 	      Elf_Internal_Rela outrel;
 	      asection *sreloc;
-	      bfd_byte *loc;
 	      int indx;
 
 	      outrel.r_offset = rel->r_offset
@@ -2917,9 +2903,7 @@ elf_s390_relocate_section (bfd *output_bfd,
 	      sreloc = elf_section_data (input_section)->sreloc;
 	      if (sreloc == NULL)
 		abort ();
-	      loc = sreloc->contents;
-	      loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
-	      bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
+	      elf_append_rela (output_bfd, sreloc, &outrel);
 	    }
 	  else
 	    {
@@ -3481,7 +3465,7 @@ elf_s390_finish_dynamic_symbol (bfd *output_bfd,
       && elf_s390_hash_entry(h)->tls_type != GOT_TLS_IE_NLT)
     {
       Elf_Internal_Rela rela;
-      bfd_byte *loc;
+      asection *relgot = htab->elf.srelgot;
 
       /* This symbol has an entry in the global offset table.  Set it
 	 up.  */
@@ -3542,16 +3526,13 @@ elf_s390_finish_dynamic_symbol (bfd *output_bfd,
 	  rela.r_addend = 0;
 	}
 
-      loc = htab->elf.srelgot->contents;
-      loc += htab->elf.srelgot->reloc_count++ * sizeof (Elf32_External_Rela);
-      bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
+      elf_append_rela (output_bfd, relgot, &rela);
     }
 
   if (h->needs_copy)
     {
       Elf_Internal_Rela rela;
       asection *s;
-      bfd_byte *loc;
 
       /* This symbols needs a copy reloc.  Set it up.  */
 
@@ -3571,8 +3552,7 @@ elf_s390_finish_dynamic_symbol (bfd *output_bfd,
 	s = htab->elf.sreldynrelro;
       else
 	s = htab->elf.srelbss;
-      loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
-      bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
+      elf_append_rela (output_bfd, s, &rela);
     }
 
   /* Mark some specially defined symbols as absolute.  */
diff --git a/bfd/elf64-s390.c b/bfd/elf64-s390.c
index da661206c641..6ba67553f03c 100644
--- a/bfd/elf64-s390.c
+++ b/bfd/elf64-s390.c
@@ -2588,7 +2588,6 @@ elf_s390_relocate_section (bfd *output_bfd,
 		    {
 		      asection *srelgot;
 		      Elf_Internal_Rela outrel;
-		      bfd_byte *loc;
 
 		      srelgot = htab->elf.srelgot;
 		      if (srelgot == NULL)
@@ -2599,9 +2598,7 @@ elf_s390_relocate_section (bfd *output_bfd,
 					 + off);
 		      outrel.r_info = ELF64_R_INFO (0, R_390_RELATIVE);
 		      outrel.r_addend = relocation;
-		      loc = srelgot->contents;
-		      loc += srelgot->reloc_count++ * sizeof (Elf64_External_Rela);
-		      bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
+		      elf_append_rela (output_bfd, srelgot, &outrel);
 		    }
 
 		  local_got_offsets[r_symndx] |= 1;
@@ -2947,7 +2944,6 @@ elf_s390_relocate_section (bfd *output_bfd,
 	      Elf_Internal_Rela outrel;
 	      bool skip, relocate;
 	      asection *sreloc;
-	      bfd_byte *loc;
 
 	      /* When generating a shared object, these relocations
 		 are copied into the output file to be resolved at run
@@ -3030,9 +3026,7 @@ elf_s390_relocate_section (bfd *output_bfd,
 	      if (sreloc == NULL)
 		abort ();
 
-	      loc = sreloc->contents;
-	      loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
-	      bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
+	      elf_append_rela (output_bfd, sreloc, &outrel);
 
 	      /* If this reloc is against an external symbol, we do
 		 not want to fiddle with the addend.  Otherwise, we
@@ -3049,7 +3043,6 @@ elf_s390_relocate_section (bfd *output_bfd,
 	    {
 	      Elf_Internal_Rela outrel;
 	      asection *sreloc;
-	      bfd_byte *loc;
 
 	      outrel.r_offset = rel->r_offset
 				+ input_section->output_section->vma
@@ -3058,9 +3051,7 @@ elf_s390_relocate_section (bfd *output_bfd,
 	      sreloc = elf_section_data (input_section)->sreloc;
 	      if (sreloc == NULL)
 		abort ();
-	      loc = sreloc->contents;
-	      loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
-	      bfd_elf64_swap_reloc_out (output_bfd, &outrel, loc);
+	      elf_append_rela (output_bfd, sreloc, &outrel);
 	    }
 	  /* Fall through.  */
 
@@ -3111,12 +3102,14 @@ elf_s390_relocate_section (bfd *output_bfd,
 	  else
 	    {
 	      Elf_Internal_Rela outrel;
-	      bfd_byte *loc;
 	      int dr_type, indx;
+	      asection *sreloc;
 
 	      if (htab->elf.srelgot == NULL)
 		abort ();
 
+	      sreloc = htab->elf.srelgot;
+
 	      outrel.r_offset = (htab->elf.sgot->output_section->vma
 				 + htab->elf.sgot->output_offset + off);
 
@@ -3130,10 +3123,7 @@ elf_s390_relocate_section (bfd *output_bfd,
 	      else
 		outrel.r_addend = 0;
 	      outrel.r_info = ELF64_R_INFO (indx, dr_type);
-	      loc = htab->elf.srelgot->contents;
-	      loc += htab->elf.srelgot->reloc_count++
-		* sizeof (Elf64_External_Rela);
-	      bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
+	      elf_append_rela (output_bfd, sreloc, &outrel);
 
 	      if (r_type == R_390_TLS_GD64)
 		{
@@ -3149,9 +3139,7 @@ elf_s390_relocate_section (bfd *output_bfd,
 		      outrel.r_info = ELF64_R_INFO (indx, R_390_TLS_DTPOFF);
 		      outrel.r_offset += GOT_ENTRY_SIZE;
 		      outrel.r_addend = 0;
-		      htab->elf.srelgot->reloc_count++;
-		      loc += sizeof (Elf64_External_Rela);
-		      bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
+		      elf_append_rela (output_bfd, sreloc, &outrel);
 		    }
 		}
 
@@ -3227,11 +3215,13 @@ elf_s390_relocate_section (bfd *output_bfd,
 	  else
 	    {
 	      Elf_Internal_Rela outrel;
-	      bfd_byte *loc;
+	      asection *sreloc;
 
 	      if (htab->elf.srelgot == NULL)
 		abort ();
 
+	      sreloc = htab->elf.srelgot;
+
 	      outrel.r_offset = (htab->elf.sgot->output_section->vma
 				 + htab->elf.sgot->output_offset + off);
 
@@ -3239,10 +3229,7 @@ elf_s390_relocate_section (bfd *output_bfd,
 			  htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
 	      outrel.r_info = ELF64_R_INFO (0, R_390_TLS_DTPMOD);
 	      outrel.r_addend = 0;
-	      loc = htab->elf.srelgot->contents;
-	      loc += htab->elf.srelgot->reloc_count++
-		* sizeof (Elf64_External_Rela);
-	      bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
+	      elf_append_rela (output_bfd, sreloc, &outrel);
 	      htab->tls_ldm_got.offset |= 1;
 	    }
 	  relocation = htab->elf.sgot->output_offset + off;
@@ -3256,7 +3243,6 @@ elf_s390_relocate_section (bfd *output_bfd,
 		 a R_390_TLS_TPOFF relocation.  */
 	      Elf_Internal_Rela outrel;
 	      asection *sreloc;
-	      bfd_byte *loc;
 	      int indx;
 
 	      outrel.r_offset = rel->r_offset
@@ -3274,9 +3260,7 @@ elf_s390_relocate_section (bfd *output_bfd,
 	      sreloc = elf_section_data (input_section)->sreloc;
 	      if (sreloc == NULL)
 		abort ();
-	      loc = sreloc->contents;
-	      loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
-	      bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
+	      elf_append_rela (output_bfd, sreloc, &outrel);
 	    }
 	  else
 	    {
@@ -3700,7 +3684,7 @@ elf_s390_finish_dynamic_symbol (bfd *output_bfd,
       && elf_s390_hash_entry(h)->tls_type != GOT_TLS_IE_NLT)
     {
       Elf_Internal_Rela rela;
-      bfd_byte *loc;
+      asection *relgot = htab->elf.srelgot;
 
       /* This symbol has an entry in the global offset table.  Set it
 	 up.  */
@@ -3761,16 +3745,13 @@ elf_s390_finish_dynamic_symbol (bfd *output_bfd,
 	  rela.r_addend = 0;
 	}
 
-      loc = htab->elf.srelgot->contents;
-      loc += htab->elf.srelgot->reloc_count++ * sizeof (Elf64_External_Rela);
-      bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
+      elf_append_rela (output_bfd, relgot, &rela);
     }
 
   if (h->needs_copy)
     {
       Elf_Internal_Rela rela;
       asection *s;
-      bfd_byte *loc;
 
       /* This symbols needs a copy reloc.  Set it up.  */
 
@@ -3790,8 +3771,7 @@ elf_s390_finish_dynamic_symbol (bfd *output_bfd,
 	s = htab->elf.sreldynrelro;
       else
 	s = htab->elf.srelbss;
-      loc = s->contents + s->reloc_count++ * sizeof (Elf64_External_Rela);
-      bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
+      elf_append_rela (output_bfd, s, &rela);
     }
 
   /* Mark some specially defined symbols as absolute.  */
-- 
2.48.1



More information about the Binutils mailing list