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 3, or (at your option)
any later version.
GAS 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 GAS; see the file COPYING. If not, write to the Free
Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
02110-1301, USA. */
seginfo = obstack_alloc (¬es, sizeof (*seginfo));
memset (seginfo, 0, sizeof (*seginfo));
bfd_set_section_userdata (seg, seginfo);
}
/*
* subseg_change()
*
* Change the subsegment we are in, BUT DO NOT MAKE A NEW FRAG for the
* subsegment. If we are already in the correct subsegment, change nothing.
* This is used eg as a worker for subseg_set [which does make a new frag_now]
* and for changing segments after we have read the source. We construct eg
* fixSs even after the source file is read, so we do have to keep the
* segment context correct.
*/
void
subseg_change (segT seg, int subseg)
{
now_seg = seg;
now_subseg = subseg;
if (!seg_info (seg))
alloc_seginfo (seg);
}
static void
subseg_set_rest (segT seg, subsegT subseg)
{
frchainS *frcP; /* crawl frchain chain */
frchainS **lastPP; /* address of last pointer */
frchainS *newP; /* address of new frchain */
segment_info_type *seginfo;
mri_common_symbol = NULL;
if (frag_now && frchain_now)
frchain_now->frch_frag_now = frag_now;
/* 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);
frcP != NULL;
frcP = *(lastPP = &frcP->frch_next))
if (frcP->frch_subseg >= subseg)
break;
if (frcP == NULL || frcP->frch_subseg != subseg)
{
/* This should be the only code that creates a frchainS. */
/*
* subseg_set(segT, subsegT)
*
* If you attempt to change to the current subsegment, nothing happens.
*
* In: segT, subsegT code for new subsegment.
* frag_now -> incomplete frag for current subsegment.
* If frag_now==NULL, then there is no old, incomplete frag, so
* the old frag is not closed off.
*
* Out: now_subseg, now_seg updated.
* Frchain_now points to the (possibly new) struct frchain for this
* sub-segment.
*/
/* Like subseg_new, except a new section is always created, even if
a section with that name already exists. */
segT
subseg_force_new (const char *segname, subsegT subseg)
{
segT 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, &zero_address_frag, 0);
}
else
{
segT seg;
s = symbol_find (sec->symbol->name);
/* We have to make sure it is the right symbol when we
have multiple sections with the same section name. */
if (s == NULL
|| ((seg = S_GET_SEGMENT (s)) != sec
&& seg != undefined_section))
s = symbol_new (sec->symbol->name, sec, &zero_address_frag, 0);
else if (seg == undefined_section)
{
S_SET_SEGMENT (s, sec);
symbol_set_frag (s, &zero_address_frag);
}
}
S_CLEAR_EXTERNAL (s);
/* Use the BFD section symbol, if possible. */
if (obj_sec_sym_ok_for_reloc (sec))
symbol_set_bfdsym (s, sec->symbol);
else
symbol_get_bfdsym (s)->flags |= BSF_SECTION_SYM;
seginfo->sym = s;
return s;
}
/* Return whether the specified segment is thought to hold text. */
/* Return non zero if SEC has at least one byte of data. It is
possible that we'll return zero even on a non-empty section because
we don't know all the fragment types, and it is possible that an
fr_fix == 0 one still contributes data. Think of this as
seg_definitely_not_empty_p. */