* gold.cc: Include "incremental.h".
authorIan Lance Taylor <ian@airs.com>
Tue, 1 Sep 2009 17:32:35 +0000 (17:32 +0000)
committerIan Lance Taylor <ian@airs.com>
Tue, 1 Sep 2009 17:32:35 +0000 (17:32 +0000)
(queue_initial_tasks): Call Incremental_checker methods.
* incremental.cc: Include "output.h".
(Incremental_checker::can_incrementally_link_output_file): New
method.
* incremental.h (Incremental_checker): New class.

gold/ChangeLog
gold/gold.cc
gold/incremental.cc
gold/incremental.h

index 174eef85dbd639c6cfd6b2b75930db061d0f4eee..aae9d2029cb389b58537cc2705ad72e6d350310b 100644 (file)
@@ -1,3 +1,19 @@
+2009-09-01  Mikolaj Zalewski  <mikolajz@google.com>
+
+       * gold.cc: Include "incremental.h".
+       (queue_initial_tasks): Call Incremental_checker methods.
+       * incremental.cc: Include "output.h".
+       (Incremental_checker::can_incrementally_link_output_file): New
+       method.
+       * incremental.h (Incremental_checker): New class.
+
+       * output.cc (Output_file::open_for_modification): New method.
+       (Output_file::map_anonymous): Changed return type to bool.  Record
+       map in base_ field.
+       (Output_file::map_no_anonymous): New method, broken out of map.
+       (Output_file::map): Use map_no_anonymous and map_anonymous.
+       * output.h (class Output_file): Update declarations.
+
 2009-08-24  Cary Coutant  <ccoutant@google.com>
 
        * options.h (Command_line::Pre_options): New class.
index 9f9f251ce53b73939eec0e7a75e122dab3f1f7c9..cb29e7d9a1be52f672f596b75e45b7957d60135e 100644 (file)
@@ -42,6 +42,7 @@
 #include "defstd.h"
 #include "plugin.h"
 #include "icf.h"
+#include "incremental.h"
 
 namespace gold
 {
@@ -176,6 +177,20 @@ queue_initial_tasks(const General_options& options,
     thread_count = cmdline.number_of_input_files();
   workqueue->set_thread_count(thread_count);
 
+  if (cmdline.options().incremental())
+    {
+      Incremental_checker incremental_checker(
+          parameters->options().output_file_name());
+      if (incremental_checker.can_incrementally_link_output_file())
+        {
+          // TODO: remove when incremental linking implemented.
+          printf("Incremental linking might be possible "
+              "(not implemented yet)\n");
+        }
+      // TODO: If we decide on an incremental build, fewer tasks
+      // should be scheduled.
+    }
+
   // Read the input files.  We have to add the symbols to the symbol
   // table in order.  We do this by creating a separate blocker for
   // each input file.  We associate the blocker with the following
@@ -229,8 +244,8 @@ queue_initial_tasks(const General_options& options,
     }
 }
 
-// Queue up a set of tasks to be done before queueing the middle set 
-// of tasks.  This is only necessary when garbage collection 
+// Queue up a set of tasks to be done before queueing the middle set
+// of tasks.  This is only necessary when garbage collection
 // (--gc-sections) of unused sections is desired.  The relocs are read
 // and processed here early to determine the garbage sections before the
 // relocs can be scanned in later tasks.
index 25caabe1b57d6e6d43104e793e28d43693b73728..4a3ecb1a69168b60884784ba5cc8186865bb0119 100644 (file)
@@ -25,6 +25,7 @@
 #include "output.h"
 #include "incremental.h"
 #include "archive.h"
+#include "output.h"
 
 using elfcpp::Convert;
 
@@ -149,6 +150,18 @@ class Incremental_inputs_entry_write
   internal::Incremental_inputs_entry_data* p_;
 };
 
+// Analyzes the output file to check if incremental linking is possible and
+// (to be done) what files need to be relinked.
+
+bool
+Incremental_checker::can_incrementally_link_output_file()
+{
+  Output_file output(this->output_name_);
+  if (!output.open_for_modification())
+    return false;
+  return true;
+}
+
 // Add the command line to the string table, setting
 // command_line_key_.  In incremental builds, the command line is
 // stored in .gnu_incremental_inputs so that the next linker run can
index 4342dcc9ee416e671cea6d1cbf023290782b6f81..9650993303259ed1f1a1dec01113517f95152114 100644 (file)
@@ -50,6 +50,24 @@ enum Incremental_input_type
   INCREMENTAL_INPUT_SCRIPT = 4
 };
 
+// Code invoked early during an incremental link that checks what files need
+// to be relinked.
+class Incremental_checker
+{
+ public:
+  Incremental_checker(const char* output_name)
+    : output_name_(output_name)
+  { }
+
+  // Analyzes the output file to check if incremental linking is possible and
+  // what files needs to be relinked.
+  bool
+  can_incrementally_link_output_file();
+
+ private:
+  const char* output_name_;
+};
+
 // This class contains the information needed during an incremental
 // build about the inputs necessary to build the .gnu_incremental_inputs.
 class Incremental_inputs
@@ -127,11 +145,11 @@ class Incremental_inputs
     {
       // Present if type == INCREMENTAL_INPUT_ARCHIVE.
       Archive* archive;
-  
+
       // Present if type == INCREMENTAL_INPUT_OBJECT or
       // INCREMENTAL_INPUT_SHARED_LIBRARY.
       Object* object;
-  
+
       // Present if type == INCREMENTAL_INPUT_SCRIPT.
       Script_info* script;
     };
@@ -141,7 +159,7 @@ class Incremental_inputs
 
     // Position of the entry information in the output section.
     unsigned int index;
-    
+
     // Last modification time of the file.
     Timespec mtime;
   };
@@ -151,7 +169,7 @@ class Incremental_inputs
   // A lock guarding access to inputs_ during the first phase of linking, when
   // report_ function may be called from multiple threads.
   Lock* lock_;
-  
+
   // The list of input arguments obtained from parsing the command line.
   const Input_arguments* inputs_;