// options.h -- handle command line options for gold  -*- C++ -*-

// Copyright (C) 2006-2021 Free Software Foundation, Inc.
// Written by Ian Lance Taylor <iant@google.com>.

// This file is part of gold.

// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 3 of the License, or
// (at your option) any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
// MA 02110-1301, USA.

// General_options (from Command_line::options())
//   All the options (a.k.a. command-line flags)
// Input_argument (from Command_line::inputs())
//   The list of input files, including -l options.
// Command_line
//   Everything we get from the command line -- the General_options
//   plus the Input_arguments.
//
// There are also some smaller classes, such as
// Position_dependent_options which hold a subset of General_options
// that change as options are parsed (as opposed to the usual behavior
// of the last instance of that option specified on the commandline wins).

#ifndef GOLD_OPTIONS_H
#define GOLD_OPTIONS_H

#include <cstdlib>
#include <cstring>
#include <list>
#include <map>
#include <string>
#include <vector>

#include "elfcpp.h"
#include "script.h"

namespace gold
{

class Command_line;
class General_options;
class Search_directory;
class Input_file_group;
class Input_file_lib;
class Position_dependent_options;
class Target;
class Plugin_manager;
class Script_info;

// Incremental build action for a specific file, as selected by the user.

enum Incremental_disposition
{
  // Startup files that appear before the first disposition option.
  // These will default to INCREMENTAL_CHECK unless the
  // --incremental-startup-unchanged option is given.
  // (For files added implicitly by gcc before any user options.)
  INCREMENTAL_STARTUP,
  // Determine the status from the timestamp (default).
  INCREMENTAL_CHECK,
  // Assume the file changed from the previous build.
  INCREMENTAL_CHANGED,
  // Assume the file didn't change from the previous build.
  INCREMENTAL_UNCHANGED
};

// The nested namespace is to contain all the global variables and
// structs that need to be defined in the .h file, but do not need to
// be used outside this class.
namespace options
{
typedef std::vector<Search_directory> Dir_list;
typedef Unordered_set<std::string> String_set;

// These routines convert from a string option to various types.
// Each gives a fatal error if it cannot parse the argument.

extern void
parse_bool(const char* option_name, const char* arg, bool* retval);

extern void
parse_int(const char* option_name, const char* arg, int* retval);

extern void
parse_uint(const char* option_name, const char* arg, int* retval);

extern void
parse_uint64(const char* option_name, const char* arg, uint64_t* retval);

extern void
parse_double(const char* option_name, const char* arg, double* retval);

extern void
parse_percent(const char* option_name, const char* arg, double* retval);

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
parse_set(const char* option_name, const char* arg, String_set* retval);

extern void
parse_choices(const char* option_name, const char* arg, const char** retval,
	      const char* choices[], int num_choices);

struct Struct_var;

// Most options have both a shortname (one letter) and a longname.
// This enum controls how many dashes are expected for longname access
// -- shortnames always use one dash.  Most longnames will accept
// either one dash or two; the only difference between ONE_DASH and
// TWO_DASHES is how we print the option in --help.  However, some
// longnames require two dashes, and some require only one.  The
// special value DASH_Z means that the option is preceded by "-z".
enum Dashes
{
  ONE_DASH, TWO_DASHES, EXACTLY_ONE_DASH, EXACTLY_TWO_DASHES, DASH_Z
};

// LONGNAME is the long-name of the option with dashes converted to
//    underscores, or else the short-name if the option has no long-name.
//    It is never the empty string.
// DASHES is an instance of the Dashes enum: ONE_DASH, TWO_DASHES, etc.
// SHORTNAME is the short-name of the option, as a char, or '\0' if the
//    option has no short-name.  If the option has no long-name, you
//    should specify the short-name in *both* VARNAME and here.
// DEFAULT_VALUE is the value of the option if not specified on the
//    commandline, as a string.
// HELPSTRING is the descriptive text used with the option via --help
// 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.
// IS_DEFAULT is true for boolean options that are on by default,
//    and thus should have "(default)" printed with the helpstring.
// A One_option struct initializes itself with the global list of options
// at constructor time, so be careful making one of these.
struct One_option
{
  std::string longname;
  Dashes dashes;
  char shortname;
  const char* default_value;
  const char* helpstring;
  const char* helparg;
  bool optional_arg;
  Struct_var* reader;
  bool is_default;

  One_option(const char* ln, Dashes d, char sn, const char* dv,
	     const char* hs, const char* ha, bool oa, Struct_var* r,
	     bool id)
    : longname(ln), dashes(d), shortname(sn), default_value(dv ? dv : ""),
      helpstring(hs), helparg(ha), optional_arg(oa), reader(r),
      is_default(id)
  {
    // In longname, we convert all underscores to dashes, since GNU
    // style uses dashes in option names.  longname is likely to have
    // underscores in it because it's also used to declare a C++
    // function.
    const char* pos = strchr(this->longname.c_str(), '_');
    for (; pos; pos = strchr(pos, '_'))
      this->longname[pos - this->longname.c_str()] = '-';

    // We only register ourselves if our helpstring is not NULL.  This
    // is to support the "no-VAR" boolean variables, which we
    // conditionally turn on by defining "no-VAR" help text.
    if (this->helpstring)
      this->register_option();
  }

  // This option takes an argument iff helparg is not NULL.
  bool
  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();

  // Print this option to stdout (used with --help).
  void
  print() const;
};

// All options have a Struct_##varname that inherits from this and
// actually implements parse_to_value for that option.
struct Struct_var
{
  // OPTION: the name of the option as specified on the commandline,
  //    including leading dashes, and any text following the option:
  //    "-O", "--defsym=mysym=0x1000", etc.
  // ARG: the arg associated with this option, or NULL if the option
  //    takes no argument: "2", "mysym=0x1000", etc.
  // CMDLINE: the global Command_line object.  Used by DEFINE_special.
  // OPTIONS: the global General_options object.  Used by DEFINE_special.
  virtual void
  parse_to_value(const char* option, const char* arg,
		 Command_line* cmdline, General_options* options) = 0;
  virtual
  ~Struct_var()  // To make gcc happy.
  { }
};

// This is for "special" options that aren't of any predefined type.
struct Struct_special : public Struct_var
{
  // If you change this, change the parse-fn in DEFINE_special as well.
  typedef void (General_options::*Parse_function)(const char*, const char*,
						  Command_line*);
  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, false, this,
	     false),
      parse(parse_function)
  { }

  void parse_to_value(const char* option, const char* arg,
		      Command_line* cmdline, General_options* options)
  { (options->*(this->parse))(option, arg, cmdline); }

  One_option option;
  Parse_function parse;
};

}  // End namespace options.


// These are helper macros use by DEFINE_uint64/etc below.
// This macro is used inside the General_options_ class, so defines
// var() and set_var() as General_options methods.  Arguments as are
// for the constructor for One_option.  param_type__ is the same as
// type__ for built-in types, and "const type__ &" otherwise.
//
// When we define the linker command option "assert", the macro argument
// varname__ of DEFINE_var below will be replaced by "assert".  On Mac OSX
// assert.h is included implicitly by one of the library headers we use.  To
// avoid unintended macro substitution of "assert()", we need to enclose
// varname__ with parenthese.
#define DEFINE_var(varname__, dashes__, shortname__, default_value__,        \
		   default_value_as_string__, helpstring__, helparg__,       \
		   optional_arg__, type__, param_type__, parse_fn__,         \
		   is_default__)					     \
 public:                                                                     \
  param_type__                                                               \
  (varname__)() const                                                        \
  { return this->varname__##_.value; }                                       \
									     \
  bool                                                                       \
  user_set_##varname__() const                                               \
  { return this->varname__##_.user_set_via_option; }                         \
									     \
  void									     \
  set_user_set_##varname__()						     \
  { this->varname__##_.user_set_via_option = true; }			     \
									     \
  static const bool varname__##is_default = is_default__;		     \
									     \
 private:                                                                    \
  struct Struct_##varname__ : public options::Struct_var                     \
  {                                                                          \
    Struct_##varname__()                                                     \
      : option(#varname__, dashes__, shortname__, default_value_as_string__, \
	       helpstring__, helparg__, optional_arg__, this, is_default__), \
	user_set_via_option(false), value(default_value__)                   \
    { }                                                                      \
									     \
    void                                                                     \
    parse_to_value(const char* option_name, const char* arg,                 \
		   Command_line*, General_options*)                          \
    {                                                                        \
      parse_fn__(option_name, arg, &this->value);                            \
      this->user_set_via_option = true;                                      \
    }                                                                        \
									     \
    options::One_option option;                                              \
    bool user_set_via_option;                                                \
    type__ value;                                                            \
  };                                                                         \
  Struct_##varname__ varname__##_;                                           \
  void                                                                       \
  set_##varname__(param_type__ value)                                        \
  { this->varname__##_.value = value; }

// These macros allow for easy addition of a new commandline option.

// If no_helpstring__ is not NULL, then in addition to creating
// VARNAME, we also create an option called no-VARNAME (or, for a -z
// option, noVARNAME).
#define DEFINE_bool(varname__, dashes__, shortname__, default_value__,   \
		    helpstring__, no_helpstring__)                       \
  DEFINE_var(varname__, dashes__, shortname__, default_value__,          \
	     default_value__ ? "true" : "false", helpstring__, NULL,     \
	     false, bool, bool, options::parse_bool, default_value__)	 \
  struct Struct_no_##varname__ : public options::Struct_var              \
  {                                                                      \
    Struct_no_##varname__() : option((dashes__ == options::DASH_Z	 \
				      ? "no" #varname__			 \
				      : "no-" #varname__),		 \
				     dashes__, '\0',			 \
				     default_value__ ? "false" : "true", \
				     no_helpstring__, NULL, false, this, \
				     !(default_value__))                 \
    { }                                                                  \
									 \
    void                                                                 \
    parse_to_value(const char*, const char*,                             \
		   Command_line*, General_options* options)              \
    {                                                                    \
      options->set_##varname__(false);                                   \
      options->set_user_set_##varname__();                               \
    }                                                                    \
									 \
    options::One_option option;                                          \
  };                                                                     \
  Struct_no_##varname__ no_##varname__##_initializer_

#define DEFINE_bool_ignore(varname__, dashes__, shortname__,		 \
		    helpstring__, no_helpstring__)                       \
  DEFINE_var(varname__, dashes__, shortname__, false,			 \
	     "false", helpstring__, NULL,				 \
	     false, bool, bool, options::parse_bool, false)		 \
  struct Struct_no_##varname__ : public options::Struct_var              \
  {                                                                      \
    Struct_no_##varname__() : option((dashes__ == options::DASH_Z	 \
				      ? "no" #varname__			 \
				      : "no-" #varname__),		 \
				     dashes__, '\0',			 \
				     "false",				 \
				     no_helpstring__, NULL, false, this, \
				     false)				 \
    { }                                                                  \
									 \
    void                                                                 \
    parse_to_value(const char*, const char*,                             \
		   Command_line*, General_options* options)              \
    {                                                                    \
      options->set_##varname__(false);                                   \
      options->set_user_set_##varname__();                               \
    }                                                                    \
									 \
    options::One_option option;                                          \
  };                                                                     \
  Struct_no_##varname__ no_##varname__##_initializer_

