]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - bfd/elf32-crx.c
Update year range in copyright notice of binutils files
[thirdparty/binutils-gdb.git] / bfd / elf32-crx.c
index 0f9069c8b79673d3e2f092830d1349371a4ba52e..99edfffdc4da7c9d0d890662153f0281da5e0d30 100644 (file)
@@ -1,5 +1,5 @@
 /* BFD back-end for National Semiconductor's CRX ELF
-   Copyright (C) 2004-2015 Free Software Foundation, Inc.
+   Copyright (C) 2004-2021 Free Software Foundation, Inc.
    Written by Tomer Levi, NSC, Israel.
 
    This file is part of BFD, the Binary File Descriptor library.
@@ -28,7 +28,7 @@
 
 static reloc_howto_type *elf_crx_reloc_type_lookup
   (bfd *, bfd_reloc_code_real_type);
-static void elf_crx_info_to_howto
+static bfd_boolean elf_crx_info_to_howto
   (bfd *, arelent *, Elf_Internal_Rela *);
 static bfd_boolean elf32_crx_relax_delete_bytes
   (struct bfd_link_info *, bfd *, asection *, bfd_vma, int);
@@ -272,7 +272,7 @@ static reloc_howto_type crx_elf_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         "R_CRX_NUM8",          /* name */
         FALSE,                 /* partial_inplace */
-        0x0,                   /* src_mask */
+        0x0,                   /* src_mask */
         0xff,                  /* dst_mask */
         FALSE),                /* pcrel_offset */
 
@@ -286,7 +286,7 @@ static reloc_howto_type crx_elf_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         "R_CRX_NUM16",         /* name */
         FALSE,                 /* partial_inplace */
-        0x0,                   /* src_mask */
+        0x0,                   /* src_mask */
         0xffff,                /* dst_mask */
         FALSE),                /* pcrel_offset */
 
@@ -300,7 +300,7 @@ static reloc_howto_type crx_elf_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         "R_CRX_NUM32",         /* name */
         FALSE,                 /* partial_inplace */
-        0x0,                   /* src_mask */
+        0x0,                   /* src_mask */
         0xffffffff,            /* dst_mask */
         FALSE),                /* pcrel_offset */
 
@@ -314,7 +314,7 @@ static reloc_howto_type crx_elf_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         "R_CRX_IMM16",         /* name */
         FALSE,                 /* partial_inplace */
-        0x0,                   /* src_mask */
+        0x0,                   /* src_mask */
         0xffff,                /* dst_mask */
         FALSE),                /* pcrel_offset */
 
@@ -328,7 +328,7 @@ static reloc_howto_type crx_elf_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         "R_CRX_IMM32",         /* name */
         FALSE,                 /* partial_inplace */
-        0x0,                   /* src_mask */
+        0x0,                   /* src_mask */
         0xffffffff,            /* dst_mask */
         FALSE),                /* pcrel_offset */
 
@@ -418,19 +418,21 @@ elf_crx_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
 
 /* Retrieve a howto ptr using an internal relocation entry.  */
 
-static void
-elf_crx_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
+static bfd_boolean
+elf_crx_info_to_howto (bfd *abfd, arelent *cache_ptr,
                       Elf_Internal_Rela *dst)
 {
   unsigned int r_type = ELF32_R_TYPE (dst->r_info);
   if (r_type >= R_CRX_MAX)
     {
-      (*_bfd_error_handler) (_("%B: unrecognised CRX reloc number: %d"),
-                            abfd, r_type);
+      /* xgettext:c-format */
+      _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
+                         abfd, r_type);
       bfd_set_error (bfd_error_bad_value);
-      r_type = R_CRX_NONE;
+      return FALSE;
     }
   cache_ptr->howto = &crx_elf_howto_table[r_type];
+  return TRUE;
 }
 
 /* Perform a relocation as part of a final link.  */
