From 44453f85d94b039d2c66cdd19a49adc2d35f6cda Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 1 Sep 2009 17:32:35 +0000 Subject: [PATCH] * 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. --- gold/ChangeLog | 16 ++++++++++++++++ gold/gold.cc | 19 +++++++++++++++++-- gold/incremental.cc | 13 +++++++++++++ gold/incremental.h | 26 ++++++++++++++++++++++---- 4 files changed, 68 insertions(+), 6 deletions(-) diff --git a/gold/ChangeLog b/gold/ChangeLog index 174eef85db..aae9d2029c 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,19 @@ +2009-09-01 Mikolaj Zalewski + + * 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 * options.h (Command_line::Pre_options): New class. diff --git a/gold/gold.cc b/gold/gold.cc index 9f9f251ce5..cb29e7d9a1 100644 --- a/gold/gold.cc +++ b/gold/gold.cc @@ -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. diff --git a/gold/incremental.cc b/gold/incremental.cc index 25caabe1b5..4a3ecb1a69 100644 --- a/gold/incremental.cc +++ b/gold/incremental.cc @@ -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 diff --git a/gold/incremental.h b/gold/incremental.h index 4342dcc9ee..9650993303 100644 --- a/gold/incremental.h +++ b/gold/incremental.h @@ -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_; -- 2.34.1