list->tail = &list->head;
}
+static void
+lang_statement_append (lang_statement_list_type *list,
+ void *element,
+ void *field)
+{
+ *(list->tail) = element;
+ list->tail = field;
+}
+
void
push_stat_ptr (lang_statement_list_type *new_ptr)
{
FAIL ();
}
- lang_statement_append (&input_file_chain,
- (lang_statement_union_type *) p,
- &p->next_real_file);
+ lang_statement_append (&input_file_chain, p, &p->next_real_file);
return p;
}
address, so we store the pointer in a variable and cast that
instead. */
nextp = &ret->s.output_section_statement.next;
- lang_statement_append (&lang_os_list,
- &ret->s,
- (lang_statement_union_type **) nextp);
+ lang_statement_append (&lang_os_list, &ret->s, nextp);
return &ret->root;
}
{
lang_input_statement_type *search;
- for (search = (lang_input_statement_type *) input_file_chain.head;
+ for (search = &input_file_chain.head->input_statement;
search != NULL;
- search = (lang_input_statement_type *) search->next_real_file)
+ search = search->next_real_file)
{
/* Use the local_sym_name as the name of the file that has
already been loaded as filename might have been transformed
static void
lang_check (void)
{
- lang_statement_union_type *file;
+ lang_input_statement_type *file;
bfd *input_bfd;
const bfd_arch_info_type *compatible;
- for (file = file_chain.head; file != NULL; file = file->input_statement.next)
+ for (file = &file_chain.head->input_statement;
+ file != NULL;
+ file = file->next)
{
#ifdef ENABLE_PLUGINS
/* Don't check format of files claimed by plugin. */
- if (file->input_statement.flags.claimed)
+ if (file->flags.claimed)
continue;
#endif /* ENABLE_PLUGINS */
- input_bfd = file->input_statement.the_bfd;
+ input_bfd = file->the_bfd;
compatible
= bfd_arch_get_compatible (input_bfd, link_info.output_bfd,
command_line.accept_unknown_input_arch);
for (f = &input_file_chain.head->input_statement;
f != NULL;
- f = &f->next_real_file->input_statement)
+ f = f->next_real_file)
func (f);
}
void
ldlang_add_file (lang_input_statement_type *entry)
{
- lang_statement_append (&file_chain,
- (lang_statement_union_type *) entry,
- &entry->next);
+ lang_statement_append (&file_chain, entry, &entry->next);
/* The BFD linker needs to have a list of all input BFDs involved in
a link. */
lastobject = &input_file_chain.head->input_statement;
for (claim1 = &file_chain.head->input_statement;
claim1 != NULL;
- claim1 = &claim1->next->input_statement)
+ claim1 = claim1->next)
{
if (claim1->flags.claimed)
{
/* Find where to insert ADD, an archive element or shared library
added during a rescan. */
-static lang_statement_union_type **
+static lang_input_statement_type **
find_rescan_insertion (lang_input_statement_type *add)
{
bfd *add_bfd = add->the_bfd;
lang_input_statement_type *f;
lang_input_statement_type *last_loaded = NULL;
lang_input_statement_type *before = NULL;
- lang_statement_union_type **iter = NULL;
+ lang_input_statement_type **iter = NULL;
if (add_bfd->my_archive != NULL)
add_bfd = add_bfd->my_archive;
then their input_statement->next points at it. */
for (f = &input_file_chain.head->input_statement;
f != NULL;
- f = &f->next_real_file->input_statement)
+ f = f->next_real_file)
{
if (f->the_bfd == add_bfd)
{
before = last_loaded;
if (f->next != NULL)
- return &f->next->input_statement.next;
+ return &f->next->next;
}
if (f->the_bfd != NULL && f->next != NULL)
last_loaded = f;
for (iter = before ? &before->next : &file_chain.head->input_statement.next;
*iter != NULL;
- iter = &(*iter)->input_statement.next)
- if (!(*iter)->input_statement.flags.claim_archive
- && (*iter)->input_statement.the_bfd->my_archive == NULL)
+ iter = &(*iter)->next)
+ if (!(*iter)->flags.claim_archive
+ && (*iter)->the_bfd->my_archive == NULL)
break;
return iter;
if (before)
{
prev = find_next_input_statement (prev);
- if (*prev != plugin_insert->next_real_file)
+ if (*prev != (void *) plugin_insert->next_real_file)
{
/* Huh? We didn't find the expected input statement. */
ASSERT (0);
lang_list_insert_after (stat_ptr, &added, prev);
/* Likewise for the file chains. */
lang_list_insert_after (&input_file_chain, &inputfiles,
- &plugin_insert->next_real_file);
+ (void *) &plugin_insert->next_real_file);
/* We must be careful when relinking file_chain; we may need to
insert the new files at the head of the list if the insert
point chosen is the dummy first input file. */
if (plugin_insert->filename)
- lang_list_insert_after (&file_chain, &files, &plugin_insert->next);
+ lang_list_insert_after (&file_chain, &files,
+ (void *) &plugin_insert->next);
else
lang_list_insert_after (&file_chain, &files, &file_chain.head);
lang_list_remove_tail (&file_chain, &files);
while (files.head != NULL)
{
- lang_statement_union_type **insert;
- lang_statement_union_type **iter, *temp;
+ lang_input_statement_type **insert;
+ lang_input_statement_type **iter, *temp;
bfd *my_arch;
insert = find_rescan_insertion (&files.head->input_statement);
iter = &files.head->input_statement.next;
my_arch = files.head->input_statement.the_bfd->my_archive;
if (my_arch != NULL)
- for (; *iter != NULL; iter = &(*iter)->input_statement.next)
- if ((*iter)->input_statement.the_bfd->my_archive != my_arch)
+ for (; *iter != NULL; iter = &(*iter)->next)
+ if ((*iter)->the_bfd->my_archive != my_arch)
break;
temp = *insert;
- *insert = files.head;
- files.head = *iter;
+ *insert = &files.head->input_statement;
+ files.head = (lang_statement_union_type *) *iter;
*iter = temp;
if (my_arch != NULL)
{
lang_input_statement_type *parent = my_arch->usrdata;
if (parent != NULL)
- parent->next = (lang_statement_union_type *)
+ parent->next = (lang_input_statement_type *)
((char *) iter
- offsetof (lang_input_statement_type, next));
}
pop_stat_ptr ();
}
-void
-lang_statement_append (lang_statement_list_type *list,
- lang_statement_union_type *element,
- lang_statement_union_type **field)
-{
- *(list->tail) = element;
- list->tail = field;
-}
-
/* Set the output format type. -oformat overrides scripts. */
void
struct flag_info *section_flag_list;
/* Next pointer for file_chain statement list. */
- union lang_statement_union *next;
+ struct lang_input_statement_struct *next;
/* Next pointer for input_file_chain statement list. */
- union lang_statement_union *next_real_file;
+ struct lang_input_statement_struct *next_real_file;
const char *target;
extern void lang_leave_output_section_statement
(fill_type *, const char *, lang_output_section_phdr_list *,
const char *);
-extern void lang_statement_append
- (lang_statement_list_type *, lang_statement_union_type *,
- lang_statement_union_type **);
extern void lang_for_each_input_file
(void (*dothis) (lang_input_statement_type *));
extern void lang_for_each_file
lang_input_statement_type *statement; \
for (statement = &file_chain.head->input_statement; \
statement != NULL; \
- statement = &statement->next->input_statement)
+ statement = statement->next)
#define lang_output_section_find(NAME) \
lang_output_section_statement_lookup (NAME, 0, FALSE)