Automatic date update in version.in
[binutils-gdb.git] / ld / ldwrite.c
index 02b1cc7f82813c156db4ec5898132d886b3df3b3..f7d379a64c15a2421a99782c5ad5234511a47e22 100644 (file)
@@ -1,5 +1,5 @@
 /* ldwrite.c -- write out the linked file
-   Copyright (C) 1991-2019 Free Software Foundation, Inc.
+   Copyright (C) 1991-2022 Free Software Foundation, Inc.
    Written by Steve Chamberlain sac@cygnus.com
 
    This file is part of the GNU Binutils.
@@ -23,6 +23,7 @@
 #include "bfd.h"
 #include "bfdlink.h"
 #include "libiberty.h"
+#include "ctf-api.h"
 #include "safe-ctype.h"
 
 #include "ld.h"
@@ -45,7 +46,6 @@ build_link_order (lang_statement_union_type *statement)
        asection *output_section;
        struct bfd_link_order *link_order;
        bfd_vma value;
-       bfd_boolean big_endian = FALSE;
 
        output_section = statement->data_statement.output_section;
        ASSERT (output_section->owner == link_info.output_bfd);
@@ -65,74 +65,38 @@ build_link_order (lang_statement_union_type *statement)
 
        value = statement->data_statement.value;
 
-       /* If the endianness of the output BFD is not known, then we
-          base the endianness of the data on the first input file.
-          By convention, the bfd_put routines for an unknown
+       /* By convention, the bfd_put routines for an unknown
           endianness are big endian, so we must swap here if the
-          input file is little endian.  */
-       if (bfd_big_endian (link_info.output_bfd))
-         big_endian = TRUE;
-       else if (bfd_little_endian (link_info.output_bfd))
-         big_endian = FALSE;
-       else
+          input is little endian.  */
+       if (!bfd_big_endian (link_info.output_bfd)
+           && !bfd_little_endian (link_info.output_bfd)
+           && !link_info.big_endian)
          {
-           bfd_boolean swap;
+           bfd_byte buffer[8];
 
-           swap = FALSE;
-           if (command_line.endian == ENDIAN_BIG)
-             big_endian = TRUE;
-           else if (command_line.endian == ENDIAN_LITTLE)
-             {
-               big_endian = FALSE;
-               swap = TRUE;
-             }
-           else if (command_line.endian == ENDIAN_UNSET)
+           switch (statement->data_statement.type)
              {
-               big_endian = TRUE;
-               {
-                 LANG_FOR_EACH_INPUT_STATEMENT (s)
+             case QUAD:
+             case SQUAD:
+               if (sizeof (bfd_vma) >= QUAD_SIZE)
                  {
-                   if (s->the_bfd != NULL)
-                     {
-                       if (bfd_little_endian (s->the_bfd))
-                         {
-                           big_endian = FALSE;
-                           swap = TRUE;
-                         }
-                       break;
-                     }
-                 }
-               }
-             }
-
-           if (swap)
-             {
-               bfd_byte buffer[8];
-
-               switch (statement->data_statement.type)
-                 {
-                 case QUAD:
-                 case SQUAD:
-                   if (sizeof (bfd_vma) >= QUAD_SIZE)
-                     {
-                       bfd_putl64 (value, buffer);
-                       value = bfd_getb64 (buffer);
-                       break;
-                     }
-                   /* Fall through.  */
-                 case LONG:
-                   bfd_putl32 (value, buffer);
-                   value = bfd_getb32 (buffer);
-                   break;
-                 case SHORT:
-                   bfd_putl16 (value, buffer);
-                   value = bfd_getb16 (buffer);
-                   break;
-                 case BYTE:
+                   bfd_putl64 (value, buffer);
+                   value = bfd_getb64 (buffer);
                    break;
-                 default:
-                   abort ();
                  }
+               /* Fall through.  */
+             case LONG:
+               bfd_putl32 (value, buffer);
+               value = bfd_getb32 (buffer);
+               break;
+             case SHORT:
+               bfd_putl16 (value, buffer);
+               value = bfd_getb16 (buffer);
+               break;
+             case BYTE:
+               break;
+             default:
+               abort ();
              }
          }
 
@@ -156,10 +120,10 @@ build_link_order (lang_statement_union_type *statement)
                  high = (bfd_vma) -1;
                bfd_put_32 (link_info.output_bfd, high,
                            (link_order->u.data.contents
-                            + (big_endian ? 0 : 4)));
+                            + (link_info.big_endian ? 0 : 4)));
                bfd_put_32 (link_info.output_bfd, value,
                            (link_order->u.data.contents
-                            + (big_endian ? 4 : 0)));
+                            + (link_info.big_endian ? 4 : 0)));
              }
            link_order->size = QUAD_SIZE;
            break;
@@ -314,20 +278,20 @@ build_link_order (lang_statement_union_type *statement)
 /* Return true if NAME is the name of an unsplittable section. These
    are the stabs strings, dwarf strings.  */
 
-static bfd_boolean
+static bool
 unsplittable_name (const char *name)
 {
-  if (CONST_STRNEQ (name, ".stab"))
+  if (startswith (name, ".stab"))
     {
       /* There are several stab like string sections. We pattern match on
         ".stab...str"  */
       unsigned len = strlen (name);
       if (strcmp (&name[len-3], "str") == 0)
-       return TRUE;
+       return true;
     }
   else if (strcmp (name, "$GDB_STRINGS$") == 0)
-    return TRUE;
-  return FALSE;
+    return true;
+  return false;
 }
 
 /* Wander around the input sections, make sure that
@@ -362,7 +326,7 @@ clone_section (bfd *abfd, asection *s, const char *name, int *count)
     {
       /* Some section names cannot be truncated, as the name is
         used to locate some other section.  */
-      if (CONST_STRNEQ (name, ".stab")
+      if (startswith (name, ".stab")
          || strcmp (name, "$GDB_SYMBOLS$") == 0)
        {
          einfo (_ ("%F%P: cannot create split section name for %s\n"), name);
@@ -375,7 +339,7 @@ clone_section (bfd *abfd, asection *s, const char *name, int *count)
   if ((sname = bfd_get_unique_section_name (abfd, tname, count)) == NULL
       || (n = bfd_make_section_anyway (abfd, sname)) == NULL
       || (h = bfd_link_hash_lookup (link_info.hash,
-                                   sname, TRUE, TRUE, FALSE)) == NULL)
+                                   sname, true, true, false)) == NULL)
     {
       einfo (_("%F%P: clone section failed: %E\n"));
       /* Silence gcc warnings.  einfo exits, so we never reach here.  */