diff options
author | Cary Coutant <ccoutant@google.com> | 2009-08-25 01:10:48 +0000 |
---|---|---|
committer | Cary Coutant <ccoutant@google.com> | 2009-08-25 01:10:48 +0000 |
commit | 293c13867ae768c9c51a8f5d8d7ddf59b9cff58e (patch) | |
tree | 952ea98bef654c1744cd598dfa28f611612b26ae /gold/options.cc | |
parent | c1af96a0c544a1dac4a4536ab371980282bb74b0 (diff) | |
download | gdb-293c13867ae768c9c51a8f5d8d7ddf59b9cff58e.zip gdb-293c13867ae768c9c51a8f5d8d7ddf59b9cff58e.tar.gz gdb-293c13867ae768c9c51a8f5d8d7ddf59b9cff58e.tar.bz2 |
* options.h (Command_line::Pre_options): New class.
(Command_line::pre_options): New member.
* options.cc (gold::options::ready_to_register): New variable.
(One_option::register_option): Do nothing if not registering options.
Assert if same short option registered twice.
(General_options::General_options): Turn off option registration when
done constructing.
(Command_line::Pre_options::Pre_options): New constructor.
Diffstat (limited to 'gold/options.cc')
-rw-r--r-- | gold/options.cc | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/gold/options.cc b/gold/options.cc index f09dccb..bf420c6 100644 --- a/gold/options.cc +++ b/gold/options.cc @@ -47,6 +47,11 @@ Position_dependent_options::default_options_; namespace options { +// This flag is TRUE if we should register the command-line options as they +// are constructed. It is set after contruction of the options within +// class Position_dependent_options. +static bool ready_to_register = false; + // This global variable is set up as General_options is constructed. static std::vector<const One_option*> registered_options; @@ -60,6 +65,9 @@ static One_option* short_options[128]; void One_option::register_option() { + if (!ready_to_register) + return; + registered_options.push_back(this); // We can't make long_options a static Option_map because we can't @@ -75,7 +83,10 @@ One_option::register_option() const int shortname_as_int = static_cast<int>(this->shortname); gold_assert(shortname_as_int >= 0 && shortname_as_int < 128); if (this->shortname != '\0') - short_options[shortname_as_int] = this; + { + gold_assert(short_options[shortname_as_int] == NULL); + short_options[shortname_as_int] = this; + } } void @@ -714,6 +725,8 @@ General_options::General_options() do_demangle_(false), plugins_(), incremental_disposition_(INCREMENTAL_CHECK), implicit_incremental_(false) { + // Turn off option registration once construction is complete. + gold::options::ready_to_register = false; } General_options::Object_format @@ -1039,6 +1052,13 @@ Command_line::Command_line() { } +// Pre_options is the hook that sets the ready_to_register flag. + +Command_line::Pre_options::Pre_options() +{ + gold::options::ready_to_register = true; +} + // Process the command line options. For process_one_option, i is the // index of argv to process next, and must be an option (that is, // start with a dash). The return value is the index of the next |