thread_count = cmdline.number_of_input_files();
workqueue->set_thread_count(thread_count);
- if (cmdline.options().incremental())
+ if (parameters->incremental())
{
Incremental_checker incremental_checker(
parameters->options().output_file_name(),
next_blocker->add_blocker();
workqueue->queue(new Read_symbols(input_objects, symtab, layout,
&search_path, 0, mapfile, &*p, NULL,
- this_blocker, next_blocker));
+ NULL, this_blocker, next_blocker));
this_blocker = next_blocker;
}
next_blocker));
this_blocker = next_blocker;
}
+
+ // If we are given only archives in input, we have no regular
+ // objects and THIS_BLOCKER is NULL here. Create a dummy
+ // blocker here so that we can run the middle tasks immediately.
+ if (this_blocker == NULL)
+ {
+ gold_assert(input_objects->number_of_relobjs() == 0);
+ this_blocker = new Task_token(true);
+ }
+
workqueue->queue(new Task_function(new Middle_runner(options,
input_objects,
symtab,
Mapfile* mapfile)
{
// Add any symbols named with -u options to the symbol table.
- symtab->add_undefined_symbols_from_command_line();
+ symtab->add_undefined_symbols_from_command_line(layout);
// If garbage collection was chosen, relocs have been read and processed
// at this point by pre_middle_tasks. Layout can then be done for all
}
}
// Symbols named with -u should not be considered garbage.
- symtab->gc_mark_undef_symbols();
+ symtab->gc_mark_undef_symbols(layout);
gold_assert(symtab->gc() != NULL);
// Do a transitive closure on all references to determine the worklist.
symtab->gc()->do_transitive_closure();
p != input_objects->relobj_end();
++p)
{
+ Task_lock_obj<Object> tlo(task, *p);
(*p)->layout(symtab, layout, NULL);
}
}
++p)
{
// Update the value of output_section stored in rd.
- Read_relocs_data *rd = (*p)->get_relocs_data();
+ Read_relocs_data* rd = (*p)->get_relocs_data();
for (Read_relocs_data::Relocs_list::iterator q = rd->relocs.begin();
q != rd->relocs.end();
++q)
}
}
+ if (this_blocker == NULL)
+ {
+ if (input_objects->number_of_relobjs() == 0)
+ {
+ // If we are given only archives in input, we have no regular
+ // objects and THIS_BLOCKER is NULL here. Create a dummy
+ // blocker here so that we can run the layout task immediately.
+ this_blocker = new Task_token(true);
+ }
+ else
+ {
+ // If we failed to open any input files, it's possible for
+ // THIS_BLOCKER to be NULL here. There's no real point in
+ // continuing if that happens.
+ gold_assert(parameters->errors()->error_count() > 0);
+ gold_exit(false);
+ }
+ }
+
// When all those tasks are complete, we can start laying out the
// output file.
// TODO(csilvers): figure out a more principled way to get the target
}
else
{
- Task_token *new_final_blocker = new Task_token(true);
+ Task_token* new_final_blocker = new Task_token(true);
new_final_blocker->add_blocker();
Task* t = new Write_after_input_sections_task(layout, of,
final_blocker,