]> 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 62bac2da910833e02e1fd30aa67a321986491ec1..81ef1deb4a6ad589f0b38e4bacef31a7f955af65 100644 (file)
@@ -1,13 +1,12 @@
 /* Stabs in sections linking support.
-   Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
-   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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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"
    the string table for this unit, and the desc field is the number of
    stabs symbols for this unit.  */
 
-#define STRDXOFF (0)
-#define TYPEOFF (4)
-#define OTHEROFF (5)
-#define DESCOFF (6)
-#define VALOFF (8)
-#define STABSIZE (12)
-
-/* A hash table used for header files with N_BINCL entries.  */
-
-struct stab_link_includes_table
-{
-  struct bfd_hash_table root;
-};
+#define STRDXOFF  0
+#define TYPEOFF   4
+#define OTHEROFF  5
+#define DESCOFF   6
+#define VALOFF    8
+#define STABSIZE  12
 
 /* A linked list of totals that we have found for a particular header
    file.  A total is a unique identifier for a particular BINCL...EINCL
@@ -80,12 +74,6 @@ struct stab_link_includes_entry
   struct stab_link_includes_totals *totals;
 };
 
-/* Look up an entry in an the header file hash table.  */
-
-#define stab_link_includes_lookup(table, string, create, copy) \
-  ((struct stab_link_includes_entry *) \
-   bfd_hash_lookup (&(table)->root, (string), (create), (copy)))
-
 /* This structure is used to hold a list of N_BINCL symbols, some of
    which might be converted into N_EXCL symbols.  */
 
@@ -124,50 +112,31 @@ struct stab_section_info
   bfd_size_type stridxs[1];
 };
 
-/* This structure is used to keep track of stabs in sections
-   information while linking.  */
-
-struct stab_info
-{
-  /* A hash table used to hold stabs strings.  */
-  struct bfd_strtab_hash *strings;
-  /* The header file hash table.  */
-  struct stab_link_includes_table includes;
-  /* The first .stabstr section.  */
-  asection *stabstr;
-};
-
-static struct bfd_hash_entry *stab_link_includes_newfunc
-  PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
 \f
 /* The function to create a new entry in the header file hash table.  */
 
 static struct bfd_hash_entry *
-stab_link_includes_newfunc (entry, table, string)
-     struct bfd_hash_entry *entry;
-     struct bfd_hash_table *table;
-     const char *string;
+stab_link_includes_newfunc (struct bfd_hash_entry *entry,
+                           struct bfd_hash_table *table,
+                           const char *string)
 {
   struct stab_link_includes_entry *ret =
     (struct stab_link_includes_entry *) entry;
 
   /* Allocate the structure if it has not already been allocated by a
      subclass.  */
-  if (ret == (struct stab_link_includes_entry *) NULL)
-    ret = ((struct stab_link_includes_entry *)
-          bfd_hash_allocate (table,
-                             sizeof (struct stab_link_includes_entry)));
-  if (ret == (struct stab_link_includes_entry *) NULL)
-    return (struct bfd_hash_entry *) ret;
+  if (ret == NULL)
+    ret = (struct stab_link_includes_entry *)
+       bfd_hash_allocate (table, sizeof (struct stab_link_includes_entry));
+  if (ret == NULL)
+    return NULL;
 
   /* Call the allocation method of the superclass.  */
   ret = ((struct stab_link_includes_entry *)
         bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string));
   if (ret)
-    {
-      /* Set local fields.  */
-      ret->totals = NULL;
-    }
+    /* Set local fields.  */
+    ret->totals = NULL;
 
   return (struct bfd_hash_entry *) ret;
 }
@@ -176,16 +145,14 @@ stab_link_includes_newfunc (entry, table, string)
    pass of the linker.  */
 
 bfd_boolean
