gdb: fix vfork with multiple threads
[deliverable/binutils-gdb.git] / bfd / coff-alpha.c
index 75060bb2e856387b8b46536a621096f69816f5a8..15fea1fde34ff7df9d9380ac73fd6118b64bb7fd 100644 (file)
@@ -1,5 +1,5 @@
 /* BFD back-end for ALPHA Extended-Coff files.
-   Copyright (C) 1993-2018 Free Software Foundation, Inc.
+   Copyright (C) 1993-2021 Free Software Foundation, Inc.
    Modified from coff-mips.c by Steve Chamberlain <sac@cygnus.com> and
    Ian Lance Taylor <ian@cygnus.com>.
 
@@ -118,45 +118,45 @@ static reloc_howto_type alpha_howto_table[] =
         0,                     /* rightshift */
         0,                     /* size (0 = byte, 1 = short, 2 = long) */
         8,                     /* bitsize */
-        TRUE,                  /* pc_relative */
+        true,                  /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         reloc_nil,             /* special_function */
         "IGNORE",              /* name */
-        TRUE,                  /* partial_inplace */
+        true,                  /* partial_inplace */
         0,                     /* src_mask */
         0,                     /* dst_mask */
-        TRUE),                 /* pcrel_offset */
+        true),                 /* pcrel_offset */
 
   /* A 32 bit reference to a symbol.  */
   HOWTO (ALPHA_R_REFLONG,      /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         0,                     /* special_function */
         "REFLONG",             /* name */
-        TRUE,                  /* partial_inplace */
+        true,                  /* partial_inplace */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* A 64 bit reference to a symbol.  */
   HOWTO (ALPHA_R_REFQUAD,      /* type */
         0,                     /* rightshift */
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
         64,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         0,                     /* special_function */
         "REFQUAD",             /* name */
-        TRUE,                  /* partial_inplace */
+        true,                  /* partial_inplace */
         MINUS_ONE,             /* src_mask */
         MINUS_ONE,             /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* A 32 bit GP relative offset.  This is just like REFLONG except
      that when the value is used the value of the gp register will be
@@ -165,15 +165,15 @@ static reloc_howto_type alpha_howto_table[] =
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         0,                     /* special_function */
         "GPREL32",             /* name */
-        TRUE,                  /* partial_inplace */
+        true,                  /* partial_inplace */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* Used for an instruction that refers to memory off the GP
      register.  The offset is 16 bits of the 32 bit instruction.  This
@@ -182,15 +182,15 @@ static reloc_howto_type alpha_howto_table[] =
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         0,                     /* special_function */
         "LITERAL",             /* name */
-        TRUE,                  /* partial_inplace */
+        true,                  /* partial_inplace */
         0xffff,                /* src_mask */
         0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* This reloc only appears immediately following a LITERAL reloc.
      It identifies a use of the literal.  It seems that the linker can
@@ -205,15 +205,15 @@ static reloc_howto_type alpha_howto_table[] =
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         reloc_nil,             /* special_function */
         "LITUSE",              /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0,                     /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* Load the gp register.  This is always used for a ldah instruction
      which loads the upper 16 bits of the gp register.  The next reloc
@@ -230,15 +230,15 @@ static reloc_howto_type alpha_howto_table[] =
         16,                    /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
-        TRUE,                  /* pc_relative */
+        true,                  /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         reloc_nil,             /* special_function */
         "GPDISP",              /* name */
-        TRUE,                  /* partial_inplace */
+        true,                  /* partial_inplace */
         0xffff,                /* src_mask */
         0xffff,                /* dst_mask */
-        TRUE),                 /* pcrel_offset */
+        true),                 /* pcrel_offset */
 
   /* A 21 bit branch.  The native assembler generates these for
      branches within the text segment, and also fills in the PC
@@ -247,90 +247,90 @@ static reloc_howto_type alpha_howto_table[] =
         2,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         21,                    /* bitsize */
-        TRUE,                  /* pc_relative */
+        true,                  /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         0,                     /* special_function */
         "BRADDR",              /* name */
