Make 'show width/height' display "unlimited" when capped for readline
[deliverable/binutils-gdb.git] / bfd / elf32-ip2k.c
index 1d61aa476797d36c403b2d45cce8c83fff57c625..43e7be63dad2b1e3640f159f4bee20d044ef984b 100644 (file)
@@ -1,12 +1,11 @@
 /* Ubicom IP2xxx specific support for 32-bit ELF
 /* Ubicom IP2xxx specific support for 32-bit ELF
-   Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
-   Free Software Foundation, Inc.
+   Copyright (C) 2000-2019 Free Software Foundation, Inc.
 
    This file is part of BFD, the Binary File Descriptor library.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
 
    This file is part of BFD, the Binary File Descriptor library.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
@@ -31,7 +30,7 @@ struct misc
 {
   Elf_Internal_Shdr *  symtab_hdr;
   Elf_Internal_Rela *  irelbase;
 {
   Elf_Internal_Shdr *  symtab_hdr;
   Elf_Internal_Rela *  irelbase;
-  bfd_byte *           contents;
+  bfd_byte *          contents;
   Elf_Internal_Sym *   isymbuf;
 };
 
   Elf_Internal_Sym *   isymbuf;
 };
 
@@ -127,22 +126,22 @@ static const struct ip2k_opcode ip2k_skip_opcodes[] =
 static reloc_howto_type ip2k_elf_howto_table [] =
 {
 #define IP2K_HOWTO(t,rs,s,bs,pr,bp,name,sm,dm) \
 static reloc_howto_type ip2k_elf_howto_table [] =
 {
 #define IP2K_HOWTO(t,rs,s,bs,pr,bp,name,sm,dm) \
-    HOWTO(t,                    /* type */ \
-          rs,                   /* rightshift */ \
-          s,                    /* size (0 = byte, 1 = short, 2 = long) */ \
-          bs,                   /* bitsize */ \
-          pr,                   /* pc_relative */ \
-          bp,                   /* bitpos */ \
-          complain_overflow_dont,/* complain_on_overflow */ \
-          bfd_elf_generic_reloc,/* special_function */ \
-          name,                 /* name */ \
-          FALSE,                /* partial_inplace */ \
-          sm,                   /* src_mask */ \
-          dm,                   /* dst_mask */ \
-          pr)                   /* pcrel_offset */
+    HOWTO(t,                   /* type */ \
+         rs,                   /* rightshift */ \
+         s,                    /* size (0 = byte, 1 = short, 2 = long) */ \
+         bs,                   /* bitsize */ \
+         pr,                   /* pc_relative */ \
+         bp,                   /* bitpos */ \
+         complain_overflow_dont,/* complain_on_overflow */ \
+         bfd_elf_generic_reloc,/* special_function */ \
+         name,                 /* name */ \
+         FALSE,                /* partial_inplace */ \
+         sm,                   /* src_mask */ \
+         dm,                   /* dst_mask */ \
+         pr)                   /* pcrel_offset */
 
   /* This reloc does nothing.  */
 
   /* This reloc does nothing.  */
-  IP2K_HOWTO (R_IP2K_NONE, 0,2,32, FALSE, 0, "R_IP2K_NONE", 0, 0),
+  IP2K_HOWTO (R_IP2K_NONE, 0,3,0, FALSE, 0, "R_IP2K_NONE", 0, 0),
   /* A 16 bit absolute relocation.  */
   IP2K_HOWTO (R_IP2K_16, 0,1,16, FALSE, 0, "R_IP2K_16", 0, 0xffff),
   /* A 32 bit absolute relocation.  */
   /* A 16 bit absolute relocation.  */
   IP2K_HOWTO (R_IP2K_16, 0,1,16, FALSE, 0, "R_IP2K_16", 0, 0xffff),
   /* A 32 bit absolute relocation.  */
