lang_output_section_statement_lookup_1 (const char *const name, int constraint)
{
lang_output_section_statement_type *lookup;
+ lang_output_section_statement_type **nextp;
lookup = lang_output_section_find_1 (name, constraint);
if (lookup == NULL)
lookup->next = NULL;
lookup->bfd_section = NULL;
- lookup->processed = 0;
+ lookup->processed = FALSE;
lookup->constraint = constraint;
lookup->ignored = FALSE;
lookup->sectype = normal_section;
lookup->update_dot_tree = NULL;
lookup->phdrs = NULL;
+ /* GCC's strict aliasing rules prevent us from just casting the
+ address, so we store the pointer in a variable and cast that
+ instead. */
+ nextp = &lookup->next;
lang_statement_append (&lang_output_section_statement,
(lang_statement_union_type *) lookup,
- (lang_statement_union_type **) &lookup->next);
+ (lang_statement_union_type **) nextp);
}
return lookup;
}
switch (exp->type.node_class)
{
case etree_assign:
+ case etree_provide:
exp_init_os (exp->assign.src);
break;
strip_excluded_output_sections (void)
{
lang_output_section_statement_type *os;
- unsigned int gc_sections;
- /* Run lang_size_sections (if not already done) to ensure that all
- symbols defined in the linker script are put in the bfd hash
- table. */
+ /* Run lang_size_sections (if not already done). */
if (expld.phase != lang_mark_phase_enum)
{
expld.phase = lang_mark_phase_enum;
lang_reset_memory_regions ();
}
- /* Now call into bfd_gc_sections to mark all sections defining global
- symbols with SEC_KEEP. */
- gc_sections = link_info.gc_sections;
- link_info.gc_sections = 0;
- bfd_gc_sections (output_bfd, &link_info);
- link_info.gc_sections = gc_sections;
-
for (os = &lang_output_section_statement.head->output_section_statement;
os != NULL;
os = os->next)
lang_output_section_statement_type *os;
os = &s->output_section_statement;
+ if (os->addr_tree != NULL)
+ {
+ os->processed = FALSE;
+ exp_fold_tree (os->addr_tree, bfd_abs_section_ptr, &dot);
+
+ if (!expld.result.valid_p
+ && expld.phase != lang_mark_phase_enum)
+ einfo (_("%F%S: non constant or forward reference"
+ " address expression for section %s\n"),
+ os->name);
+
+ dot = expld.result.value + expld.result.section->vma;
+ }
+
if (os->bfd_section == NULL)
/* This section was removed or never actually created. */
break;
break;
}
+ newdot = dot;
if (bfd_is_abs_section (os->bfd_section))
{
/* No matter what happens, an abs section starts at zero. */
os->name, (unsigned long) (newdot - savedot));
}
}
- else
- {
- newdot = dot;
- os->processed = -1;
- exp_fold_tree (os->addr_tree, bfd_abs_section_ptr,
- &newdot);
- os->processed = 0;
-
- if (!expld.result.valid_p
- && expld.phase != lang_mark_phase_enum)
- einfo (_("%F%S: non constant or forward reference"
- " address expression for section %s\n"),
- os->name);
-
- newdot = expld.result.value + expld.result.section->vma;
- }
/* The section starts here.
First, align to what the section needs. */
lang_size_sections_1 (os->children.head, os, &os->children.head,
os->fill, newdot, relax, check_regions);
- os->processed = 1;
+ os->processed = TRUE;
if (bfd_is_abs_section (os->bfd_section) || os->ignored)
{
for (os = &lang_output_section_statement.head->output_section_statement;
os != NULL;
os = os->next)
- os->processed = 0;
+ os->processed = FALSE;
for (o = output_bfd->sections; o != NULL; o = o->next)
{