Make bfd_byte an int8_t, flagword a uint32_t
[binutils-gdb.git] / bfd / elf32-avr.c
index 8c003d0553b3eacc03811e9c85f633d07cd66a08..702719136d09acbc8c98ec49ab8129d0f33fffa8 100644 (file)
@@ -1,5 +1,5 @@
 /* AVR-specific support for 32-bit ELF
-   Copyright (C) 1999-2022 Free Software Foundation, Inc.
+   Copyright (C) 1999-2023 Free Software Foundation, Inc.
    Contributed by Denis Chertykov <denisc@overta.ru>
 
    This file is part of BFD, the Binary File Descriptor library.
@@ -1048,7 +1048,7 @@ avr_final_link_relocate (reloc_howto_type *                   howto,
               input_section->output_offset);
 
       if (srel & 1)
-       return bfd_reloc_outofrange;
+       return bfd_reloc_other;
       if (srel > ((1 << 7) - 1) || (srel < - (1 << 7)))
        return bfd_reloc_overflow;
       x = bfd_get_16 (input_bfd, contents);
@@ -1066,7 +1066,7 @@ avr_final_link_relocate (reloc_howto_type *                   howto,
               input_section->output_offset);
 
       if (srel & 1)
-       return bfd_reloc_outofrange;
+       return bfd_reloc_other;
 
       srel = avr_relative_distance_considering_wrap_around (srel);
 
@@ -1228,11 +1228,11 @@ avr_final_link_relocate (reloc_howto_type *                 howto,
                    (unsigned int) reloc_addr);
 
          if (avr_stub_is_required_for_16_bit_reloc (srel - base_addr))
-           return bfd_reloc_outofrange;
+           return bfd_reloc_overflow;
        }
 
       if (srel & 1)
-       return bfd_reloc_outofrange;
+       return bfd_reloc_other;
       srel = srel >> 1;
       x = bfd_get_16 (input_bfd, contents);
       x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
@@ -1261,11 +1261,11 @@ avr_final_link_relocate (reloc_howto_type *                 howto,
                    (unsigned int) reloc_addr);
 
          if (avr_stub_is_required_for_16_bit_reloc (srel - base_addr))
-           return bfd_reloc_outofrange;
+           return bfd_reloc_overflow;
        }
 
       if (srel & 1)
-       return bfd_reloc_outofrange;
+       return bfd_reloc_other;
       srel = srel >> 1;
       srel = (srel >> 8) & 0xff;
       x = bfd_get_16 (input_bfd, contents);
@@ -1277,7 +1277,7 @@ avr_final_link_relocate (reloc_howto_type *                   howto,
       contents += rel->r_offset;
       srel = (bfd_signed_vma) relocation + rel->r_addend;
       if (srel & 1)
-       return bfd_reloc_outofrange;
+       return bfd_reloc_other;
       srel = srel >> 1;
       srel = (srel >> 16) & 0xff;
       x = bfd_get_16 (input_bfd, contents);
@@ -1290,7 +1290,7 @@ avr_final_link_relocate (reloc_howto_type *                   howto,
       srel = (bfd_signed_vma) relocation + rel->r_addend;
       srel = -srel;
       if (srel & 1)
-       return bfd_reloc_outofrange;
+       return bfd_reloc_other;
       srel = srel >> 1;
       x = bfd_get_16 (input_bfd, contents);
       x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
@@ -1302,7 +1302,7 @@ avr_final_link_relocate (reloc_howto_type *                   howto,
       srel = (bfd_signed_vma) relocation + rel->r_addend;
       srel = -srel;
       if (srel & 1)
-       return bfd_reloc_outofrange;
+       return bfd_reloc_other;
       srel = srel >> 1;
       srel = (srel >> 8) & 0xff;
       x = bfd_get_16 (input_bfd, contents);
@@ -1315,7 +1315,7 @@ avr_final_link_relocate (reloc_howto_type *                   howto,
       srel = (bfd_signed_vma) relocation + rel->r_addend;
       srel = -srel;
       if (srel & 1)
-       return bfd_reloc_outofrange;
+       return bfd_reloc_other;
       srel = srel >> 1;
       srel = (srel >> 16) & 0xff;
       x = bfd_get_16 (input_bfd, contents);
@@ -1327,7 +1327,7 @@ avr_final_link_relocate (reloc_howto_type *                   howto,
       contents += rel->r_offset;
       srel = (bfd_signed_vma) relocation + rel->r_addend;
       if (srel & 1)
-       return bfd_reloc_outofrange;
+       return bfd_reloc_other;
       srel = srel >> 1;
       x = bfd_get_16 (input_bfd, contents);
       x |= ((srel & 0x10000) | ((srel << 3) & 0x1f00000)) >> 16;
@@ -1355,11 +1355,11 @@ avr_final_link_relocate (reloc_howto_type *                 howto,
                    (unsigned int) reloc_addr);
 
          if (avr_stub_is_required_for_16_bit_reloc (srel - base_addr))
-           return bfd_reloc_outofrange;
+           return bfd_reloc_overflow;
        }
 
       if (srel & 1)
-       return bfd_reloc_outofrange;
+       return bfd_reloc_other;
       srel = srel >> 1;
       bfd_put_16 (input_bfd, (bfd_vma) srel &0x00ffff, contents);
       break;
@@ -1375,7 +1375,7 @@ avr_final_link_relocate (reloc_howto_type *                   howto,
       contents += rel->r_offset;
       srel = (bfd_signed_vma) relocation + rel->r_addend;
       if ((srel & 0xFFFF) < 0x40 || (srel & 0xFFFF) > 0xbf)
-       return bfd_reloc_outofrange;
+       return bfd_reloc_overflow;
       srel = srel & 0x7f;
       x = bfd_get_16 (input_bfd, contents);
       x |= (srel & 0x0f) | ((srel & 0x30) << 5) | ((srel & 0x40) << 2);
@@ -1386,7 +1386,7 @@ avr_final_link_relocate (reloc_howto_type *                   howto,
       contents += rel->r_offset;
       srel = (bfd_signed_vma) relocation + rel->r_addend;
       if ((srel & 0xffff) > 0x3f)
-       return bfd_reloc_outofrange;
+       return bfd_reloc_overflow;
       x = bfd_get_16 (input_bfd, contents);
       x = (x & 0xf9f0) | ((srel & 0x30) << 5) | (srel & 0x0f);
       bfd_put_16 (input_bfd, x, contents);
@@ -1396,7 +1396,7 @@ avr_final_link_relocate (reloc_howto_type *                   howto,
       contents += rel->r_offset;
       srel = (bfd_signed_vma) relocation + rel->r_addend;
       if ((srel & 0xffff) > 0x1f)
-       return bfd_reloc_outofrange;
+       return bfd_reloc_overflow;
       x = bfd_get_16 (input_bfd, contents);
       x = (x & 0xff07) | ((srel & 0x1f) << 3);
       bfd_put_16 (input_bfd, x, contents);
@@ -1489,8 +1489,6 @@ elf32_avr_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
 
       if (r != bfd_reloc_ok)
        {
-         const char * msg = (const char *) NULL;
-
          switch (r)
            {
            case bfd_reloc_overflow:
@@ -1505,25 +1503,29 @@ elf32_avr_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
              break;
 
            case bfd_reloc_outofrange:
-             msg = _("internal error: out of range error");
-             break;
-
-           case bfd_reloc_notsupported:
-             msg = _("internal error: unsupported relocation error");
+             /* xgettext:c-format */
+             (*info->callbacks->einfo)
+               (_("%X%H: %s against `%s':"
+                  " error: relocation applies outside section\n"),
+                input_bfd, input_section, rel->r_offset, howto->name, name);
              break;
 
