gdb: Convert dwarf2_evaluate_property to return bool
[deliverable/binutils-gdb.git] / ld / ldctor.c
index ab881ad54b66740167deb087f9a3c2f79d526ee8..608ca6c1f359f47410adced98867af981b34f2ee 100644 (file)
@@ -1,24 +1,23 @@
 /* ldctor.c -- constructor support routines
-   Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
-   2002, 2003, 2004, 2006, 2007 Free Software Foundation, Inc.
+   Copyright (C) 1991-2019 Free Software Foundation, Inc.
    By Steve Chamberlain <sac@cygnus.com>
 
-This file is part of GLD, the Gnu Linker.
+   This file is part of the GNU Binutils.
 
-GLD 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, or (at your option)
-any later version.
+   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 3 of the License, or
+   (at your option) any later version.
 
-GLD is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with GLD; see the file COPYING.  If not, write to the Free
-Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
-02110-1301, USA.  */
+   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.  */
 
 #include "sysdep.h"
 #include "bfd.h"
@@ -69,7 +68,7 @@ ldctor_add_set_entry (struct bfd_link_hash_entry *h,
 
   if (p == NULL)
     {
-      p = xmalloc (sizeof (struct set_info));
+      p = (struct set_info *) xmalloc (sizeof (struct set_info));
       p->next = sets;
       sets = p;
       p->h = h;
@@ -81,31 +80,31 @@ ldctor_add_set_entry (struct bfd_link_hash_entry *h,
     {
       if (p->reloc != reloc)
        {
-         einfo (_("%P%X: Different relocs used in set %s\n"),
+         einfo (_("%X%P: different relocs used in set %s\n"),
                 h->root.string);
          return;
        }
 
       /* Don't permit a set to be constructed from different object
-         file formats.  The same reloc may have different results.  We
-         actually could sometimes handle this, but the case is
-         unlikely to ever arise.  Sometimes constructor symbols are in
-         unusual sections, such as the absolute section--this appears
-         to be the case in Linux a.out--and in such cases we just
-         assume everything is OK.  */
+        file formats.  The same reloc may have different results.  We
+        actually could sometimes handle this, but the case is
+        unlikely to ever arise.  Sometimes constructor symbols are in
+        unusual sections, such as the absolute section--this appears
+        to be the case in Linux a.out--and in such cases we just
+        assume everything is OK.  */
       if (p->elements != NULL
          && section->owner != NULL
          && p->elements->section->owner != NULL
          && strcmp (bfd_get_target (section->owner),
                     bfd_get_target (p->elements->section->owner)) != 0)
        {
-         einfo (_("%P%X: Different object file formats composing set %s\n"),
+         einfo (_("%X%P: different object file formats composing set %s\n"),
                 h->root.string);
          return;
        }
     }
 
-  e = xmalloc (sizeof (struct set_element));
+  e = (struct set_element *) xmalloc (sizeof (struct set_element));
   e->next = NULL;
   e->name = name;
   e->section = section;
@@ -131,7 +130,7 @@ ctor_prio (const char *name)
   while (*name == '_')
     ++name;
 
-  if (! CONST_STRNEQ (name, "GLOBAL_"))
+  if (!CONST_STRNEQ (name, "GLOBAL_"))
     return -1;
 
   name += sizeof "GLOBAL_" - 1;
@@ -140,7 +139,7 @@ ctor_prio (const char *name)
     return -1;
   if (name[1] != 'I' && name[1] != 'D')
     return -1;
-  if (! ISDIGIT (name[3]))
+  if (!ISDIGIT (name[3]))
     return -1;
 
   return atoi (name + 3);
@@ -152,8 +151,10 @@ ctor_prio (const char *name)
 static int
 ctor_cmp (const void *p1, const void *p2)
 {
-  const struct set_element * const *pe1 = p1;
-  const struct set_element * const *pe2 = p2;
+  const struct set_element *const *pe1
+    = (const struct set_element *const *) p1;
+  const struct set_element *const *pe2
+    = (const struct set_element *const *) p2;
   const char *n1;
   const char *n2;
   int prio1;
@@ -198,7 +199,6 @@ void
 ldctor_build_sets (void)
 {
   static bfd_boolean called;
-  lang_statement_list_type *old;
   bfd_boolean header_printed;
   struct set_info *p;
 
@@ -223,7 +223,7 @@ ldctor_build_sets (void)
          for (e = p->elements; e != NULL; e = e->next)
            ++c;
 
-         array = xmalloc (c * sizeof *array);
+         array = (struct set_element **) xmalloc (c * sizeof *array);
 
          i = 0;
          for (e = p->elements; e != NULL; e = e->next)
@@ -244,10 +244,8 @@ ldctor_build_sets (void)
        }
     }
 
-  old = stat_ptr;
-  stat_ptr = &constructor_list;
-
-  lang_list_init (stat_ptr);
+  lang_list_init (&constructor_list);
+  push_stat_ptr (&constructor_list);
 
   header_printed = FALSE;
   for (p = sets; p != NULL; p = p->next)
@@ -273,13 +271,13 @@ ldctor_build_sets (void)
         except that we use the right size instead of .long.  When
         generating relocatable output, we generate relocs instead of
         addresses.  */
-      howto = bfd_reloc_type_lookup (output_bfd, p->reloc);
+      howto = bfd_reloc_type_lookup (link_info.output_bfd, p->reloc);
       if (howto == NULL)
        {
-         if (link_info.relocatable)
+         if (bfd_link_relocatable (&link_info))
            {
-             einfo (_("%P%X: %s does not support reloc %s for set %s\n"),
-                    bfd_get_target (output_bfd),
+             einfo (_("%X%P: %s does not support reloc %s for set %s\n"),
+                    bfd_get_target (link_info.output_bfd),
                     bfd_get_reloc_code_name (p->reloc),
                     p->h->root.string);
              continue;
@@ -292,10 +290,17 @@ ldctor_build_sets (void)
                                           p->reloc);
          if (howto == NULL)
            {
-             einfo (_("%P%X: %s does not support reloc %s for set %s\n"),
-                    bfd_get_target (p->elements->section->owner),
-                    bfd_get_reloc_code_name (p->reloc),
-                    p->h->root.string);
+             /* See PR 20911 for a reproducer.  */
+             if (p->elements->section->owner == NULL)
+               einfo (_("%X%P: special section %s does not support reloc %s for set %s\n"),
+                      bfd_get_section_name (link_info.output_bfd, p->elements->section),
+                      bfd_get_reloc_code_name (p->reloc),
+                      p->h->root.string);
+             else
+               einfo (_("%X%P: %s does not support reloc %s for set %s\n"),
+                      bfd_get_target (p->elements->section->owner),
+                      bfd_get_reloc_code_name (p->reloc),
+                      p->h->root.string);
              continue;
            }
        }
@@ -313,17 +318,19 @@ ldctor_build_sets (void)
            size = QUAD;
          break;
        default:
-         einfo (_("%P%X: Unsupported size %d for set %s\n"),
+         einfo (_("%X%P: unsupported size %d for set %s\n"),
                 bfd_get_reloc_size (howto), p->h->root.string);
          size = LONG;
          break;
        }
 
-      lang_add_assignment (exp_assop ('=', ".",
-                                     exp_unop (ALIGN_K,
-                                               exp_intop (reloc_size))));
-      lang_add_assignment (exp_assop ('=', p->h->root.string,
-                                     exp_nameop (NAME, ".")));
+      lang_add_assignment (exp_assign (".",
+                                      exp_unop (ALIGN_K,
+                                                exp_intop (reloc_size)),
+                                      FALSE));
+      lang_add_assignment (exp_assign (p->h->root.string,
+                                      exp_nameop (NAME, "."),
+                                      FALSE));
       lang_add_data (size, exp_intop (p->count));
 
       for (e = p->elements; e != NULL; e = e->next)
@@ -332,7 +339,7 @@ ldctor_build_sets (void)
            {
              int len;
 
-             if (! header_printed)
+             if (!header_printed)
                {
                  minfo (_("\nSet                 Symbol\n\n"));
                  header_printed = TRUE;
@@ -353,16 +360,16 @@ ldctor_build_sets (void)
                }
 
              if (e->name != NULL)
-               minfo ("%T\n", e->name);
+               minfo ("%pT\n", e->name);
              else
                minfo ("%G\n", e->section->owner, e->section, e->value);
            }
 
          /* Need SEC_KEEP for --gc-sections.  */
-         if (! bfd_is_abs_section (e->section))
+         if (!bfd_is_abs_section (e->section))
            e->section->flags |= SEC_KEEP;
 
-         if (link_info.relocatable)
+         if (bfd_link_relocatable (&link_info))
            lang_add_reloc (p->reloc, howto, e->section, e->name,
                            exp_intop (e->value));
          else
@@ -372,5 +379,5 @@ ldctor_build_sets (void)
       lang_add_data (size, exp_intop (0));
     }
 
-  stat_ptr = old;
+  pop_stat_ptr ();
 }
This page took 0.029336 seconds and 4 git commands to generate.