* archures.c (bfd_mach_am33): Define.
[deliverable/binutils-gdb.git] / bfd / elf-m10300.c
index cd7dd5f18d890a72cf5cb113106467575fe9030a..5dbd2d6d4d79a92c111b97b52b907cdb9d93f64d 100644 (file)
@@ -1,5 +1,5 @@
 /* Matsushita 10300 specific support for 32-bit ELF
 /* Matsushita 10300 specific support for 32-bit ELF
-   Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
+   Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
 
 This file is part of BFD, the Binary File Descriptor library.
 
 
 This file is part of BFD, the Binary File Descriptor library.
 
@@ -270,7 +270,7 @@ static reloc_howto_type elf_mn10300_howto_table[] =
 
 struct mn10300_reloc_map
 {
 
 struct mn10300_reloc_map
 {
-  unsigned char bfd_reloc_val;
+  bfd_reloc_code_real_type bfd_reloc_val;
   unsigned char elf_reloc_val;
 };
 
   unsigned char elf_reloc_val;
 };
 
@@ -290,7 +290,7 @@ static const struct mn10300_reloc_map mn10300_reloc_map[] =
 
 static reloc_howto_type *
 bfd_elf32_bfd_reloc_type_lookup (abfd, code)
 
 static reloc_howto_type *
 bfd_elf32_bfd_reloc_type_lookup (abfd, code)
-     bfd *abfd;
+     bfd *abfd ATTRIBUTE_UNUSED;
      bfd_reloc_code_real_type code;
 {
   unsigned int i;
      bfd_reloc_code_real_type code;
 {
   unsigned int i;
@@ -310,7 +310,7 @@ bfd_elf32_bfd_reloc_type_lookup (abfd, code)
 
 static void
 mn10300_info_to_howto (abfd, cache_ptr, dst)
 
 static void
 mn10300_info_to_howto (abfd, cache_ptr, dst)
-     bfd *abfd;
+     bfd *abfd ATTRIBUTE_UNUSED;
      arelent *cache_ptr;
      Elf32_Internal_Rela *dst;
 {
      arelent *cache_ptr;
      Elf32_Internal_Rela *dst;
 {
@@ -385,7 +385,7 @@ mn10300_elf_check_relocs (abfd, info, sec, relocs)
 static asection *
 mn10300_elf_gc_mark_hook (abfd, info, rel, h, sym)
      bfd *abfd;
 static asection *
 mn10300_elf_gc_mark_hook (abfd, info, rel, h, sym)
      bfd *abfd;
-     struct bfd_link_info *info;
+     struct bfd_link_info *info ATTRIBUTE_UNUSED;
      Elf_Internal_Rela *rel;
      struct elf_link_hash_entry *h;
      Elf_Internal_Sym *sym;
      Elf_Internal_Rela *rel;
      struct elf_link_hash_entry *h;
      Elf_Internal_Sym *sym;
@@ -407,6 +407,9 @@ mn10300_elf_gc_mark_hook (abfd, info, rel, h, sym)
 
            case bfd_link_hash_common:
              return h->root.u.c.p->section;
 
            case bfd_link_hash_common:
              return h->root.u.c.p->section;
+
+           default:
+             break;
            }
        }
     }
            }
        }
     }
@@ -431,15 +434,15 @@ mn10300_elf_final_link_relocate (howto, input_bfd, output_bfd,
                                 addend, info, sym_sec, is_local)
      reloc_howto_type *howto;
      bfd *input_bfd;
                                 addend, info, sym_sec, is_local)
      reloc_howto_type *howto;
      bfd *input_bfd;
-     bfd *output_bfd;
+     bfd *output_bfd ATTRIBUTE_UNUSED;
      asection *input_section;
      bfd_byte *contents;
      bfd_vma offset;
      bfd_vma value;
      bfd_vma addend;
      asection *input_section;
      bfd_byte *contents;
      bfd_vma offset;
      bfd_vma value;
      bfd_vma addend;
-     struct bfd_link_info *info;
-     asection *sym_sec;
-     int is_local;
+     struct bfd_link_info *info ATTRIBUTE_UNUSED;
+     asection *sym_sec ATTRIBUTE_UNUSED;
+     int is_local ATTRIBUTE_UNUSED;
 {
   unsigned long r_type = howto->type;
   bfd_byte *hit_data = contents + offset;
 {
   unsigned long r_type = howto->type;
   bfd_byte *hit_data = contents + offset;
@@ -696,7 +699,7 @@ mn10300_elf_relocate_section (output_bfd, info, input_bfd, input_section,
 static boolean
 elf32_mn10300_finish_hash_table_entry (gen_entry, in_args)
      struct bfd_hash_entry *gen_entry;
 static boolean
 elf32_mn10300_finish_hash_table_entry (gen_entry, in_args)
      struct bfd_hash_entry *gen_entry;
-     PTR in_args;
+     PTR in_args ATTRIBUTE_UNUSED;
 {
   struct elf32_mn10300_link_hash_entry *entry;
   unsigned int byte_count = 0;
 {
   struct elf32_mn10300_link_hash_entry *entry;
   unsigned int byte_count = 0;
@@ -849,7 +852,6 @@ mn10300_elf_relax_section (abfd, sec, link_info, again)
              asection *sym_sec;
              const char *sym_name;
              char *new_name;
              asection *sym_sec;
              const char *sym_name;
              char *new_name;
-             Elf_Internal_Shdr *hdr;
 
              /* Get cached copy of section contents if it exists.  */
              if (elf_section_data (section)->this_hdr.contents != NULL)
 
              /* Get cached copy of section contents if it exists.  */
              if (elf_section_data (section)->this_hdr.contents != NULL)
