diff options
author | Ian Lance Taylor <ian@airs.com> | 2008-03-24 03:48:29 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@airs.com> | 2008-03-24 03:48:29 +0000 |
commit | 086a18414ad6c07d0ee79990a971fdc7387af7c1 (patch) | |
tree | ec8a34804f770463ee55114f4981658beb878413 /gold/options.h | |
parent | b5615ead1bf14f1ac87c310f20f63ed74adc46e8 (diff) | |
download | fsf-binutils-gdb-086a18414ad6c07d0ee79990a971fdc7387af7c1.zip fsf-binutils-gdb-086a18414ad6c07d0ee79990a971fdc7387af7c1.tar.gz fsf-binutils-gdb-086a18414ad6c07d0ee79990a971fdc7387af7c1.tar.bz2 |
* options.cc: Include "demangle.h".
(parse_optional_string): New function.
(parse_long_option): Handle takes_optional_argument.
(parse_short_option): Update dash_z initializer. Handle
takes_optional_argument.
(General_options::General_options): Initialize do_demangle_.
(General_options::finalize): Set do_demangle_. Handle demangling
style.
* options.h (parse_optional_string): Declare.
(struct One_option): Add optional_arg field. Update constructor.
Update call constructor calls. Add takes_optional_argument
function.
(DEFINE_var): Add optional_arg__ parameter. Change all callers.
(DEFINE_optional_string): Define.
(General_options::demangle): Change from DEFINE_bool to
DEFINE_optional_string.
(General_options::no_demangle): New function.
(General_options::do_demangle): New function.
(General_options::set_do_demangle): New function.
(General_options::execstack_status_): Move definition to end of
class definition.
(General_options::static_): Likewise.
(General_options::do_demangle_): New field.
* object.cc (big_endian>::get_symbol_location_info): Call
Options::do_demangle, not Options::demangle.
* symtab.cc (demangle): Likewise.
Diffstat (limited to 'gold/options.h')
-rw-r--r-- | gold/options.h | 81 |
1 files changed, 61 insertions, 20 deletions
diff --git a/gold/options.h b/gold/options.h index ee48d11..a9b546b 100644 --- a/gold/options.h +++ b/gold/options.h @@ -81,6 +81,10 @@ extern void parse_string(const char* option_name, const char* arg, const char** retval); extern void +parse_optional_string(const char* option_name, const char* arg, + const char** retval); + +extern void parse_dirlist(const char* option_name, const char* arg, Dir_list* retval); extern void @@ -114,6 +118,9 @@ enum Dashes // HELPARG is how you define the argument to the option. // --help output is "-shortname HELPARG, --longname HELPARG: HELPSTRING" // HELPARG should be NULL iff the option is a bool and takes no arg. +// OPTIONAL_ARG is true if this option takes an optional argument. An +// optional argument must be specifid as --OPTION=VALUE, not +// --OPTION VALUE. // READER provides parse_to_value, which is a function that will convert // a char* argument into the proper type and store it in some variable. // A One_option struct initializes itself with the global list of options @@ -126,12 +133,13 @@ struct One_option const char* default_value; const char* helpstring; const char* helparg; + bool optional_arg; Struct_var* reader; One_option(const char* ln, Dashes d, char sn, const char* dv, - const char* hs, const char* ha, Struct_var* r) + const char* hs, const char* ha, bool oa, Struct_var* r) : longname(ln), dashes(d), shortname(sn), default_value(dv ? dv : ""), - helpstring(hs), helparg(ha), reader(r) + helpstring(hs), helparg(ha), optional_arg(oa), reader(r) { // In longname, we convert all underscores to dashes, since GNU // style uses dashes in option names. longname is likely to have @@ -153,6 +161,11 @@ struct One_option takes_argument() const { return this->helparg != NULL; } + // Whether the argument is optional. + bool + takes_optional_argument() const + { return this->optional_arg; } + // Register this option with the global list of options. void register_option(); @@ -190,7 +203,7 @@ struct Struct_special : public Struct_var Struct_special(const char* varname, Dashes dashes, char shortname, Parse_function parse_function, const char* helpstring, const char* helparg) - : option(varname, dashes, shortname, "", helpstring, helparg, this), + : option(varname, dashes, shortname, "", helpstring, helparg, false, this), parse(parse_function) { } @@ -212,7 +225,7 @@ struct Struct_special : public Struct_var // type__ for built-in types, and "const type__ &" otherwise. #define DEFINE_var(varname__, dashes__, shortname__, default_value__, \ default_value_as_string__, helpstring__, helparg__, \ - type__, param_type__, parse_fn__) \ + optional_arg__, type__, param_type__, parse_fn__) \ public: \ param_type__ \ varname__() const \ @@ -227,7 +240,7 @@ struct Struct_special : public Struct_var { \ Struct_##varname__() \ : option(#varname__, dashes__, shortname__, default_value_as_string__, \ - helpstring__, helparg__, this), \ + helpstring__, helparg__, optional_arg__, this), \ user_set_via_option(false), value(default_value__) \ { } \ \ @@ -256,12 +269,12 @@ struct Struct_special : public Struct_var helpstring__, no_helpstring__) \ DEFINE_var(varname__, dashes__, shortname__, default_value__, \ default_value__ ? "true" : "false", helpstring__, NULL, \ - bool, bool, options::parse_bool) \ + false, bool, bool, options::parse_bool) \ struct Struct_no_##varname__ : public options::Struct_var \ { \ Struct_no_##varname__() : option("no-" #varname__, dashes__, '\0', \ default_value__ ? "false" : "true", \ - no_helpstring__, NULL, this) \ + no_helpstring__, NULL, false, this) \ { } \ \ void \ @@ -276,25 +289,25 @@ struct Struct_special : public Struct_var #define DEFINE_uint(varname__, dashes__, shortname__, default_value__, \ helpstring__, helparg__) \ DEFINE_var(varname__, dashes__, shortname__, default_value__, \ - #default_value__, helpstring__, helparg__, \ + #default_value__, helpstring__, helparg__, false, \ int, int, options::parse_uint) #define DEFINE_uint64(varname__, dashes__, shortname__, default_value__, \ helpstring__, helparg__) \ DEFINE_var(varname__, dashes__, shortname__, default_value__, \ - #default_value__, helpstring__, helparg__, \ + #default_value__, helpstring__, helparg__, false, \ uint64_t, uint64_t, options::parse_uint64) #define DEFINE_double(varname__, dashes__, shortname__, default_value__, \ helpstring__, helparg__) \ DEFINE_var(varname__, dashes__, shortname__, default_value__, \ - #default_value__, helpstring__, helparg__, \ + #default_value__, helpstring__, helparg__, false, \ double, double, options::parse_double) #define DEFINE_string(varname__, dashes__, shortname__, default_value__, \ helpstring__, helparg__) \ DEFINE_var(varname__, dashes__, shortname__, default_value__, \ - default_value__, helpstring__, helparg__, \ + default_value__, helpstring__, helparg__, false, \ const char*, const char*, options::parse_string) // This is like DEFINE_string, but we convert each occurrence to a @@ -303,7 +316,7 @@ struct Struct_special : public Struct_var #define DEFINE_dirlist(varname__, dashes__, shortname__, \ helpstring__, helparg__) \ DEFINE_var(varname__, dashes__, shortname__, , \ - "", helpstring__, helparg__, options::Dir_list, \ + "", helpstring__, helparg__, false, options::Dir_list, \ const options::Dir_list&, options::parse_dirlist) \ void \ add_to_##varname__(const char* new_value) \ @@ -318,7 +331,7 @@ struct Struct_special : public Struct_var #define DEFINE_enum(varname__, dashes__, shortname__, default_value__, \ helpstring__, helparg__, ...) \ DEFINE_var(varname__, dashes__, shortname__, default_value__, \ - default_value__, helpstring__, helparg__, \ + default_value__, helpstring__, helparg__, false, \ const char*, const char*, parse_choices_##varname__) \ private: \ static void parse_choices_##varname__(const char* option_name, \ @@ -349,6 +362,15 @@ struct Struct_special : public Struct_var }; \ Struct_##varname__ varname__##_initializer_ +// An option that takes an optional string argument. If the option is +// used with no argument, the value will be the default, and +// user_set_via_option will be true. +#define DEFINE_optional_string(varname__, dashes__, shortname__, \ + default_value__, \ + helpstring__, helparg__) \ + DEFINE_var(varname__, dashes__, shortname__, default_value__, \ + default_value__, helpstring__, helparg__, true, \ + const char*, const char*, options::parse_optional_string) // A directory to search. For each directory we record whether it is // in the sysroot. We need to know this so that, if a linker script @@ -465,10 +487,13 @@ class General_options DEFINE_special(defsym, options::TWO_DASHES, '\0', N_("Define a symbol"), N_("SYMBOL=EXPRESSION")); - DEFINE_bool(demangle, options::TWO_DASHES, '\0', - getenv("COLLECT_NO_DEMANGLE") == NULL, - N_("Demangle C++ symbols in log messages"), - N_("Do not demangle C++ symbols in log messages")); + DEFINE_optional_string(demangle, options::TWO_DASHES, '\0', NULL, + N_("Demangle C++ symbols in log messages"), + N_("[=STYLE]")); + + DEFINE_bool(no_demangle, options::TWO_DASHES, '\0', false, + N_("Do not demangle C++ symbols in log messages"), + NULL); DEFINE_bool(detect_odr_violations, options::TWO_DASHES, '\0', false, N_("Try to detect violations of the One Definition Rule"), @@ -666,6 +691,13 @@ class General_options is_stack_executable() const { return this->execstack_status_ == EXECSTACK_YES; } + // The --demangle option takes an optional string, and there is also + // a --no-demangle option. This is the best way to decide whether + // to demangle or not. + bool + do_demangle() const + { return this->do_demangle_; } + private: // Don't copy this structure. General_options(const General_options&); @@ -682,12 +714,14 @@ class General_options EXECSTACK_NO }; - Execstack execstack_status_; void set_execstack_status(Execstack value) - { execstack_status_ = value; } + { this->execstack_status_ = value; } + + void + set_do_demangle(bool value) + { this->do_demangle_ = value; } - bool static_; void set_static(bool value) { static_ = value; } @@ -700,6 +734,13 @@ class General_options // Apply any sysroot to the directory lists. void add_sysroot(); + + // Whether to mark the stack as executable. + Execstack execstack_status_; + // Whether to do a static link. + bool static_; + // Whether to do demangling. + bool do_demangle_; }; // The position-dependent options. We use this to store the state of |