Fix build failure on macOS
[deliverable/binutils-gdb.git] / bfd / coff-z80.c
index fe401d77b867e28a9c4809a9c57b07f0f03157c2..4dad8387399748a5282fad755b6c3e1e5dde49b5 100644 (file)
@@ -1,12 +1,12 @@
 /* BFD back-end for Zilog Z80 COFF binaries.
 /* BFD back-end for Zilog Z80 COFF binaries.
-   Copyright 2005 Free Software Foundation, Inc.
+   Copyright (C) 2005-2019 Free Software Foundation, Inc.
    Contributed by Arnold Metselaar <arnold_m@operamail.com>
 
    This file is part of BFD, the Binary File Descriptor library.
 
    Contributed by Arnold Metselaar <arnold_m@operamail.com>
 
    This file is part of BFD, the Binary File Descriptor library.
 
-   This program is free software; you can redistribute it and/or modify 
+   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
    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,
@@ -19,8 +19,8 @@
    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
    MA 02110-1301, USA.  */
 
    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
    MA 02110-1301, USA.  */
 
-#include "bfd.h"
 #include "sysdep.h"
 #include "sysdep.h"
+#include "bfd.h"
 #include "libbfd.h"
 #include "bfdlink.h"
 #include "coff/z80.h"
 #include "libbfd.h"
 #include "bfdlink.h"
 #include "coff/z80.h"
 #define COFF_DEFAULT_SECTION_ALIGNMENT_POWER 0
 
 static reloc_howto_type r_imm32 =
 #define COFF_DEFAULT_SECTION_ALIGNMENT_POWER 0
 
 static reloc_howto_type r_imm32 =
-HOWTO (R_IMM32, 0, 1, 32, FALSE, 0,
+HOWTO (R_IMM32, 0, 2, 32, FALSE, 0,
        complain_overflow_dont, 0, "r_imm32", TRUE, 0xffffffff, 0xffffffff,
        FALSE);
 
        complain_overflow_dont, 0, "r_imm32", TRUE, 0xffffffff, 0xffffffff,
        FALSE);
 
+static reloc_howto_type r_imm24 =
+HOWTO (R_IMM24, 0, 1, 24, FALSE, 0,
+       complain_overflow_dont, 0, "r_imm24", TRUE, 0x00ffffff, 0x00ffffff,
+       FALSE);
+
 static reloc_howto_type r_imm16 =
 HOWTO (R_IMM16, 0, 1, 16, FALSE, 0,
        complain_overflow_dont, 0, "r_imm16", TRUE, 0x0000ffff, 0x0000ffff,
 static reloc_howto_type r_imm16 =
 HOWTO (R_IMM16, 0, 1, 16, FALSE, 0,
        complain_overflow_dont, 0, "r_imm16", TRUE, 0x0000ffff, 0x0000ffff,
@@ -45,12 +50,12 @@ HOWTO (R_IMM8, 0, 0, 8, FALSE, 0,
        FALSE);
 
 static reloc_howto_type r_jr =
        FALSE);
 
 static reloc_howto_type r_jr =
-HOWTO (R_JR, 0, 0, 8, TRUE, 0, 
+HOWTO (R_JR, 0, 0, 8, TRUE, 0,
        complain_overflow_signed, 0, "r_jr", FALSE, 0, 0xFF,
        FALSE);
 
 static reloc_howto_type r_off8 =
        complain_overflow_signed, 0, "r_jr", FALSE, 0, 0xFF,
        FALSE);
 
 static reloc_howto_type r_off8 =
-HOWTO (R_OFF8, 0, 0, 8, FALSE, 0, 
+HOWTO (R_OFF8, 0, 0, 8, FALSE, 0,
        complain_overflow_signed, 0,"r_off8", FALSE, 0, 0xff,
        FALSE);
 
        complain_overflow_signed, 0,"r_off8", FALSE, 0, 0xff,
        FALSE);
 
@@ -76,7 +81,7 @@ rtype2howto (arelent *internal, struct internal_reloc *dst)
   switch (dst->r_type)
     {
     default:
   switch (dst->r_type)
     {
     default:
-      abort ();
+      internal->howto = NULL;
       break;
     case R_IMM8:
       internal->howto = &r_imm8;
       break;
     case R_IMM8:
       internal->howto = &r_imm8;
@@ -84,6 +89,9 @@ rtype2howto (arelent *internal, struct internal_reloc *dst)
     case R_IMM16:
       internal->howto = &r_imm16;
       break;
     case R_IMM16:
       internal->howto = &r_imm16;
       break;
+    case R_IMM24:
+      internal->howto = &r_imm24;
+      break;
     case R_IMM32:
       internal->howto = &r_imm32;
       break;
     case R_IMM32:
       internal->howto = &r_imm32;
       break;
@@ -106,6 +114,7 @@ coff_z80_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
     {
     case BFD_RELOC_8:          return & r_imm8;
     case BFD_RELOC_16:         return & r_imm16;
     {
     case BFD_RELOC_8:          return & r_imm8;
     case BFD_RELOC_16:         return & r_imm16;
+    case BFD_RELOC_24:         return & r_imm24;
     case BFD_RELOC_32:         return & r_imm32;
     case BFD_RELOC_8_PCREL:    return & r_jr;
     case BFD_RELOC_Z80_DISP8:  return & r_off8;
     case BFD_RELOC_32:         return & r_imm32;
     case BFD_RELOC_8_PCREL:    return & r_jr;
     case BFD_RELOC_Z80_DISP8:  return & r_off8;
@@ -114,6 +123,26 @@ coff_z80_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
     }
 }
 
     }
 }
 
+static reloc_howto_type *
+coff_z80_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
+                           const char *r_name)
+{
+  if (strcasecmp (r_imm8.name, r_name) == 0)
+    return &r_imm8;
+  if (strcasecmp (r_imm16.name, r_name) == 0)
+    return &r_imm16;
+  if (strcasecmp (r_imm24.name, r_name) == 0)
+    return &r_imm24;
+  if (strcasecmp (r_imm32.name, r_name) == 0)
+    return &r_imm32;
+  if (strcasecmp (r_jr.name, r_name) == 0)
+    return &r_jr;
+  if (strcasecmp (r_off8.name, r_name) == 0)
+    return &r_off8;
+
+  return NULL;
+}
+
 /* Perform any necessary magic to the addend in a reloc entry.  */
 
 #define CALC_ADDEND(abfd, symbol, ext_reloc, cache_ptr) \
 /* Perform any necessary magic to the addend in a reloc entry.  */
 
 #define CALC_ADDEND(abfd, symbol, ext_reloc, cache_ptr) \
