[gold patch] incremental links should disable --gc-sections, --icf, etc.

Cary Coutant ccoutant@google.com
Mon Sep 26 21:28:00 GMT 2011


Gold currently prints error messages if certain options are used with
incremental links, but does not exit. Most of these should call
gold_fatal instead of gold_error; for a few of them (--gc-sections,
--icf, --compress-debug-sections), it's reasonable to simply disable
the incompatible option and print a warning. I've also moved the code
to make these checks into General_options::finalize().

OK to commit?

-cary


	* gold/gold.cc (queue_initial_tasks): Move option checks ...
	* gold/options.cc (General_options::finalize): ... to here. Disable
	some options; make others fatal.
-------------- next part --------------
2011-09-26  Cary Coutant  <ccoutant@google.com>

	* gold/gold.cc (queue_initial_tasks): Move option checks ...
	* gold/options.cc (General_options::finalize): ... to here. Disable
	some options; make others fatal.


commit d10613e6686176f9cc31192653ae42f04ef86368
Author: Cary Coutant <ccoutant@google.com>
Date:   Mon Sep 26 14:22:48 2011 -0700

    Disable --gc-sections, --icf, --compress-debug-sections for incremental links.

diff --git a/gold/gold.cc b/gold/gold.cc
index 12f25b7..693ff79 100644
--- a/gold/gold.cc
+++ b/gold/gold.cc
@@ -197,46 +197,29 @@ queue_initial_tasks(const General_options& options,
   // For incremental links, the base output file.
   Incremental_binary* ibase = NULL;
 
-  if (parameters->incremental())
-    {
-      if (options.relocatable())
-	gold_error(_("incremental linking is incompatible with -r"));
-      if (options.emit_relocs())
-	gold_error(_("incremental linking is incompatible with --emit-relocs"));
-      if (options.gc_sections())
-	gold_error(_("incremental linking is incompatible with --gc-sections"));
-      if (options.icf_enabled())
-	gold_error(_("incremental linking is incompatible with --icf"));
-      if (options.has_plugins())
-	gold_error(_("incremental linking is incompatible with --plugin"));
-      if (strcmp(options.compress_debug_sections(), "none") != 0)
-	gold_error(_("incremental linking is incompatible with "
-		     "--compress-debug-sections"));
-
-      if (parameters->incremental_update())
+  if (parameters->incremental_update())
+    {
+      Output_file* of = new Output_file(options.output_file_name());
+      if (of->open_base_file(options.incremental_base(), true))
 	{
-	  Output_file* of = new Output_file(options.output_file_name());
-	  if (of->open_base_file(options.incremental_base(), true))
-	    {
-	      ibase = open_incremental_binary(of);
-	      if (ibase != NULL
-		  && ibase->check_inputs(cmdline, layout->incremental_inputs()))
-		ibase->init_layout(layout);
-	      else
-		{
-		  delete ibase;
-		  ibase = NULL;
-		  of->close();
-		}
-	    }
-	  if (ibase == NULL)
+	  ibase = open_incremental_binary(of);
+	  if (ibase != NULL
+	      && ibase->check_inputs(cmdline, layout->incremental_inputs()))
+	    ibase->init_layout(layout);
+	  else
 	    {
-	      if (set_parameters_incremental_full())
-		gold_info(_("linking with --incremental-full"));
-	      else
-		gold_fallback(_("restart link with --incremental-full"));
+	      delete ibase;
+	      ibase = NULL;
+	      of->close();
 	    }
 	}
+      if (ibase == NULL)
+	{
+	  if (set_parameters_incremental_full())
+	    gold_info(_("linking with --incremental-full"));
+	  else
+	    gold_fallback(_("restart link with --incremental-full"));
+	}
     }
 
   // Read the input files.  We have to add the symbols to the symbol
diff --git a/gold/options.cc b/gold/options.cc
index be32645..d91a834 100644
--- a/gold/options.cc
+++ b/gold/options.cc
@@ -1224,6 +1224,37 @@ General_options::finalize()
     gold_fatal(_("Options --incremental-changed, --incremental-unchanged, "
                  "--incremental-unknown require the use of --incremental"));
 
+  // Check for options that are not compatible with incremental linking.
+  // Where an option can be disabled without seriously changing the semantics
+  // of the link, we turn the option off; otherwise, we issue a fatal error.
+
+  if (this->incremental_mode_ != INCREMENTAL_OFF)
+    {
+      if (this->relocatable())
+	gold_fatal(_("incremental linking is not compatible with -r"));
+      if (this->emit_relocs())
+	gold_fatal(_("incremental linking is not compatible with "
+		     "--emit-relocs"));
+      if (this->has_plugins())
+	gold_fatal(_("incremental linking is not compatible with --plugin"));
+      if (this->gc_sections())
+	{
+	  gold_warning(_("ignoring --gc-sections for an incremental link"));
+	  this->set_gc_sections(false);
+	}
+      if (this->icf_enabled())
+	{
+	  gold_warning(_("ignoring --icf for an incremental link"));
+	  this->set_icf_status(ICF_NONE);
+	}
+      if (strcmp(this->compress_debug_sections(), "none") != 0)
+	{
+	  gold_warning(_("ignoring --compress-debug-sections for an "
+			 "incremental link"));
+	  this->set_compress_debug_sections("none");
+	}
+    }
+
   // FIXME: we can/should be doing a lot more sanity checking here.
 }
 


More information about the Binutils mailing list