Add new port: crx-elf
[deliverable/binutils-gdb.git] / bfd / elf32-ip2k.c
index e8cb1771887ba83bc06f24bdbbc379425df4a31e..758842b837373f1e141632548bdccfe4eedc132d 100644 (file)
@@ -1,5 +1,5 @@
 /* Ubicom IP2xxx specific support for 32-bit ELF
-   Copyright 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+   Copyright 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
 
    This file is part of BFD, the Binary File Descriptor library.
 
@@ -503,7 +503,7 @@ ip2k_is_switch_table_128 (abfd, sec, addr, contents)
   int index = 0;
   
   /* Check current page-jmp.  */
-  if (addr + 4 > sec->_cooked_size)
+  if (addr + 4 > sec->size)
     return -1;
 
   ip2k_get_mem (abfd, contents + addr, 4, code);
@@ -550,7 +550,7 @@ ip2k_relax_switch_table_128 (abfd, sec, irel, again, misc)
   addr = irel->r_offset;
   while (1)
     {
-      if (addr + 4 > sec->_cooked_size)
+      if (addr + 4 > sec->size)
        break;
 
       ip2k_get_mem (abfd, misc->contents + addr, 4, code);
@@ -656,7 +656,7 @@ ip2k_is_switch_table_256 (abfd, sec, addr, contents)
   int index = 0;
   
   /* Check current page-jmp.  */
-  if (addr + 4 > sec->_cooked_size)
+  if (addr + 4 > sec->size)
     return -1;
 
   ip2k_get_mem (abfd, contents + addr, 4, code);
@@ -718,7 +718,7 @@ ip2k_relax_switch_table_256 (abfd, sec, irel, again, misc)
 
   while (1)
     {
-      if (addr + 4 > sec->_cooked_size)
+      if (addr + 4 > sec->size)
        break;
 
       ip2k_get_mem (abfd, misc->contents + addr, 4, code);
@@ -840,11 +840,6 @@ ip2k_elf_relax_section (abfd, sec, link_info, again)
       || (sec->flags & SEC_CODE) == 0)
     return TRUE;
 
-  /* If this is the first time we have been called
-      for this section, initialise the cooked size.  */
-  if (sec->_cooked_size == 0)
-    sec->_cooked_size = sec->_raw_size;
-
   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
 
   internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL,
@@ -875,12 +870,7 @@ ip2k_elf_relax_section (abfd, sec, link_info, again)
       else
        {
          /* Go get them off disk.  */
-         contents = (bfd_byte *) bfd_malloc (sec->_raw_size);
-         if (contents == NULL)
-           goto error_return;
-
-         if (! bfd_get_section_contents (abfd, sec, contents,
-                                         (file_ptr) 0, sec->_raw_size))
+         if (!bfd_malloc_and_get_section (abfd, sec, &contents))
            goto error_return;
        }
     }
@@ -917,8 +907,8 @@ ip2k_elf_relax_section (abfd, sec, link_info, again)
          search_addr = 0xFFFFFFFF;
        }
 
-      if ((BASEADDR (sec) + sec->_cooked_size < search_addr)
-         && (BASEADDR (sec) + sec->_cooked_size > page_end))
+      if ((BASEADDR (sec) + sec->size < search_addr)
+         && (BASEADDR (sec) + sec->size > page_end))
        {
          if (BASEADDR (sec) <= page_end)
            search_addr = page_end + 1;
@@ -940,7 +930,7 @@ ip2k_elf_relax_section (abfd, sec, link_info, again)
        }
 
       /* Only process sections in range.  */
-      if ((BASEADDR (sec) + sec->_cooked_size >= page_start)
+      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))
@@ -1007,7 +997,7 @@ ip2k_elf_relax_section_page (abfd, sec, again, misc, page_start, page_end)
   int switch_table_128;
   int switch_table_256;
   
-  /* Walk thru the section looking for relaxation opertunities.  */
+  /* Walk thru the section looking for relaxation opportunities.  */
   for (irel = misc->irelbase; irel < irelend; irel++)
     {
       if (ELF32_R_TYPE (irel->r_info) != (int) R_IP2K_PAGE3)
@@ -1137,6 +1127,7 @@ adjust_all_relocations (abfd, sec, addr, endaddr, count, noadj)
   if (stab)
     {
       bfd_byte *stabcontents, *stabend, *stabp;
+      bfd_size_type stab_size = stab->rawsize ? stab->rawsize : stab->size;
 
       irelbase = elf_section_data (stab)->relocs;
       irelend = irelbase + stab->reloc_count;
@@ -1146,19 +1137,18 @@ adjust_all_relocations (abfd, sec, addr, endaddr, count, noadj)
        stabcontents = elf_section_data (stab)->this_hdr.contents;
       else
        {
-         stabcontents = (bfd_byte *) bfd_alloc (abfd, stab->_raw_size);
-         if (stabcontents == NULL)
-           return;
-
-         if (! bfd_get_section_contents (abfd, stab, stabcontents,
-                                         (file_ptr) 0, stab->_raw_size))
-           return;
+         if (!bfd_malloc_and_get_section (abfd, stab, &stabcontents))
+           {
+             if (stabcontents != NULL)
+               free (stabcontents);
+             return;
+           }
 
          /* We need to remember this.  */
          elf_section_data (stab)->this_hdr.contents = stabcontents;
        }
 
-      stabend = stabcontents + stab->_raw_size;
+      stabend = stabcontents + stab_size;
 
       for (irel = irelbase; irel < irelend; irel++)
        {
@@ -1308,13 +1298,13 @@ ip2k_elf_relax_delete_bytes (abfd, sec, addr, count)
      int count;
 {
   bfd_byte *contents = elf_section_data (sec)->this_hdr.contents;
-  bfd_vma endaddr = sec->_cooked_size;
+  bfd_vma endaddr = sec->size;
 
   /* Actually delete the bytes.  */
   memmove (contents + addr, contents + addr + count,
           endaddr - addr - count);
 
-  sec->_cooked_size -= count;
+  sec->size -= count;
 
   adjust_all_relocations (abfd, sec, addr + count, endaddr, -count, 0);
   return TRUE;
@@ -1388,7 +1378,7 @@ ip2k_final_link_relocate (howto, input_bfd, input_section, contents, rel,
     case R_IP2K_ADDR16CJP:
       if (BASEADDR (input_section) + rel->r_offset != page_addr + 2)
        {
-         /* No preceeding page instruction, verify that it isn't needed.  */
+         /* 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))
@@ -1398,7 +1388,7 @@ ip2k_final_link_relocate (howto, input_bfd, input_section, contents, rel,
         }
       else if (ip2k_relaxed)
         {
-          /* Preceeding page instruction. Verify that the page instruction is
+          /* 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) &&
@@ -1535,7 +1525,10 @@ ip2k_elf_relocate_section (output_bfd, info, input_bfd, input_section,
          bfd_boolean warned;
          bfd_boolean unresolved_reloc;
 
-         RELOC_FOR_GLOBAL_SYMBOL (h, sym_hashes, r_symndx, symtab_hdr, relocation, sec, unresolved_reloc, info, warned);
+         RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
+                                  r_symndx, symtab_hdr, sym_hashes,
+                                  h, sec, relocation,
+                                  unresolved_reloc, warned);
 
          name = h->root.root.string;
        }
This page took 0.026436 seconds and 4 git commands to generate.