@@ -941,7 +943,10 @@ mn10300_elf_relax_section (abfd, sec, link_info, again)
 
                          /* Tack on an ID so we can uniquely identify this
                             local symbol in the global hash table.  */
 
                          /* Tack on an ID so we can uniquely identify this
                             local symbol in the global hash table.  */
-                         new_name = alloca (strlen (sym_name) + 10);
+                         new_name = bfd_malloc (strlen (sym_name) + 10);
+                         if (new_name == 0)
+                           goto error_return;
+
                          sprintf (new_name, "%s_%08x", sym_name, (int)sym_sec);
                          sym_name = new_name;
 
                          sprintf (new_name, "%s_%08x", sym_name, (int)sym_sec);
                          sym_name = new_name;
 
@@ -949,6 +954,7 @@ mn10300_elf_relax_section (abfd, sec, link_info, again)
                                   elf_link_hash_lookup (&hash_table->static_hash_table->root,
                                                         sym_name, true,
                                                         true, false);
                                   elf_link_hash_lookup (&hash_table->static_hash_table->root,
                                                         sym_name, true,
                                                         true, false);
+                         free (new_name);
                        }
                      else
                        {
                        }
                      else
                        {
@@ -1018,7 +1024,10 @@ mn10300_elf_relax_section (abfd, sec, link_info, again)
 
                          /* Tack on an ID so we can uniquely identify this
                             local symbol in the global hash table.  */
 
                          /* Tack on an ID so we can uniquely identify this
                             local symbol in the global hash table.  */
-                         new_name = alloca (strlen (sym_name) + 10);
+                         new_name = bfd_malloc (strlen (sym_name) + 10);
+                         if (new_name == 0)
+                           goto error_return;
+
                          sprintf (new_name, "%s_%08x", sym_name, (int)sym_sec);
                          sym_name = new_name;
 
                          sprintf (new_name, "%s_%08x", sym_name, (int)sym_sec);
                          sym_name = new_name;
 
@@ -1026,6 +1035,7 @@ mn10300_elf_relax_section (abfd, sec, link_info, again)
                                    elf_link_hash_lookup (&hash_table->static_hash_table->root,
                                                          sym_name, true,
                                                          true, false);
                                    elf_link_hash_lookup (&hash_table->static_hash_table->root,
                                                          sym_name, true,
                                                          true, false);
+                         free (new_name);
                          compute_function_info (input_bfd, hash,
                                                 isym.st_value, contents);
                        }
                          compute_function_info (input_bfd, hash,
                                                 isym.st_value, contents);
                        }
@@ -1185,7 +1195,6 @@ mn10300_elf_relax_section (abfd, sec, link_info, again)
                  struct elf32_mn10300_link_hash_entry *sym_hash;
                  asection *sym_sec;
                  const char *sym_name;
                  struct elf32_mn10300_link_hash_entry *sym_hash;
                  asection *sym_sec;
                  const char *sym_name;
-                 Elf_Internal_Shdr *hdr;
                  char *new_name;
 
                  bfd_elf32_swap_symbol_in (input_bfd, esym, &isym);
                  char *new_name;
 
                  bfd_elf32_swap_symbol_in (input_bfd, esym, &isym);
@@ -1209,7 +1218,9 @@ mn10300_elf_relax_section (abfd, sec, link_info, again)
 
                  /* Tack on an ID so we can uniquely identify this
                     local symbol in the global hash table.  */
 
                  /* Tack on an ID so we can uniquely identify this
                     local symbol in the global hash table.  */