@@ -124,10 +153,10 @@ coff_z80_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
 
 static void
 reloc_processing (arelent *relent,
 
 static void
 reloc_processing (arelent *relent,
-                  struct internal_reloc *reloc,
-                  asymbol **symbols,
-                  bfd *abfd,
-                  asection *section)
+                 struct internal_reloc *reloc,
+                 asymbol **symbols,
+                 bfd *abfd,
+                 asection *section)
 {
   relent->address = reloc->r_vaddr;
   rtype2howto (relent, reloc);
 {
   relent->address = reloc->r_vaddr;
   rtype2howto (relent, reloc);
@@ -143,12 +172,12 @@ reloc_processing (arelent *relent,
 
 static void
 extra_case (bfd *in_abfd,
 
 static void
 extra_case (bfd *in_abfd,
-            struct bfd_link_info *link_info,
-            struct bfd_link_order *link_order,
-            arelent *reloc,
-            bfd_byte *data,
-            unsigned int *src_ptr,
-            unsigned int *dst_ptr)
+           struct bfd_link_info *link_info,
+           struct bfd_link_order *link_order,
+           arelent *reloc,
+           bfd_byte *data,
+           unsigned int *src_ptr,
+           unsigned int *dst_ptr)
 {
   asection * input_section = link_order->u.indirect.section;
   int val;
 {
   asection * input_section = link_order->u.indirect.section;
   int val;
@@ -159,21 +188,18 @@ extra_case (bfd *in_abfd,
        val = bfd_coff_reloc16_get_value (reloc, link_info,
                                           input_section);
        if (val>127 || val<-128) /* Test for overflow.  */
        val = bfd_coff_reloc16_get_value (reloc, link_info,
                                           input_section);
        if (val>127 || val<-128) /* Test for overflow.  */
-         {
-           if (! ((*link_info->callbacks->reloc_overflow)
-                  (link_info, NULL,
-                   bfd_asymbol_name (*reloc->sym_ptr_ptr),
-                   reloc->howto->name, reloc->addend, input_section->owner,
-                   input_section, reloc->address)))
-             abort ();
-         }
+         (*link_info->callbacks->reloc_overflow)
+           (link_info, NULL, bfd_asymbol_name (*reloc->sym_ptr_ptr),
+            reloc->howto->name, reloc->addend, input_section->owner,
+            input_section, reloc->address);
+
        bfd_put_8 (in_abfd, val, data + *dst_ptr);
        (*dst_ptr) += 1;
        (*src_ptr) += 1;
       break;
 
     case R_IMM8:
        bfd_put_8 (in_abfd, val, data + *dst_ptr);
        (*dst_ptr) += 1;
        (*src_ptr) += 1;
       break;
 
     case R_IMM8:
-      val = bfd_get_16 ( in_abfd, data+*src_ptr)
+      val = bfd_get_8 ( in_abfd, data+*src_ptr)
        + bfd_coff_reloc16_get_value (reloc, link_info, input_section);
       bfd_put_8 (in_abfd, val, data + *dst_ptr);
       (*dst_ptr) += 1;
        + bfd_coff_reloc16_get_value (reloc, link_info, input_section);
       bfd_put_8 (in_abfd, val, data + *dst_ptr);
       (*dst_ptr) += 1;
@@ -188,6 +214,16 @@ extra_case (bfd *in_abfd,
       (*src_ptr) += 2;
       break;
 
       (*src_ptr) += 2;
       break;
 
+    case R_IMM24:
+      val = bfd_get_16 ( in_abfd, data+*src_ptr)
+       + (bfd_get_8 ( in_abfd, data+*src_ptr+2) << 16)
+       + bfd_coff_reloc16_get_value (reloc, link_info, input_section);
+      bfd_put_16 (in_abfd, val, data + *dst_ptr);
+      bfd_put_8 (in_abfd, val >> 16, data + *dst_ptr+2);
+      (*dst_ptr) += 3;
+      (*src_ptr) += 3;
+      break;
+
     case R_IMM32:
       val = bfd_get_32 ( in_abfd, data+*src_ptr)
        + bfd_coff_reloc16_get_value (reloc, link_info, input_section);
     case R_IMM32:
       val = bfd_get_32 ( in_abfd, data+*src_ptr)
        + bfd_coff_reloc16_get_value (reloc, link_info, input_section);
@@ -200,22 +236,19 @@ extra_case (bfd *in_abfd,
       {
        bfd_vma dst = bfd_coff_reloc16_get_value (reloc, link_info,
                                                  input_section);
       {
        bfd_vma dst = bfd_coff_reloc16_get_value (reloc, link_info,
                                                  input_section);
-       bfd_vma dot = (link_order->offset
-                      + *dst_ptr
+       bfd_vma dot = (*dst_ptr
+                      + input_section->output_offset
                       + input_section->output_section->vma);
        int gap = dst - dot - 1;  /* -1, Since the offset is relative
                                     to the value of PC after reading
                                     the offset.  */
 
        if (gap >= 128 || gap < -128)
                       + input_section->output_section->vma);
        int gap = dst - dot - 1;  /* -1, Since the offset is relative
                                     to the value of PC after reading
                                     the offset.  */
 
        if (gap >= 128 || gap < -128)
-         {
-           if (! ((*link_info->callbacks->reloc_overflow)
-                  (link_info, NULL,
-                   bfd_asymbol_name (*reloc->sym_ptr_ptr),
-                   reloc->howto->name, reloc->addend, input_section->owner,
-                   input_section, reloc->address)))
-             abort ();
-         }
+         (*link_info->callbacks->reloc_overflow)
+           (link_info, NULL, bfd_asymbol_name (*reloc->sym_ptr_ptr),
+            reloc->howto->name, reloc->addend, input_section->owner,
+            input_section, reloc->address);
+
        bfd_put_8 (in_abfd, gap, data + *dst_ptr);
        (*dst_ptr)++;
        (*src_ptr)++;
        bfd_put_8 (in_abfd, gap, data + *dst_ptr);
        (*dst_ptr)++;
        (*src_ptr)++;
@@ -229,6 +262,11 @@ extra_case (bfd *in_abfd,
 
 #define coff_reloc16_extra_cases    extra_case
 #define coff_bfd_reloc_type_lookup  coff_z80_reloc_type_lookup
 
 #define coff_reloc16_extra_cases    extra_case
 #define coff_bfd_reloc_type_lookup  coff_z80_reloc_type_lookup
+#define coff_bfd_reloc_name_lookup coff_z80_reloc_name_lookup
+
+#ifndef bfd_pe_print_pdata
+#define bfd_pe_print_pdata     NULL
+#endif
 
 #include "coffcode.h"
 
 
 #include "coffcode.h"
 
@@ -239,6 +277,7 @@ extra_case (bfd *in_abfd,
 #undef  coff_bfd_relax_section
 #define coff_bfd_relax_section bfd_coff_reloc16_relax_section
 
 #undef  coff_bfd_relax_section
 #define coff_bfd_relax_section bfd_coff_reloc16_relax_section
 
-CREATE_LITTLE_COFF_TARGET_VEC (z80coff_vec, "coff-z80", 0, 0, '\0', NULL, 
+CREATE_LITTLE_COFF_TARGET_VEC (z80_coff_vec, "coff-z80", 0,
+                              SEC_CODE | SEC_DATA, '\0', NULL,
                               COFF_SWAP_TABLE)
 
                               COFF_SWAP_TABLE)
 
This page took 0.027149 seconds and 4 git commands to generate.