]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - bfd/stabs.c
[PATCH] fix windmc typedef bug
[thirdparty/binutils-gdb.git] / bfd / stabs.c
index 25fae29ccc76331ae1272461729e423207157765..81ef1deb4a6ad589f0b38e4bacef31a7f955af65 100644 (file)
@@ -1,13 +1,12 @@
 /* Stabs in sections linking support.
-   Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
-   Free Software Foundation, Inc.
+   Copyright (C) 1996-2020 Free Software Foundation, Inc.
    Written by Ian Lance Taylor, Cygnus Support.
 
    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,
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
+   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
 
 /* This file contains support for linking stabs in sections, as used
    on COFF and ELF.  */
 
-#include "bfd.h"
 #include "sysdep.h"
+#include "bfd.h"
 #include "libbfd.h"
 #include "aout/stab_gnu.h"
 #include "safe-ctype.h"
@@ -125,8 +126,8 @@ stab_link_includes_newfunc (struct bfd_hash_entry *entry,
   /* Allocate the structure if it has not already been allocated by a
      subclass.  */
   if (ret == NULL)
-    ret = bfd_hash_allocate (table,
-                            sizeof (struct stab_link_includes_entry));
+    ret = (struct stab_link_includes_entry *)
+       bfd_hash_allocate (table, sizeof (struct stab_link_includes_entry));
   if (ret == NULL)
     return NULL;
 
@@ -175,10 +176,8 @@ _bfd_link_section_stabs (bfd *abfd,
        prepared to handle them.  */
     return TRUE;
 
-  if ((stabsec->output_section != NULL
-       && bfd_is_abs_section (stabsec->output_section))
-      || (stabstrsec->output_section != NULL
-         && bfd_is_abs_section (stabstrsec->output_section)))
+  if (bfd_is_abs_section (stabsec->output_section)
+      || bfd_is_abs_section (stabstrsec->output_section))
     /* At least one of the sections is being discarded from the
        link, so we should just ignore them.  */
     return TRUE;
@@ -187,6 +186,8 @@ _bfd_link_section_stabs (bfd *abfd,
 
   if (sinfo->stabstr == NULL)
     {
+      flagword flags;
+
       /* Initialize the stabs information we need to keep track of.  */
       first = TRUE;
       sinfo->strings = _bfd_stringtab_init ();
@@ -195,13 +196,15 @@ _bfd_link_section_stabs (bfd *abfd,
       /* Make sure the first byte is zero.  */
       (void) _bfd_stringtab_add (sinfo->strings, "", TRUE, TRUE);
       if (! bfd_hash_table_init (&sinfo->includes,
-                                stab_link_includes_newfunc))
+                                stab_link_includes_newfunc,
+                                sizeof (struct stab_link_includes_entry)))
        goto error_return;
-      sinfo->stabstr = bfd_make_section_anyway (abfd, ".stabstr");
+      flags = (SEC_HAS_CONTENTS | SEC_READONLY | SEC_DEBUGGING
+              | SEC_LINKER_CREATED);
+      sinfo->stabstr = bfd_make_section_anyway_with_flags (abfd, ".stabstr",
+                                                          flags);
       if (sinfo->stabstr == NULL)
        goto error_return;
-      sinfo->stabstr->flags |= (SEC_HAS_CONTENTS | SEC_READONLY
-                               | SEC_DEBUGGING | SEC_LINKER_CREATED);
     }
 
   /* Initialize the information we are going to store for this .stab
@@ -271,8 +274,9 @@ _bfd_link_section_stabs (bfd *abfd,
       symstroff = stroff + bfd_get_32 (abfd, sym + STRDXOFF);
       if (symstroff >= stabstrsec->size)
        {
-         (*_bfd_error_handler)
-           (_("%B(%A+0x%lx): Stabs entry has invalid string index."),
+         _bfd_error_handler
+           /* xgettext:c-format */
+           (_("%pB(%pA+%#lx): stabs entry has invalid string index"),
             abfd, stabsec, (long) (sym - stabbuf));
          bfd_set_error (bfd_error_bad_value);
          goto error_return;
@@ -333,7 +337,7 @@ _bfd_link_section_stabs (bfd *abfd,
                      if (num_chars >= buf_len)
                        {
                          buf_len += 32 * 1024;
-                         symb = bfd_realloc (symb, buf_len);
+                         symb = (char *) bfd_realloc_or_free (symb, buf_len);
                          if (symb == NULL)
                            goto error_return;
                          symb_rover = symb + num_chars;
@@ -371,7 +375,7 @@ _bfd_link_section_stabs (bfd *abfd,
          /* Record this symbol, so that we can set the value
             correctly.  */
          amt = sizeof *ne;
-         ne = bfd_alloc (abfd, amt);
+         ne = (struct stab_excl_list *) bfd_alloc (abfd, amt);
          if (ne == NULL)
            goto error_return;
          ne->offset = sym - stabbuf;
@@ -384,12 +388,14 @@ _bfd_link_section_stabs (bfd *abfd,
            {
              /* This is the first time we have seen this header file
                 with this set of stabs strings.  */
-             t = bfd_hash_allocate (&sinfo->includes, sizeof *t);
+             t = (struct stab_link_includes_totals *)
+                 bfd_hash_allocate (&sinfo->includes, sizeof *t);
              if (t == NULL)
                goto error_return;
              t->sum_chars = sum_chars;
              t->num_chars = num_chars;
-             t->symb = bfd_realloc (symb, num_chars); /* Trim data down.  */
+             /* Trim data down.  */
+             t->symb = symb = (char *) bfd_realloc_or_free (symb, num_chars);
              t->next = incl_entry->totals;
              incl_entry->totals = t;
            }
@@ -429,7 +435,7 @@ _bfd_link_section_stabs (bfd *abfd,
                    ++nest;
                  else if (incl_type == (int) N_EXCL)
                    /* Keep existing exclusion marks.  */
-                   continue;   
+                   continue;
                  else if (nest == 0)
                    {
                      *incl_pstridx = (bfd_size_type) -1;
@@ -454,8 +460,8 @@ _bfd_link_section_stabs (bfd *abfd,
      for that section.  */
   stabsec->size = (count - skip) * STABSIZE;
   if (stabsec->size == 0)
-    stabsec->flags |= SEC_EXCLUDE;
-  stabstrsec->flags |= SEC_EXCLUDE;
+    stabsec->flags |= SEC_EXCLUDE | SEC_KEEP;
+  stabstrsec->flags |= SEC_EXCLUDE | SEC_KEEP;
   sinfo->stabstr->size = _bfd_stringtab_size (sinfo->strings);
 
   /* Calculate the `cumulative_skips' array now that stabs have been
@@ -467,7 +473,7 @@ _bfd_link_section_stabs (bfd *abfd,
       bfd_size_type *pskips;
 
       amt = count * sizeof (bfd_size_type);
-      secinfo->cumulative_skips = bfd_alloc (abfd, amt);
+      secinfo->cumulative_skips = (bfd_size_type *) bfd_alloc (abfd, amt);
       if (secinfo->cumulative_skips == NULL)
        goto error_return;
 
@@ -488,10 +494,8 @@ _bfd_link_section_stabs (bfd *abfd,
   return TRUE;
 
  error_return:
-  if (stabbuf != NULL)
-    free (stabbuf);
-  if (stabstrbuf != NULL)
-    free (stabstrbuf);
+  free (stabbuf);
+  free (stabstrbuf);
   return FALSE;
 }
 \f
@@ -531,7 +535,7 @@ _bfd_discard_section_stabs (bfd *abfd,
        link, so we should just ignore them.  */
     return FALSE;
 
-  /* We should have initialized our data in _bfd_link_stab_sections.
+  /* We should have initialized our data in _bfd_link_section_stabs.
      If there was some bizarre error reading the string sections, though,
      we might not have.  Bail rather than asserting.  */
   if (psecinfo == NULL)
@@ -607,7 +611,7 @@ _bfd_discard_section_stabs (bfd *abfd,
   /* Shrink the stabsec as needed.  */
   stabsec->size -= skip * STABSIZE;
   if (stabsec->size == 0)
-    stabsec->flags |= SEC_EXCLUDE;
+    stabsec->flags |= SEC_EXCLUDE | SEC_KEEP;
 
   /* Recalculate the `cumulative_skips' array now that stabs have been
      deleted for this section.  */
@@ -620,7 +624,7 @@ _bfd_discard_section_stabs (bfd *abfd,
       if (secinfo->cumulative_skips == NULL)
        {
          amt = count * sizeof (bfd_size_type);
-         secinfo->cumulative_skips = bfd_alloc (abfd, amt);
+         secinfo->cumulative_skips = (bfd_size_type *) bfd_alloc (abfd, amt);
          if (secinfo->cumulative_skips == NULL)
            goto error_return;
        }
@@ -642,8 +646,7 @@ _bfd_discard_section_stabs (bfd *abfd,
   return skip > 0;
 
  error_return:
-  if (stabbuf != NULL)
-    free (stabbuf);
+  free (stabbuf);
   return FALSE;
 }