aarch64: Relax check for RNG system registers
[binutils-gdb.git] / gas / subsegs.c
index 00947649d68e5f5632e205bad6c9122e73db74fd..cb598e84bef8ac4e0d3aad8951cd0c160e3a5812 100644 (file)
@@ -1,13 +1,11 @@
 /* subsegs.c - subsegments -
-   Copyright 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
-   1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
-   Free Software Foundation, Inc.
+   Copyright (C) 1987-2022 Free Software Foundation, Inc.
 
    This file is part of GAS, the GNU Assembler.
 
    GAS 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)
+   the Free Software Foundation; either version 3, or (at your option)
    any later version.
 
    GAS is distributed in the hope that it will be useful,
@@ -57,7 +55,7 @@ subsegs_begin (void)
  * segment context correct.
  */
 void
-subseg_change (register segT seg, register int subseg)
+subseg_change (segT seg, int subseg)
 {
   segment_info_type *seginfo = seg_info (seg);
   now_seg = seg;
@@ -65,9 +63,9 @@ subseg_change (register segT seg, register int subseg)
 
   if (! seginfo)
     {
-      seginfo = xcalloc (1, sizeof (*seginfo));
+      seginfo = XCNEW (segment_info_type);
       seginfo->bfd_section = seg;
-      bfd_set_section_userdata (stdoutput, seg, seginfo);
+      bfd_set_section_userdata (seg, seginfo);
     }
 }
 \f
@@ -84,13 +82,17 @@ subseg_set_rest (segT seg, subsegT subseg)
   if (frag_now && frchain_now)
     frchain_now->frch_frag_now = frag_now;
 
-  assert (frchain_now == 0
+  gas_assert (frchain_now == 0
          || frchain_now->frch_last == frag_now);
 
   subseg_change (seg, (int) subseg);
 
   seginfo = seg_info (seg);
 
+  /* Should the section symbol be kept?  */
+  if (bfd_keep_unused_section_symbols (stdoutput))
+    seg->symbol->flags |= BSF_SECTION_SYM_USED;
+
   /* Attempt to find or make a frchain for that subsection.
      We keep the list sorted by subsection number.  */
   for (frcP = *(lastPP = &seginfo->frchainP);
@@ -103,7 +105,7 @@ subseg_set_rest (segT seg, subsegT subseg)
     {
       /* This should be the only code that creates a frchainS.  */
 
-      newP = obstack_alloc (&frchains, sizeof (frchainS));
+      newP = (frchainS *) obstack_alloc (&frchains, sizeof (frchainS));
       newP->frch_subseg = subseg;
       newP->fix_root = NULL;
       newP->fix_tail = NULL;
@@ -125,7 +127,7 @@ subseg_set_rest (segT seg, subsegT subseg)
   frchain_now = frcP;
   frag_now = frcP->frch_frag_now;
 
-  assert (frchain_now->frch_last == frag_now);
+  gas_assert (frchain_now->frch_last == frag_now);
 }
 
 /*
@@ -148,9 +150,7 @@ subseg_get (const char *segname, int force_new)
 {
   segT secptr;
   segment_info_type *seginfo;
-  const char *now_seg_name = (now_seg
-                             ? bfd_get_section_name (stdoutput, now_seg)
-                             : 0);
+  const char *now_seg_name = now_seg ? bfd_section_name (now_seg) : 0;
 
   if (!force_new
       && now_seg_name
@@ -167,9 +167,9 @@ subseg_get (const char *segname, int force_new)
   if (! seginfo)
     {
       secptr->output_section = secptr;
-      seginfo = xcalloc (1, sizeof (*seginfo));
+      seginfo = XCNEW (segment_info_type);
       seginfo->bfd_section = secptr;
-      bfd_set_section_userdata (stdoutput, secptr, seginfo);
+      bfd_set_section_userdata (secptr, seginfo);
     }
   return secptr;
 }
@@ -226,7 +226,7 @@ section_symbol (segT sec)
   if (! EMIT_SECTION_SYMBOLS || symbol_table_frozen)
     {
       /* Here we know it won't be going into the symbol table.  */
-      s = symbol_create (sec->symbol->name, sec, 0, &zero_address_frag);
+      s = symbol_create (sec->symbol->name, sec, &zero_address_frag, 0);
     }
   else
     {
@@ -237,7 +237,7 @@ section_symbol (segT sec)
       if (s == NULL
          || ((seg = S_GET_SEGMENT (s)) != sec
              && seg != undefined_section))
-       s = symbol_new (sec->symbol->name, sec, 0, &zero_address_frag);
+       s = symbol_new (sec->symbol->name, sec, &zero_address_frag, 0);
       else if (seg == undefined_section)
        {
          S_SET_SEGMENT (s, sec);
@@ -262,7 +262,7 @@ section_symbol (segT sec)
 int
 subseg_text_p (segT sec)
 {
-  return (bfd_get_section_flags (stdoutput, sec) & SEC_CODE) != 0;
+  return (bfd_section_flags (sec) & SEC_CODE) != 0;
 }
 
 /* Return non zero if SEC has at least one byte of data.  It is
@@ -280,7 +280,7 @@ seg_not_empty_p (segT sec ATTRIBUTE_UNUSED)
 
   if (!seginfo)
     return 0;
-  
+
   for (chain = seginfo->frchainP; chain; chain = chain->frch_next)
     {
       for (frag = chain->frch_root; frag; frag = frag->fr_next)
@@ -299,6 +299,10 @@ subsegs_print_statistics (FILE *file)
   frchainS *frchp;
   asection *s;
 
+  /* PR 20897 - check to see if the output bfd was actually created.  */
+  if (stdoutput == NULL)
+    return;
+
   fprintf (file, "frag chains:\n");
   for (s = stdoutput->sections; s; s = s->next)
     {