[gold patch] Incremental 25/25: Add --incremental-startup-unchanged option
Cary Coutant
ccoutant@google.com
Wed Jun 1 22:53:00 GMT 2011
GCC adds a few startup files at the beginning of the link command, and
-Wl,--incremental-unchanged options can't be placed in front of them.
In distributed build systems where those startup files may not even be
staged if they haven't changed, or where the timestamps might not be
reliable, it's useful to be able to claim that those "startup" files
are all unchanged. This patch adds a --incremental-startup-unchanged
option, which provides the disposition for all files that precede it
(or the first --incremental-changed/-unchanged/-unknown option).
Tested on x86_64 with strace, to ensure that there are no stat() calls
to the startup files.
-cary
2011-06-01 Cary Coutant <ccoutant@google.com>
* gold/incremental.cc (Sized_incremental_binary::do_file_has_changed):
Check disposition for startup file.
(Incremental_inputs::report_command_line): Ignore
--incremental-startup-unchanged option.
* gold/options.cc
(General_options::parse_incremental_startup_unchanged): New function.
(General_options::General_options): Initialize new data member.
* gold/options.h (Incremental_disposition): Add INCREMENTAL_STARTUP.
(General_options): Add --incremental-startup-unchanged option.
(General_options::incremental_startup_disposition): New function.
(General_options::incremental_startup_disposition_): New data member.
-------------- next part --------------
Patch 25: Add --incremental-startup-unchanged option.
2011-06-01 Cary Coutant <ccoutant@google.com>
* gold/incremental.cc (Sized_incremental_binary::do_file_has_changed):
Check disposition for startup file.
(Incremental_inputs::report_command_line): Ignore
--incremental-startup-unchanged option.
* gold/options.cc
(General_options::parse_incremental_startup_unchanged): New function.
(General_options::General_options): Initialize new data member.
* gold/options.h (Incremental_disposition): Add INCREMENTAL_STARTUP.
(General_options): Add --incremental-startup-unchanged option.
(General_options::incremental_startup_disposition): New function.
(General_options::incremental_startup_disposition_): New data member.
diff --git a/gold/incremental.cc b/gold/incremental.cc
index 89af75d..7fc56de 100644
--- a/gold/incremental.cc
+++ b/gold/incremental.cc
@@ -460,6 +460,12 @@ Sized_incremental_binary<size, big_endian>::do_file_has_changed(
if (input_argument != NULL)
disp = input_argument->file().options().incremental_disposition();
+ // For files at the beginning of the command line (i.e., those added
+ // implicitly by gcc), check whether the --incremental-startup-unchanged
+ // option was used.
+ if (disp == INCREMENTAL_STARTUP)
+ disp = parameters->options().incremental_startup_disposition();
+
if (disp != INCREMENTAL_CHECK)
return disp == INCREMENTAL_CHANGED;
@@ -938,6 +944,7 @@ Incremental_inputs::report_command_line(int argc, const char* const* argv)
|| strcmp(argv[i], "--incremental-changed") == 0
|| strcmp(argv[i], "--incremental-unchanged") == 0
|| strcmp(argv[i], "--incremental-unknown") == 0
+ || strcmp(argv[i], "--incremental-startup-unchanged") == 0
|| is_prefix_of("--incremental-base=", argv[i])
|| is_prefix_of("--incremental-patch=", argv[i])
|| is_prefix_of("--debug=", argv[i]))
diff --git a/gold/options.cc b/gold/options.cc
index b41daa2..1a4e50b 100644
--- a/gold/options.cc
+++ b/gold/options.cc
@@ -380,6 +380,14 @@ General_options::parse_incremental_unknown(const char*, const char*,
}
void
+General_options::parse_incremental_startup_unchanged(const char*, const char*,
+ Command_line*)
+{
+ this->implicit_incremental_ = true;
+ this->incremental_startup_disposition_ = INCREMENTAL_UNCHANGED;
+}
+
+void
General_options::parse_library(const char*, const char* arg,
Command_line* cmdline)
{
@@ -892,7 +900,8 @@ General_options::General_options()
plugins_(NULL),
dynamic_list_(),
incremental_mode_(INCREMENTAL_OFF),
- incremental_disposition_(INCREMENTAL_CHECK),
+ incremental_disposition_(INCREMENTAL_STARTUP),
+ incremental_startup_disposition_(INCREMENTAL_CHECK),
implicit_incremental_(false),
excluded_libs_(),
symbols_to_retain_(),
diff --git a/gold/options.h b/gold/options.h
index f261622..6c2a4e1 100644
--- a/gold/options.h
+++ b/gold/options.h
@@ -63,6 +63,11 @@ class Script_info;
enum Incremental_disposition
{
+ // Startup files that appear before the first disposition option.
+ // These will default to INCREMENTAL_CHECK unless the
+ // --incremental-startup-unchanged option is given.
+ // (For files added implicitly by gcc before any user options.)
+ INCREMENTAL_STARTUP,
// Determine the status from the timestamp (default).
INCREMENTAL_CHECK,
// Assume the file changed from the previous build.
@@ -810,6 +815,10 @@ class General_options
DEFINE_special(incremental_unknown, options::TWO_DASHES, '\0',
N_("Use timestamps to check files (default)"), NULL);
+ DEFINE_special(incremental_startup_unchanged, options::TWO_DASHES, '\0',
+ N_("Assume startup files unchanged "
+ "(files preceding this option)"), NULL);
+
DEFINE_percent(incremental_patch, options::TWO_DASHES, '\0', 10,
N_("Amount of extra space to allocate for patches"),
N_("PERCENT"));
@@ -1326,6 +1335,12 @@ class General_options
incremental_disposition() const
{ return this->incremental_disposition_; }
+ // The disposition to use for startup files (those that precede the
+ // first --incremental-changed, etc. option).
+ Incremental_disposition
+ incremental_startup_disposition() const
+ { return this->incremental_startup_disposition_; }
+
// Return true if S is the name of a library excluded from automatic
// symbol export.
bool
@@ -1443,9 +1458,12 @@ class General_options
// --incremental-unchanged or --incremental-unknown option. The
// value may change as we proceed parsing the command line flags.
Incremental_disposition incremental_disposition_;
+ // The disposition to use for startup files (those marked
+ // INCREMENTAL_STARTUP).
+ Incremental_disposition incremental_startup_disposition_;
// Whether we have seen one of the options that require incremental
- // build (--incremental-changed, --incremental-unchanged or
- // --incremental-unknown)
+ // build (--incremental-changed, --incremental-unchanged,
+ // --incremental-unknown, or --incremental-startup-unchanged).
bool implicit_incremental_;
// Libraries excluded from automatic export, via --exclude-libs.
Unordered_set<std::string> excluded_libs_;
More information about the Binutils
mailing list