@@ -315,30 +314,30 @@ symbol_value (bfd *abfd,
    the prologue of a switch dispatch table with fewer than
    128 entries.
 
    the prologue of a switch dispatch table with fewer than
    128 entries.
 
-          sc
-          page    $nnn0
-          jmp     $nnn0
-          add     w,wreg
-          add     pcl,w
+         sc
+         page    $nnn0
+         jmp     $nnn0
+         add     w,wreg
+         add     pcl,w
   addr=>
   addr=>
-          page    $nnn1
-          jmp     $nnn1
-          page    $nnn2
-          jmp     $nnn2
-          ...
-          page    $nnnN
-          jmp     $nnnN
+         page    $nnn1
+         jmp     $nnn1
+          page    $nnn2
+          jmp     $nnn2
+          ...
+          page    $nnnN
+          jmp     $nnnN
 
   After relaxation.
 
   After relaxation.
-          sc
-          page    $nnn0
-          jmp     $nnn0
-          add     pcl,w
+          sc
+          page    $nnn0
+          jmp     $nnn0
+          add     pcl,w
   addr=>
   addr=>
-          jmp     $nnn1
-          jmp     $nnn2
-          ...
-          jmp     $nnnN  */
+          jmp     $nnn1
+          jmp     $nnn2
+          ...
+         jmp     $nnnN  */
 
 static int
 ip2k_is_switch_table_128 (bfd *abfd ATTRIBUTE_UNUSED,
 
 static int
 ip2k_is_switch_table_128 (bfd *abfd ATTRIBUTE_UNUSED,
@@ -347,8 +346,8 @@ ip2k_is_switch_table_128 (bfd *abfd ATTRIBUTE_UNUSED,
                          bfd_byte *contents)
 {
   bfd_byte code[4];
                          bfd_byte *contents)
 {
   bfd_byte code[4];
-  int index = 0;
-  
+  int table_index = 0;
+
   /* Check current page-jmp.  */
   if (addr + 4 > sec->size)
     return -1;
   /* Check current page-jmp.  */
   if (addr + 4 > sec->size)
     return -1;
@@ -358,7 +357,7 @@ ip2k_is_switch_table_128 (bfd *abfd ATTRIBUTE_UNUSED,
   if ((! IS_PAGE_OPCODE (code + 0))
       || (! IS_JMP_OPCODE (code + 2)))
     return -1;
   if ((! IS_PAGE_OPCODE (code + 0))
       || (! IS_JMP_OPCODE (code + 2)))
     return -1;
-  
+
   /* Search back.  */
   while (1)
     {
   /* Search back.  */
   while (1)
     {
@@ -369,13 +368,13 @@ ip2k_is_switch_table_128 (bfd *abfd ATTRIBUTE_UNUSED,
       ip2k_get_mem (abfd, contents + addr - 4, 4, code);
       if ((IS_ADD_W_WREG_OPCODE (code + 0))
          && (IS_ADD_PCL_W_OPCODE (code + 2)))
       ip2k_get_mem (abfd, contents + addr - 4, 4, code);
       if ((IS_ADD_W_WREG_OPCODE (code + 0))
          && (IS_ADD_PCL_W_OPCODE (code + 2)))
-       return index;
+       return table_index;
 
       if ((! IS_PAGE_OPCODE (code + 0))
          || (! IS_JMP_OPCODE (code + 2)))
        return -1;
 
 
       if ((! IS_PAGE_OPCODE (code + 0))
          || (! IS_JMP_OPCODE (code + 2)))
        return -1;
 
-      index++;
+      table_index++;
       addr -= 4;
     }
 }
       addr -= 4;
     }
 }
@@ -385,40 +384,40 @@ ip2k_is_switch_table_128 (bfd *abfd ATTRIBUTE_UNUSED,
    256 entries but more than 127.
 
    Before relaxation.
    256 entries but more than 127.
 
    Before relaxation.
-          push    %lo8insn(label) ; Push address of table
-          push    %hi8insn(label)
-          add     w,wreg          ; index*2 => offset
-          snc                     ; CARRY SET?
-          inc     1(sp)           ; Propagate MSB into table address
-          add     2(sp),w         ; Add low bits of offset to table address
-          snc                     ; and handle any carry-out
-          inc     1(sp)
+         push    %lo8insn(label) ; Push address of table
+         push    %hi8insn(label)
+         add     w,wreg          ; index*2 => offset
+         snc                     ; CARRY SET?
+         inc     1(sp)           ; Propagate MSB into table address
+         add     2(sp),w         ; Add low bits of offset to table address
+         snc                     ; and handle any carry-out
+         inc     1(sp)
    addr=>
    addr=>
-          page    __indjmp        ; Do an indirect jump to that location
-          jmp     __indjmp
-   label:                         ; case dispatch table starts here
-          page    $nnn1
-          jmp     $nnn1
-          page    $nnn2
-          jmp     $nnn2
-          ...
-          page    $nnnN
-          jmp     $nnnN
+         page    __indjmp        ; Do an indirect jump to that location
+         jmp     __indjmp
+   label:                        ; case dispatch table starts here
+          page    $nnn1
+          jmp     $nnn1
+          page    $nnn2
+          jmp     $nnn2
+          ...
+          page    $nnnN
+          jmp     $nnnN
 
   After relaxation.
 
   After relaxation.
-          push    %lo8insn(label) ; Push address of table
-          push    %hi8insn(label)
-          add     2(sp),w         ; Add low bits of offset to table address
-          snc                     ; and handle any carry-out
-          inc     1(sp)
+         push    %lo8insn(label) ; Push address of table
+         push    %hi8insn(label)
+         add     2(sp),w         ; Add low bits of offset to table address
+         snc                     ; and handle any carry-out
+         inc     1(sp)
   addr=>
   addr=>
-          page    __indjmp        ; Do an indirect jump to that location
-          jmp     __indjmp
-   label:                         ; case dispatch table starts here
-          jmp     $nnn1
-          jmp     $nnn2
-          ...
-          jmp     $nnnN  */
+         page    __indjmp        ; Do an indirect jump to that location
+         jmp     __indjmp
+   label:                        ; case dispatch table starts here
+         jmp     $nnn1
+         jmp     $nnn2
+         ...
+         jmp     $nnnN  */
 
 static int
 ip2k_is_switch_table_256 (bfd *abfd ATTRIBUTE_UNUSED,
 
 static int
 ip2k_is_switch_table_256 (bfd *abfd ATTRIBUTE_UNUSED,
@@ -427,8 +426,8 @@ ip2k_is_switch_table_256 (bfd *abfd ATTRIBUTE_UNUSED,
                          bfd_byte *contents)
 {
   bfd_byte code[16];
                          bfd_byte *contents)
 {
   bfd_byte code[16];
-  int index = 0;
-  
+  int table_index = 0;
+
   /* Check current page-jmp.  */
   if (addr + 4 > sec->size)
     return -1;
   /* Check current page-jmp.  */
   if (addr + 4 > sec->size)
     return -1;
@@ -437,7 +436,7 @@ ip2k_is_switch_table_256 (bfd *abfd ATTRIBUTE_UNUSED,
   if ((! IS_PAGE_OPCODE (code + 0))
       || (! IS_JMP_OPCODE (code + 2)))
     return -1;
   if ((! IS_PAGE_OPCODE (code + 0))
       || (! IS_JMP_OPCODE (code + 2)))
     return -1;
-  
+
   /* Search back.  */
   while (1)
     {
   /* Search back.  */
   while (1)
     {
@@ -454,7 +453,7 @@ ip2k_is_switch_table_256 (bfd *abfd ATTRIBUTE_UNUSED,
          && (IS_INC_1SP_OPCODE (code + 10))
          && (IS_PAGE_OPCODE (code + 12))
          && (IS_JMP_OPCODE (code + 14)))
          && (IS_INC_1SP_OPCODE (code + 10))
          && (IS_PAGE_OPCODE (code + 12))
          && (IS_JMP_OPCODE (code + 14)))
-       return index;
+       return table_index;
 
       if ((IS_ADD_W_WREG_OPCODE (code + 2))
          && (IS_SNC_OPCODE (code + 4))
 
       if ((IS_ADD_W_WREG_OPCODE (code + 2))
          && (IS_SNC_OPCODE (code + 4))
@@ -463,13 +462,13 @@ ip2k_is_switch_table_256 (bfd *abfd ATTRIBUTE_UNUSED,
          && (IS_SNC_OPCODE (code + 10))
          && (IS_INC_1SP_OPCODE (code + 12))
          && (IS_JMP_OPCODE (code + 14)))
          && (IS_SNC_OPCODE (code + 10))
          && (IS_INC_1SP_OPCODE (code + 12))
          && (IS_JMP_OPCODE (code + 14)))
-       return index;
-      
+       return table_index;
+
       if ((! IS_PAGE_OPCODE (code + 0))
          || (! IS_JMP_OPCODE (code + 2)))
        return -1;
 
       if ((! IS_PAGE_OPCODE (code + 0))
          || (! IS_JMP_OPCODE (code + 2)))
        return -1;
 
-      index++;
+      table_index++;
       addr -= 4;
     }
 }
       addr -= 4;
     }
 }
@@ -516,12 +515,12 @@ ip2k_nominal_page_bits (bfd *abfd ATTRIBUTE_UNUSED,
 
       /* Found a page instruction, check if conditional.  */
       if (addr >= 2)
 
       /* Found a page instruction, check if conditional.  */
       if (addr >= 2)
-        {
+       {
          ip2k_get_mem (abfd, contents + addr - 2, 2, code);
          ip2k_get_mem (abfd, contents + addr - 2, 2, code);
-          if (IS_SKIP_OPCODE (code))
+         if (IS_SKIP_OPCODE (code))
            /* Page is conditional.  */
            continue;
            /* Page is conditional.  */
            continue;
-        }
+       }
 
       /* Unconditional page instruction => page bits should be correct.  */
       return page;
 
       /* Unconditional page instruction => page bits should be correct.  */
       return page;
@@ -577,7 +576,6 @@ adjust_all_relocations (bfd *abfd,
   Elf_Internal_Shdr *symtab_hdr;
   Elf_Internal_Sym *isymbuf, *isym, *isymend;
   unsigned int shndx;
   Elf_Internal_Shdr *symtab_hdr;
   Elf_Internal_Sym *isymbuf, *isym, *isymend;
   unsigned int shndx;
-  bfd_byte *contents;
   Elf_Internal_Rela *irel, *irelend, *irelbase;
   struct elf_link_hash_entry **sym_hashes;
   struct elf_link_hash_entry **end_hashes;
   Elf_Internal_Rela *irel, *irelend, *irelbase;
   struct elf_link_hash_entry **sym_hashes;
   struct elf_link_hash_entry **end_hashes;
@@ -589,40 +587,38 @@ adjust_all_relocations (bfd *abfd,
 
   shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
 
 
   shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
 
-  contents = elf_section_data (sec)->this_hdr.contents;
-
   irelbase = elf_section_data (sec)->relocs;
   irelend = irelbase + sec->reloc_count;
 
   for (irel = irelbase; irel < irelend; irel++)
     {
       if (ELF32_R_TYPE (irel->r_info) != R_IP2K_NONE)
   irelbase = elf_section_data (sec)->relocs;
   irelend = irelbase + sec->reloc_count;
 
   for (irel = irelbase; irel < irelend; irel++)
     {
       if (ELF32_R_TYPE (irel->r_info) != R_IP2K_NONE)
-        {
-          /* Get the value of the symbol referred to by the reloc.  */
-          if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
-            {
-              asection *sym_sec;
+       {
+         /* Get the value of the symbol referred to by the reloc.  */
+         if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
+           {
+             asection *sym_sec;
 
 
-              /* A local symbol.  */
+             /* A local symbol.  */
              isym = isymbuf + ELF32_R_SYM (irel->r_info);
              isym = isymbuf + ELF32_R_SYM (irel->r_info);
-              sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
+             sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
 
 
-              if (isym->st_shndx == shndx)
-                {
-                  bfd_vma baseaddr = BASEADDR (sec);
-                  bfd_vma symval = BASEADDR (sym_sec) + isym->st_value
-                                   + irel->r_addend;
+             if (isym->st_shndx == shndx)
+               {
+                 bfd_vma baseaddr = BASEADDR (sec);
+                 bfd_vma symval = BASEADDR (sym_sec) + isym->st_value
+                                  + irel->r_addend;
 
 
-                  if ((baseaddr + addr + noadj) <= symval
-                      && symval < (baseaddr + endaddr))
-                    irel->r_addend += count;
-                }
-            }
-        }
+                 if ((baseaddr + addr + noadj) <= symval
+                     && symval < (baseaddr + endaddr))
+                   irel->r_addend += count;
+               }
+           }
+       }
 
       /* Do this only for PC space relocations.  */
       if (addr <= irel->r_offset && irel->r_offset < endaddr)
 
       /* Do this only for PC space relocations.  */
       if (addr <= irel->r_offset && irel->r_offset < endaddr)
-        irel->r_offset += count;
+       irel->r_offset += count;
     }
 
   /* Now fix the stab relocations.  */
     }
 
   /* Now fix the stab relocations.  */
@@ -661,38 +657,33 @@ adjust_all_relocations (bfd *abfd,
              if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
                {
                  asection *sym_sec;
              if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
                {
                  asection *sym_sec;
-                 
+
                  /* A local symbol.  */
                  isym = isymbuf + ELF32_R_SYM (irel->r_info);
                  sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
                  /* A local symbol.  */
                  isym = isymbuf + ELF32_R_SYM (irel->r_info);
                  sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
-                 
+
                  if (sym_sec == sec)
                    {
                      const char *name;
                  if (sym_sec == sec)
                    {
                      const char *name;
-                     unsigned long strx;
-                     unsigned char type, other;
-                     unsigned short desc;
+                     unsigned char type;
                      bfd_vma value;
                      bfd_vma baseaddr = BASEADDR (sec);
                      bfd_vma symval = BASEADDR (sym_sec) + isym->st_value
                        + irel->r_addend;
                      bfd_vma value;
                      bfd_vma baseaddr = BASEADDR (sec);
                      bfd_vma symval = BASEADDR (sym_sec) + isym->st_value
                        + irel->r_addend;
-                     
+
                      if ((baseaddr + addr) <= symval
                          && symval <= (baseaddr + endaddr))
                        irel->r_addend += count;
 
                      /* Go hunt up a function and fix its line info if needed.  */
                      if ((baseaddr + addr) <= symval
                          && symval <= (baseaddr + endaddr))
                        irel->r_addend += count;
 
                      /* Go hunt up a function and fix its line info if needed.  */
-                     stabp = stabcontents + irel->r_offset - 8; 
+                     stabp = stabcontents + irel->r_offset - 8;
 
                      /* Go pullout the stab entry.  */
 
                      /* Go pullout the stab entry.  */
-                     strx  = bfd_h_get_32 (abfd, stabp + STRDXOFF);
                      type  = bfd_h_get_8 (abfd, stabp + TYPEOFF);
                      type  = bfd_h_get_8 (abfd, stabp + TYPEOFF);
-                     other = bfd_h_get_8 (abfd, stabp + OTHEROFF);
-                     desc  = bfd_h_get_16 (abfd, stabp + DESCOFF);
                      value = bfd_h_get_32 (abfd, stabp + VALOFF);
                      value = bfd_h_get_32 (abfd, stabp + VALOFF);
-                     
+
                      name = bfd_get_stab_name (type);
                      name = bfd_get_stab_name (type);
-                     
+
                      if (strcmp (name, "FUN") == 0)
                        {
                          int function_adjusted = 0;
                      if (strcmp (name, "FUN") == 0)
                        {
                          int function_adjusted = 0;
@@ -706,10 +697,7 @@ adjust_all_relocations (bfd *abfd,
                          for (;stabp < stabend; stabp += STABSIZE)
                            {
                              /* Go pullout the stab entry.  */
                          for (;stabp < stabend; stabp += STABSIZE)
                            {
                              /* Go pullout the stab entry.  */
-                             strx  = bfd_h_get_32 (abfd, stabp + STRDXOFF);
                              type  = bfd_h_get_8 (abfd, stabp + TYPEOFF);
                              type  = bfd_h_get_8 (abfd, stabp + TYPEOFF);
-                             other = bfd_h_get_8 (abfd, stabp + OTHEROFF);
-                             desc  = bfd_h_get_16 (abfd, stabp + DESCOFF);
                              value = bfd_h_get_32 (abfd, stabp + VALOFF);
 
                              name = bfd_get_stab_name (type);
                              value = bfd_h_get_32 (abfd, stabp + VALOFF);
 
                              name = bfd_get_stab_name (type);
@@ -721,7 +709,7 @@ adjust_all_relocations (bfd *abfd,
                                    {
                                      /* Adjust the value.  */
                                      value += count;
                                    {
                                      /* Adjust the value.  */
                                      value += count;
-                                 
+
                                      /* We need to put it back.  */
                                      bfd_h_put_32 (abfd, value,stabp + VALOFF);
                                    }
                                      /* We need to put it back.  */
                                      bfd_h_put_32 (abfd, value,stabp + VALOFF);
                                    }
@@ -782,8 +770,8 @@ adjust_all_relocations (bfd *abfd,
           || sym_hash->root.type == bfd_link_hash_defweak)
          && sym_hash->root.u.def.section == sec)
        {
           || sym_hash->root.type == bfd_link_hash_defweak)
          && sym_hash->root.u.def.section == sec)
        {
-          if (addr <= sym_hash->root.u.def.value
-              && sym_hash->root.u.def.value < endaddr)
+         if (addr <= sym_hash->root.u.def.value
+             && sym_hash->root.u.def.value < endaddr)
            sym_hash->root.u.def.value += count;
        }
     }
            sym_hash->root.u.def.value += count;
        }
     }
@@ -830,10 +818,10 @@ ip2k_delete_page_insn (bfd *abfd ATTRIBUTE_UNUSED,
   /* Delete the PAGE insn.  */
   if (!ip2k_elf_relax_delete_bytes (abfd, sec, irel->r_offset, 2))
     return FALSE;
   /* Delete the PAGE insn.  */
   if (!ip2k_elf_relax_delete_bytes (abfd, sec, irel->r_offset, 2))
     return FALSE;
-       
+
   /* Modified => will need to iterate relaxation again.  */
   *again = TRUE;
   /* Modified => will need to iterate relaxation again.  */
   *again = TRUE;
-  
+
   return TRUE;
 }
 
   return TRUE;
 }
 
@@ -848,7 +836,7 @@ ip2k_relax_switch_table_128 (bfd *abfd ATTRIBUTE_UNUSED,
   Elf_Internal_Rela *ireltest = irel;
   bfd_byte code[4];
   bfd_vma addr;
   Elf_Internal_Rela *ireltest = irel;
   bfd_byte code[4];
   bfd_vma addr;
-  
+
   /* Test all page instructions.  */
   addr = irel->r_offset;
   while (1)
   /* Test all page instructions.  */
   addr = irel->r_offset;
   while (1)
@@ -862,18 +850,18 @@ ip2k_relax_switch_table_128 (bfd *abfd ATTRIBUTE_UNUSED,
        break;
 
       /* Validate relocation entry (every entry should have a matching
        break;
 
       /* Validate relocation entry (every entry should have a matching
-          relocation entry).  */
+         relocation entry).  */
       if (ireltest >= irelend)
       if (ireltest >= irelend)
-        {
+       {
          _bfd_error_handler (_("ip2k relaxer: switch table without complete matching relocation information."));
          _bfd_error_handler (_("ip2k relaxer: switch table without complete matching relocation information."));
-          return FALSE;
-        }
+         return FALSE;
+       }
 
       if (ireltest->r_offset != addr)
 
       if (ireltest->r_offset != addr)
-        {
+       {
          _bfd_error_handler (_("ip2k relaxer: switch table without complete matching relocation information."));
          _bfd_error_handler (_("ip2k relaxer: switch table without complete matching relocation information."));
-          return FALSE;
-        }
+         return FALSE;
+       }
 
       if (! ip2k_test_page_insn (abfd, sec, ireltest, misc))
        /* Un-removable page insn => nothing can be done.  */
 
       if (! ip2k_test_page_insn (abfd, sec, ireltest, misc))
        /* Un-removable page insn => nothing can be done.  */
@@ -919,7 +907,7 @@ ip2k_relax_switch_table_256 (bfd *abfd ATTRIBUTE_UNUSED,
   Elf_Internal_Rela *ireltest = irel;
   bfd_byte code[12];
   bfd_vma addr;
   Elf_Internal_Rela *ireltest = irel;
   bfd_byte code[12];
   bfd_vma addr;
-  
+
   /* Test all page instructions.  */
   addr = irel->r_offset;
 
   /* Test all page instructions.  */
   addr = irel->r_offset;
 
@@ -935,18 +923,18 @@ ip2k_relax_switch_table_256 (bfd *abfd ATTRIBUTE_UNUSED,
        break;
 
       /* Validate relocation entry (every entry should have a matching
        break;
 
       /* Validate relocation entry (every entry should have a matching
-          relocation entry).  */
+         relocation entry).  */
       if (ireltest >= irelend)
       if (ireltest >= irelend)
-        {
-          _bfd_error_handler (_("ip2k relaxer: switch table without complete matching relocation information."));
-          return FALSE;
-        }
+       {
+         _bfd_error_handler (_("ip2k relaxer: switch table without complete matching relocation information."));
+         return FALSE;
+       }
 
       if (ireltest->r_offset != addr)
 
       if (ireltest->r_offset != addr)
-        {
-          _bfd_error_handler (_("ip2k relaxer: switch table without complete matching relocation information."));
-          return FALSE;
-        }
+       {
+         _bfd_error_handler (_("ip2k relaxer: switch table without complete matching relocation information."));
+         return FALSE;
+       }
 
       if (!ip2k_test_page_insn (abfd, sec, ireltest, misc))
        /* Un-removable page insn => nothing can be done.  */
 
       if (!ip2k_test_page_insn (abfd, sec, ireltest, misc))
        /* Un-removable page insn => nothing can be done.  */
@@ -1006,7 +994,7 @@ ip2k_elf_relax_section_page (bfd *abfd,
   Elf_Internal_Rela *irel;
   int switch_table_128;
   int switch_table_256;
   Elf_Internal_Rela *irel;
   int switch_table_128;
   int switch_table_256;
-  
+
   /* Walk thru the section looking for relaxation opportunities.  */
   for (irel = misc->irelbase; irel < irelend; irel++)
     {
   /* Walk thru the section looking for relaxation opportunities.  */
   for (irel = misc->irelbase; irel < irelend; irel++)
     {
@@ -1089,7 +1077,6 @@ ip2k_elf_relax_section (bfd *abfd,
   static bfd_boolean new_pass = FALSE;
   static bfd_boolean changed = FALSE;
   struct misc misc;
   static bfd_boolean new_pass = FALSE;
   static bfd_boolean changed = FALSE;
   struct misc misc;
-  asection *stab;
 
   /* Assume nothing changes.  */
   *again = FALSE;
 
   /* Assume nothing changes.  */
   *again = FALSE;
@@ -1109,7 +1096,7 @@ ip2k_elf_relax_section (bfd *abfd,
   /* 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.  */
   /* 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)
       || (sec->flags & SEC_RELOC) == 0
       || sec->reloc_count == 0
       || (sec->flags & SEC_CODE) == 0)
@@ -1122,18 +1109,6 @@ ip2k_elf_relax_section (bfd *abfd,
   if (internal_relocs == NULL)
     goto error_return;
 
   if (internal_relocs == NULL)
     goto error_return;
 
-  /* Make sure the stac.rela stuff gets read in.  */
-  stab = bfd_get_section_by_name (abfd, ".stab");
-
-  if (stab)
-    {
-      /* So stab does exits.  */
-      Elf_Internal_Rela * irelbase;
-
-      irelbase = _bfd_elf_link_read_relocs (abfd, stab, NULL, NULL,
-                                           link_info->keep_memory);
-    }
-
   /* Get section contents cached copy if it exists.  */
   if (contents == NULL)
     {
   /* Get section contents cached copy if it exists.  */
   if (contents == NULL)
     {
@@ -1169,9 +1144,9 @@ ip2k_elf_relax_section (bfd *abfd,
   if ((pass == 1) || (new_pass && !changed))
     {
       /* On the first pass we simply search for the lowest page that
   if ((pass == 1) || (new_pass && !changed))
     {
       /* On the first pass we simply search for the lowest page that
-         we havn't relaxed yet. Note that the pass count is reset
-         each time a page is complete in order to move on to the next page.
-         If we can't find any more pages then we are finished.  */
+        we havn't relaxed yet. Note that the pass count is reset
+        each time a page is complete in order to move on to the next page.
+        If we can't find any more pages then we are finished.  */
       if (new_pass)
        {
          pass = 1;
       if (new_pass)
        {
          pass = 1;
@@ -1206,7 +1181,7 @@ ip2k_elf_relax_section (bfd *abfd,
       if ((BASEADDR (sec) + sec->size >= page_start)
          && (BASEADDR (sec) <= page_end))
        {
       if ((BASEADDR (sec) + sec->size >= page_start)
          && (BASEADDR (sec) <= page_end))
        {
-          if (!ip2k_elf_relax_section_page (abfd, sec, &changed, &misc, page_start, page_end))
+         if (!ip2k_elf_relax_section_page (abfd, sec, &changed, &misc, page_start, page_end))
            return FALSE;
        }
       *again = TRUE;
            return FALSE;
        }
       *again = TRUE;
@@ -1256,15 +1231,24 @@ ip2k_elf_relax_section (bfd *abfd,
 
 /* Set the howto pointer for a IP2K ELF reloc.  */
 
 
 /* Set the howto pointer for a IP2K ELF reloc.  */
 
-static void
-ip2k_info_to_howto_rela (bfd * abfd ATTRIBUTE_UNUSED,
+static bfd_boolean
+ip2k_info_to_howto_rela (bfd * abfd,
                         arelent * cache_ptr,
                         Elf_Internal_Rela * dst)
 {
   unsigned int r_type;
 
   r_type = ELF32_R_TYPE (dst->r_info);
                         arelent * cache_ptr,
                         Elf_Internal_Rela * dst)
 {
   unsigned int r_type;
 
   r_type = ELF32_R_TYPE (dst->r_info);
+  if (r_type >= (unsigned int) R_IP2K_max)
+    {
+      /* xgettext:c-format */
+      _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
+                         abfd, r_type);
+      bfd_set_error (bfd_error_bad_value);
+      return FALSE;
+    }
   cache_ptr->howto = & ip2k_elf_howto_table [r_type];
   cache_ptr->howto = & ip2k_elf_howto_table [r_type];
+  return TRUE;
 }
 
 /* Perform a single relocation.
 }
 
 /* Perform a single relocation.
@@ -1272,11 +1256,11 @@ ip2k_info_to_howto_rela (bfd * abfd ATTRIBUTE_UNUSED,
 
 static bfd_reloc_status_type
 ip2k_final_link_relocate (reloc_howto_type *  howto,
 
 static bfd_reloc_status_type
 ip2k_final_link_relocate (reloc_howto_type *  howto,
-                         bfd *               input_bfd,
-                         asection *          input_section,
-                         bfd_byte *          contents,
+                         bfd *               input_bfd,
+                         asection *          input_section,
+                         bfd_byte *          contents,
                          Elf_Internal_Rela * rel,
                          Elf_Internal_Rela * rel,
-                         bfd_vma             relocation)
+                         bfd_vma             relocation)
 {
   static bfd_vma page_addr = 0;
 
 {
   static bfd_vma page_addr = 0;
 
@@ -1312,16 +1296,19 @@ ip2k_final_link_relocate (reloc_howto_type *  howto,
          /* No preceding page instruction, verify that it isn't needed.  */
          if (PAGENO (relocation + rel->r_addend) !=
              ip2k_nominal_page_bits (input_bfd, input_section,
          /* No preceding page instruction, verify that it isn't needed.  */
          if (PAGENO (relocation + rel->r_addend) !=
              ip2k_nominal_page_bits (input_bfd, input_section,
-                                     rel->r_offset, contents))
-           _bfd_error_handler (_("ip2k linker: missing page instruction at 0x%08lx (dest = 0x%08lx)."),
-                               BASEADDR (input_section) + rel->r_offset,
-                               relocation + rel->r_addend);
-        }
+                                     rel->r_offset, contents))
+           /* xgettext:c-format */
+           _bfd_error_handler
+             (_("ip2k linker: missing page instruction "
+                "at %#" PRIx64 " (dest = %#" PRIx64 ")"),
+              (uint64_t) (BASEADDR (input_section) + rel->r_offset),
+              (uint64_t) (relocation + rel->r_addend));
+       }
       else if (ip2k_relaxed)
       else if (ip2k_relaxed)
-        {
-          /* Preceding page instruction. Verify that the page instruction is
-             really needed. One reason for the relaxation to miss a page is if
-             the section is not marked as executable.  */
+       {
+         /* Preceding page instruction. Verify that the page instruction is
+            really needed. One reason for the relaxation to miss a page is if
+            the section is not marked as executable.  */
          if (!ip2k_is_switch_table_128 (input_bfd, input_section,
                                         rel->r_offset - 2, contents)
              && !ip2k_is_switch_table_256 (input_bfd, input_section,
          if (!ip2k_is_switch_table_128 (input_bfd, input_section,
                                         rel->r_offset - 2, contents)
              && !ip2k_is_switch_table_256 (input_bfd, input_section,
@@ -1329,10 +1316,13 @@ ip2k_final_link_relocate (reloc_howto_type *  howto,
              && (PAGENO (relocation + rel->r_addend) ==
                  ip2k_nominal_page_bits (input_bfd, input_section,
                                          rel->r_offset - 2, contents)))
              && (PAGENO (relocation + rel->r_addend) ==
                  ip2k_nominal_page_bits (input_bfd, input_section,
                                          rel->r_offset - 2, contents)))
-           _bfd_error_handler (_("ip2k linker: redundant page instruction at 0x%08lx (dest = 0x%08lx)."),
-                               page_addr,
-                               relocation + rel->r_addend);
-        }
+           /* xgettext:c-format */
+           _bfd_error_handler
+             (_("ip2k linker: redundant page instruction "
+                "at %#" PRIx64 " (dest = %#" PRIx64 ")"),
+              (uint64_t) page_addr,
+              (uint64_t) (relocation + rel->r_addend));
+       }
       if ((relocation & IP2K_INSN_MASK) == IP2K_INSN_VALUE)
        relocation &= ~IP2K_INSN_MASK;
       else
       if ((relocation & IP2K_INSN_MASK) == IP2K_INSN_VALUE)
        relocation &= ~IP2K_INSN_MASK;
       else
@@ -1420,19 +1410,19 @@ ip2k_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
 
   for (rel = relocs; rel < relend; rel ++)
     {
 
   for (rel = relocs; rel < relend; rel ++)
     {
-      reloc_howto_type *           howto;
-      unsigned long                r_symndx;
-      Elf_Internal_Sym *           sym;
-      asection *                   sec;
+      reloc_howto_type *          howto;
+      unsigned long               r_symndx;
+      Elf_Internal_Sym *          sym;
+      asection *                  sec;
       struct elf_link_hash_entry * h;
       struct elf_link_hash_entry * h;
-      bfd_vma                      relocation;
-      bfd_reloc_status_type        r;
-      const char *                 name = NULL;
-      int                          r_type;
+      bfd_vma                     relocation;
+      bfd_reloc_status_type       r;
+      const char *                name = NULL;
+      int                         r_type;
 
       r_type = ELF32_R_TYPE (rel->r_info);
       r_symndx = ELF32_R_SYM (rel->r_info);
 
       r_type = ELF32_R_TYPE (rel->r_info);
       r_symndx = ELF32_R_SYM (rel->r_info);
-      howto  = ip2k_elf_howto_table + ELF32_R_TYPE (rel->r_info);
+      howto  = ip2k_elf_howto_table + r_type;
       h      = NULL;
       sym    = NULL;
       sec    = NULL;
       h      = NULL;
       sym    = NULL;
       sec    = NULL;
@@ -1449,29 +1439,22 @@ ip2k_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
        }
       else
        {
        }
       else
        {
-         bfd_boolean warned;
+         bfd_boolean warned, ignored;
          bfd_boolean unresolved_reloc;
 
          RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
                                   r_symndx, symtab_hdr, sym_hashes,
                                   h, sec, relocation,
          bfd_boolean unresolved_reloc;
 
          RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
                                   r_symndx, symtab_hdr, sym_hashes,
                                   h, sec, relocation,
-                                  unresolved_reloc, warned);
+                                  unresolved_reloc, warned, ignored);
 
          name = h->root.root.string;
        }
 
 
          name = h->root.root.string;
        }
 
-      if (sec != NULL && elf_discarded_section (sec))
-       {
-         /* For relocs against symbols from removed linkonce sections,
-            or sections discarded by a linker script, we just want the
-            section contents zeroed.  Avoid any special processing.  */
-         _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-         rel->r_info = 0;
-         rel->r_addend = 0;
-         continue;
-       }
+      if (sec != NULL && discarded_section (sec))
+       RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+                                        rel, 1, relend, howto, 0, contents);
 
 
-      if (info->relocatable)
+      if (bfd_link_relocatable (info))
        continue;
 
       /* Finally, the sole IP2K-specific part.  */
        continue;
 
       /* Finally, the sole IP2K-specific part.  */
@@ -1485,13 +1468,13 @@ ip2k_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
          switch (r)
            {
            case bfd_reloc_overflow:
          switch (r)
            {
            case bfd_reloc_overflow:
-             r = info->callbacks->reloc_overflow
+             (*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:
                (info, (h ? &h->root : NULL), name, howto->name,
                 (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
              break;
 
            case bfd_reloc_undefined:
-             r = info->callbacks->undefined_symbol
+             (*info->callbacks->undefined_symbol)
                (info, name, input_bfd, input_section, rel->r_offset, TRUE);
              break;
 
                (info, name, input_bfd, input_section, rel->r_offset, TRUE);
              break;
 
@@ -1500,10 +1483,10 @@ ip2k_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
              break;
 
              /* This is how ip2k_final_link_relocate tells us of a non-kosher
              break;
 
              /* This is how ip2k_final_link_relocate tells us of a non-kosher
-                 reference between insn & data address spaces.  */
+                reference between insn & data address spaces.  */
            case bfd_reloc_notsupported:
            case bfd_reloc_notsupported:
-              if (sym != NULL) /* Only if it's not an unresolved symbol.  */
-                msg = _("unsupported relocation between data/insn address spaces");
+             if (sym != NULL) /* Only if it's not an unresolved symbol.  */
+                msg = _("unsupported relocation between data/insn address spaces");
              break;
 
            case bfd_reloc_dangerous:
              break;
 
            case bfd_reloc_dangerous:
@@ -1516,18 +1499,15 @@ ip2k_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
            }
 
          if (msg)
            }
 
          if (msg)
-           r = info->callbacks->warning
-             (info, msg, name, input_bfd, input_section, rel->r_offset);
-
-         if (! r)
-           return FALSE;
+           (*info->callbacks->warning) (info, msg, name, input_bfd,
+                                        input_section, rel->r_offset);
        }
     }
 
   return TRUE;
 }
 
        }
     }
 
   return TRUE;
 }
 
-#define TARGET_BIG_SYM  bfd_elf32_ip2k_vec
+#define TARGET_BIG_SYM  ip2k_elf32_vec
 #define TARGET_BIG_NAME  "elf32-ip2k"
 
 #define ELF_ARCH        bfd_arch_ip2k
 #define TARGET_BIG_NAME  "elf32-ip2k"
 
 #define ELF_ARCH        bfd_arch_ip2k
@@ -1538,7 +1518,7 @@ ip2k_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
 #define elf_info_to_howto_rel                  NULL
 #define elf_info_to_howto                      ip2k_info_to_howto_rela
 
 #define elf_info_to_howto_rel                  NULL
 #define elf_info_to_howto                      ip2k_info_to_howto_rela
 
-#define elf_backend_can_gc_sections            1
+#define elf_backend_can_gc_sections            1
 #define elf_backend_rela_normal                        1
 #define elf_backend_relocate_section           ip2k_elf_relocate_section
 
 #define elf_backend_rela_normal                        1
 #define elf_backend_relocate_section           ip2k_elf_relocate_section
 
This page took 0.035927 seconds and 4 git commands to generate.