gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / gold / gold.cc
index e345887ac12956f088f10fe3d6c342c488f017ad..f02d2aadaf7367efcefd9be67a3e61880dda6185 100644 (file)
@@ -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 <iant@google.com>.
 
 // 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,8 +492,13 @@ queue_middle_tasks(const General_options& options,
   if (timer != NULL)
     timer->stamp(0);
 
-  // Finalize the .eh_frame section.
-  layout->finalize_eh_frame_section();
+  // 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);
@@ -555,6 +560,9 @@ queue_middle_tasks(const General_options& options,
       plugins->layout_deferred_objects();
     }
 
+  // Finalize the .eh_frame section.
+  layout->finalize_eh_frame_section();
+
   /* If plugins have specified a section order, re-arrange input sections
      according to a specified section order.  If --section-ordering-file is
      also specified, do not do anything here.  */
@@ -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.
This page took 0.030255 seconds and 4 git commands to generate.