2001-03-20 Michael Chastain <chastain@redhat.com>
[deliverable/binutils-gdb.git] / bfd / coff-h8300.c
index 16d3aaed154bef84cde86b6c13abcbafc6c8ea87..cdbd79c8a466893e76e008de3fcb2e1f44d3fece 100644 (file)
@@ -1,5 +1,6 @@
 /* BFD back-end for Hitachi H8/300 COFF binaries.
-   Copyright 1990, 91, 92, 93, 94, 95, 96, 97, 98, 1999
+   Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+   2000
    Free Software Foundation, Inc.
    Written by Steve Chamberlain, <sac@cygnus.com>.
 
@@ -31,7 +32,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (1)
 
 /* We derive a hash table from the basic BFD hash table to
-   hold entries in the function vector.  Aside from the 
+   hold entries in the function vector.  Aside from the
    info stored by the basic hash table, we need the offset
    of a particular entry within the hash table as well as
    the offset where we'll add the next entry.  */
@@ -196,9 +197,9 @@ h8300_coff_link_hash_table_create (abfd)
    We only come here for pcrel stuff and return normally if not an -r link.
    When doing -r, we can't do any arithmetic for the pcrel stuff, because
    the code in reloc.c assumes that we can manipulate the targets of
-   the pcrel branches.  This isn't so, since the H8/300 can do relaxing, 
+   the pcrel branches.  This isn't so, since the H8/300 can do relaxing,
    which means that the gap after the instruction may not be enough to
-   contain the offset required for the branch, so we have to use the only
+   contain the offset required for the branch, so we have to use only
    the addend until the final link.  */
 
 static bfd_reloc_status_type
@@ -215,6 +216,8 @@ special (abfd, reloc_entry, symbol, data, input_section, output_bfd,
   if (output_bfd == (bfd *) NULL)
     return bfd_reloc_continue;
 
+  /* Adjust the reloc address to that in the output section.  */
+  reloc_entry->address += input_section->output_offset;
   return bfd_reloc_ok;
 }
 
@@ -437,7 +440,7 @@ h8300_reloc16_estimate (abfd, input_section, reloc, shrink, link_info)
   static asection *last_input_section = NULL;
   static arelent *last_reloc = NULL;
 
-  /* The address of the thing to be relocated will have moved back by 
+  /* The address of the thing to be relocated will have moved back by
      the size of the shrink - but we don't change reloc->address here,
      since we need it to know where the relocation lives in the source
      uncooked section.  */
@@ -448,7 +451,7 @@ h8300_reloc16_estimate (abfd, input_section, reloc, shrink, link_info)
 
   /* Only examine the relocs which might be relaxable.  */
   switch (reloc->howto->type)
-    {     
+    {
     /* This is the 16/24 bit absolute branch which could become an 8 bit
        pc-relative branch.  */
     case R_JMP1:
@@ -470,7 +473,7 @@ h8300_reloc16_estimate (abfd, input_section, reloc, shrink, link_info)
         this jump.  +128 is valid since the target will move two bytes
         closer if we do relax this branch.  */
       if ((int)gap >= -128 && (int)gap <= 128 )
-       { 
+       {
          /* It's possible we may be able to eliminate this branch entirely;
             if the previous instruction is a branch around this instruction,
             and there's no label at this instruction, then we can reverse
@@ -480,7 +483,7 @@ h8300_reloc16_estimate (abfd, input_section, reloc, shrink, link_info)
                 bCC lab1                       bCC' lab2
                 jmp lab2
                lab1:                           lab1:
-       
+
             This saves 4 bytes instead of two, and should be relatively
             common.  */
 
@@ -533,7 +536,7 @@ h8300_reloc16_estimate (abfd, input_section, reloc, shrink, link_info)
         this jump.  +128 is valid since the target will move two bytes
         closer if we do relax this branch.  */
       if ((int)gap >= -128 && (int)gap <= 128 )
-       { 
+       {
          /* Change the reloc type.  */
          reloc->howto = howto_table + 15;
 
@@ -688,8 +691,8 @@ h8300_reloc16_extra_cases (abfd, link_info, link_order, reloc, data, src_ptr,
       value = bfd_coff_reloc16_get_value (reloc, link_info, input_section);
 
       /* Get the address of the instruction (not the reloc).  */
-      dot = (link_order->offset 
-            + dst_address 
+      dot = (link_order->offset
+            + dst_address
             + link_order->u.indirect.section->output_section->vma + 1);
 
       gap = value - dot;
@@ -888,6 +891,7 @@ h8300_reloc16_extra_cases (abfd, link_info, link_order, reloc, data, src_ptr,
          /* Write it.  */
          bfd_put_8 (abfd, tmp, data + dst_address - 2);
          break;
+
        case 0x5c:
          /* bsr:16 -> bsr:8 */
          bfd_put_8 (abfd, 0x55, data + dst_address - 2);
@@ -905,7 +909,7 @@ h8300_reloc16_extra_cases (abfd, link_info, link_order, reloc, data, src_ptr,
        src_address += 2;
 
        break;
-      
+
     /* Similarly for a 24bit absolute that is now 8 bits.  */
     case R_JMPL2:
       /* Get the address of the target of this branch.  */
@@ -1076,7 +1080,7 @@ h8300_reloc16_extra_cases (abfd, link_info, link_order, reloc, data, src_ptr,
          }
 
        /* This is a jump/call through a function vector, and we're
-          expected to create the function vector ourselves. 
+          expected to create the function vector ourselves.
 
           First look up this symbol in the linker hash table -- we need
           the derived linker symbol which holds this symbol's index
@@ -1276,7 +1280,6 @@ h8300_bfd_link_add_symbols (abfd, info)
              h = funcvec_hash_lookup (h8300_coff_hash_table (info)->funcvec_hash_table,
                                       name, false, false);
 
-
              /* If this symbol isn't already in the hash table, add
                 it and bump up the size of the hash table.  */
              if (h == NULL)
This page took 0.025473 seconds and 4 git commands to generate.