/* 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,
* 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;
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
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);
{
/* 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;
frchain_now = frcP;
frag_now = frcP->frch_frag_now;
- assert (frchain_now->frch_last == frag_now);
+ gas_assert (frchain_now->frch_last == frag_now);
}
/*
{
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
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;
}
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
{
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);
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
if (!seginfo)
return 0;
-
+
for (chain = seginfo->frchainP; chain; chain = chain->frch_next)
{
for (frag = chain->frch_root; frag; frag = frag->fr_next)
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)
{