@@ -504,25 +506,18 @@ crx_elf_final_link_relocate (reloc_howto_type *howto, bfd *input_bfd,
      as signed or unsigned.  */
   check = Rvalue >> howto->rightshift;
 
-  /* Assumes two's complement.  This expression avoids
-     overflow if howto->bitsize is the number of bits in
-     bfd_vma.  */
-  reloc_bits = (((1 << (howto->bitsize - 1)) - 1) << 1) | 1;
+  reloc_bits = ((bfd_vma) 1 << (howto->bitsize - 1) << 1) - 1;
 
-  if (((bfd_vma) check & ~reloc_bits) != 0
-      && (((bfd_vma) check & ~reloc_bits)
-         != (-(bfd_vma) 1 & ~reloc_bits)))
+  if ((check & ~reloc_bits) != 0
+      && (check & ~reloc_bits) != ((bfd_vma) -1 & ~reloc_bits))
     {
       /* The above right shift is incorrect for a signed
         value.  See if turning on the upper bits fixes the
         overflow.  */
       if (howto->rightshift && (bfd_signed_vma) Rvalue < 0)
        {
-         check |= ((bfd_vma) - 1
-                   & ~((bfd_vma) - 1
-                       >> howto->rightshift));
-         if (((bfd_vma) check & ~reloc_bits)
-             != (-(bfd_vma) 1 & ~reloc_bits))
+         check |= (bfd_vma) -1 & ~((bfd_vma) -1 >> howto->rightshift);
+         if ((check & ~reloc_bits) != ((bfd_vma) -1 & ~reloc_bits))
            return bfd_reloc_overflow;
        }
       else
@@ -530,7 +525,7 @@ crx_elf_final_link_relocate (reloc_howto_type *howto, bfd *input_bfd,
     }
 
   /* Drop unwanted bits from the value we are relocating to.  */
-  Rvalue >>= (bfd_vma) howto->rightshift;
+  Rvalue >>= howto->rightshift;
 
   /* Apply dst_mask to select only relocatable part of the insn.  */
   Rvalue &= howto->dst_mask;
@@ -803,10 +798,8 @@ elf32_crx_get_relocated_section_contents (bfd *output_bfd,
                                     isymbuf, sections))
        goto error_return;
 
-      if (sections != NULL)
-       free (sections);
-      if (isymbuf != NULL
-         && symtab_hdr->contents != (unsigned char *) isymbuf)
+      free (sections);
+      if (symtab_hdr->contents != (unsigned char *) isymbuf)
        free (isymbuf);
       if (elf_section_data (input_section)->relocs != internal_relocs)
        free (internal_relocs);
@@ -815,13 +808,10 @@ elf32_crx_get_relocated_section_contents (bfd *output_bfd,
   return data;
 
  error_return:
-  if (sections != NULL)
-    free (sections);
-  if (isymbuf != NULL
-      && symtab_hdr->contents != (unsigned char *) isymbuf)
+  free (sections);
+  if (symtab_hdr->contents != (unsigned char *) isymbuf)
     free (isymbuf);
-  if (internal_relocs != NULL
-      && elf_section_data (input_section)->relocs != internal_relocs)
+  if (elf_section_data (input_section)->relocs != internal_relocs)
     free (internal_relocs);
   return NULL;
 }
@@ -882,7 +872,7 @@ elf32_crx_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
        RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
                                         rel, 1, relend, howto, 0, contents);
 
-      if (info->relocatable)
+      if (bfd_link_relocatable (info))
        continue;
 
       r = crx_elf_final_link_relocate (howto, input_bfd, output_bfd,
@@ -903,24 +893,20 @@ elf32_crx_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
              name = (bfd_elf_string_from_elf_section
                      (input_bfd, symtab_hdr->sh_link, sym->st_name));
              if (name == NULL || *name == '\0')
-               name = bfd_section_name (input_bfd, sec);
+               name = bfd_section_name (sec);
            }
 
          switch (r)
            {
             case bfd_reloc_overflow:
-              if (!((*info->callbacks->reloc_overflow)
-                    (info, (h ? &h->root : NULL), name, howto->name,
-                     (bfd_vma) 0, input_bfd, input_section,
-                     rel->r_offset)))
-                return FALSE;
+              (*info->callbacks->reloc_overflow)
+                (info, (h ? &h->root : NULL), name, howto->name,
+                 (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
               break;
 
             case bfd_reloc_undefined:
-              if (!((*info->callbacks->undefined_symbol)
-                    (info, name, input_bfd, input_section,
-                     rel->r_offset, TRUE)))
-                return FALSE;
+              (*info->callbacks->undefined_symbol)
+                (info, name, input_bfd, input_section, rel->r_offset, TRUE);
               break;
 
             case bfd_reloc_outofrange:
@@ -940,10 +926,8 @@ elf32_crx_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
               /* Fall through.  */
 
             common_error:
-              if (!((*info->callbacks->warning)
-                    (info, msg, name, input_bfd, input_section,
-                     rel->r_offset)))
-                return FALSE;
+              (*info->callbacks->warning) (info, msg, name, input_bfd,
+                                           input_section, rel->r_offset);
               break;
            }
        }
@@ -979,7 +963,7 @@ elf32_crx_relax_section (bfd *abfd, asection *sec,
   /* We don't have to do anything for a relocatable link, if
      this section does not have relocs, or if this is not a
      code section.  */
-  if (link_info->relocatable
+  if (bfd_link_relocatable (link_info)
       || (sec->flags & SEC_RELOC) == 0
       || sec->reloc_count == 0
       || (sec->flags & SEC_CODE) == 0)
@@ -1293,21 +1277,17 @@ elf32_crx_relax_section (bfd *abfd, asection *sec,
        }
     }
 
-  if (internal_relocs != NULL
-      && elf_section_data (sec)->relocs != internal_relocs)
+  if (elf_section_data (sec)->relocs != internal_relocs)
     free (internal_relocs);
 
   return TRUE;
 
  error_return:
-  if (isymbuf != NULL
-      && symtab_hdr->contents != (unsigned char *) isymbuf)
+  if (symtab_hdr->contents != (unsigned char *) isymbuf)
     free (isymbuf);
-  if (contents != NULL
-      && elf_section_data (sec)->this_hdr.contents != contents)
+  if (elf_section_data (sec)->this_hdr.contents != contents)
     free (contents);
-  if (internal_relocs != NULL
-      && elf_section_data (sec)->relocs != internal_relocs)
+  if (elf_section_data (sec)->relocs != internal_relocs)
     free (internal_relocs);
 
   return FALSE;
@@ -1325,7 +1305,7 @@ elf32_crx_relax_section (bfd *abfd, asection *sec,
 #define bfd_elf32_bfd_reloc_name_lookup \
                                        elf_crx_reloc_name_lookup
 #define elf_info_to_howto              elf_crx_info_to_howto
-#define elf_info_to_howto_rel          0
+#define elf_info_to_howto_rel          NULL
 #define elf_backend_relocate_section   elf32_crx_relocate_section
 #define bfd_elf32_bfd_relax_section    elf32_crx_relax_section
 #define bfd_elf32_bfd_get_relocated_section_contents \