-           case bfd_reloc_dangerous:
-             msg = _("internal error: dangerous relocation");
+           case bfd_reloc_other:
+             /* xgettext:c-format */
+             (*info->callbacks->einfo)
+               (_("%X%H: %s against `%s':"
+                  " error: relocation target address is odd\n"),
+                input_bfd, input_section, rel->r_offset, howto->name, name);
              break;
 
            default:
-             msg = _("internal error: unknown error");
+             /* xgettext:c-format */
+             (*info->callbacks->einfo)
+               (_("%X%H: %s against `%s':"
+                  " internal error: unexpected relocation result %d\n"),
+                input_bfd, input_section, rel->r_offset, howto->name, name, r);
              break;
            }
-
-         if (msg)
-           (*info->callbacks->warning) (info, msg, name, input_bfd,
-                                        input_section, rel->r_offset);
        }
     }
 
@@ -2520,8 +2522,9 @@ elf32_avr_relax_section (bfd *abfd,
      this section does not have relocs, or if this is not a
      code section.  */
   if (bfd_link_relocatable (link_info)
-      || (sec->flags & SEC_RELOC) == 0
       || sec->reloc_count == 0
+      || (sec->flags & SEC_RELOC) == 0
+      || (sec->flags & SEC_HAS_CONTENTS) == 0
       || (sec->flags & SEC_CODE) == 0)
     return true;
 
@@ -3214,6 +3217,13 @@ elf32_avr_get_relocated_section_contents (bfd *output_bfd,
                                                       symbols);
   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
 
+  bfd_byte *orig_data = data;
+  if (data == NULL)
+    {
+      data = bfd_malloc (input_section->size);
+      if (data == NULL)
+       return NULL;
+    }
   memcpy (data, elf_section_data (input_section)->this_hdr.contents,
          (size_t) input_section->size);
 
@@ -3283,6 +3293,8 @@ elf32_avr_get_relocated_section_contents (bfd *output_bfd,
     free (isymbuf);
   if (elf_section_data (input_section)->relocs != internal_relocs)
     free (internal_relocs);
+  if (orig_data == NULL)
+    free (data);
   return NULL;
 }
 
@@ -4205,7 +4217,7 @@ avr_elf32_load_property_records (bfd *abfd)
 
   /* Find the '.avr.prop' section and load the contents into memory.  */
   sec = bfd_get_section_by_name (abfd, AVR_PROPERTY_RECORD_SECTION_NAME);
-  if (sec == NULL)
+  if (sec == NULL || (sec->flags & SEC_HAS_CONTENTS) == 0)
     return NULL;
   return avr_elf32_load_records_from_section (abfd, sec);
 }