#define DEFINE_enable(varname__, dashes__, shortname__, default_value__, \
		      helpstring__, no_helpstring__)                     \
  DEFINE_var(enable_##varname__, dashes__, shortname__, default_value__, \
	     default_value__ ? "true" : "false", helpstring__, NULL,     \
	     false, bool, bool, options::parse_bool, default_value__)	 \
  struct Struct_disable_##varname__ : public options::Struct_var         \
  {                                                                      \
    Struct_disable_##varname__() : option("disable-" #varname__,         \
				     dashes__, '\0',                     \
				     default_value__ ? "false" : "true", \
				     no_helpstring__, NULL, false, this, \
				     !default_value__)                   \
    { }                                                                  \
									 \
    void                                                                 \
    parse_to_value(const char*, const char*,                             \
		   Command_line*, General_options* options)              \
    { options->set_enable_##varname__(false); }                          \
									 \
    options::One_option option;                                          \
  };                                                                     \
  Struct_disable_##varname__ disable_##varname__##_initializer_

#define DEFINE_int(varname__, dashes__, shortname__, default_value__,   \
		   helpstring__, helparg__)                             \
  DEFINE_var(varname__, dashes__, shortname__, default_value__,         \
	     #default_value__, helpstring__, helparg__, false,		\
	     int, int, options::parse_int, false)

#define DEFINE_uint(varname__, dashes__, shortname__, default_value__,  \
		   helpstring__, helparg__)                             \
  DEFINE_var(varname__, dashes__, shortname__, default_value__,         \
	     #default_value__, helpstring__, helparg__, false,		\
	     int, int, options::parse_uint, false)

#define DEFINE_uint64(varname__, dashes__, shortname__, default_value__, \
		      helpstring__, helparg__)                           \
  DEFINE_var(varname__, dashes__, shortname__, default_value__,          \
	     #default_value__, helpstring__, helparg__, false,		 \
	     uint64_t, uint64_t, options::parse_uint64, false)

#define DEFINE_double(varname__, dashes__, shortname__, default_value__, \
		      helpstring__, helparg__)				 \
  DEFINE_var(varname__, dashes__, shortname__, default_value__,		 \
	     #default_value__, helpstring__, helparg__, false,		 \
	     double, double, options::parse_double, false)

#define DEFINE_percent(varname__, dashes__, shortname__, default_value__, \
		       helpstring__, helparg__)				  \
  DEFINE_var(varname__, dashes__, shortname__, default_value__ / 100.0,	  \
	     #default_value__, helpstring__, helparg__, false,		  \
	     double, double, options::parse_percent, false)

#define DEFINE_string(varname__, dashes__, shortname__, default_value__, \
		      helpstring__, helparg__)                           \
  DEFINE_var(varname__, dashes__, shortname__, default_value__,          \
	     default_value__, helpstring__, helparg__, false,		 \
	     const char*, const char*, options::parse_string, false)