-                 new_name = alloca (strlen (sym_name) + 10);
+                 new_name = bfd_malloc (strlen (sym_name) + 10);
+                 if (new_name == 0)
+                   goto error_return;
                  sprintf (new_name, "%s_%08x", sym_name, (int)sym_sec);
                  sym_name = new_name;
 
                  sprintf (new_name, "%s_%08x", sym_name, (int)sym_sec);
                  sym_name = new_name;
 
@@ -1218,6 +1229,7 @@ mn10300_elf_relax_section (abfd, sec, link_info, again)
                                                  sym_name, false,
                                                  false, false);
 
                                                  sym_name, false,
                                                  false, false);
 
+                 free (new_name);
                  if (sym_hash == NULL)
                    continue;
 
                  if (sym_hash == NULL)
                    continue;
 
@@ -1450,7 +1462,6 @@ mn10300_elf_relax_section (abfd, sec, link_info, again)
        {
          Elf_Internal_Sym isym;
          asection *sym_sec;
        {
          Elf_Internal_Sym isym;
          asection *sym_sec;
-         Elf_Internal_Shdr *hdr;
          const char *sym_name;
          char *new_name;
 
          const char *sym_name;
          char *new_name;
 
@@ -1477,13 +1488,16 @@ mn10300_elf_relax_section (abfd, sec, link_info, again)
 
          /* Tack on an ID so we can uniquely identify this
             local symbol in the global hash table.  */
 
          /* Tack on an ID so we can uniquely identify this
             local symbol in the global hash table.  */
-         new_name = alloca (strlen (sym_name) + 10);
+         new_name = bfd_malloc (strlen (sym_name) + 10);
+         if (new_name == 0)
+           goto error_return;
          sprintf (new_name, "%s_%08x", sym_name, (int)sym_sec);
          sym_name = new_name;
 
          h = (struct elf32_mn10300_link_hash_entry *)
                elf_link_hash_lookup (&hash_table->static_hash_table->root,
                                      sym_name, false, false, false);
          sprintf (new_name, "%s_%08x", sym_name, (int)sym_sec);
          sym_name = new_name;
 
          h = (struct elf32_mn10300_link_hash_entry *)
                elf_link_hash_lookup (&hash_table->static_hash_table->root,
                                      sym_name, false, false, false);
+         free (new_name);
        }
       else
        {
        }
       else
        {
@@ -1889,7 +1903,6 @@ mn10300_elf_relax_section (abfd, sec, link_info, again)
          *again = true;
        }
 
          *again = true;
        }
 
-      /* start-sanitize-am33 */
       /* Try to turn a 24 immediate, displacement or absolute address
         into a 8 immediate, displacement or absolute address.  */
       if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_24)
       /* Try to turn a 24 immediate, displacement or absolute address
         into a 8 immediate, displacement or absolute address.  */
       if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_24)
@@ -1949,7 +1962,7 @@ mn10300_elf_relax_section (abfd, sec, link_info, again)
 
                          /* Delete two bytes of data.  */
                          if (!mn10300_elf_relax_delete_bytes (abfd, sec,
 
                          /* Delete two bytes of data.  */
                          if (!mn10300_elf_relax_delete_bytes (abfd, sec,
-                                                              irel->r_offset + 3, 2))
+                                                              irel->r_offset + 1, 2))
                            goto error_return;
 
                          /* That will change things, so, we should relax
                            goto error_return;
 
                          /* That will change things, so, we should relax
@@ -1963,7 +1976,6 @@ mn10300_elf_relax_section (abfd, sec, link_info, again)
                }
            }
        }
                }
            }
        }
-      /* end-sanitize-am33 */
 
       /* Try to turn a 32bit immediate, displacement or absolute address
         into a 16bit immediate, displacement or absolute address.  */
 
       /* Try to turn a 32bit immediate, displacement or absolute address
         into a 16bit immediate, displacement or absolute address.  */
@@ -1972,7 +1984,6 @@ mn10300_elf_relax_section (abfd, sec, link_info, again)
          bfd_vma value = symval;
          value += irel->r_addend;
 
          bfd_vma value = symval;
          value += irel->r_addend;
 
-         /* start-sanitize-am33 */
          /* See if the value will fit in 24 bits.
             We allow any 16bit match here.  We prune those we can't
             handle below.  */
          /* See if the value will fit in 24 bits.
             We allow any 16bit match here.  We prune those we can't
             handle below.  */
