+/* Worker function for lang_mark_used_section. Recursiveness goes
+ here. */
+
+static void
+lang_mark_used_section_1
+ (lang_statement_union_type *s,
+ lang_output_section_statement_type *output_section_statement)
+{
+ for (; s != NULL; s = s->header.next)
+ {
+ switch (s->header.type)
+ {
+ case lang_constructors_statement_enum:
+ break;
+
+ case lang_output_section_statement_enum:
+ {
+ lang_output_section_statement_type *os;
+
+ os = &(s->output_section_statement);
+ if (os->bfd_section != NULL)
+ lang_mark_used_section_1 (os->children.head, os);
+ }
+ break;
+ case lang_wild_statement_enum:
+ lang_mark_used_section_1 (s->wild_statement.children.head,
+ output_section_statement);
+
+ break;
+
+ case lang_object_symbols_statement_enum:
+ case lang_output_statement_enum:
+ case lang_target_statement_enum:
+ break;
+ case lang_data_statement_enum:
+ exp_mark_used_section (s->data_statement.exp,
+ abs_output_section);
+ break;
+
+ case lang_reloc_statement_enum:
+ break;
+
+ case lang_input_section_enum:
+ break;
+
+ case lang_input_statement_enum:
+ break;
+ case lang_fill_statement_enum:
+ break;
+ case lang_assignment_statement_enum:
+ exp_mark_used_section (s->assignment_statement.exp,
+ output_section_statement);
+ break;
+ case lang_padding_statement_enum:
+ break;
+
+ case lang_group_statement_enum:
+ lang_mark_used_section_1 (s->group_statement.children.head,
+ output_section_statement);
+ break;
+
+ default:
+ FAIL ();
+ break;
+ case lang_address_statement_enum:
+ break;
+ }
+ }
+}
+
+static void
+lang_mark_used_section (void)
+{
+ unsigned int gc_sections = link_info.gc_sections;
+
+ /* Callers of exp_fold_tree need to increment this. */
+ lang_statement_iteration++;
+ lang_mark_used_section_1 (statement_list.head, abs_output_section);
+
+ link_info.gc_sections = 0;
+ bfd_gc_sections (output_bfd, &link_info);
+ link_info.gc_sections = gc_sections;
+}
+