// This is like DEFINE_string, but we convert each occurrence to a
// Search_directory and store it in a vector.  Thus we also have the
// add_to_VARNAME() method, to append to the vector.
#define DEFINE_dirlist(varname__, dashes__, shortname__,                  \
			   helpstring__, helparg__)                       \
  DEFINE_var(varname__, dashes__, shortname__, ,                          \
	     "", helpstring__, helparg__, false, options::Dir_list,	  \
	     const options::Dir_list&, options::parse_dirlist, false)     \
  void                                                                    \
  add_to_##varname__(const char* new_value)                               \
  { options::parse_dirlist(NULL, new_value, &this->varname__##_.value); } \
  void                                                                    \
  add_search_directory_to_##varname__(const Search_directory& dir)        \
  { this->varname__##_.value.push_back(dir); }

// This is like DEFINE_string, but we store a set of strings.
#define DEFINE_set(varname__, dashes__, shortname__,                      \
		   helpstring__, helparg__)                               \
  DEFINE_var(varname__, dashes__, shortname__, ,                          \
	     "", helpstring__, helparg__, false, options::String_set,     \
	     const options::String_set&, options::parse_set, false)       \
 public:                                                                  \
  bool                                                                    \
  any_##varname__() const                                                 \
  { return !this->varname__##_.value.empty(); }                           \
									  \
  bool                                                                    \
  is_##varname__(const char* symbol) const                                \
  {                                                                       \
    return (!this->varname__##_.value.empty()                             \
	    && (this->varname__##_.value.find(std::string(symbol))        \
		!= this->varname__##_.value.end()));                      \
  }									  \
									  \
  options::String_set::const_iterator					  \
  varname__##_begin() const						  \
  { return this->varname__##_.value.begin(); }				  \
									  \
  options::String_set::const_iterator					  \
  varname__##_end() const						  \
  { return this->varname__##_.value.end(); }                              \
									  \
  options::String_set::size_type                                          \
  varname__##_size() const                                                \
  { return this->varname__##_.value.size(); }                             \

// When you have a list of possible values (expressed as string)
// After helparg__ should come an initializer list, like
//   {"foo", "bar", "baz"}
#define DEFINE_enum(varname__, dashes__, shortname__, default_value__,   \
		    helpstring__, helparg__, optional_arg__, ...)        \
  DEFINE_var(varname__, dashes__, shortname__, default_value__,          \
	     default_value__, helpstring__, helparg__, optional_arg__,   \
	     const char*, const char*, parse_choices_##varname__, false) \
 private:                                                                \
  static void parse_choices_##varname__(const char* option_name,         \
					const char* arg,                 \
					const char** retval) {           \
    const char* choices[] = __VA_ARGS__;                                 \
    options::parse_choices(option_name, arg, retval,                     \
			   choices, sizeof(choices) / sizeof(*choices)); \
  }

// This is like DEFINE_bool, but VARNAME is the name of a different
// option.  This option becomes an alias for that one.  INVERT is true
// if this option is an inversion of the other one.
#define DEFINE_bool_alias(option__, varname__, dashes__, shortname__,	\
			  helpstring__, no_helpstring__, invert__)	\
 private:								\
  struct Struct_##option__ : public options::Struct_var			\
  {									\
    Struct_##option__()							\
      : option(#option__, dashes__, shortname__, "", helpstring__,	\
	       NULL, false, this,					\
	       General_options::varname__##is_default ^ invert__)	\
    { }									\
									\
    void								\
    parse_to_value(const char*, const char*,				\
		   Command_line*, General_options* options)		\
    {									\
      options->set_##varname__(!invert__);				\
      options->set_user_set_##varname__();				\
    }									\
									\
    options::One_option option;						\
  };									\
  Struct_##option__ option__##_;					\
									\
  struct Struct_no_##option__ : public options::Struct_var		\
  {									\
    Struct_no_##option__()						\
      : option((dashes__ == options::DASH_Z				\
		? "no" #option__					\
		: "no-" #option__),					\
	       dashes__, '\0', "", no_helpstring__,			\
	       NULL, false, this,					\
	       !General_options::varname__##is_default ^ invert__)	\
    { }									\
									\
    void								\
    parse_to_value(const char*, const char*,				\
		   Command_line*, General_options* options)		\
    {									\
      options->set_##varname__(invert__);				\
      options->set_user_set_##varname__();				\
    }									\
									\
    options::One_option option;						\
  };									\
  Struct_no_##option__ no_##option__##_initializer_

// This is like DEFINE_uint64, but VARNAME is the name of a different
// option.  This option becomes an alias for that one.
#define DEFINE_uint64_alias(option__, varname__, dashes__, shortname__,	\
			    helpstring__, helparg__)			\
 private:								\
  struct Struct_##option__ : public options::Struct_var			\
  {									\
    Struct_##option__()							\
      : option(#option__, dashes__, shortname__, "", helpstring__,	\
	       helparg__, false, this, false)				\
    { }									\
									\
    void								\
    parse_to_value(const char* option_name, const char* arg,		\
		   Command_line*, General_options* options)		\
    {									\
      uint64_t value;							\
      options::parse_uint64(option_name, arg, &value);			\
      options->set_##varname__(value);					\
      options->set_user_set_##varname__();				\
    }									\
									\
    options::One_option option;						\
  };									\
  Struct_##option__ option__##_;

// This is used for non-standard flags.  It defines no functions; it
// just calls General_options::parse_VARNAME whenever the flag is
// seen.  We declare parse_VARNAME as a static member of
// General_options; you are responsible for defining it there.
// helparg__ should be NULL iff this special-option is a boolean.
#define DEFINE_special(varname__, dashes__, shortname__,                \
		       helpstring__, helparg__)                         \
 private:                                                               \
  void parse_##varname__(const char* option, const char* arg,           \
			 Command_line* inputs);                         \
  struct Struct_##varname__ : public options::Struct_special            \
  {                                                                     \
    Struct_##varname__()                                                \
      : options::Struct_special(#varname__, dashes__, shortname__,      \
				&General_options::parse_##varname__,    \
				helpstring__, helparg__)                \
    { }                                                                 \
  };                                                                    \
  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,  \
	     false)

// 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
// is found within the sysroot, we will apply the sysroot to any files
// named by that script.

class Search_directory
{
 public:
  // We need a default constructor because we put this in a
  // std::vector.
  Search_directory()
    : name_(), put_in_sysroot_(false), is_in_sysroot_(false)
  { }

  // This is the usual constructor.
  Search_directory(const std::string& name, bool put_in_sysroot)
    : name_(name), put_in_sysroot_(put_in_sysroot), is_in_sysroot_(false)
  {
    if (this->name_.empty())
      this->name_ = ".";
  }

  // This is called if we have a sysroot.  The sysroot is prefixed to
  // any entries for which put_in_sysroot_ is true.  is_in_sysroot_ is
  // set to true for any enries which are in the sysroot (this will
  // naturally include any entries for which put_in_sysroot_ is true).
  // SYSROOT is the sysroot, CANONICAL_SYSROOT is the result of
  // passing SYSROOT to lrealpath.
  void
  add_sysroot(const char* sysroot, const char* canonical_sysroot);

  // Get the directory name.
  const std::string&
  name() const
  { return this->name_; }

  // Return whether this directory is in the sysroot.
  bool
  is_in_sysroot() const
  { return this->is_in_sysroot_; }

  // Return whether this is considered a system directory.
  bool
  is_system_directory() const
  { return this->put_in_sysroot_ || this->is_in_sysroot_; }

 private:
  // The directory name.
  std::string name_;
  // True if the sysroot should be added as a prefix for this
  // directory (if there is a sysroot).  This is true for system
  // directories that we search by default.
  bool put_in_sysroot_;
  // True if this directory is in the sysroot (if there is a sysroot).
  // This is true if there is a sysroot and either 1) put_in_sysroot_
  // is true, or 2) the directory happens to be in the sysroot based
  // on a pathname comparison.
  bool is_in_sysroot_;
};

class General_options
{
 private:
  // NOTE: For every option that you add here, also consider if you
  // should add it to Position_dependent_options.
  DEFINE_special(help, options::TWO_DASHES, '\0',
		 N_("Report usage information"), NULL);
  DEFINE_special(version, options::TWO_DASHES, 'v',
		 N_("Report version information"), NULL);
  DEFINE_special(V, options::EXACTLY_ONE_DASH, '\0',
		 N_("Report version and target information"), NULL);

  // These options are sorted approximately so that for each letter in
  // the alphabet, we show the option whose shortname is that letter
  // (if any) and then every longname that starts with that letter (in
  // alphabetical order).  For both, lowercase sorts before uppercase.
  // The -z options come last.

  // a

  DEFINE_bool(add_needed, options::TWO_DASHES, '\0', false,
	      N_("Not supported"),
	      N_("Do not copy DT_NEEDED tags from shared libraries"));

  DEFINE_bool_alias(allow_multiple_definition, muldefs, options::TWO_DASHES,
		    '\0',
		    N_("Allow multiple definitions of symbols"),
		    N_("Do not allow multiple definitions"), false);

  DEFINE_bool(allow_shlib_undefined, options::TWO_DASHES, '\0', false,
	      N_("Allow unresolved references in shared libraries"),
	      N_("Do not allow unresolved references in shared libraries"));

  DEFINE_bool(apply_dynamic_relocs, options::TWO_DASHES, '\0', true,
	      N_("Apply link-time values for dynamic relocations"),
	      N_("(aarch64 only) Do not apply link-time values "
		 "for dynamic relocations"));

  DEFINE_bool(as_needed, options::TWO_DASHES, '\0', false,
	      N_("Use DT_NEEDED only for shared libraries that are used"),
	      N_("Use DT_NEEDED for all shared libraries"));

  DEFINE_enum(assert, options::ONE_DASH, '\0', NULL,
	      N_("Ignored"), N_("[ignored]"), false,
	      {"definitions", "nodefinitions", "nosymbolic", "pure-text"});

  // b

  // This should really be an "enum", but it's too easy for folks to
  // forget to update the list as they add new targets.  So we just
  // accept any string.  We'll fail later (when the string is parsed),
  // if the target isn't actually supported.
  DEFINE_string(format, options::TWO_DASHES, 'b', "elf",
		N_("Set input format"), ("[elf,binary]"));

  DEFINE_bool(be8, options::TWO_DASHES, '\0', false,
	      N_("Output BE8 format image"), NULL);

  DEFINE_optional_string(build_id, options::TWO_DASHES, '\0', "tree",
			 N_("Generate build ID note"),
			 N_("[=STYLE]"));

  DEFINE_uint64(build_id_chunk_size_for_treehash,
		options::TWO_DASHES, '\0', 2 << 20,
		N_("Chunk size for '--build-id=tree'"), N_("SIZE"));

  DEFINE_uint64(build_id_min_file_size_for_treehash, options::TWO_DASHES,
		'\0', 40 << 20,
		N_("Minimum output file size for '--build-id=tree' to work"
		   " differently than '--build-id=sha1'"), N_("SIZE"));

  DEFINE_bool(Bdynamic, options::ONE_DASH, '\0', true,
	      N_("-l searches for shared libraries"), NULL);
  DEFINE_bool_alias(Bstatic, Bdynamic, options::ONE_DASH, '\0',
		    N_("-l does not search for shared libraries"), NULL,
		    true);
  DEFINE_bool_alias(dy, Bdynamic, options::ONE_DASH, '\0',
		    N_("alias for -Bdynamic"), NULL, false);
  DEFINE_bool_alias(dn, Bdynamic, options::ONE_DASH, '\0',
		    N_("alias for -Bstatic"), NULL, true);

  DEFINE_bool(Bgroup, options::ONE_DASH, '\0', false,
	      N_("Use group name lookup rules for shared library"), NULL);

  DEFINE_bool(Bshareable, options::ONE_DASH, '\0', false,
	      N_("Generate shared library (alias for -G/-shared)"), NULL);

  DEFINE_special (Bno_symbolic, options::ONE_DASH, '\0',
		  N_ ("Don't bind default visibility defined symbols locally "
		      "for -shared (default)"),
		  NULL);

  DEFINE_special (Bsymbolic_functions, options::ONE_DASH, '\0',
		  N_ ("Bind default visibility defined function symbols "
		      "locally for -shared"),
		  NULL);

  DEFINE_special (
      Bsymbolic, options::ONE_DASH, '\0',
      N_ ("Bind default visibility defined symbols locally for -shared"),
      NULL);

  // c

  DEFINE_bool(check_sections, options::TWO_DASHES, '\0', true,
	      N_("Check segment addresses for overlaps"),
	      N_("Do not check segment addresses for overlaps"));

  DEFINE_enum(compress_debug_sections, options::TWO_DASHES, '\0', "none",
	      N_("Compress .debug_* sections in the output file"),
	      ("[none,zlib,zlib-gnu,zlib-gabi]"), false,
	      {"none", "zlib", "zlib-gnu", "zlib-gabi"});

  DEFINE_bool(copy_dt_needed_entries, options::TWO_DASHES, '\0', false,
	      N_("Not supported"),
	      N_("Do not copy DT_NEEDED tags from shared libraries"));

  DEFINE_bool(cref, options::TWO_DASHES, '\0', false,
	      N_("Output cross reference table"),
	      N_("Do not output cross reference table"));

  DEFINE_bool(ctors_in_init_array, options::TWO_DASHES, '\0', true,
	      N_("Use DT_INIT_ARRAY for all constructors"),
	      N_("Handle constructors as directed by compiler"));

  // d

  DEFINE_bool(define_common, options::TWO_DASHES, 'd', false,
	      N_("Define common symbols"),
	      N_("Do not define common symbols in relocatable output"));
  DEFINE_bool(dc, options::ONE_DASH, '\0', false,
	      N_("Alias for -d"), NULL);
  DEFINE_bool(dp, options::ONE_DASH, '\0', false,
	      N_("Alias for -d"), NULL);

  DEFINE_string(debug, options::TWO_DASHES, '\0', "",
		N_("Turn on debugging"),
		N_("[all,files,script,task][,...]"));

  DEFINE_special(defsym, options::TWO_DASHES, '\0',
		 N_("Define a symbol"), N_("SYMBOL=EXPRESSION"));

  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_string(dependency_file, options::TWO_DASHES, '\0', NULL,
		N_("Write a dependency file listing all files read"),
		N_("FILE"));

  DEFINE_bool(detect_odr_violations, options::TWO_DASHES, '\0', false,
	      N_("Look for violations of the C++ One Definition Rule"),
	      N_("Do not look for violations of the C++ One Definition Rule"));

  DEFINE_bool(dynamic_list_data, options::TWO_DASHES, '\0', false,
	      N_("Add data symbols to dynamic symbols"), NULL);

  DEFINE_bool(dynamic_list_cpp_new, options::TWO_DASHES, '\0', false,
	      N_("Add C++ operator new/delete to dynamic symbols"), NULL);

  DEFINE_bool(dynamic_list_cpp_typeinfo, options::TWO_DASHES, '\0', false,
	      N_("Add C++ typeinfo to dynamic symbols"), NULL);

  DEFINE_special(dynamic_list, options::TWO_DASHES, '\0',
		 N_("Read a list of dynamic symbols"), N_("FILE"));

  // e

  DEFINE_bool(emit_stub_syms, options::TWO_DASHES, '\0', true,
	      N_("(PowerPC only) Label linker stubs with a symbol"),
	      N_("(PowerPC only) Do not label linker stubs with a symbol"));

  DEFINE_string(entry, options::TWO_DASHES, 'e', NULL,
		N_("Set program start address"), N_("ADDRESS"));

  DEFINE_bool(eh_frame_hdr, options::TWO_DASHES, '\0', false,
	      N_("Create exception frame header"),
	      N_("Do not create exception frame header"));

  // Alphabetized under 'e' because the option is spelled --enable-new-dtags.
  DEFINE_enable(new_dtags, options::EXACTLY_TWO_DASHES, '\0', true,
		N_("Enable use of DT_RUNPATH"),
		N_("Disable use of DT_RUNPATH"));

  DEFINE_bool(enum_size_warning, options::TWO_DASHES, '\0', true, NULL,
	      N_("(ARM only) Do not warn about objects with incompatible "
		 "enum sizes"));

  DEFINE_special(exclude_libs, options::TWO_DASHES, '\0',
		 N_("Exclude libraries from automatic export"),
		 N_(("lib,lib ...")));

  DEFINE_bool(export_dynamic, options::TWO_DASHES, 'E', false,
	      N_("Export all dynamic symbols"),
	      N_("Do not export all dynamic symbols"));

  DEFINE_set(export_dynamic_symbol, options::TWO_DASHES, '\0',
	     N_("Export SYMBOL to dynamic symbol table"), N_("SYMBOL"));

  DEFINE_special(EB, options::ONE_DASH, '\0',
		 N_("Link big-endian objects."), NULL);
  DEFINE_special(EL, options::ONE_DASH, '\0',
		 N_("Link little-endian objects."), NULL);

  // f

  DEFINE_set(auxiliary, options::TWO_DASHES, 'f',
	     N_("Auxiliary filter for shared object symbol table"),
	     N_("SHLIB"));

  DEFINE_string(filter, options::TWO_DASHES, 'F', NULL,
		N_("Filter for shared object symbol table"),
		N_("SHLIB"));

  DEFINE_bool(fatal_warnings, options::TWO_DASHES, '\0', false,
	      N_("Treat warnings as errors"),
	      N_("Do not treat warnings as errors"));

  DEFINE_string(fini, options::ONE_DASH, '\0', "_fini",
		N_("Call SYMBOL at unload-time"), N_("SYMBOL"));

  DEFINE_bool(fix_arm1176, options::TWO_DASHES, '\0', true,
	      N_("(ARM only) Fix binaries for ARM1176 erratum"),
	      N_("(ARM only) Do not fix binaries for ARM1176 erratum"));

  DEFINE_bool(fix_cortex_a8, options::TWO_DASHES, '\0', false,
	      N_("(ARM only) Fix binaries for Cortex-A8 erratum"),
	      N_("(ARM only) Do not fix binaries for Cortex-A8 erratum"));

  DEFINE_bool(fix_cortex_a53_843419, options::TWO_DASHES, '\0', false,
	      N_("(AArch64 only) Fix Cortex-A53 erratum 843419"),
	      N_("(AArch64 only) Do not fix Cortex-A53 erratum 843419"));

  DEFINE_bool(fix_cortex_a53_835769, options::TWO_DASHES, '\0', false,
	      N_("(AArch64 only) Fix Cortex-A53 erratum 835769"),
	      N_("(AArch64 only) Do not fix Cortex-A53 erratum 835769"));

  DEFINE_special(fix_v4bx, options::TWO_DASHES, '\0',
		 N_("(ARM only) Rewrite BX rn as MOV pc, rn for ARMv4"),
		 NULL);

  DEFINE_special(fix_v4bx_interworking, options::TWO_DASHES, '\0',
		 N_("(ARM only) Rewrite BX rn branch to ARMv4 interworking "
		    "veneer"),
		 NULL);

  DEFINE_string(fuse_ld, options::ONE_DASH, '\0', "",
		N_("Ignored for GCC linker option compatibility"),
		N_("[gold,bfd]"));

  // g

  DEFINE_bool(g, options::EXACTLY_ONE_DASH, '\0', false,
	      N_("Ignored"), NULL);

  DEFINE_bool(gc_sections, options::TWO_DASHES, '\0', false,
	      N_("Remove unused sections"),
	      N_("Don't remove unused sections"));

  DEFINE_bool(gdb_index, options::TWO_DASHES, '\0', false,
	      N_("Generate .gdb_index section"),
	      N_("Do not generate .gdb_index section"));

  DEFINE_bool(gnu_unique, options::TWO_DASHES, '\0', true,
	      N_("Enable STB_GNU_UNIQUE symbol binding"),
	      N_("Disable STB_GNU_UNIQUE symbol binding"));

  DEFINE_bool(shared, options::ONE_DASH, 'G', false,
	      N_("Generate shared library"), NULL);

  // h

  DEFINE_string(soname, options::ONE_DASH, 'h', NULL,
		N_("Set shared library name"), N_("FILENAME"));

  DEFINE_double(hash_bucket_empty_fraction, options::TWO_DASHES, '\0', 0.0,
		N_("Min fraction of empty buckets in dynamic hash"),
		N_("FRACTION"));

  DEFINE_enum(hash_style, options::TWO_DASHES, '\0', DEFAULT_HASH_STYLE,
	      N_("Dynamic hash style"), N_("[sysv,gnu,both]"), false,
	      {"sysv", "gnu", "both"});

  // i

  DEFINE_bool_alias(i, relocatable, options::EXACTLY_ONE_DASH, '\0',
		    N_("Alias for -r"), NULL, false);

  DEFINE_enum(icf, options::TWO_DASHES, '\0', "none",
	      N_("Identical Code Folding. "
		 "\'--icf=safe\' Folds ctors, dtors and functions whose"
		 " pointers are definitely not taken"),
	      ("[none,all,safe]"), false,
	      {"none", "all", "safe"});

  DEFINE_uint(icf_iterations, options::TWO_DASHES , '\0', 0,
	      N_("Number of iterations of ICF (default 3)"), N_("COUNT"));

  DEFINE_special(incremental, options::TWO_DASHES, '\0',
		 N_("Do an incremental link if possible; "
		    "otherwise, do a full link and prepare output "
		    "for incremental linking"), NULL);

  DEFINE_special(no_incremental, options::TWO_DASHES, '\0',
		 N_("Do a full link (default)"), NULL);

  DEFINE_special(incremental_full, options::TWO_DASHES, '\0',
		 N_("Do a full link and "
		    "prepare output for incremental linking"), NULL);

  DEFINE_special(incremental_update, options::TWO_DASHES, '\0',
		 N_("Do an incremental link; exit if not possible"), NULL);

  DEFINE_string(incremental_base, options::TWO_DASHES, '\0', NULL,
		N_("Set base file for incremental linking"
		   " (default is output file)"),
		N_("FILE"));

  DEFINE_special(incremental_changed, options::TWO_DASHES, '\0',
		 N_("Assume files changed"), NULL);

  DEFINE_special(incremental_unchanged, options::TWO_DASHES, '\0',
		 N_("Assume files didn't change"), NULL);

  DEFINE_special(incremental_unknown, options::TWO_DASHES, '\0',
		 N_("Use timestamps to check files (default)"), NULL);

  DEFINE_special(incremental_startup_unchanged, options::TWO_DASHES, '\0',
		 N_("Assume startup files unchanged "
		    "(files preceding this option)"), NULL);

  DEFINE_percent(incremental_patch, options::TWO_DASHES, '\0', 10,
		 N_("Amount of extra space to allocate for patches "
		    "(default 10)"),
		 N_("PERCENT"));

  DEFINE_string(init, options::ONE_DASH, '\0', "_init",
		N_("Call SYMBOL at load-time"), N_("SYMBOL"));

  DEFINE_string(dynamic_linker, options::TWO_DASHES, 'I', NULL,
		N_("Set dynamic linker path"), N_("PROGRAM"));

  // j

  DEFINE_special(just_symbols, options::TWO_DASHES, '\0',
		 N_("Read only symbol values from FILE"), N_("FILE"));

  // k

  DEFINE_bool(keep_files_mapped, options::TWO_DASHES, '\0', true,
	      N_("Keep files mapped across passes"),
	      N_("Release mapped files after each pass"));

  DEFINE_set(keep_unique, options::TWO_DASHES, '\0',
	     N_("Do not fold this symbol during ICF"), N_("SYMBOL"));

  // l

  DEFINE_special(library, options::TWO_DASHES, 'l',
		 N_("Search for library LIBNAME"), N_("LIBNAME"));

  DEFINE_bool(ld_generated_unwind_info, options::TWO_DASHES, '\0', true,
	      N_("Generate unwind information for PLT"),
	      N_("Do not generate unwind information for PLT"));

  DEFINE_dirlist(library_path, options::TWO_DASHES, 'L',
		 N_("Add directory to search path"), N_("DIR"));

  DEFINE_bool(long_plt, options::TWO_DASHES, '\0', false,
	      N_("(ARM only) Generate long PLT entries"),
	      N_("(ARM only) Do not generate long PLT entries"));

  // m

  DEFINE_string(m, options::EXACTLY_ONE_DASH, 'm', "",
		N_("Set GNU linker emulation; obsolete"), N_("EMULATION"));

  DEFINE_bool(map_whole_files, options::TWO_DASHES, '\0',
	      sizeof(void*) >= 8,
	      N_("Map whole files to memory"),
	      N_("Map relevant file parts to memory"));

  DEFINE_bool(merge_exidx_entries, options::TWO_DASHES, '\0', true,
	      N_("(ARM only) Merge exidx entries in debuginfo"),
	      N_("(ARM only) Do not merge exidx entries in debuginfo"));

  DEFINE_bool(mmap_output_file, options::TWO_DASHES, '\0', true,
	      N_("Map the output file for writing"),
	      N_("Do not map the output file for writing"));

  DEFINE_bool(print_map, options::TWO_DASHES, 'M', false,
	      N_("Write map file on standard output"), NULL);

  DEFINE_string(Map, options::ONE_DASH, '\0', NULL, N_("Write map file"),
		N_("MAPFILENAME"));

  // n

  DEFINE_bool(nmagic, options::TWO_DASHES, 'n', false,
	      N_("Do not page align data"), NULL);
  DEFINE_bool(omagic, options::EXACTLY_TWO_DASHES, 'N', false,
	      N_("Do not page align data, do not make text readonly"),
	      N_("Page align data, make text readonly"));

  DEFINE_bool(no_keep_memory, options::TWO_DASHES, '\0', false,
	      N_("Use less memory and more disk I/O "
		 "(included only for compatibility with GNU ld)"), NULL);

  DEFINE_bool_alias(no_undefined, defs, options::TWO_DASHES, '\0',
		    N_("Report undefined symbols (even with --shared)"),
		    NULL, false);

  DEFINE_bool(noinhibit_exec, options::TWO_DASHES, '\0', false,
	      N_("Create an output file even if errors occur"), NULL);

  DEFINE_bool(nostdlib, options::ONE_DASH, '\0', false,
	      N_("Only search directories specified on the command line"),
	      NULL);

  // o

  DEFINE_string(output, options::TWO_DASHES, 'o', "a.out",
		N_("Set output file name"), N_("FILE"));

  DEFINE_string(oformat, options::EXACTLY_TWO_DASHES, '\0', "elf",
		N_("Set output format"), N_("[binary]"));

  DEFINE_uint(optimize, options::EXACTLY_ONE_DASH, 'O', 0,
	      N_("Optimize output file size"), N_("LEVEL"));

  DEFINE_enum(orphan_handling, options::TWO_DASHES, '\0', "place",
	      N_("Orphan section handling"), N_("[place,discard,warn,error]"),
	      false, {"place", "discard", "warn", "error"});

  // p

  DEFINE_bool(p, options::ONE_DASH, 'p', false,
	      N_("Ignored for ARM compatibility"), NULL);

  DEFINE_bool(pie, options::ONE_DASH, '\0', false,
	      N_("Create a position independent executable"),
	      N_("Do not create a position independent executable"));
  DEFINE_bool_alias(pic_executable, pie, options::TWO_DASHES, '\0',
		    N_("Create a position independent executable"),
		    N_("Do not create a position independent executable"),
		    false);

  DEFINE_bool(pic_veneer, options::TWO_DASHES, '\0', false,
	      N_("Force PIC sequences for ARM/Thumb interworking veneers"),
	      NULL);

  DEFINE_bool(pipeline_knowledge, options::ONE_DASH, '\0', false,
	      NULL, N_("(ARM only) Ignore for backward compatibility"));

  DEFINE_var(plt_align, options::TWO_DASHES, '\0', 0, "5",
	     N_("(PowerPC only) Align PLT call stubs to fit cache lines"),
	     N_("[=P2ALIGN]"), true, int, int, options::parse_uint, false);

  DEFINE_bool(plt_localentry, options::TWO_DASHES, '\0', false,
	      N_("(PowerPC64 only) Optimize calls to ELFv2 localentry:0 functions"),
	      N_("(PowerPC64 only) Don't optimize ELFv2 calls"));

  DEFINE_bool(plt_static_chain, options::TWO_DASHES, '\0', false,
	      N_("(PowerPC64 only) PLT call stubs should load r11"),
	      N_("(PowerPC64 only) PLT call stubs should not load r11"));

  DEFINE_bool(plt_thread_safe, options::TWO_DASHES, '\0', false,
	      N_("(PowerPC64 only) PLT call stubs with load-load barrier"),
	      N_("(PowerPC64 only) PLT call stubs without barrier"));

#ifdef ENABLE_PLUGINS
  DEFINE_special(plugin, options::TWO_DASHES, '\0',
		 N_("Load a plugin library"), N_("PLUGIN"));
  DEFINE_special(plugin_opt, options::TWO_DASHES, '\0',
		 N_("Pass an option to the plugin"), N_("OPTION"));
#else
  DEFINE_special(plugin, options::TWO_DASHES, '\0',
		 N_("Load a plugin library (not supported)"), N_("PLUGIN"));
  DEFINE_special(plugin_opt, options::TWO_DASHES, '\0',
		 N_("Pass an option to the plugin (not supported)"),
		 N_("OPTION"));
#endif

  DEFINE_bool(posix_fallocate, options::TWO_DASHES, '\0', true,
	      N_("Use posix_fallocate to reserve space in the output file"),
	      N_("Use fallocate or ftruncate to reserve space"));

  DEFINE_enum(power10_stubs, options::TWO_DASHES, '\0', "yes",
	     N_("(PowerPC64 only) stubs use power10 insns"),
	     N_("[=auto,no,yes]"), true, {"auto", "no", "yes"});
  DEFINE_special(no_power10_stubs, options::TWO_DASHES, '\0',
		 N_("(PowerPC64 only) stubs do not use power10 insns"), NULL);

  DEFINE_bool(preread_archive_symbols, options::TWO_DASHES, '\0', false,
	      N_("Preread archive symbols when multi-threaded"), NULL);

  DEFINE_bool(print_gc_sections, options::TWO_DASHES, '\0', false,
	      N_("List removed unused sections on stderr"),
	      N_("Do not list removed unused sections"));

  DEFINE_bool(print_icf_sections, options::TWO_DASHES, '\0', false,
	      N_("List folded identical sections on stderr"),
	      N_("Do not list folded identical sections"));

  DEFINE_bool(print_output_format, options::TWO_DASHES, '\0', false,
	      N_("Print default output format"), NULL);

  DEFINE_string(print_symbol_counts, options::TWO_DASHES, '\0', NULL,
		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,
	      N_("Generate relocations in output"), NULL);

  DEFINE_bool(Qy, options::EXACTLY_ONE_DASH, '\0', false,
	      N_("Ignored for SVR4 compatibility"), NULL);

  // r

  DEFINE_bool(relocatable, options::EXACTLY_ONE_DASH, 'r', false,
	      N_("Generate relocatable output"), NULL);

  DEFINE_bool(relax, options::TWO_DASHES, '\0', false,
	      N_("Relax branches on certain targets"),
	      N_("Do not relax branches"));

  DEFINE_string(retain_symbols_file, options::TWO_DASHES, '\0', NULL,
		N_("keep only symbols listed in this file"), N_("FILE"));

  DEFINE_bool(rosegment, options::TWO_DASHES, '\0', false,
	      N_("Put read-only non-executable sections in their own segment"),
	      N_("Do not put read-only non-executable sections in their own segment"));

  DEFINE_uint64(rosegment_gap, options::TWO_DASHES, '\0', -1U,
		N_("Set offset between executable and read-only segments"),
		N_("OFFSET"));

  // -R really means -rpath, but can mean --just-symbols for
  // compatibility with GNU ld.  -rpath is always -rpath, so we list
  // it separately.
  DEFINE_special(R, options::EXACTLY_ONE_DASH, 'R',
		 N_("Add DIR to runtime search path"), N_("DIR"));

  DEFINE_dirlist(rpath, options::ONE_DASH, '\0',
		 N_("Add DIR to runtime search path"), N_("DIR"));

  DEFINE_dirlist(rpath_link, options::TWO_DASHES, '\0',
		 N_("Add DIR to link time shared library search path"),
		 N_("DIR"));

  // s

  DEFINE_bool(strip_all, options::TWO_DASHES, 's', false,
	      N_("Strip all symbols"), NULL);
  DEFINE_bool(strip_debug, options::TWO_DASHES, 'S', false,
	      N_("Strip debugging information"), NULL);
  DEFINE_bool(strip_debug_non_line, options::TWO_DASHES, '\0', false,
	      N_("Emit only debug line number information"), NULL);
  DEFINE_bool(strip_debug_gdb, options::TWO_DASHES, '\0', false,
	      N_("Strip debug symbols that are unused by gdb "
		 "(at least versions <= 7.4)"), NULL);
  DEFINE_bool(strip_lto_sections, options::TWO_DASHES, '\0', true,
	      N_("Strip LTO intermediate code sections"), NULL);

  DEFINE_string(section_ordering_file, options::TWO_DASHES, '\0', NULL,
		N_("Layout sections in the order specified"),
		N_("FILENAME"));

  DEFINE_special(section_start, options::TWO_DASHES, '\0',
		 N_("Set address of section"), N_("SECTION=ADDRESS"));

  DEFINE_bool(secure_plt, options::TWO_DASHES , '\0', true,
	      N_("(PowerPC only) Use new-style PLT"), NULL);

  DEFINE_optional_string(sort_common, options::TWO_DASHES, '\0', NULL,
			 N_("Sort common symbols by alignment"),
			 N_("[={ascending,descending}]"));

  DEFINE_enum(sort_section, options::TWO_DASHES, '\0', "none",
	      N_("Sort sections by name.  \'--no-text-reorder\'"
		 " will override \'--sort-section=name\' for .text"),
	      N_("[none,name]"), false,
	      {"none", "name"});

  DEFINE_uint(spare_dynamic_tags, options::TWO_DASHES, '\0', 5,
	      N_("Dynamic tag slots to reserve (default 5)"),
	      N_("COUNT"));

  DEFINE_int(stub_group_size, options::TWO_DASHES , '\0', 1,
	     N_("(ARM, PowerPC only) The maximum distance from instructions "
		"in a group of sections to their stubs. Negative values mean "
		"stubs are always after the group. 1 means use default size"),
	     N_("SIZE"));

  DEFINE_bool(stub_group_multi, options::TWO_DASHES, '\0', true,
	      N_("(PowerPC only) Allow a group of stubs to serve multiple "
		 "output sections"),
	      N_("(PowerPC only) Each output section has its own stubs"));

  DEFINE_uint(split_stack_adjust_size, options::TWO_DASHES, '\0', 0x100000,
	      N_("Stack size when -fsplit-stack function calls non-split"),
	      N_("SIZE"));

  // This is not actually special in any way, but I need to give it
  // a non-standard accessor-function name because 'static' is a keyword.
  DEFINE_special(static, options::ONE_DASH, '\0',
		 N_("Do not link against shared libraries"), NULL);

  DEFINE_special(start_lib, options::TWO_DASHES, '\0',
		 N_("Start a library"), NULL);
  DEFINE_special(end_lib, options::TWO_DASHES, '\0',
		 N_("End a library "), NULL);

  DEFINE_bool(stats, options::TWO_DASHES, '\0', false,
	      N_("Print resource usage statistics"), NULL);

  DEFINE_string(sysroot, options::TWO_DASHES, '\0', "",
		N_("Set target system root directory"), N_("DIR"));

  // t

  DEFINE_bool(trace, options::TWO_DASHES, 't', false,
	      N_("Print the name of each input file"), NULL);

  DEFINE_bool(target1_abs, options::TWO_DASHES, '\0', false,
	      N_("(ARM only) Force R_ARM_TARGET1 type to R_ARM_ABS32"),
	      NULL);
  DEFINE_bool(target1_rel, options::TWO_DASHES, '\0', false,
	      N_("(ARM only) Force R_ARM_TARGET1 type to R_ARM_REL32"),
	      NULL);
  DEFINE_enum(target2, options::TWO_DASHES, '\0', NULL,
	      N_("(ARM only) Set R_ARM_TARGET2 relocation type"),
	      N_("[rel, abs, got-rel"), false,
	      {"rel", "abs", "got-rel"});

  DEFINE_bool(text_reorder, options::TWO_DASHES, '\0', true,
	      N_("Enable text section reordering for GCC section names"),
	      N_("Disable text section reordering for GCC section names"));

  DEFINE_bool(threads, options::TWO_DASHES, '\0', false,
	      N_("Run the linker multi-threaded"),
	      N_("Do not run the linker multi-threaded"));
  DEFINE_uint(thread_count, options::TWO_DASHES, '\0', 0,
	      N_("Number of threads to use"), N_("COUNT"));
  DEFINE_uint(thread_count_initial, options::TWO_DASHES, '\0', 0,
	      N_("Number of threads to use in initial pass"), N_("COUNT"));
  DEFINE_uint(thread_count_middle, options::TWO_DASHES, '\0', 0,
	      N_("Number of threads to use in middle pass"), N_("COUNT"));
  DEFINE_uint(thread_count_final, options::TWO_DASHES, '\0', 0,
	      N_("Number of threads to use in final pass"), N_("COUNT"));

  DEFINE_bool(tls_optimize, options::TWO_DASHES, '\0', true,
	      N_("(PowerPC/64 only) Optimize GD/LD/IE code to IE/LE"),
	      N_("(PowerPC/64 only) Don'\''t try to optimize TLS accesses"));
  DEFINE_bool(tls_get_addr_optimize, options::TWO_DASHES, '\0', true,
	      N_("(PowerPC/64 only) Use a special __tls_get_addr call"),
	      N_("(PowerPC/64 only) Don't use a special __tls_get_addr call"));

  DEFINE_bool(toc_optimize, options::TWO_DASHES, '\0', true,
	      N_("(PowerPC64 only) Optimize TOC code sequences"),
	      N_("(PowerPC64 only) Don't optimize TOC code sequences"));

  DEFINE_bool(toc_sort, options::TWO_DASHES, '\0', true,
	      N_("(PowerPC64 only) Sort TOC and GOT sections"),
	      N_("(PowerPC64 only) Don't sort TOC and GOT sections"));

  DEFINE_special(script, options::TWO_DASHES, 'T',
		 N_("Read linker script"), N_("FILE"));

  DEFINE_uint64(Tbss, options::ONE_DASH, '\0', -1U,
		N_("Set the address of the bss segment"), N_("ADDRESS"));
  DEFINE_uint64(Tdata, options::ONE_DASH, '\0', -1U,
		N_("Set the address of the data segment"), N_("ADDRESS"));
  DEFINE_uint64(Ttext, options::ONE_DASH, '\0', -1U,
		N_("Set the address of the text segment"), N_("ADDRESS"));
  DEFINE_uint64_alias(Ttext_segment, Ttext, options::ONE_DASH, '\0',
		      N_("Set the address of the text segment"),
		      N_("ADDRESS"));
  DEFINE_uint64(Trodata_segment, options::ONE_DASH, '\0', -1U,
		N_("Set the address of the rodata segment"), N_("ADDRESS"));

  // u

  DEFINE_set(undefined, options::TWO_DASHES, 'u',
	     N_("Create undefined reference to SYMBOL"), N_("SYMBOL"));

  DEFINE_enum(unresolved_symbols, options::TWO_DASHES, '\0', NULL,
	      N_("How to handle unresolved symbols"),
	      ("ignore-all,report-all,ignore-in-object-files,"
	       "ignore-in-shared-libs"), false,
	      {"ignore-all", "report-all", "ignore-in-object-files",
		  "ignore-in-shared-libs"});

  // v

  DEFINE_bool(verbose, options::TWO_DASHES, '\0', false,
	      N_("Alias for --debug=files"), NULL);

  DEFINE_special(version_script, options::TWO_DASHES, '\0',
		 N_("Read version script"), N_("FILE"));

  // w

  DEFINE_bool(warn_common, options::TWO_DASHES, '\0', false,
	      N_("Warn about duplicate common symbols"),
	      N_("Do not warn about duplicate common symbols"));

  DEFINE_bool_ignore(warn_constructors, options::TWO_DASHES, '\0',
		     N_("Ignored"), N_("Ignored"));

  DEFINE_bool(warn_drop_version, options::TWO_DASHES, '\0', false,
	      N_("Warn when discarding version information"),
	      N_("Do not warn when discarding version information"));

  DEFINE_bool(warn_execstack, options::TWO_DASHES, '\0', false,
	      N_("Warn if the stack is executable"),
	      N_("Do not warn if the stack is executable"));

  DEFINE_bool(warn_mismatch, options::TWO_DASHES, '\0', true,
	      NULL, N_("Don't warn about mismatched input files"));

  DEFINE_bool(warn_multiple_gp, options::TWO_DASHES, '\0', false,
	      N_("Ignored"), NULL);

  DEFINE_bool(warn_search_mismatch, options::TWO_DASHES, '\0', true,
	      N_("Warn when skipping an incompatible library"),
	      N_("Don't warn when skipping an incompatible library"));

  DEFINE_bool(warn_shared_textrel, options::TWO_DASHES, '\0', false,
	      N_("Warn if text segment is not shareable"),
	      N_("Do not warn if text segment is not shareable"));

  DEFINE_bool(warn_unresolved_symbols, options::TWO_DASHES, '\0', false,
	      N_("Report unresolved symbols as warnings"),
	      NULL);
  DEFINE_bool_alias(error_unresolved_symbols, warn_unresolved_symbols,
		    options::TWO_DASHES, '\0',
		    N_("Report unresolved symbols as errors"),
		    NULL, true);

  DEFINE_bool(wchar_size_warning, options::TWO_DASHES, '\0', true, NULL,
	      N_("(ARM only) Do not warn about objects with incompatible "
		 "wchar_t sizes"));

  DEFINE_bool(weak_unresolved_symbols, options::TWO_DASHES, '\0', false,
	      N_("Convert unresolved symbols to weak references"),
	      NULL);

  DEFINE_bool(whole_archive, options::TWO_DASHES, '\0', false,
	      N_("Include all archive contents"),
	      N_("Include only needed archive contents"));

  DEFINE_set(wrap, options::TWO_DASHES, '\0',
	     N_("Use wrapper functions for SYMBOL"), N_("SYMBOL"));

  // x

  DEFINE_special(discard_all, options::TWO_DASHES, 'x',
		 N_("Delete all local symbols"), NULL);
  DEFINE_special(discard_locals, options::TWO_DASHES, 'X',
		 N_("Delete all temporary local symbols"), NULL);
  DEFINE_special(discard_none, options::TWO_DASHES, '\0',
		 N_("Keep all local symbols"), NULL);

  // y

  DEFINE_set(trace_symbol, options::TWO_DASHES, 'y',
	     N_("Trace references to symbol"), N_("SYMBOL"));

  DEFINE_bool(undefined_version, options::TWO_DASHES, '\0', true,
	      N_("Allow unused version in script"),
	      N_("Do not allow unused version in script"));

  DEFINE_string(Y, options::EXACTLY_ONE_DASH, 'Y', "",
		N_("Default search path for Solaris compatibility"),
		N_("PATH"));

  // special characters

  DEFINE_special(start_group, options::TWO_DASHES, '(',
		 N_("Start a library search group"), NULL);
  DEFINE_special(end_group, options::TWO_DASHES, ')',
		 N_("End a library search group"), NULL);

  // The -z options.

  DEFINE_bool(bndplt, options::DASH_Z, '\0', false,
	      N_("(x86-64 only) Generate a BND PLT for Intel MPX"),
	      N_("Generate a regular PLT"));
  DEFINE_bool(combreloc, options::DASH_Z, '\0', true,
	      N_("Sort dynamic relocs"),
	      N_("Do not sort dynamic relocs"));
  DEFINE_uint64(common_page_size, options::DASH_Z, '\0', 0,
		N_("Set common page size to SIZE"), N_("SIZE"));
  DEFINE_bool(defs, options::DASH_Z, '\0', false,
	      N_("Report undefined symbols (even with --shared)"),
	      NULL);
  DEFINE_bool(execstack, options::DASH_Z, '\0', false,
	      N_("Mark output as requiring executable stack"), NULL);
  DEFINE_bool(global, options::DASH_Z, '\0', false,
	      N_("Make symbols in DSO available for subsequently loaded "
		 "objects"), NULL);
  DEFINE_bool(initfirst, options::DASH_Z, '\0', false,
	      N_("Mark DSO to be initialized first at runtime"),
	      NULL);
  DEFINE_bool(interpose, options::DASH_Z, '\0', false,
	      N_("Mark object to interpose all DSOs but executable"),
	      NULL);
  DEFINE_bool(unique, options::DASH_Z, '\0', false,
	      N_("Mark DSO to be loaded at most once, and only in the main namespace"),
	      N_("Do not mark the DSO as one to be loaded only in the main namespace"));
  DEFINE_bool_alias(lazy, now, options::DASH_Z, '\0',
		    N_("Mark object for lazy runtime binding"),
		    NULL, true);
  DEFINE_bool(loadfltr, options::DASH_Z, '\0', false,
	      N_("Mark object requiring immediate process"),
	      NULL);
  DEFINE_uint64(max_page_size, options::DASH_Z, '\0', 0,
		N_("Set maximum page size to SIZE"), N_("SIZE"));
  DEFINE_bool(muldefs, options::DASH_Z, '\0', false,
	      N_("Allow multiple definitions of symbols"),
	      NULL);
  // copyreloc is here in the list because there is only -z
  // nocopyreloc, not -z copyreloc.
  DEFINE_bool(copyreloc, options::DASH_Z, '\0', true,
	      NULL,
	      N_("Do not create copy relocs"));
  DEFINE_bool(nodefaultlib, options::DASH_Z, '\0', false,
	      N_("Mark object not to use default search paths"),
	      NULL);
  DEFINE_bool(nodelete, options::DASH_Z, '\0', false,
	      N_("Mark DSO non-deletable at runtime"),
	      NULL);
  DEFINE_bool(nodlopen, options::DASH_Z, '\0', false,
	      N_("Mark DSO not available to dlopen"),
	      NULL);
  DEFINE_bool(nodump, options::DASH_Z, '\0', false,
	      N_("Mark DSO not available to dldump"),
	      NULL);
  DEFINE_bool(noexecstack, options::DASH_Z, '\0', false,
	      N_("Mark output as not requiring executable stack"), NULL);
  DEFINE_bool(now, options::DASH_Z, '\0', false,
	      N_("Mark object for immediate function binding"),
	      NULL);
  DEFINE_bool(origin, options::DASH_Z, '\0', false,
	      N_("Mark DSO to indicate that needs immediate $ORIGIN "
		 "processing at runtime"), NULL);
  DEFINE_bool(relro, options::DASH_Z, '\0', DEFAULT_LD_Z_RELRO,
	      N_("Where possible mark variables read-only after relocation"),
	      N_("Don't mark variables read-only after relocation"));
  DEFINE_uint64(stack_size, options::DASH_Z, '\0', 0,
		N_("Set PT_GNU_STACK segment p_memsz to SIZE"), N_("SIZE"));
  DEFINE_enum(start_stop_visibility, options::DASH_Z, '\0', "protected",
	      N_("ELF symbol visibility for synthesized "
		 "__start_* and __stop_* symbols"),
	      ("[default,internal,hidden,protected]"), false,
	      {"default", "internal", "hidden", "protected"});
  DEFINE_bool(text, options::DASH_Z, '\0', false,
	      N_("Do not permit relocations in read-only segments"),
	      N_("Permit relocations in read-only segments"));
  DEFINE_bool_alias(textoff, text, options::DASH_Z, '\0',
		    N_("Permit relocations in read-only segments"),
		    NULL, true);
  DEFINE_bool(text_unlikely_segment, options::DASH_Z, '\0', false,
	      N_("Move .text.unlikely sections to a separate segment."),
	      N_("Do not move .text.unlikely sections to a separate "
		 "segment."));
  DEFINE_bool(keep_text_section_prefix, options::DASH_Z, '\0', false,
	      N_("Keep .text.hot, .text.startup, .text.exit and .text.unlikely "
		 "as separate sections in the final binary."),
	      N_("Merge all .text.* prefix sections."));


 public:
  typedef options::Dir_list Dir_list;

  General_options();

  // Does post-processing on flags, making sure they all have
  // non-conflicting values.  Also converts some flags from their
  // "standard" types (string, etc), to another type (enum, DirList),
  // which can be accessed via a separate method.  Dies if it notices
  // any problems.
  void finalize();

  // True if we printed the version information.
  bool
  printed_version() const
  { return this->printed_version_; }

  // The macro defines output() (based on --output), but that's a
  // generic name.  Provide this alternative name, which is clearer.
  const char*
  output_file_name() const
  { return this->output(); }

  // This is not defined via a flag, but combines flags to say whether
  // the output is position-independent or not.
  bool
  output_is_position_independent() const
  { return this->shared() || this->pie(); }

  // Return true if the output is something that can be exec()ed, such
  // as a static executable, or a position-dependent or
  // position-independent executable, but not a dynamic library or an
  // object file.
  bool
  output_is_executable() const
  { return !this->shared() && !this->relocatable(); }

  // This would normally be static(), and defined automatically, but
  // since static is a keyword, we need to come up with our own name.
  bool
  is_static() const
  { return static_; }

  // In addition to getting the input and output formats as a string
  // (via format() and oformat()), we also give access as an enum.
  enum Object_format
  {
    // Ordinary ELF.
    OBJECT_FORMAT_ELF,
    // Straight binary format.
    OBJECT_FORMAT_BINARY
  };

  // Convert a string to an Object_format.  Gives an error if the
  // string is not recognized.
  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;

  // Return whether FILENAME is in a system directory.
  bool
  is_in_system_directory(const std::string& name) const;

  // RETURN whether SYMBOL_NAME should be kept, according to symbols_to_retain_.
  bool
  should_retain_symbol(const char* symbol_name) const
    {
      if (symbols_to_retain_.empty())    // means flag wasn't specified
	return true;
      return symbols_to_retain_.find(symbol_name) != symbols_to_retain_.end();
    }

  // These are the best way to get access to the execstack state,
  // not execstack() and noexecstack() which are hard to use properly.
  bool
  is_execstack_set() const
  { return this->execstack_status_ != EXECSTACK_FROM_INPUT; }

  bool
  is_stack_executable() const
  { return this->execstack_status_ == EXECSTACK_YES; }

  bool
  icf_enabled() const
  { return this->icf_status_ != ICF_NONE; }

  bool
  icf_safe_folding() const
  { return this->icf_status_ == ICF_SAFE; }

  // 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_; }

  // Returns TRUE if any plugin libraries have been loaded.
  bool
  has_plugins() const
  { return this->plugins_ != NULL; }

  // Return a pointer to the plugin manager.
  Plugin_manager*
  plugins() const
  { return this->plugins_; }

  // True iff SYMBOL was found in the file specified by dynamic-list.
  bool
  in_dynamic_list(const char* symbol) const
  { return this->dynamic_list_.version_script_info()->symbol_is_local(symbol); }

  // True if a --dynamic-list script was provided.
  bool
  have_dynamic_list() const
  { return this->have_dynamic_list_; }

  // Finalize the dynamic list.
  void
  finalize_dynamic_list()
  { this->dynamic_list_.version_script_info()->finalize(); }

  // The mode selected by the --incremental options.
  enum Incremental_mode
  {
    // No incremental linking (--no-incremental).
    INCREMENTAL_OFF,
    // Incremental update only (--incremental-update).
    INCREMENTAL_UPDATE,
    // Force a full link, but prepare for subsequent incremental link
    // (--incremental-full).
    INCREMENTAL_FULL,
    // Incremental update if possible, fallback to full link  (--incremental).
    INCREMENTAL_AUTO
  };

  // The incremental linking mode.
  Incremental_mode
  incremental_mode() const
  { return this->incremental_mode_; }

  // The disposition given by the --incremental-changed,
  // --incremental-unchanged or --incremental-unknown option.  The
  // value may change as we proceed parsing the command line flags.
  Incremental_disposition
  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
  incremental_startup_disposition() const
  { return this->incremental_startup_disposition_; }

  // Return true if S is the name of a library excluded from automatic
  // symbol export.
  bool
  check_excluded_libs(const std::string &s) const;

  // If an explicit start address was given for section SECNAME with
  // the --section-start option, return true and set *PADDR to the
  // address.  Otherwise return false.
  bool
  section_start(const char* secname, uint64_t* paddr) const;

  // Return whether any --section-start option was used.
  bool
  any_section_start() const
  { return !this->section_starts_.empty(); }

  enum Fix_v4bx
  {
    // Leave original instruction.
    FIX_V4BX_NONE,
    // Replace instruction.
    FIX_V4BX_REPLACE,
    // Generate an interworking veneer.
    FIX_V4BX_INTERWORKING
  };

  Fix_v4bx
  fix_v4bx() const
  { return (this->fix_v4bx_); }

  enum Endianness
  {
    ENDIANNESS_NOT_SET,
    ENDIANNESS_BIG,
    ENDIANNESS_LITTLE
  };

  Endianness
  endianness() const
  { return this->endianness_; }

  enum Bsymbolic_kind
  {
    BSYMBOLIC_NONE,
    BSYMBOLIC_FUNCTIONS,
    BSYMBOLIC_ALL,
  };

  bool
  Bsymbolic() const
  { return this->bsymbolic_ == BSYMBOLIC_ALL; }

  bool
  Bsymbolic_functions() const
  { return this->bsymbolic_ == BSYMBOLIC_FUNCTIONS; }

  bool
  discard_all() const
  { return this->discard_locals_ == DISCARD_ALL; }

  bool
  discard_locals() const
  { return this->discard_locals_ == DISCARD_LOCALS; }

  bool
  discard_sec_merge() const
  { return this->discard_locals_ == DISCARD_SEC_MERGE; }

  enum Orphan_handling
  {
    // Place orphan sections normally (default).
    ORPHAN_PLACE,
    // Discard all orphan sections.
    ORPHAN_DISCARD,
    // Warn when placing orphan sections.
    ORPHAN_WARN,
    // Issue error for orphan sections.
    ORPHAN_ERROR
  };

  Orphan_handling
  orphan_handling_enum() const
  { return this->orphan_handling_enum_; }

  elfcpp::STV
  start_stop_visibility_enum() const
  { return this->start_stop_visibility_enum_; }

  enum Power10_stubs
  {
    // Use Power10 insns on @notoc calls/branches, non-Power10 elsewhere.
    POWER10_STUBS_AUTO,
    // Don't use Power10 insns
    POWER10_STUBS_NO,
    // Always use Power10 insns
    POWER10_STUBS_YES
  };

  Power10_stubs
  power10_stubs_enum() const
  { return this->power10_stubs_enum_; }

 private:
  // Don't copy this structure.
  General_options(const General_options&);
  General_options& operator=(const General_options&);

  // What local symbols to discard.
  enum Discard_locals
  {
    // Locals in merge sections (default).
    DISCARD_SEC_MERGE,
    // None (--discard-none).
    DISCARD_NONE,
    // Temporary locals (--discard-locals/-X).
    DISCARD_LOCALS,
    // All locals (--discard-all/-x).
    DISCARD_ALL
  };

  // Whether to mark the stack as executable.
  enum Execstack
  {
    // Not set on command line.
    EXECSTACK_FROM_INPUT,
    // Mark the stack as executable (-z execstack).
    EXECSTACK_YES,
    // Mark the stack as not executable (-z noexecstack).
    EXECSTACK_NO
  };

  enum Icf_status
  {
    // Do not fold any functions (Default or --icf=none).
    ICF_NONE,
    // All functions are candidates for folding. (--icf=all).
    ICF_ALL,
    // Only ctors and dtors are candidates for folding. (--icf=safe).
    ICF_SAFE
  };

  void
  set_icf_status(Icf_status value)
  { this->icf_status_ = value; }

  void
  set_execstack_status(Execstack value)
  { this->execstack_status_ = value; }

  void
  set_do_demangle(bool value)
  { this->do_demangle_ = value; }

  void
  set_static(bool value)
  { static_ = value; }

  void
  set_orphan_handling_enum(Orphan_handling value)
  { this->orphan_handling_enum_ = value; }

  void
  set_start_stop_visibility_enum(elfcpp::STV value)
  { this->start_stop_visibility_enum_ = value; }

  void
  set_power10_stubs_enum(Power10_stubs value)
  { this->power10_stubs_enum_ = value; }

  // These are called by finalize() to set up the search-path correctly.
  void
  add_to_library_path_with_sysroot(const std::string& arg)
  { this->add_search_directory_to_library_path(Search_directory(arg, true)); }

  // Apply any sysroot to the directory lists.
  void
  add_sysroot();

  // Add a plugin and its arguments to the list of plugins.
  void
  add_plugin(const char* filename);

  // Add a plugin option.
  void
  add_plugin_option(const char* opt);

  void
  copy_from_posdep_options(const Position_dependent_options&);

  // Whether we bind default visibility defined symbols locally for -shared.
  Bsymbolic_kind bsymbolic_;
  // Whether we printed version information.
  bool printed_version_;
  // Whether to mark the stack as executable.
  Execstack execstack_status_;
  // Whether to do code folding.
  Icf_status icf_status_;
  // Whether to do a static link.
  bool static_;
  // Whether to do demangling.
  bool do_demangle_;
  // List of plugin libraries.
  Plugin_manager* plugins_;
  // The parsed output of --dynamic-list files.  For convenience in
  // script.cc, we store this as a Script_options object, even though
  // we only use a single Version_tree from it.
  Script_options dynamic_list_;
  // Whether a --dynamic-list file was provided.
  bool have_dynamic_list_;
  // The incremental linking mode.
  Incremental_mode incremental_mode_;
  // The disposition given by the --incremental-changed,
  // --incremental-unchanged or --incremental-unknown option.  The
  // value may change as we proceed parsing the command line flags.
  Incremental_disposition incremental_disposition_;
  // The disposition to use for startup files (those marked
  // INCREMENTAL_STARTUP).
  Incremental_disposition incremental_startup_disposition_;
  // Whether we have seen one of the options that require incremental
  // build (--incremental-changed, --incremental-unchanged,
  // --incremental-unknown, or --incremental-startup-unchanged).
  bool implicit_incremental_;
  // Libraries excluded from automatic export, via --exclude-libs.
  Unordered_set<std::string> excluded_libs_;
  // List of symbol-names to keep, via -retain-symbol-info.
  Unordered_set<std::string> symbols_to_retain_;
  // Map from section name to address from --section-start.
  std::map<std::string, uint64_t> section_starts_;
  // Whether to process armv4 bx instruction relocation.
  Fix_v4bx fix_v4bx_;
  // Endianness.
  Endianness endianness_;
  // What local symbols to discard.
  Discard_locals discard_locals_;
  // Stack of saved options for --push-state/--pop-state.
  std::vector<Position_dependent_options*> options_stack_;
  // Orphan handling option, decoded to an enum value.
  Orphan_handling orphan_handling_enum_;
  // Symbol visibility for __start_* / __stop_* magic symbols.
  elfcpp::STV start_stop_visibility_enum_;
  // Power10 stubs option
  Power10_stubs power10_stubs_enum_;
};

// The position-dependent options.  We use this to store the state of
// the commandline at a particular point in parsing for later
// reference.  For instance, if we see "ld --whole-archive foo.a
// --no-whole-archive," we want to store the whole-archive option with
// foo.a, so when the time comes to parse foo.a we know we should do
// it in whole-archive mode.  We could store all of General_options,
// but that's big, so we just pick the subset of flags that actually
// change in a position-dependent way.

#define DEFINE_posdep(varname__, type__)        \
 public:                                        \
  type__                                        \
  varname__() const                             \
  { return this->varname__##_; }                \
						\
  void                                          \
  set_##varname__(type__ value)                 \
  { this->varname__##_ = value; }               \
 private:                                       \
  type__ varname__##_

class Position_dependent_options
{
 public:
  Position_dependent_options(const General_options& options
			     = Position_dependent_options::default_options_)
  { copy_from_options(options); }

  void
  copy_from_options(const General_options& options)
  {
    this->set_as_needed(options.as_needed());
    this->set_Bdynamic(options.Bdynamic());
    this->set_format_enum(options.format_enum());
    this->set_whole_archive(options.whole_archive());
    this->set_incremental_disposition(options.incremental_disposition());
  }

  DEFINE_posdep(as_needed, bool);
  DEFINE_posdep(Bdynamic, bool);
  DEFINE_posdep(format_enum, General_options::Object_format);
  DEFINE_posdep(whole_archive, bool);
  DEFINE_posdep(incremental_disposition, Incremental_disposition);

 private:
  // This is a General_options with everything set to its default
  // value.  A Position_dependent_options created with no argument
  // will take its values from here.
  static General_options default_options_;
};


// A single file or library argument from the command line.

class Input_file_argument
{
 public:
  enum Input_file_type
  {
    // A regular file, name used as-is, not searched.
    INPUT_FILE_TYPE_FILE,
    // A library name.  When used, "lib" will be prepended and ".so" or
    // ".a" appended to make a filename, and that filename will be searched
    // for using the -L paths.
    INPUT_FILE_TYPE_LIBRARY,
    // A regular file, name used as-is, but searched using the -L paths.
    INPUT_FILE_TYPE_SEARCHED_FILE
  };

  // name: file name or library name
  // type: the type of this input file.
  // extra_search_path: an extra directory to look for the file, prior
  //         to checking the normal library search path.  If this is "",
  //         then no extra directory is added.
  // just_symbols: whether this file only defines symbols.
  // options: The position dependent options at this point in the
  //         command line, such as --whole-archive.
  Input_file_argument()
    : name_(), type_(INPUT_FILE_TYPE_FILE), extra_search_path_(""),
      just_symbols_(false), options_(), arg_serial_(0)
  { }

  Input_file_argument(const char* name, Input_file_type type,
		      const char* extra_search_path,
		      bool just_symbols,
		      const Position_dependent_options& options)
    : name_(name), type_(type), extra_search_path_(extra_search_path),
      just_symbols_(just_symbols), options_(options), arg_serial_(0)
  { }

  // You can also pass in a General_options instance instead of a
  // Position_dependent_options.  In that case, we extract the
  // position-independent vars from the General_options and only store
  // those.
  Input_file_argument(const char* name, Input_file_type type,
		      const char* extra_search_path,
		      bool just_symbols,
		      const General_options& options)
    : name_(name), type_(type), extra_search_path_(extra_search_path),
      just_symbols_(just_symbols), options_(options), arg_serial_(0)
  { }

  const char*
  name() const
  { return this->name_.c_str(); }

  const Position_dependent_options&
  options() const
  { return this->options_; }

  bool
  is_lib() const
  { return type_ == INPUT_FILE_TYPE_LIBRARY; }

  bool
  is_searched_file() const
  { return type_ == INPUT_FILE_TYPE_SEARCHED_FILE; }

  const char*
  extra_search_path() const
  {
    return (this->extra_search_path_.empty()
	    ? NULL
	    : this->extra_search_path_.c_str());
  }

  // Return whether we should only read symbols from this file.
  bool
  just_symbols() const
  { return this->just_symbols_; }

  // Return whether this file may require a search using the -L
  // options.
  bool
  may_need_search() const
  {
    return (this->is_lib()
	    || this->is_searched_file()
	    || !this->extra_search_path_.empty());
  }

  // Set the serial number for this argument.
  void
  set_arg_serial(unsigned int arg_serial)
  { this->arg_serial_ = arg_serial; }

  // Get the serial number.
  unsigned int
  arg_serial() const
  { return this->arg_serial_; }

 private:
  // We use std::string, not const char*, here for convenience when
  // using script files, so that we do not have to preserve the string
  // in that case.
  std::string name_;
  Input_file_type type_;
  std::string extra_search_path_;
  bool just_symbols_;
  Position_dependent_options options_;
  // A unique index for this file argument in the argument list.
  unsigned int arg_serial_;
};

// A file or library, or a group, from the command line.

class Input_argument
{
 public:
  // Create a file or library argument.
  explicit Input_argument(Input_file_argument file)
    : is_file_(true), file_(file), group_(NULL), lib_(NULL), script_info_(NULL)
  { }

  // Create a group argument.
  explicit Input_argument(Input_file_group* group)
    : is_file_(false), group_(group), lib_(NULL), script_info_(NULL)
  { }

  // Create a lib argument.
  explicit Input_argument(Input_file_lib* lib)
    : is_file_(false), group_(NULL), lib_(lib), script_info_(NULL)
  { }

  // Return whether this is a file.
  bool
  is_file() const
  { return this->is_file_; }

  // Return whether this is a group.
  bool
  is_group() const
  { return !this->is_file_ && this->lib_ == NULL; }

  // Return whether this is a lib.
  bool
  is_lib() const
  { return this->lib_ != NULL; }

  // Return the information about the file.
  const Input_file_argument&
  file() const
  {
    gold_assert(this->is_file_);
    return this->file_;
  }

  // Return the information about the group.
  const Input_file_group*
  group() const
  {
    gold_assert(!this->is_file_);
    return this->group_;
  }

  Input_file_group*
  group()
  {
    gold_assert(!this->is_file_);
    return this->group_;
  }

  // Return the information about the lib.
  const Input_file_lib*
  lib() const
  {
    gold_assert(!this->is_file_);
    gold_assert(this->lib_);
    return this->lib_;
  }

  Input_file_lib*
  lib()
  {
    gold_assert(!this->is_file_);
    gold_assert(this->lib_);
    return this->lib_;
  }

  // If a script generated this argument, store a pointer to the script info.
  // Currently used only for recording incremental link information.
  void
  set_script_info(Script_info* info)
  { this->script_info_ = info; }

  Script_info*
  script_info() const
  { return this->script_info_; }

 private:
  bool is_file_;
  Input_file_argument file_;
  Input_file_group* group_;
  Input_file_lib* lib_;
  Script_info* script_info_;
};

typedef std::vector<Input_argument> Input_argument_list;

// A group from the command line.  This is a set of arguments within
// --start-group ... --end-group.

class Input_file_group
{
 public:
  typedef Input_argument_list::const_iterator const_iterator;

  Input_file_group()
    : files_()
  { }

  // Add a file to the end of the group.
  Input_argument&
  add_file(const Input_file_argument& arg)
  {
    this->files_.push_back(Input_argument(arg));
    return this->files_.back();
  }

  // Iterators to iterate over the group contents.

  const_iterator
  begin() const
  { return this->files_.begin(); }

  const_iterator
  end() const
  { return this->files_.end(); }

 private:
  Input_argument_list files_;
};

// A lib from the command line.  This is a set of arguments within
// --start-lib ... --end-lib.

class Input_file_lib
{
 public:
  typedef Input_argument_list::const_iterator const_iterator;

  Input_file_lib(const Position_dependent_options& options)
    : files_(), options_(options)
  { }

  // Add a file to the end of the lib.
  Input_argument&
  add_file(const Input_file_argument& arg)
  {
    this->files_.push_back(Input_argument(arg));
    return this->files_.back();
  }

  const Position_dependent_options&
  options() const
  { return this->options_; }

  // Iterators to iterate over the lib contents.

  const_iterator
  begin() const
  { return this->files_.begin(); }

  const_iterator
  end() const
  { return this->files_.end(); }

  size_t
  size() const
  { return this->files_.size(); }

 private:
  Input_argument_list files_;
  Position_dependent_options options_;
};

// A list of files from the command line or a script.

class Input_arguments
{
 public:
  typedef Input_argument_list::const_iterator const_iterator;

  Input_arguments()
    : input_argument_list_(), in_group_(false), in_lib_(false), file_count_(0)
  { }

  // Add a file.
  Input_argument&
  add_file(Input_file_argument& arg);

  // Start a group (the --start-group option).
  void
  start_group();

  // End a group (the --end-group option).
  void
  end_group();

  // Start a lib (the --start-lib option).
  void
  start_lib(const Position_dependent_options&);

  // End a lib (the --end-lib option).
  void
  end_lib();

  // Return whether we are currently in a group.
  bool
  in_group() const
  { return this->in_group_; }

  // Return whether we are currently in a lib.
  bool
  in_lib() const
  { return this->in_lib_; }

  // The number of entries in the list.
  int
  size() const
  { return this->input_argument_list_.size(); }

  // Iterators to iterate over the list of input files.

  const_iterator
  begin() const
  { return this->input_argument_list_.begin(); }

  const_iterator
  end() const
  { return this->input_argument_list_.end(); }

  // Return whether the list is empty.
  bool
  empty() const
  { return this->input_argument_list_.empty(); }

  // Return the number of input files.  This may be larger than
  // input_argument_list_.size(), because of files that are part
  // of groups or libs.
  int
  number_of_input_files() const
  { return this->file_count_; }

 private:
  Input_argument_list input_argument_list_;
  bool in_group_;
  bool in_lib_;
  unsigned int file_count_;
};


// All the information read from the command line.  These are held in
// three separate structs: one to hold the options (--foo), one to
// hold the filenames listed on the commandline, and one to hold
// linker script information.  This third is not a subset of the other
// two because linker scripts can be specified either as options (via
// -T) or as a file.

class Command_line
{
 public:
  typedef Input_arguments::const_iterator const_iterator;

  Command_line();

  // Process the command line options.  This will exit with an
  // appropriate error message if an unrecognized option is seen.
  void
  process(int argc, const char** argv);

  // Process one command-line option.  This takes the index of argv to
  // process, and returns the index for the next option.  no_more_options
  // is set to true if argv[i] is "--".
  int
  process_one_option(int argc, const char** argv, int i,
		     bool* no_more_options);

  // Get the general options.
  const General_options&
  options() const
  { return this->options_; }

  // Get the position dependent options.
  const Position_dependent_options&
  position_dependent_options() const
  { return this->position_options_; }

  // Get the linker-script options.
  Script_options&
  script_options()
  { return this->script_options_; }

  // Finalize the version-script options and return them.
  const Version_script_info&
  version_script();

  // Get the input files.
  Input_arguments&
  inputs()
  { return this->inputs_; }

  // The number of input files.
  int
  number_of_input_files() const
  { return this->inputs_.number_of_input_files(); }

  // Iterators to iterate over the list of input files.

  const_iterator
  begin() const
  { return this->inputs_.begin(); }

  const_iterator
  end() const
  { return this->inputs_.end(); }

 private:
  Command_line(const Command_line&);
  Command_line& operator=(const Command_line&);

  // This is a dummy class to provide a constructor that runs before
  // the constructor for the General_options.  The Pre_options constructor
  // is used as a hook to set the flag enabling the options to register
  // themselves.
  struct Pre_options {
    Pre_options();
  };

  // This must come before options_!
  Pre_options pre_options_;
  General_options options_;
  Position_dependent_options position_options_;
  Script_options script_options_;
  Input_arguments inputs_;
};

} // End namespace gold.

#endif // !defined(GOLD_OPTIONS_H)
