From 376c3ecd17d0636bcf4e527c2e2ca2f94822fe64 Mon Sep 17 00:00:00 2001 From: Cary Coutant Date: Thu, 1 Dec 2016 16:32:38 -0800 Subject: Implement --push-state/--pop-state. gold/ PR gold/18989 * options.cc (General_options::object_format_to_string): New function. (General_options::copy_from_posdep_options): New function. (General_options::parse_push_state): New function. (General_options::parse_pop_state): New function. * options.h (--push-state, --pop-state): New options. (General_options::object_format_to_string): New method. (General_options::set_incremental_disposition): New method. (General_options::copy_from_posdep_options): New method. (General_options::options_stack_): New data member. --- gold/ChangeLog | 13 +++++++++++++ gold/options.cc | 47 +++++++++++++++++++++++++++++++++++++++++++++++ gold/options.h | 21 ++++++++++++++++++++- 3 files changed, 80 insertions(+), 1 deletion(-) (limited to 'gold') diff --git a/gold/ChangeLog b/gold/ChangeLog index 15593b6..ab1181a 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,5 +1,18 @@ 2016-12-01 Cary Coutant + PR gold/18989 + * options.cc (General_options::object_format_to_string): New function. + (General_options::copy_from_posdep_options): New function. + (General_options::parse_push_state): New function. + (General_options::parse_pop_state): New function. + * options.h (--push-state, --pop-state): New options. + (General_options::object_format_to_string): New method. + (General_options::set_incremental_disposition): New method. + (General_options::copy_from_posdep_options): New method. + (General_options::options_stack_): New data member. + +2016-12-01 Cary Coutant + PR gold/20807 * aarch64.cc (Target_aarch64::scan_reloc_section_for_stubs): Handle section symbols correctly. diff --git a/gold/options.cc b/gold/options.cc index 73a3f67..276be39 100644 --- a/gold/options.cc +++ b/gold/options.cc @@ -689,6 +689,20 @@ General_options::string_to_object_format(const char* arg) } } +const char* +General_options::object_format_to_string(General_options::Object_format fmt) +{ + switch (fmt) + { + case General_options::OBJECT_FORMAT_ELF: + return "elf"; + case General_options::OBJECT_FORMAT_BINARY: + return "binary"; + default: + gold_unreachable(); + } +} + void General_options::parse_fix_v4bx(const char*, const char*, Command_line*) @@ -715,6 +729,39 @@ General_options::parse_EL(const char*, const char*, Command_line*) this->endianness_ = ENDIANNESS_LITTLE; } +void +General_options::copy_from_posdep_options( + const Position_dependent_options& posdep) +{ + this->set_as_needed(posdep.as_needed()); + this->set_Bdynamic(posdep.Bdynamic()); + this->set_format( + General_options::object_format_to_string(posdep.format_enum())); + this->set_whole_archive(posdep.whole_archive()); + this->set_incremental_disposition(posdep.incremental_disposition()); +} + +void +General_options::parse_push_state(const char*, const char*, Command_line*) +{ + Position_dependent_options* posdep = new Position_dependent_options(*this); + this->options_stack_.push_back(posdep); +} + +void +General_options::parse_pop_state(const char*, const char*, Command_line*) +{ + if (this->options_stack_.empty()) + { + gold::gold_error(_("unbalanced --push-state/--pop-state")); + return; + } + Position_dependent_options* posdep = this->options_stack_.back(); + this->options_stack_.pop_back(); + this->copy_from_posdep_options(*posdep); + delete posdep; +} + } // End namespace gold. namespace diff --git a/gold/options.h b/gold/options.h index 0aba4b7..d21b935 100644 --- a/gold/options.h +++ b/gold/options.h @@ -1133,6 +1133,11 @@ class General_options N_("Print symbols defined and used for each input"), N_("FILENAME")); + DEFINE_special(push_state, options::TWO_DASHES, '\0', + N_("Save the state of flags related to input files"), NULL); + DEFINE_special(pop_state, options::TWO_DASHES, '\0', + N_("Restore the state of flags related to input files"), NULL); + // q DEFINE_bool(emit_relocs, options::TWO_DASHES, 'q', false, @@ -1516,6 +1521,10 @@ class General_options static Object_format string_to_object_format(const char* arg); + // Convert an Object_format to string. + static const char* + object_format_to_string(Object_format); + // Note: these functions are not very fast. Object_format format_enum() const; Object_format oformat_enum() const; @@ -1609,6 +1618,10 @@ class General_options incremental_disposition() const { return this->incremental_disposition_; } + void + set_incremental_disposition(Incremental_disposition disp) + { this->incremental_disposition_ = disp; } + // The disposition to use for startup files (those that precede the // first --incremental-changed, etc. option). Incremental_disposition @@ -1740,6 +1753,9 @@ class General_options void add_plugin_option(const char* opt); + void + copy_from_posdep_options(const Position_dependent_options&); + // Whether we printed version information. bool printed_version_; // Whether to mark the stack as executable. @@ -1783,6 +1799,8 @@ class General_options Endianness endianness_; // What local symbols to discard. Discard_locals discard_locals_; + // Stack of saved options for --push-state/--pop-state. + std::vector options_stack_; }; // The position-dependent options. We use this to store the state of @@ -1813,7 +1831,8 @@ class Position_dependent_options = Position_dependent_options::default_options_) { copy_from_options(options); } - void copy_from_options(const General_options& options) + void + copy_from_options(const General_options& options) { this->set_as_needed(options.as_needed()); this->set_Bdynamic(options.Bdynamic()); -- cgit v1.1