-_bfd_link_section_stabs (abfd, psinfo, stabsec, stabstrsec, psecinfo, pstring_offset)
-     bfd *abfd;
-     PTR *psinfo;
-     asection *stabsec;
-     asection *stabstrsec;
-     PTR *psecinfo;
-     bfd_size_type *pstring_offset;
+_bfd_link_section_stabs (bfd *abfd,
+                        struct stab_info *sinfo,
+                        asection *stabsec,
+                        asection *stabstrsec,
+                        void * *psecinfo,
+                        bfd_size_type *pstring_offset)
 {
   bfd_boolean first;
-  struct stab_info *sinfo;
   bfd_size_type count, amt;
   struct stab_section_info *secinfo;
   bfd_byte *stabbuf = NULL;
@@ -196,64 +163,52 @@ _bfd_link_section_stabs (abfd, psinfo, stabsec, stabstrsec, psecinfo, pstring_of
 
   if (stabsec->size == 0
       || stabstrsec->size == 0)
-    {
-      /* This file does not contain stabs debugging information.  */
-      return TRUE;
-    }
+    /* This file does not contain stabs debugging information.  */
+    return TRUE;
 
   if (stabsec->size % STABSIZE != 0)
-    {
-      /* Something is wrong with the format of these stab symbols.
-        Don't try to optimize them.  */
-      return TRUE;
-    }
+    /* Something is wrong with the format of these stab symbols.
+       Don't try to optimize them.  */
+    return TRUE;
 
   if ((stabstrsec->flags & SEC_RELOC) != 0)
-    {
-      /* We shouldn't see relocations in the strings, and we aren't
-        prepared to handle them.  */
-      return TRUE;
-    }
+    /* We shouldn't see relocations in the strings, and we aren't
+       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)))
-    {
-      /* At least one of the sections is being discarded from the
-        link, so we should just ignore them.  */
-      return TRUE;
-    }
+  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;
 
   first = FALSE;
 
-  if (*psinfo == NULL)
+  if (sinfo->stabstr == NULL)
     {
+      flagword flags;
+
       /* Initialize the stabs information we need to keep track of.  */
       first = TRUE;
-      amt = sizeof (struct stab_info);
-      *psinfo = (PTR) bfd_alloc (abfd, amt);
-      if (*psinfo == NULL)
-       goto error_return;
-      sinfo = (struct stab_info *) *psinfo;
       sinfo->strings = _bfd_stringtab_init ();
       if (sinfo->strings == NULL)
        goto error_return;
       /* Make sure the first byte is zero.  */
       (void) _bfd_stringtab_add (sinfo->strings, "", TRUE, TRUE);
-      if (! bfd_hash_table_init_n (&sinfo->includes.root,
-                                  stab_link_includes_newfunc,
-                                  251))
+      if (! bfd_hash_table_init (&sinfo->includes,
+                                stab_link_includes_newfunc,
+                                sizeof (struct stab_link_includes_entry)))
+       goto error_return;
+      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 = bfd_make_section_anyway (abfd, ".stabstr");
-      sinfo->stabstr->flags |= SEC_HAS_CONTENTS | SEC_READONLY | SEC_DEBUGGING;
     }
 
-  sinfo = (struct stab_info *) *psinfo;
-
   /* Initialize the information we are going to store for this .stab
      section.  */
-
   count = stabsec->size / STABSIZE;
 
   amt = sizeof (struct stab_section_info);
@@ -269,14 +224,12 @@ _bfd_link_section_stabs (abfd, psinfo, stabsec, stabstrsec, psecinfo, pstring_of
   memset (secinfo->stridxs, 0, (size_t) count * sizeof (bfd_size_type));
 
   /* Read the stabs information from abfd.  */
-
   if (!bfd_malloc_and_get_section (abfd, stabsec, &stabbuf)
       || !bfd_malloc_and_get_section (abfd, stabstrsec, &stabstrbuf))
     goto error_return;
 
   /* Look through the stabs symbols, work out the new string indices,
      and identify N_BINCL symbols which can be eliminated.  */
-
   stroff = 0;
   /* The stabs sections can be split when
      -split-by-reloc/-split-by-file is used.  We must keep track of
@@ -295,10 +248,8 @@ _bfd_link_section_stabs (abfd, psinfo, stabsec, stabstrsec, psecinfo, pstring_of
       const char *string;
 
       if (*pstridx != 0)
-       {
-         /* This symbol has already been handled by an N_BINCL pass.  */
-         continue;
-       }
+       /* This symbol has already been handled by an N_BINCL pass.  */
+       continue;
 
       type = sym[TYPEOFF];
 
@@ -323,11 +274,10 @@ _bfd_link_section_stabs (abfd, psinfo, stabsec, stabstrsec, psecinfo, pstring_of
       symstroff = stroff + bfd_get_32 (abfd, sym + STRDXOFF);
       if (symstroff >= stabstrsec->size)
        {
-         (*_bfd_error_handler)
-           (_("%s(%s+0x%lx): Stabs entry has invalid string index."),
-            bfd_archive_filename (abfd),
-            bfd_get_section_name (abfd, stabsec),
-            (long) (sym - stabbuf));
+         _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;
        }
@@ -387,7 +337,7 @@ _bfd_link_section_stabs (abfd, psinfo, stabsec, stabstrsec, psecinfo, pstring_of
                      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;
@@ -411,8 +361,8 @@ _bfd_link_section_stabs (abfd, psinfo, stabsec, stabstrsec, psecinfo, pstring_of
 
          /* If we have already included a header file with the same
             value, then replaced this one with an N_EXCL symbol.  */
-         incl_entry = stab_link_includes_lookup (&sinfo->includes, string,
-                                                 TRUE, TRUE);
+         incl_entry = (struct stab_link_includes_entry * )
+           bfd_hash_lookup (&sinfo->includes, string, TRUE, TRUE);
          if (incl_entry == NULL)
            goto error_return;
 
@@ -438,13 +388,14 @@ _bfd_link_section_stabs (abfd, psinfo, stabsec, stabstrsec, psecinfo, pstring_of
            {
              /* This is the first time we have seen this header file
                 with this set of stabs strings.  */
-             t = ((struct stab_link_includes_totals *)
-                  bfd_hash_allocate (&sinfo->includes.root, 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;
            }
@@ -484,7 +435,7 @@ _bfd_link_section_stabs (abfd, psinfo, stabsec, stabstrsec, psecinfo, pstring_of
                    ++nest;
                  else if (incl_type == (int) N_EXCL)
                    /* Keep existing exclusion marks.  */
-                   continue;   
+                   continue;
                  else if (nest == 0)
                    {
                      *incl_pstridx = (bfd_size_type) -1;
@@ -509,8 +460,8 @@ _bfd_link_section_stabs (abfd, psinfo, stabsec, stabstrsec, psecinfo, pstring_of
      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
@@ -543,10 +494,8 @@ _bfd_link_section_stabs (abfd, psinfo, stabsec, stabstrsec, psecinfo, pstring_of
   return TRUE;
 
  error_return:
-  if (stabbuf != NULL)
-    free (stabbuf);
-  if (stabstrbuf != NULL)
-    free (stabstrbuf);
+  free (stabbuf);
+  free (stabstrbuf);
   return FALSE;
 }
 \f
@@ -557,13 +506,11 @@ _bfd_link_section_stabs (abfd, psinfo, stabsec, stabstrsec, psecinfo, pstring_of
 */
 
 bfd_boolean
-_bfd_discard_section_stabs (abfd, stabsec, psecinfo,
-                           reloc_symbol_deleted_p, cookie)
-     bfd *abfd;
-     asection *stabsec;
-     PTR psecinfo;
-     bfd_boolean (*reloc_symbol_deleted_p) PARAMS ((bfd_vma, PTR));
-     PTR cookie;
+_bfd_discard_section_stabs (bfd *abfd,
+                           asection *stabsec,
+                           void * psecinfo,
+                           bfd_boolean (*reloc_symbol_deleted_p) (bfd_vma, void *),
+                           void * cookie)
 {
   bfd_size_type count, amt;
   struct stab_section_info *secinfo;
@@ -574,27 +521,21 @@ _bfd_discard_section_stabs (abfd, stabsec, psecinfo,
   int deleting;
 
   if (stabsec->size == 0)
-    {
-      /* This file does not contain stabs debugging information.  */
-      return FALSE;
-    }
+    /* This file does not contain stabs debugging information.  */
+    return FALSE;
 
   if (stabsec->size % STABSIZE != 0)
-    {
-      /* Something is wrong with the format of these stab symbols.
-        Don't try to optimize them.  */
-      return FALSE;
-    }
+    /* Something is wrong with the format of these stab symbols.
+       Don't try to optimize them.  */
+    return FALSE;
 
   if ((stabsec->output_section != NULL
        && bfd_is_abs_section (stabsec->output_section)))
-    {
-      /* At least one of the sections is being discarded from the
-        link, so we should just ignore them.  */
-      return FALSE;
-    }
+    /* At least one of the sections is being discarded from the
+       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)
@@ -604,13 +545,11 @@ _bfd_discard_section_stabs (abfd, stabsec, psecinfo,
   secinfo = (struct stab_section_info *) psecinfo;
 
   /* Read the stabs information from abfd.  */
-
   if (!bfd_malloc_and_get_section (abfd, stabsec, &stabbuf))
     goto error_return;
 
   /* Look through the stabs symbols and discard any information for
      discarded functions.  */
-
   skip = 0;
   deleting = -1;
 
@@ -622,10 +561,8 @@ _bfd_discard_section_stabs (abfd, stabsec, psecinfo,
       int type;
 
       if (*pstridx == (bfd_size_type) -1)
-       {
-         /* This stab was deleted in a previous pass.  */
-         continue;
-       }
+       /* This stab was deleted in a previous pass.  */
+       continue;
 
       type = sym[TYPEOFF];
 
@@ -674,7 +611,7 @@ _bfd_discard_section_stabs (abfd, stabsec, psecinfo,
   /* 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.  */
@@ -709,8 +646,7 @@ _bfd_discard_section_stabs (abfd, stabsec, psecinfo,
   return skip > 0;
 
  error_return:
-  if (stabbuf != NULL)
-    free (stabbuf);
+  free (stabbuf);
   return FALSE;
 }
 
@@ -718,20 +654,17 @@ _bfd_discard_section_stabs (abfd, stabsec, psecinfo,
    contents.  */
 
 bfd_boolean
-_bfd_write_section_stabs (output_bfd, psinfo, stabsec, psecinfo, contents)
-     bfd *output_bfd;
-     PTR *psinfo;
-     asection *stabsec;
-     PTR *psecinfo;
-     bfd_byte *contents;
+_bfd_write_section_stabs (bfd *output_bfd,
+                         struct stab_info *sinfo,
+                         asection *stabsec,
+                         void * *psecinfo,
+                         bfd_byte *contents)
 {
-  struct stab_info *sinfo;
   struct stab_section_info *secinfo;
   struct stab_excl_list *e;
   bfd_byte *sym, *tosym, *symend;
   bfd_size_type *pstridx;
 
-  sinfo = (struct stab_info *) *psinfo;
   secinfo = (struct stab_section_info *) *psecinfo;
 
   if (secinfo == NULL)
@@ -792,22 +725,11 @@ _bfd_write_section_stabs (output_bfd, psinfo, stabsec, psecinfo, contents)
 /* Write out the .stabstr section.  */
 
 bfd_boolean
-_bfd_write_stab_strings (output_bfd, psinfo)
-     bfd *output_bfd;
-     PTR *psinfo;
+_bfd_write_stab_strings (bfd *output_bfd, struct stab_info *sinfo)
 {
-  struct stab_info *sinfo;
-
-  sinfo = (struct stab_info *) *psinfo;
-
-  if (sinfo == NULL)
-    return TRUE;
-
   if (bfd_is_abs_section (sinfo->stabstr->output_section))
-    {
-      /* The section was discarded from the link.  */
-      return TRUE;
-    }
+    /* The section was discarded from the link.  */
+    return TRUE;
 
   BFD_ASSERT ((sinfo->stabstr->output_offset
               + _bfd_stringtab_size (sinfo->strings))
@@ -824,7 +746,7 @@ _bfd_write_stab_strings (output_bfd, psinfo)
 
   /* We no longer need the stabs information.  */
   _bfd_stringtab_free (sinfo->strings);
-  bfd_hash_table_free (&sinfo->includes.root);
+  bfd_hash_table_free (&sinfo->includes);
 
   return TRUE;
 }
@@ -834,10 +756,9 @@ _bfd_write_stab_strings (output_bfd, psinfo)
    or -1 if the address refers to a stab which has been removed.  */
 
 bfd_vma
-_bfd_stab_section_offset (stabsec, psecinfo, offset)
-     asection *stabsec;
-     PTR psecinfo;
-     bfd_vma offset;
+_bfd_stab_section_offset (asection *stabsec,
+                         void * psecinfo,
+                         bfd_vma offset)
 {
   struct stab_section_info *secinfo;