2011-09-26 Cary Coutant * 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 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. }