-        TRUE,                  /* partial_inplace */
+        true,                  /* partial_inplace */
         0x1fffff,              /* src_mask */
         0x1fffff,              /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* A hint for a jump to a register.  */
   HOWTO (ALPHA_R_HINT,         /* type */
         2,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         14,                    /* bitsize */
-        TRUE,                  /* pc_relative */
+        true,                  /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         0,                     /* special_function */
         "HINT",                /* name */
-        TRUE,                  /* partial_inplace */
+        true,                  /* partial_inplace */
         0x3fff,                /* src_mask */
         0x3fff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* 16 bit PC relative offset.  */
   HOWTO (ALPHA_R_SREL16,       /* type */
         0,                     /* rightshift */
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
         16,                    /* bitsize */
-        TRUE,                  /* pc_relative */
+        true,                  /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         0,                     /* special_function */
         "SREL16",              /* name */
-        TRUE,                  /* partial_inplace */
+        true,                  /* partial_inplace */
         0xffff,                /* src_mask */
         0xffff,                /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* 32 bit PC relative offset.  */
   HOWTO (ALPHA_R_SREL32,       /* type */
         0,                     /* rightshift */
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
         32,                    /* bitsize */
-        TRUE,                  /* pc_relative */
+        true,                  /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         0,                     /* special_function */
         "SREL32",              /* name */
-        TRUE,                  /* partial_inplace */
+        true,                  /* partial_inplace */
         0xffffffff,            /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* A 64 bit PC relative offset.  */
   HOWTO (ALPHA_R_SREL64,       /* type */
         0,                     /* rightshift */
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
         64,                    /* bitsize */
-        TRUE,                  /* pc_relative */
+        true,                  /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         0,                     /* special_function */
         "SREL64",              /* name */
-        TRUE,                  /* partial_inplace */
+        true,                  /* partial_inplace */
         MINUS_ONE,             /* src_mask */
         MINUS_ONE,             /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* Push a value on the reloc evaluation stack.  */
   HOWTO (ALPHA_R_OP_PUSH,      /* type */
         0,                     /* rightshift */
         0,                     /* size (0 = byte, 1 = short, 2 = long) */
         0,                     /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         0,                     /* special_function */
         "OP_PUSH",             /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0,                     /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* Store the value from the stack at the given address.  Store it in
      a bitfield of size r_size starting at bit position r_offset.  */
@@ -338,15 +338,15 @@ static reloc_howto_type alpha_howto_table[] =
         0,                     /* rightshift */
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
         64,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         0,                     /* special_function */
         "OP_STORE",            /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         MINUS_ONE,             /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* Subtract the reloc address from the value on the top of the
      relocation stack.  */
@@ -354,15 +354,15 @@ static reloc_howto_type alpha_howto_table[] =
         0,                     /* rightshift */
         0,                     /* size (0 = byte, 1 = short, 2 = long) */
         0,                     /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         0,                     /* special_function */
         "OP_PSUB",             /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0,                     /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* Shift the value on the top of the relocation stack right by the
      given value.  */
@@ -370,38 +370,38 @@ static reloc_howto_type alpha_howto_table[] =
         0,                     /* rightshift */
         0,                     /* size (0 = byte, 1 = short, 2 = long) */
         0,                     /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         0,                     /* special_function */
         "OP_PRSHIFT",          /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0,                     /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* Adjust the GP value for a new range in the object file.  */
   HOWTO (ALPHA_R_GPVALUE,      /* type */
         0,                     /* rightshift */
         0,                     /* size (0 = byte, 1 = short, 2 = long) */
         0,                     /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         0,                     /* special_function */
         "GPVALUE",             /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0,                     /* dst_mask */
-        FALSE)                 /* pcrel_offset */
+        false)                 /* pcrel_offset */
 };
 \f
 /* Recognize an Alpha ECOFF file.  */
 
-static const bfd_target *
+static bfd_cleanup
 alpha_ecoff_object_p (bfd *abfd)
 {
-  static const bfd_target *ret;
+  bfd_cleanup ret;
 
   ret = coff_object_p (abfd);
 
@@ -423,10 +423,10 @@ alpha_ecoff_object_p (bfd *abfd)
        {
          bfd_size_type size;
 
-         size = sec->line_filepos * 8;
+         size = (bfd_size_type) sec->line_filepos * 8;
          BFD_ASSERT (size == sec->size
                      || size + 8 == sec->size);
-         if (! bfd_set_section_size (abfd, sec, size))
+         if (!bfd_set_section_size (sec, size))
            return NULL;
        }
     }
@@ -436,22 +436,22 @@ alpha_ecoff_object_p (bfd *abfd)
 
 /* See whether the magic number matches.  */
 
-static bfd_boolean
+static bool
 alpha_ecoff_bad_format_hook (bfd *abfd ATTRIBUTE_UNUSED,
                             void * filehdr)
 {
   struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
 
   if (! ALPHA_ECOFF_BADMAG (*internal_f))
-    return TRUE;
+    return true;
 
   if (ALPHA_ECOFF_COMPRESSEDMAG (*internal_f))
     _bfd_error_handler
-      (_("%pB: Cannot handle compressed Alpha binaries.\n"
-        "   Use compiler flags, or objZ, to generate uncompressed binaries."),
+      (_("%pB: cannot handle compressed Alpha binaries; "
+        "use compiler flags, or objZ, to generate uncompressed binaries"),
        abfd);
 
-  return FALSE;
+  return false;
 }
 
 /* This is a hook called by coff_real_object_p to create any backend
@@ -598,9 +598,8 @@ alpha_adjust_reloc_in (bfd *abfd,
   if (intern->r_type > ALPHA_R_GPVALUE)
     {
       /* xgettext:c-format */
-      _bfd_error_handler
-       (_("%pB: unknown/unsupported relocation type %d"),
-        abfd, intern->r_type);
+      _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
+                         abfd, intern->r_type);
       bfd_set_error (bfd_error_bad_value);
       rptr->addend = 0;
       rptr->howto  = NULL;
@@ -728,30 +727,36 @@ alpha_ecoff_get_relocated_section_contents (bfd *abfd,
                                            struct bfd_link_info *link_info,
                                            struct bfd_link_order *link_order,
                                            bfd_byte *data,
-                                           bfd_boolean relocatable,
+                                           bool relocatable,
                                            asymbol **symbols)
 {
   bfd *input_bfd = link_order->u.indirect.section->owner;
   asection *input_section = link_order->u.indirect.section;
-  long reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section);
-  arelent **reloc_vector = NULL;
+  long reloc_size;
+  arelent **reloc_vector;
   long reloc_count;
   bfd *output_bfd = relocatable ? abfd : (bfd *) NULL;
   bfd_vma gp;
-  bfd_size_type sz;
-  bfd_boolean gp_undefined;
+  bool gp_undefined;
   bfd_vma stack[RELOC_STACKSIZE];
   int tos = 0;
 
+  reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section);
   if (reloc_size < 0)
-    goto error_return;
-  reloc_vector = (arelent **) bfd_malloc ((bfd_size_type) reloc_size);
-  if (reloc_vector == NULL && reloc_size != 0)
-    goto error_return;
+    return NULL;
 
-  sz = input_section->rawsize ? input_section->rawsize : input_section->size;
-  if (! bfd_get_section_contents (input_bfd, input_section, data, 0, sz))
-    goto error_return;
+  if (!bfd_get_full_section_contents (input_bfd, input_section, &data))
+    return NULL;
+
+  if (data == NULL)
+    return NULL;
+
+  if (reloc_size == 0)
+    return data;
+
+  reloc_vector = (arelent **) bfd_malloc (reloc_size);
+  if (reloc_vector == NULL)
+    return NULL;
 
   reloc_count = bfd_canonicalize_reloc (input_bfd, input_section,
                                        reloc_vector, symbols);
@@ -761,7 +766,7 @@ alpha_ecoff_get_relocated_section_contents (bfd *abfd,
     goto successful_return;
 
   /* Get the GP value for the output BFD.  */
-  gp_undefined = FALSE;
+  gp_undefined = false;
   gp = _bfd_get_gp_value (abfd);
   if (gp == 0)
     {
@@ -789,11 +794,11 @@ alpha_ecoff_get_relocated_section_contents (bfd *abfd,
        {
          struct bfd_link_hash_entry *h;
 
-         h = bfd_link_hash_lookup (link_info->hash, "_gp", FALSE, FALSE,
-                                   TRUE);
+         h = bfd_link_hash_lookup (link_info->hash, "_gp", false, false,
+                                   true);
          if (h == (struct bfd_link_hash_entry *) NULL
              || h->type != bfd_link_hash_defined)
-           gp_undefined = TRUE;
+           gp_undefined = true;
          else
            {
              gp = (h->u.def.value
@@ -1081,7 +1086,7 @@ alpha_ecoff_get_relocated_section_contents (bfd *abfd,
        case ALPHA_R_GPVALUE:
          /* I really don't know if this does the right thing.  */
          gp = rel->addend;
-         gp_undefined = FALSE;
+         gp_undefined = false;
          break;
 
        default:
@@ -1104,7 +1109,7 @@ alpha_ecoff_get_relocated_section_contents (bfd *abfd,
            case bfd_reloc_undefined:
              (*link_info->callbacks->undefined_symbol)
                (link_info, bfd_asymbol_name (*rel->sym_ptr_ptr),
-                input_bfd, input_section, rel->address, TRUE);
+                input_bfd, input_section, rel->address, true);
              break;
            case bfd_reloc_dangerous:
              (*link_info->callbacks->reloc_dangerous)
@@ -1128,13 +1133,11 @@ alpha_ecoff_get_relocated_section_contents (bfd *abfd,
     abort ();
 
  successful_return:
-  if (reloc_vector != NULL)
-    free (reloc_vector);
+  free (reloc_vector);
   return data;
 
  error_return:
-  if (reloc_vector != NULL)
-    free (reloc_vector);
+  free (reloc_vector);
   return NULL;
 }
 
@@ -1238,7 +1241,7 @@ alpha_convert_external_reloc (bfd *output_bfd ATTRIBUTE_UNUSED,
 
       /* Compute a new r_symndx value.  */
       hsec = h->root.u.def.section;
-      name = bfd_get_section_name (output_bfd, hsec->output_section);
+      name = bfd_section_name (hsec->output_section);
 
       r_symndx = (unsigned long) -1;
       switch (name[1])
@@ -1328,7 +1331,7 @@ alpha_convert_external_reloc (bfd *output_bfd ATTRIBUTE_UNUSED,
    quite similar to get_relocated_section_contents.  Perhaps they
    could be combined somehow.  */
 
-static bfd_boolean
+static bool
 alpha_relocate_section (bfd *output_bfd,
                        struct bfd_link_info *info,
                        bfd *input_bfd,
@@ -1339,7 +1342,7 @@ alpha_relocate_section (bfd *output_bfd,
   asection **symndx_to_section, *lita_sec;
   struct ecoff_link_hash_entry **sym_hashes;
   bfd_vma gp;
-  bfd_boolean gp_undefined;
+  bool gp_undefined;
   bfd_vma stack[RELOC_STACKSIZE];
   int tos = 0;
   struct external_reloc *ext_rel;
@@ -1355,7 +1358,7 @@ alpha_relocate_section (bfd *output_bfd,
       amt = NUM_RELOC_SECTIONS * sizeof (asection *);
       symndx_to_section = (asection **) bfd_alloc (input_bfd, amt);
       if (!symndx_to_section)
-       return FALSE;
+       return false;
 
       symndx_to_section[RELOC_SECTION_NONE] = NULL;
       symndx_to_section[RELOC_SECTION_TEXT] =
@@ -1444,7 +1447,7 @@ alpha_relocate_section (bfd *output_bfd,
                                               _("using multiple gp values"),
                                               (char *) NULL, output_bfd,
                                               (asection *) NULL, (bfd_vma) 0);
-                 ecoff_data (output_bfd)->issued_multiple_gp_warning = TRUE;
+                 ecoff_data (output_bfd)->issued_multiple_gp_warning = true;
                }
              if (lita_vma < gp - 0x8000)
                gp = lita_vma + lita_size - 0x8000;
@@ -1474,9 +1477,9 @@ alpha_relocate_section (bfd *output_bfd,
       int r_extern;
       int r_offset;
       int r_size;
-      bfd_boolean relocatep;
-      bfd_boolean adjust_addrp;
-      bfd_boolean gp_usedp;
+      bool relocatep;
+      bool adjust_addrp;
+      bool gp_usedp;
       bfd_vma addend;
 
       r_vaddr = H_GET_64 (input_bfd, ext_rel->r_vaddr);
@@ -1491,32 +1494,29 @@ alpha_relocate_section (bfd *output_bfd,
       r_size = ((ext_rel->r_bits[3] & RELOC_BITS3_SIZE_LITTLE)
                >> RELOC_BITS3_SIZE_SH_LITTLE);
 
-      relocatep = FALSE;
-      adjust_addrp = TRUE;
-      gp_usedp = FALSE;
+      relocatep = false;
+      adjust_addrp = true;
+      gp_usedp = false;
       addend = 0;
 
       switch (r_type)
        {
        case ALPHA_R_GPRELHIGH:
-         _bfd_error_handler
-           (_("%pB: unsupported relocation: ALPHA_R_GPRELHIGH"),
-            input_bfd);
+         _bfd_error_handler (_("%pB: %s unsupported"),
+                             input_bfd, "ALPHA_R_GPRELHIGH");
          bfd_set_error (bfd_error_bad_value);
          continue;
 
        case ALPHA_R_GPRELLOW:
-         _bfd_error_handler
-           (_("%pB: unsupported relocation: ALPHA_R_GPRELLOW"),
-            input_bfd);
+         _bfd_error_handler (_("%pB: %s unsupported"),
+                             input_bfd, "ALPHA_R_GPRELLOW");
          bfd_set_error (bfd_error_bad_value);
          continue;
 
        default:
-         _bfd_error_handler
-           /* xgettext:c-format */
-           (_("%pB: unknown relocation type %d"),
-            input_bfd, (int) r_type);
+         /* xgettext:c-format */
+         _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
+                             input_bfd, (int) r_type);
          bfd_set_error (bfd_error_bad_value);
          continue;
 
@@ -1530,13 +1530,13 @@ alpha_relocate_section (bfd *output_bfd,
          if (bfd_link_relocatable (info))
            H_PUT_64 (input_bfd, input_section->output_offset + r_vaddr,
                      ext_rel->r_vaddr);
-         adjust_addrp = FALSE;
+         adjust_addrp = false;
          break;
 
        case ALPHA_R_REFLONG:
        case ALPHA_R_REFQUAD:
        case ALPHA_R_HINT:
-         relocatep = TRUE;
+         relocatep = true;
          break;
 
        case ALPHA_R_BRADDR:
@@ -1545,7 +1545,7 @@ alpha_relocate_section (bfd *output_bfd,
        case ALPHA_R_SREL64:
          if (r_extern)
            addend += - (r_vaddr + 4);
-         relocatep = TRUE;
+         relocatep = true;
          break;
 
        case ALPHA_R_GPREL32:
@@ -1553,9 +1553,9 @@ alpha_relocate_section (bfd *output_bfd,
             bit offset from the current GP value.  We must adjust it
             by the different between the original GP value and the
             current GP value.  */
-         relocatep = TRUE;
+         relocatep = true;
          addend = ecoff_data (input_bfd)->gp - gp;
-         gp_usedp = TRUE;
+         gp_usedp = true;
          break;
 
        case ALPHA_R_LITERAL:
@@ -1586,9 +1586,9 @@ alpha_relocate_section (bfd *output_bfd,
                        || ((insn >> 26) & 0x3f) == 0x28);
          }
 
-         relocatep = TRUE;
+         relocatep = true;
          addend = ecoff_data (input_bfd)->gp - gp;
-         gp_usedp = TRUE;
+         gp_usedp = true;
          break;
 
        case ALPHA_R_LITUSE:
@@ -1652,7 +1652,7 @@ alpha_relocate_section (bfd *output_bfd,
            bfd_put_32 (input_bfd, (bfd_vma) insn2,
                        contents + r_vaddr - input_section->vma + r_symndx);
 
-           gp_usedp = TRUE;
+           gp_usedp = true;
          }
          break;
 
@@ -1695,7 +1695,7 @@ alpha_relocate_section (bfd *output_bfd,
                         relocated.  */
                      (*info->callbacks->undefined_symbol)
                        (info, h->root.root.string, input_bfd,
-                        input_section, (bfd_vma) 0, TRUE);
+                        input_section, (bfd_vma) 0, true);
                      addend = 0;
                    }
                }
@@ -1750,7 +1750,7 @@ alpha_relocate_section (bfd *output_bfd,
                }
            }
 
-         adjust_addrp = FALSE;
+         adjust_addrp = false;
          break;
 
        case ALPHA_R_OP_STORE:
@@ -1787,7 +1787,7 @@ alpha_relocate_section (bfd *output_bfd,
        case ALPHA_R_GPVALUE:
          /* I really don't know if this does the right thing.  */
          gp = ecoff_data (input_bfd)->gp + r_symndx;
-         gp_undefined = FALSE;
+         gp_undefined = false;
          break;
        }
 
@@ -1892,7 +1892,7 @@ alpha_relocate_section (bfd *output_bfd,
                    {
                      (*info->callbacks->undefined_symbol)
                        (info, h->root.root.string, input_bfd, input_section,
-                        r_vaddr - input_section->vma, TRUE);
+                        r_vaddr - input_section->vma, true);
                      relocation = 0;
                    }
                }
@@ -1932,8 +1932,7 @@ alpha_relocate_section (bfd *output_bfd,
                    if (r_extern)
                      name = sym_hashes[r_symndx]->root.root.string;
                    else
-                     name = bfd_section_name (input_bfd,
-                                              symndx_to_section[r_symndx]);
+                     name = bfd_section_name (symndx_to_section[r_symndx]);
                    (*info->callbacks->reloc_overflow)
                      (info, NULL, name, alpha_howto_table[r_type].name,
                       (bfd_vma) 0, input_bfd, input_section,
@@ -1963,20 +1962,20 @@ alpha_relocate_section (bfd *output_bfd,
          /* Only give the error once per link.  */
          gp = 4;
          _bfd_set_gp_value (output_bfd, gp);
-         gp_undefined = FALSE;
+         gp_undefined = false;
        }
     }
 
   if (tos != 0)
     abort ();
 
-  return TRUE;
+  return true;
 }
 \f
 /* Do final adjustments to the filehdr and the aouthdr.  This routine
    sets the dynamic bits in the file header.  */
 
-static bfd_boolean
+static bool
 alpha_adjust_headers (bfd *abfd,
                      struct internal_filehdr *fhdr,
                      struct internal_aouthdr *ahdr ATTRIBUTE_UNUSED)
@@ -1985,7 +1984,7 @@ alpha_adjust_headers (bfd *abfd,
     fhdr->f_flags |= F_ALPHA_CALL_SHARED;
   else if ((abfd->flags & DYNAMIC) != 0)
     fhdr->f_flags |= F_ALPHA_SHARABLE;
-  return TRUE;
+  return true;
 }
 \f
 /* Archive handling.  In OSF/1 (or Digital Unix) v3.2, Digital
@@ -2031,7 +2030,10 @@ alpha_ecoff_read_ar_hdr (bfd *abfd)
       if (bfd_seek (abfd, (file_ptr) FILHSZ, SEEK_CUR) != 0
          || bfd_bread (ab, (bfd_size_type) 8, abfd) != 8
          || bfd_seek (abfd, (file_ptr) (- (FILHSZ + 8)), SEEK_CUR) != 0)
-       return NULL;
+       {
+         free (ret);
+         return NULL;
+       }
 
       ret->parsed_size = H_GET_64 (abfd, ab);
     }
@@ -2052,6 +2054,7 @@ alpha_ecoff_get_elt_at_filepos (bfd *archive, file_ptr filepos)
   bfd_size_type size;
   bfd_byte *buf, *p;
   struct bfd_in_memory *bim;
+  ufile_ptr filesize;
 
   buf = NULL;
   nbfd = _bfd_get_elt_at_filepos (archive, filepos);
@@ -2085,6 +2088,14 @@ alpha_ecoff_get_elt_at_filepos (bfd *archive, file_ptr filepos)
     goto error_return;
   size = H_GET_64 (nbfd, ab);
 
+  /* The decompression algorithm will at most expand by eight times.  */
+  filesize = bfd_get_file_size (archive);
+  if (filesize != 0 && size / 8 > filesize)
+    {
+      bfd_set_error (bfd_error_malformed_archive);
+      goto error_return;
+    }
+
   if (size != 0)
     {
       bfd_size_type left;
@@ -2123,7 +2134,7 @@ alpha_ecoff_get_elt_at_filepos (bfd *archive, file_ptr filepos)
                n = dict[h];
              else
                {
-                 if (! bfd_bread (&n, (bfd_size_type) 1, nbfd))
+                 if (bfd_bread (&n, 1, nbfd) != 1)
                    goto error_return;
                  dict[h] = n;
                }
@@ -2152,7 +2163,7 @@ alpha_ecoff_get_elt_at_filepos (bfd *archive, file_ptr filepos)
   bim->size = size;
   bim->buffer = buf;
 
-  nbfd->mtime_set = TRUE;
+  nbfd->mtime_set = true;
   nbfd->mtime = strtol (hdr->ar_date, (char **) NULL, 10);
 
   nbfd->flags |= BFD_IN_MEMORY;
@@ -2164,8 +2175,7 @@ alpha_ecoff_get_elt_at_filepos (bfd *archive, file_ptr filepos)
   return nbfd;
 
  error_return:
-  if (buf != NULL)
-    free (buf);
+  free (buf);
   if (nbfd != NULL)
     bfd_close (nbfd);
   return NULL;
@@ -2293,8 +2303,8 @@ static const struct ecoff_backend_data alpha_ecoff_backend_data =
     alpha_ecoff_swap_coff_reloc_out,
     alpha_ecoff_swap_filehdr_out, alpha_ecoff_swap_aouthdr_out,
     alpha_ecoff_swap_scnhdr_out,
-    FILHSZ, AOUTSZ, SCNHSZ, 0, 0, 0, 0, FILNMLEN, TRUE,
-    ECOFF_NO_LONG_SECTION_NAMES, 4, FALSE, 2, 32768,
+    FILHSZ, AOUTSZ, SCNHSZ, 0, 0, 0, 0, FILNMLEN, true,
+    ECOFF_NO_LONG_SECTION_NAMES, 4, false, 2, 32768,
     alpha_ecoff_swap_filehdr_in, alpha_ecoff_swap_aouthdr_in,
     alpha_ecoff_swap_scnhdr_in, NULL,
     alpha_ecoff_bad_format_hook, _bfd_ecoff_set_arch_mach_hook,
@@ -2313,7 +2323,7 @@ static const struct ecoff_backend_data alpha_ecoff_backend_data =
   /* TRUE if the .rdata section is part of the text segment, as on the
      Alpha.  FALSE if .rdata is part of the data segment, as on the
      MIPS.  */
-  TRUE,
+  true,
   /* Bitsize of constructor entries.  */
   64,
   /* Reloc to use for constructor entries.  */
@@ -2394,10 +2404,12 @@ static const struct ecoff_backend_data alpha_ecoff_backend_data =
 #define _bfd_ecoff_bfd_gc_sections bfd_generic_gc_sections
 #define _bfd_ecoff_bfd_merge_sections bfd_generic_merge_sections
 #define _bfd_ecoff_bfd_is_group_section bfd_generic_is_group_section
+#define _bfd_ecoff_bfd_group_name bfd_generic_group_name
 #define _bfd_ecoff_bfd_discard_group bfd_generic_discard_group
 #define _bfd_ecoff_section_already_linked \
   _bfd_coff_section_already_linked
 #define _bfd_ecoff_bfd_define_common_symbol bfd_generic_define_common_symbol
+#define _bfd_ecoff_bfd_link_hide_symbol _bfd_generic_link_hide_symbol
 #define _bfd_ecoff_bfd_define_start_stop    bfd_generic_define_start_stop
 #define _bfd_ecoff_bfd_link_check_relocs    _bfd_generic_link_check_relocs
 
@@ -2415,11 +2427,13 @@ const bfd_target alpha_ecoff_le_vec =
    | HAS_LINENO | HAS_DEBUG
    | HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT | D_PAGED),
 
-  (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE | SEC_DATA),
+  (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE
+   | SEC_DATA | SEC_SMALL_DATA),
   0,                           /* leading underscore */
   ' ',                         /* ar_pad_char */
   15,                          /* ar_max_namelen */
   0,                           /* match priority.  */
+  TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
   bfd_getl64, bfd_getl_signed_64, bfd_putl64,
      bfd_getl32, bfd_getl_signed_32, bfd_putl32,
      bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
This page took 0.037338 seconds and 4 git commands to generate.