@@ -1992,9 +2003,13 @@ mn10300_elf_relax_section (abfd, sec, link_info, again)
                  code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
 
                  /* All the am33 32 -> 24 relaxing possibilities.  */
                  code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
 
                  /* All the am33 32 -> 24 relaxing possibilities.  */
-                 if ((code & 0x0f) == 0x09 || (code & 0x0f) == 0x08
-                     || (code & 0x0f) == 0x0a || (code & 0x0f) == 0x0b
-                     || (code & 0x0f) == 0x0e)
+                 /* We can not relax 0x6b, 0x7b, 0x8b, 0x9b as no 24bit
+                    equivalent instructions exists.  */
+                 if (code != 0x6b && code != 0x7b
+                     && code != 0x8b && code != 0x9b
+                     && ((code & 0x0f) == 0x09 || (code & 0x0f) == 0x08
+                         || (code & 0x0f) == 0x0a || (code & 0x0f) == 0x0b
+                         || (code & 0x0f) == 0x0e))
                    {
                      /* Not safe if the high bit is on as relaxing may
                         move the value out of high mem and thus not fit
                    {
                      /* Not safe if the high bit is on as relaxing may
                         move the value out of high mem and thus not fit
@@ -2037,7 +2052,6 @@ mn10300_elf_relax_section (abfd, sec, link_info, again)
 
                }
            }
 
                }
            }
-         /* end-sanitize-am33 */
 
          /* See if the value will fit in 16 bits.
             We allow any 16bit match here.  We prune those we can't
 
          /* See if the value will fit in 16 bits.
             We allow any 16bit match here.  We prune those we can't
@@ -2460,7 +2474,6 @@ compute_function_info (abfd, hash, addr, contents)
       if (hash->movm_args & 0x08)
        hash->movm_stack_size += 8 * 4;
 
       if (hash->movm_args & 0x08)
        hash->movm_stack_size += 8 * 4;
 
-      /* start-sanitize-am33 */
       if (bfd_get_mach (abfd) == bfd_mach_am33)
        {
          /* "exother" space.  e0, e1, mdrq, mcrh, mcrl, mcvf */
       if (bfd_get_mach (abfd) == bfd_mach_am33)
        {
          /* "exother" space.  e0, e1, mdrq, mcrh, mcrl, mcvf */
@@ -2475,7 +2488,6 @@ compute_function_info (abfd, hash, addr, contents)
          if (hash->movm_args & 0x4)
            hash->movm_stack_size += 2 * 4;
        }
          if (hash->movm_args & 0x4)
            hash->movm_stack_size += 2 * 4;
        }
-      /* end-sanitize-am33 */
     }
 
   /* Now look for the two stack adjustment variants.  */
     }
 
   /* Now look for the two stack adjustment variants.  */
@@ -2867,10 +2879,8 @@ elf_mn10300_mach (flags)
       default:
         return bfd_mach_mn10300;
 
       default:
         return bfd_mach_mn10300;
 
-      /* start-sanitize-am33 */
       case E_MN10300_MACH_AM33:
         return bfd_mach_am33;
       case E_MN10300_MACH_AM33:
         return bfd_mach_am33;
-      /* end-sanitize-am33 */
     }
 }
 
     }
 }
 
@@ -2882,13 +2892,9 @@ elf_mn10300_mach (flags)
 void
 _bfd_mn10300_elf_final_write_processing (abfd, linker)
      bfd *abfd;
 void
 _bfd_mn10300_elf_final_write_processing (abfd, linker)
      bfd *abfd;
-     boolean linker;
+     boolean linker ATTRIBUTE_UNUSED;
 {
   unsigned long val;
 {
   unsigned long val;
-  unsigned int i;
-  Elf_Internal_Shdr **hdrpp;
-  const char *name;
-  asection *sec;
 
   switch (bfd_get_mach (abfd))
     {
 
   switch (bfd_get_mach (abfd))
     {
@@ -2897,11 +2903,9 @@ _bfd_mn10300_elf_final_write_processing (abfd, linker)
        val = E_MN10300_MACH_MN10300;
        break;
 
        val = E_MN10300_MACH_MN10300;
        break;
 
-      /* start-sanitize-am33 */
       case bfd_mach_am33:
        val = E_MN10300_MACH_AM33;
        break;
       case bfd_mach_am33:
        val = E_MN10300_MACH_AM33;
        break;
-      /* end-sanitize-am33 */
     }
 
   elf_elfheader (abfd)->e_flags &= ~ (EF_MN10300_MACH);
     }
 
   elf_elfheader (abfd)->e_flags &= ~ (EF_MN10300_MACH);
This page took 0.030276 seconds and 4 git commands to generate.