X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gold%2Fgold.cc;h=f02d2aadaf7367efcefd9be67a3e61880dda6185;hb=8c45011acd7a589c306e74563d00fb3fa5c14bbd;hp=39843c28684f0c80ff74b7df7e983f97705227ba;hpb=bd9e0d4628f1265c42516f90c4f162cefa787294;p=deliverable%2Fbinutils-gdb.git diff --git a/gold/gold.cc b/gold/gold.cc index 39843c2868..f02d2aadaf 100644 --- a/gold/gold.cc +++ b/gold/gold.cc @@ -1,6 +1,6 @@ // gold.cc -- main linker functions -// Copyright (C) 2006-2015 Free Software Foundation, Inc. +// Copyright (C) 2006-2020 Free Software Foundation, Inc. // Written by Ian Lance Taylor . // This file is part of gold. @@ -175,7 +175,7 @@ queue_initial_tasks(const General_options& options, Workqueue* workqueue, Input_objects* input_objects, Symbol_table* symtab, Layout* layout, Mapfile* mapfile) { - if (cmdline.begin() == cmdline.end()) + if (cmdline.number_of_input_files() == 0) { bool is_ok = false; if (options.printed_version()) @@ -492,6 +492,14 @@ queue_middle_tasks(const General_options& options, if (timer != NULL) timer->stamp(0); + // We have to support the case of not seeing any input objects, and + // generate an empty file. Existing builds depend on being able to + // pass an empty archive to the linker and get an empty object file + // out. In order to do this we need to use a default target. + if (input_objects->number_of_input_objects() == 0 + && layout->incremental_base() == NULL) + parameters_force_valid_target(); + // Add any symbols named with -u options to the symbol table. symtab->add_undefined_symbols_from_command_line(layout); @@ -589,14 +597,6 @@ queue_middle_tasks(const General_options& options, } } - // We have to support the case of not seeing any input objects, and - // generate an empty file. Existing builds depend on being able to - // pass an empty archive to the linker and get an empty object file - // out. In order to do this we need to use a default target. - if (input_objects->number_of_input_objects() == 0 - && layout->incremental_base() == NULL) - parameters_force_valid_target(); - int thread_count = options.thread_count_middle(); if (thread_count == 0) thread_count = std::max(2, input_objects->number_of_input_objects()); @@ -631,10 +631,16 @@ queue_middle_tasks(const General_options& options, for (++p; p != input_objects->relobj_end(); ++p) { if ((*p)->uses_split_stack() != uses_split_stack) - gold_fatal(_("cannot mix split-stack '%s' and " - "non-split-stack '%s' when using -r"), - (*input_objects->relobj_begin())->name().c_str(), - (*p)->name().c_str()); + { + const char *name1 + = (*input_objects->relobj_begin())->name().c_str(); + const char *name2 = (*p)->name().c_str(); + const char *name_split = uses_split_stack ? name1 : name2; + const char *name_nosplit = uses_split_stack ? name2 : name1; + gold_fatal(_("cannot mix split-stack '%s' and " + "non-split-stack '%s' when using -r"), + name_split, name_nosplit); + } } } } @@ -880,14 +886,27 @@ queue_final_tasks(const General_options& options, } // Create tasks for tree-style build ID computation, if necessary. - final_blocker = layout->queue_build_id_tasks(workqueue, final_blocker, of); - - // Queue a task to close the output file. This will be blocked by - // FINAL_BLOCKER. - workqueue->queue(new Task_function(new Close_task_runner(&options, layout, - of), - final_blocker, - "Task_function Close_task_runner")); + if (strcmp(options.build_id(), "tree") == 0) + { + // Queue a task to compute the build id. This will be blocked by + // FINAL_BLOCKER, and will in turn schedule the task to close + // the output file. + workqueue->queue(new Task_function(new Build_id_task_runner(&options, + layout, + of), + final_blocker, + "Task_function Build_id_task_runner")); + } + else + { + // Queue a task to close the output file. This will be blocked by + // FINAL_BLOCKER. + workqueue->queue(new Task_function(new Close_task_runner(&options, layout, + of, NULL, 0), + final_blocker, + "Task_function Close_task_runner")); + } + } } // End namespace gold.